网站开发和小程序开发区别,宜都网站设计,企业网站建设存在的问题,做公司网站每年多少钱【嵌入式移植】2、使用Crosstool-NG制作交叉编译工具链 1 准备工作1.1 下载Crosstool-NG1.2 尝试配置crosstool-ng#xff0c;安装依赖项1.2.1 Crosstool-NG所需软件包 1.3 编译及安装 2 制作交叉编译工具链2.1 选择配置文件2.2 使用用户界面菜单进行配置2.2.1 Paths and misc… 【嵌入式移植】2、使用Crosstool-NG制作交叉编译工具链 1 准备工作1.1 下载Crosstool-NG1.2 尝试配置crosstool-ng安装依赖项1.2.1 Crosstool-NG所需软件包 1.3 编译及安装 2 制作交叉编译工具链2.1 选择配置文件2.2 使用用户界面菜单进行配置2.2.1 Paths and misc options2.2.2 Target options2.2.3 Toolchain options2.2.4 Operating System2.2.5 Binary utilities2.2.6 C-library2.2.7 C Compiler2.2.8 Debug facilities2.2.9 Companion libraries2.2.10 Companion tools 2.3 下载配套库源码压缩包2.4 ct-ng build 1 准备工作
通过SSH登录建立的ubuntu-22.04.3虚拟机环境新建文件夹并进入
mkdir arm cd arm
mkdir crosstool-ng cd crosstool-ng1.1 下载Crosstool-NG
下载http://crosstool-ng.org
wget http://crosstool-ng.org/download/crosstool-ng/crosstool-ng-1.26.0.tar.bz2或直接访问网址下载源码通过FTP上传至/arm/crosstool-ng目录下运行解压命令。
tar -xjvf crosstool-ng-1.26.0.tar.bz2进入/crosstool-ng-1.26.0目录查看目录下结构
1.2 尝试配置crosstool-ng安装依赖项
在/opt目录下新建/crosstool-ng目录
sudo mkdir /opt/crosstool-ng查看路径确保当前进入/crosstool-ng-1.26.0目录运行配置命令这里通过–prefix指定crosstool-ng安装目录为/opt/crosstool-ng
./configure --prefix/opt/crosstool-ng不出意外的话应该会报错 从报错信息可知缺少可用的C编译器
configure: error: in /home/tzw/arm/crosstool-ng/crosstool-ng-1.26.0:
configure: error: no acceptable C compiler found in $PATH通过命令查看确实没有安装gcc如果安装gcc的话会输出gcc版本
gcc -v这里我们不直接安装gcc通过安装build-essential同时安装gcc、g、make等依赖项build-essential 是编译程序的基础软件包通过命令可查看build-essential依赖关系
apt-cache depends build-essential安装build-essential
sudo apt install build-essential安装完成后再次运行命令不出意外的话应该还会报错
./configure --prefix/opt/crosstool-ng这次是缺少flex词法分析器工具因此安装flex
sudo apt install flex…… 按照上述步骤进行直至将crosstool-ng所有依赖软件包安装完毕。 运行configure配置成功输出结果
1.2.1 Crosstool-NG所需软件包
sudo apt install build-essential flex texinfo help2man gawk libtool libtool-bin bison libncurses5-devbuild-essential包含libc、gcc、g、make、dpkg-dev等在编译和构建软件时常用的工具和库flex即Fast Lexical Analyzer Generator是一个可以生成文法分析程序的工具texinfomakeinfo通过单个源文件来生成在线信息和打印输出的文档系统help2man从程序输出自动生成简单的手册文档gawk一种查找替换文本工具libtool通用库支持脚本将使用动态库的复杂性隐藏在统一、可移植的接口中使用libtool的标准方法可以在不同平台上创建并调用动态库主要的一个作用是在编译大型软件的过程中解决了库的依赖问题将繁重的库依赖关系的维护工作承担下来从而释放了程序员的人力资源。libtool提供统一的接口隐藏了不同平台间库的名称的差异等细节生成一个抽象的后缀名为la高层库libxx.la其实是个文本文件并将该库对其它库的依赖关系都写在该la的文件中;bison一种通用解析器生成器它将带注释的上下文无关文法转换为使用LALR1解析器表的确定性LR或广义LRGLR解析器libncurses5-devncurses库提供了一个API允许开发者在文本终端下使用图形用户界面。
1.3 编译及安装
确认当前路径为/crosstool-ng-1.26.0执行命令
./configure --prefix/opt/crosstool-ng
make
sudo make install安装完成后在/opt/crosstool-ng/bin路径下生成可执行文件文件ct-ng 将其添加到环境变量PATH中可以直接修改~/.bashrc文件也可以使用如下命令.bashrc文件位于当前登录用户默认home路径下
echo PATH$PATH:/opt/crosstool-ng/bin ~/.bashrc
source ~/.bashrc查看环境变量PATH确认添加成功
$PATH并查看是否安装成功
ct-ng -vGNU Make 4.3
Built for x86_64-pc-linux-gnu
Copyright (C) 1988-2020 Free Software Foundation, Inc.
License GPLv3: GNU GPL version 3 or later http://gnu.org/licenses/gpl.html
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.2 制作交叉编译工具链
使用crosstool-ng可以通过用户界面菜单进行配置也可以使用源码中自带的配置文件这里使用源码中自带的配置文件并通过用户界面菜单进行修改。
2.1 选择配置文件
在/crosstool-ng-1.26.0/samples路径下保存了各类CPU制作交叉编译工具链的示例配置文件
ls samples
或者
ct-ng list-samples这里以Armv8-A处理器中的Cortex-A53为例ARM Cortex-A53是一款基于ARMv8指令系统的八级流水线结构处理器。在28nm HPM制造工艺下、运行SPECint2000测试时单个核心的功耗不超过0.13W主频可达1.5Ghz。其推出市场之初是世界上能耗比最高、面积最小的64位应用处理器。
Cortex-A53为基于ARMv8-A架构的64位CPU拥有2种执行模式AArch64和AArch32因此选择/crosstool-ng-1.26.0/samples/aarch64-rpi3-linux-gnu/crosstool.config配置文件为基础进行配置。查看文件内容
cat aarch64-rpi3-linux-gnu/crosstool.configCT_CONFIG_VERSION4
CT_ARCH_ARMy
CT_ARCH_CPUcortex-a53
CT_ARCH_64y
CT_TARGET_VENDORrpi3
CT_KERNEL_LINUXy
CT_BINUTILS_LINKER_LD_GOLDy
CT_BINUTILS_GOLD_THREADSy
CT_BINUTILS_LD_WRAPPERy
CT_BINUTILS_PLUGINSy
CT_CC_LANG_CXXy
CT_DEBUG_GDBy前几项意义很明确后几项意义如下
CT_BINUTILS_LINKER_LD_GOLD使用ld.gold代替ld加快链接速度CT_BINUTILS_GOLD_THREADS使能多线程CT_BINUTILS_LD_WRAPPER使能wrap选项CT_BINUTILS_PLUGINS启用gold链接器的插件支持CT_CC_LANG_CXX支持C至于为什么不是CT_CC_LANG_CPP是因为CPP已经被使用了表示C PreProcessorCT_DEBUG_GDB启用gdb调试工具
在/crosstool-ng路径下新建src、crosstool-build、x-tools文件夹并将/crosstool-ng-1.26.0/samples/aarch64-rpi3-linux-gnu/crosstool.config文件复制到/crosstool-ng路径下重命名为.config后续将在/crosstool-ng路径下进行制作即${CT_TOP_DIR}~/arm/crosstool-ng
cd ~/arm/crosstool-ng
mkdir src crosstool-build x-tools
cp crosstool-ng-1.26.0/samples/aarch64-rpi3-linux-gnu/crosstool.config .config2.2 使用用户界面菜单进行配置
运行命令进入用户界面菜单配置在每个配置项条目上按下?将显示帮助信息。
对于需要配置的地方在后续小节中使用加粗显示其它条目仅进行介绍或略过。 Select 进入当前选项中进行详细设置 Exit 退出到上一层级 修改过程中及时使用 Save 保存避免丢失配置。
cd ~/arm/crosstool-ng
ct-ng menuconfig2.2.1 Paths and misc options
Crosstool-NG behavior
Use obsolete features使能此项将启用一些早先版本的功能如早先版本的内核头文件、gcc等。Try features marked as EXPERIMENTAL启用实验功能可能是未经验证的。Debug crosstool-NG按Y选择此项将新增3项按Y选择Save intermediate steps则可以保存构建过程中每一步的信息可以在构建中断后从中断处重新运行减少总时间。选择Save intermediate steps后将新增选择gzip saved states保持默认即可。
Paths
Local tarballs directory本地压缩包保存路径按回车进入设置将路径设置为${HOME}/arm/crosstool-ng/src这个路径用于保存制作工具链时需要下载的各项源码压缩包。Save new tarballs默认为选择。Prefer buildroot-style layout of the downloads使用和buildroot相同形式的目录结构这里默认不选择。Working directory工作目录路径将保存所有构建过程中的文件将路径设置为${CT_TOP_DIR}/crosstool-build。Prefix directory此路径为生成的工具链存储路径设置为{HOME}/arm/crosstool-ng/x-tools}…。Remove the prefix dir prior to building在每次构建前删除之前的构建文件默认选择。Remove documentation删除手册、信息等文档节省约8MiB空间默认选择。Install licenses安装所有组件的许可文件默认选择。Render the toolchain read-only将生成的工具链目录及其子目录设置为只读一般用于商用默认选择。Strip host toolchain executables去除宿主机下工具链可执行文件中不必要的信息可以加快编译速度默认选择。Strip targe toolchain executables去除目标机下工具链可执行文件中不必要的信息这里默认不选。
Downloading 配置源码包相关下载、校验等选项全部保持默认即可由于让crosstool-ng自己下载源码包太慢后续会直接从镜像源进行下载并保存至src路径下。 Extracting 源码包解压相关选项保持默认即可。 Logging 构建过程日志相关选项保持默认即可。
2.2.2 Target options
Target Architecture选择arm.
Options for arm
Suffix to the arch-partCPU架构后缀如armv5tel中的v5tel、alphaev6中的ev6用于指定架构的架构的具体分支且将附加到工具链名称上如armv5tel-linux-gnu-gcc。按理说应该输入v8-acrc之类的表示为armv8-acrc但这里暂时留空。Omit vendor part of the target tuple省略目标元组的供应商部分默认留空。
Generic target options
Build a multilib toolchain启用针对所选CPU架构的某些分支进行优化的C库尚未进行充分测试默认不选。Attempt to combine libraries into a single directory尝试将库合并到一个目录中由于并非工具链的所有使用者都可以处理在多个目录中的库因此crosstool-ng尝试将库组合进入单个/lib目录并将其他目录下的库创建为符号链接保存在此/lib目录下默认选择。Use the MMU使用MMU内存管理单元若所选的架构有MMU则选用默认选择。Endianness字节顺序默认选择小端 Little endian。BitnessCPU位数默认选择64-bit。
Target optimisations
Emit assembly for CPU根据所用GCC版本的手册选择这里按照配置文件中默认设置为cortex-a53。Target CFLAGS指定构建工具链过程中各个库的编译选项这里默认留空。Target LDFLAGS指定构建工具链过程中各个库的链接选项这里默认留空。
2.2.3 Toolchain options
General toolchain options
Use sysroot’ed toolchain使用gcc“闪亮的新功能”—sysroot允许用户构建可能需要额外依赖项的项目。例如假设必须在项目中使用库libasdf.so在构建了该库后将无法使用因为项目不知道如何找到这个库。当然可以通过指定在某个特定路径中查找这个库但在有许多库要使用的情况下将很不方便并且会产生混乱的标记。通过sysroot功能这将这些库安装到sysroot中避免上述问题。默认选择。sysroot directory name默认设置为sysroot。sysroot prefix dir保持留空。Build Static Toolchain构建静态工具链如果工具链需要在其它宿主机上运行且不确定是否有所需版本的库可以选择启用此项。默认不选择。Add crosstool-NG version to --version output增加版本信息默认选择。Toolchain ID string用于识别工具链内部版本的字符串默认留空。Toolchain bug URL用于反馈错误报告的链接默认留空。
Tuple completion and aliasing
Tuple’s vendor string工具链中供应商名称工具链名称形式为arch-vendor-kernel-system这里改为各位想改字符串的就行。Tuple’s sed transform默认留空。Tuple’s alias工具链别名默认留空。
Toolchain type 默认设置为Cross表示交叉编译。 Build system 保持默认状态。
2.2.4 Operating System
Target OS选择为linux。这里也可以选择为bare-metal表示为裸机程序构建的工具链。Show linux version from保持默认即可。Source of linux默认为Released tarball即发布的源码压缩包。Version of linux默认选择为6.4。Kernel verbosity暂时选择为Full commands。Build shared libraries默认选择。
2.2.5 Binary utilities
Binary format工具链二进制可执行文件默认格式默认ELF。Binutils二进制工具集默认选择为binutils。Show binutils versions from默认选择为GNU。Source of binutils默认为Released tarball即发布的源码压缩包。Version of binutilsbinutils版本默认选择2.40。Linkers to enable默认使能ldgold。Enable threaded gold默认使能gold的多线程并行链接功能。Add ld wrapper默认使能wrap选项。Enable support for plugins默认使能插件。Enable -z relro in ELF linker by default默认设置为M由所选架构的内部默认值来配置。Enable deterministic archives by default默认使能。binutils extra config默认留空。binutils libraries for the target默认留空。
2.2.6 C-library
C library默认选择glibc。Show glibc versions from默认为GNU。Source of glibc默认为Released tarball即发布的源码压缩包。Version of glibc默认选择为2.38.Build libidn add-on默认不选择。extra config默认留空。Extra config params默认留空。Enable debug symbols默认选择。extra target CFLAGS默认留空。Enable obsolete libcrypt不使用早先版本默认不选择。Disable symbols versioning默认不选择。Oldest supported ABI默认不选择。Force unwind support与某些架构的旧版本glibc上构建NPTL有关这里默认选择。Build and install locales默认不选择。Minimum supported kernel version与kernel headers保持一致Same as kernel headers (default)。Stack-smashing protection (SSP) in glibcglibc中堆栈崩溃保护设置为默认default。Enable -Werror during the build默认选择将警告信息视为编译错误。Enable -fcommon flag for older version of glibc when using GCC 10默认不选择。Threading implementation to use仅可选择为native。Create /etc/ld.so.conf file默认不选择。Install a cross ldd-like helper默认选择构建一个类似ldd的帮助程序。
2.2.7 C Compiler
均保持默认后续再看。
2.2.8 Debug facilities
选择gdb其它保持默认。
2.2.9 Companion libraries
配套库这里可以查看构建工具链所需的部分库可以根据此处列表提前下载各项源码。
expat-2.5.0
gettext-0.21
gmp-6.2.1
isl-0.26
libconv-1.16
mpc-1.2.1
mpfr-4.2.1
ncurses-6.4
zlib-1.2.13
zstd-1.5.52.2.10 Companion tools
默认都不选择
完成配置后进行保存 Save 然后退出 Exit 。
2.3 下载配套库源码压缩包
依次下载所需源码压缩包其中大部分压缩包可在镜像源网站上的gnu目录下找到并保存在~/arm/crosstool-ng/src路径下。
binutils-2.40二进制工具集包含addr2line、nm、readelf、size、objcopy、objdump、strings、strip、ar、ld、ranlibexpat-2.5.0快速流式XML解析器gcc-13.2.0GNU Compiler CollectionGNU编译器套件gdb-13.2程序调试工具gettext-0.21国际化语言支持库用于系统的国际化和本地化可以在编译程序的时候使用本国语言支持(NLS)可以使程序的输出使用用户设置的语言而不是英文glibc-2.38GNU发布的libc库即c运行库。glibc是linux系统中最底层的api几乎其它任何运行库都会依赖于glibcgmp-6.2.1GNU多精度算数库isl-0.26Integer Set Library for the polyhedral model多面体模型整数库集libiconv-1.16转换字符编码库linux-6.4mpc-1.2.1:用于复数的算术具有任意高的精度和正确的舍入结果的C库mpfr-4.2.1用于具有正确舍入的多精度浮点计算的C库ncurses-6.4字符终端处理库能提供功能键定义(快捷键),屏幕绘制以及基于文本终端的图形互动功能zlib-1.2.13一个免费的压缩库zstd-1.5.5开源压缩工具
binutils工具集指令
指令描述addr2line根据指令地址获取对应的函数、源文件名、行号nm列出程序文件中的符号以及在内存中的地址readelf显示有关ELF二进制文件的信息size查看目标文件中的段大小objcopy将一种对象文件翻译成另外一种objdump查看程序段信息以及反汇编strip剔除可执行程序中的调试信息ar将目标文件打包成静态库ld链接器ranlib生成文件的索引加快查找速度
2.4 ct-ng build
在~/arm/crosstool-ng路径下执行ct-ng build命令
cd ~/arm/crosstool-ng
ct-ng build然后就是等待……
等待……
等待……
经过65min23s的等待4-core2GHz迎来了……报错(ಥ_ಥ)
啊 这个错误查了很久最后在crosstool-ng的issue里找到了no usable python found at /usr/bin/python3 · 按照描述安装python-dev-is-python3即可
sudo apt install python-dev-is-python3然后因为前面配置的时候在Debug crosstool-NG选项中设置了Save intermediate steps因此可以直接使用命令继续build查看报错输出信息之前最后一次保存构建状态
Saving state to restart at step libc_post_cc...
Saving state to restart at step companion_libs_for_target...
Saving state to restart at step binutils_for_target...
Saving state to restart at step debug...因此输入下述命令可从step debug继续运行
ct-ng build RESTARTdebug最后一共经过95min12s的等待编译完成生成的交叉编译工具链位于~/arm/crosstool-ng/x-tools/aarch64-tzw-linux-gnu路径下 查看aarch64-tzw-linux-gnu-gcc版本
cd ~/arm/crosstool-ng/x-tools/aarch64-tzw-linux-gnu/bin
./aarch64-tzw-linux-gnu-gcc -vTarget: aarch64-tzw-linux-gnu
Configured with:/home/tzw/arm/crosstool-ng/crosstool-build/aarch64-tzw-linux-gnu/src/gcc/configure
--buildx86_64-build_pc-linux-gnu
--hostx86_64-build_pc-linux-gnu
--targetaarch64-tzw-linux-gnu
--prefix/home/tzw/arm/crosstool-ng/x-tools/aarch64-tzw-linux-gnu
--exec_prefix/home/tzw/arm/crosstool-ng/x-tools/aarch64-tzw-linux-gnu
--with-sysroot/home/tzw/arm/crosstool-ng/x-tools/aarch64-tzw-linux-gnu/aarch64-tzw-linux-gnu/sysroot
--enable-languagesc,c
--with-cpucortex-a53
--with-pkgversioncrosstool-NG 1.26.0
--enable-__cxa_atexit
--disable-libmudflap
--disable-libgomp --disable-libssp
--disable-libquadmath
--disable-libquadmath-support
--disable-libsanitizer
--disable-libmpx
--with-gmp/home/tzw/arm/crosstool-ng/crosstool-build/aarch64-tzw-linux-gnu/buildtools
--with-mpfr/home/tzw/arm/crosstool-ng/crosstool-build/aarch64-tzw-linux-gnu/buildtools
--with-mpc/home/tzw/arm/crosstool-ng/crosstool-build/aarch64-tzw-linux-gnu/buildtools
--with-isl/home/tzw/arm/crosstool-ng/crosstool-build/aarch64-tzw-linux-gnu/buildtools
--enable-lto
--enable-threadsposix
--enable-target-optspace
--enable-plugin --enable-gold
--disable-nls
--disable-multilib
--with-local-prefix/home/tzw/arm/crosstool-ng/x-tools/aarch64-tzw-linux-gnu/aarch64-tzw-linux-gnu/sysroot
--enable-long-longThread model: posix
Supported LTO compression algorithms: zlib zstd
gcc version 13.2.0 (crosstool-NG 1.26.0)交叉编译工具链制作成功
本章完结撒花✿✿ヽ(°▽°)ノ✿