栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

用crosstool-ng工具制作arm 32bit的交叉编译链

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

用crosstool-ng工具制作arm 32bit的交叉编译链

环境:

宿主机:windows 10 ,64 bit
VMware: Pro 15
linux: ubuntu 18.04 , 64bit
crosstool版本:crosstool-ng-1.24.0-rc2

下载安装crosstool-ng:

官网下载:crosstool-ng.org
默认安装:configure , make , make install
按提示安装各种依赖库…libtool, texinfo(makeinfo), bison, flex, gawk, libncurses5-dev, automake

编译命令ct-ng 在/usr/local/bin
支持文件在:/usr/local/share/crosstool-ng

biren@ubuntu:~/crossbuild$ ct-ng -v
GNU Make 4.1
Built for x86_64-pc-linux-gnu
Copyright (C) 1988-2014 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later 
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
交叉编译链工具制作:

需要的步骤:
命令:ct-ng list-steps

biren@ubuntu:~/crossbuild$ ct-ng list-steps 
Available build steps, in order:
  - companion_tools_for_build
  - companion_libs_for_build
  - binutils_for_build
  - companion_tools_for_host
  - companion_libs_for_host
  - binutils_for_host
  - cc_core_pass_1
  - kernel_headers
  - libc_start_files
  - cc_core_pass_2
  - libc_main
  - cc_for_build
  - cc_for_host
  - libc_post_cc
  - companion_libs_for_target
  - binutils_for_target
  - debug
  - test_suite
  - finish
Use "" as action to execute only that step.
Use "+" as action to execute up to that step.
Use "+" as action to execute from that step onward.

查看支持哪些工具链:
命令:ct-ng list-samples

biren@ubuntu:~/crossbuild$ ct-ng list-samples
Status  Sample name
[G..X]   aarch64-unknown-linux-android
[G...]   aarch64-unknown-linux-gnu
[G...]   aarch64-unknown-linux-uclibc
[G...]   arm-bare_newlib_cortex_m3_nommu-eabi
[G...]   arm-cortex_a15-linux-gnueabihf
[G..X]   arm-cortexa5-linux-uclibcgnueabihf
[G...]   arm-cortex_a8-linux-gnueabi
[G..X]   arm-cortexa9_neon-linux-gnueabihf

[G...]   arm-unknown-eabi
[G...]   arm-unknown-linux-gnueabi
[G..X]   arm-unknown-linux-musleabi
[G...]   arm-unknown-linux-uclibcgnueabi
[G..X]   arm-unknown-linux-uclibcgnueabihf
[G...]   armv6-nommu-linux-uclibcgnueabi
[G...]   armv6-rpi-linux-gnueabi
[G...]   armv7-rpi2-linux-gnueabihf
[G...]   armv8-rpi3-linux-gnueabihf
[G...]   x86_64-unknown-linux-gnu
[G...]   x86_64-unknown-linux-uclibc
...

此处以常用的arm-unknown-linux-gnueabi为例,32位arm架构

生成配置文件:

命令:ct-ng arm-unknown-linux-gnueabi

biren@ubuntu:~/crossbuild$ ct-ng arm-unknown-linux-gnueabi 

生成的配置文件.config在~/crossbuild目录下,此配置文件里已经包含默认的选项
此配置文件也可以从/usr/local/share/crosstool-ng/samples选一个复制改名而来。

修改配置:

命令:ct-ng menuconfig

biren@ubuntu:~/crossbuild$ ct-ng menuconfig 

Paths and misc options —>

Debug crosstool-NG , Save intermediate steps 可以记录每一个阶段的状态,以便在出错时可以从此状态继续运行,而不用从头开始。

Local tarballs directory :源码文件存放地
Working directory :工作目录
最长那项是prefix directory, 即结果安装目录, 此处是/home/biren/x-tools

Number of parallel jobs :并行线程数量
0默认,系统确定
通常设置成系统CPU内核数的2倍,如有2内核则设置为4,以提高编译速度
效果类似于:ct-ng build.4 , make -j4

Target options —>
选择目标架构

Floating point: 浮点运算方式,这里选的是软件计算方式

Toolchain options —>
Tuple’s vendor string供应商名

Operating System —>
版本:linux-4.20.8

Binary utilities —>
binutils版本:2.27

Linkers to enable:
ld支持的模式,开始选中ld, gold引起后面的一个问题

C-library —>
glibc版本:2.29

C compiler —>
选择gcc版本:6.5.0

c++支持:

Debug facilities —>
调试相关的配置

Companion libraries —>

Companion tools —>

保存退出。

开始编译:

命令:ct-ng build

biren@ubuntu:~/crossbuild$ ct-ng build

[INFO ]  Performing some trivial sanity checks
[WARN ]  Number of open files 1024 may not be sufficient to build the toolchain; increasing to 2048
[INFO ]  Build started 20220508.112539
[INFO ]  Building environment variables
[EXTRA]  Preparing working directories
[EXTRA]  Installing user-supplied crosstool-NG configuration
[EXTRA]  =================================================================
[EXTRA]  Dumping internal crosstool-NG configuration
[EXTRA]    Building a toolchain for:
[EXTRA]      build  = x86_64-pc-linux-gnu
[EXTRA]      host   = x86_64-pc-linux-gnu
[EXTRA]      target = arm-jwj-linux-gnueabi
[EXTRA]  Dumping internal crosstool-NG configuration: done in 0.48s (at 00:06)
。。。

错误:
isl: download failed

[EXTRA]    Retrieving 'isl-0.20'
[ERROR]    isl: download failed
[ERROR]   
[ERROR]  >>
[ERROR]  >>  Build failed in step 'Retrieving needed toolchain components' tarballs'
[ERROR]  >>        called in step '(top-level)'

原因:
isl-0.20包原来的下载地址失效了,
手动下载后放入.build/arm-jwj-linux-gnueabi/src
错误:

[EXTRA]    Retrieving 'libelf-0.8.13'
[ERROR]    libelf: download failed

原因:
libelf-0.8.13包下载地址失效
解决同上

错误:

[INFO ]  Retrieving needed toolchain components' tarballs
[EXTRA]    Retrieving 'expat-2.2.6'
[ERROR]    expat: download failed

解决同上
错误 :
duma: download failed

[EXTRA]    Retrieving 'duma_2_5_15'
[ERROR]    duma: download failed

解决同上
错误 :
Error: unknown pseudo-op: `.q’

[INFO ]  Installing gettext for host: done in 0.05s (at 22:30)
[INFO ]  Saving state to restart at step 'binutils_for_host'...
[INFO ]  ====================================
Installing binutils for host
[EXTRA]    Configuring binutils
[EXTRA]    Building binutils
[ERROR]    {standard input}:1210938: Error: unknown pseudo-op: `.q'
[ERROR]    g++: internal compiler error: Killed (program cc1plus)
[ERROR]    make[5]: *** [aarch64.o] Error 4
[ERROR]    make[5]: *** Waiting for unfinished jobs....
[ERROR]    make[4]: *** [all-recursive] Error 1
[ERROR]    make[3]: *** [all] Error 2
[ERROR]    make[2]: *** [all-gold] Error 2
[ERROR]    make[1]: *** [all] Error 2

这个问题与上面说的ld模式相关,可能是组合版本不匹配
解决:只选“ld”那一项即可
ld有三种模式:
ld.bfd, ld.gold , lld,链接优化速度依次增大

错误 :
fatal error: error writing to /tmp/ccNZtMAk.s: No space left on device

[INFO ]    Building for multilib 1/1: '': done in 1349.45s (at 122:54)
[INFO ]  Installing C library: done in 1349.84s (at 122:54)
[INFO ]  Saving state to restart at step 'cc_for_build'...
[INFO ]  Saving state to restart at step 'cc_for_host'...
[INFO ]  =================================================================
[INFO ]  Installing final gcc compiler
[EXTRA]    Configuring final gcc compiler
[EXTRA]    Building final gcc compiler
[ERROR]    /home/biren/crossbuild/.build/arm-jwj-linux-gnueabi/src/gcc/libgcc/fixed-bit.c:379:1: fatal error: error writing to /tmp/ccNZtMAk.s: No space left on device
[ERROR]    make[3]: *** [_mulUHA.o] Error 1
[ERROR]    make[3]: *** Waiting for unfinished jobs....
[ERROR]    make[2]: *** [all-target-libgcc] Error 2
[ERROR]    make[1]: *** [all] Error 2

原因:
系统空间不足,清理空间后重新运行
从中断处继续运行:
上一个保留的状态参考这句:
[INFO ] Saving state to restart at step ‘cc_for_host’…
即状态是:cc_for_host ,运行时在后面加上+号

biren@ubuntu:~/crossbuild$ ct-ng cc_for_host+

[INFO ]  Performing some trivial sanity checks
[WARN ]  Number of open files 1024 may not be sufficient to build the toolchain; increasing to 2048
[INFO ]  Build started 20220508.222414
[INFO ]  Building environment variables
[EXTRA]  Preparing working directories
[INFO ]  Restoring state at step 'cc_for_host', as requested.
[INFO ]  =================================================================
[INFO ]  Installing final gcc compiler
[EXTRA]    Configuring final gcc compiler
[EXTRA]    Building final gcc compiler
[56:24]  
正常结束:

结果存放在:/home/biren/x-tools/

......
[INFO ]  Finalizing the toolchain's directory
[INFO ]    Stripping all toolchain executables
[EXTRA]    Installing the populate helper
[EXTRA]    Installing a cross-ldd helper
[EXTRA]    Creating toolchain aliases
[EXTRA]    Collect license information from: /home/biren/crossbuild/.build/arm-jwj-linux-gnueabi/src
[EXTRA]    Put the license information to: /home/biren/x-tools/arm-jwj-linux-gnueabi/share/licenses
[INFO ]  Finalizing the toolchain's directory: done in 43.90s (at 71:29)
[INFO ]  Build completed at 20220509.093239
[INFO ]  (elapsed: 849:25.21)
[INFO ]  Finishing installation (may take a few seconds)...

工具链目录:

biren@ubuntu:~$ tree -d -L 3 x-tools/
x-tools/
└── arm-jwj-linux-gnueabi
    ├── arm-jwj-linux-gnueabi
    │   ├── bin
    │   ├── debug-root
    │   ├── include
    │   ├── lib
    │   └── sysroot
    ├── bin
    ├── include
    │   └── gdb
    ├── lib
    │   ├── bfd-plugins
    │   ├── gcc
    │   └── ldscripts
    ├── libexec
    │   └── gcc
    └── share
        ├── gcc-6.5.0
        ├── gdb
        ├── info
        ├── licenses
        └── man

bin:

验证一下:
biren@ubuntu:~$ cat helloARM.c 
#include 
int main()
{
	printf("Hello ARM 32 bit ! n");
	return 0;
}
biren@ubuntu:~$ ./x-tools/arm-jwj-linux-gnueabi/bin/arm-jwj-linux-gnueabi-gcc ./helloARM.c -o helloARM
biren@ubuntu:~$ file helloARM 
helloARM: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.3, for GNU/Linux 4.20.8, with debug_info, not stripped
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/870161.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号