Buildroot使用外部编译工具链

以ARM32和ARM64两种架构举例。

一、ARM32

工具链:gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz

$ tar -xf arm-linux-gnueabihf/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz
$ mv arm-linux-gnueabihf/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf gcc-linaro-arm-linux-gnueabihf
$ ls gcc-linaro-arm-linux-gnueabihf/bin
arm-linux-gnueabihf-addr2line
...
arm-linux-gnueabihf-g++
arm-linux-gnueabihf-gcc
...
arm-linux-gnueabihf-strip

buidroot配置:qemu_arm_vexpress_defconfig.

$ make qemu_arm_vexpress_defconfig
$ make menuconfig

执行如下配置:

Toolchain  --->
    Toolchain type (External toolchain)  --->
    Toolchain (Custom toolchain)  --->
    Toolchain origin (Pre-installed toolchain)  --->
    (${home}/toolchain/gcc-linaro-arm-linux-gnueabihf) Toolchain path
    (arm-linux-gnueabihf) Toolchain prefix
    External toolchain gcc version (7.x)  --->
    External toolchain kernel headers series (4.10.x)  --->
    External toolchain C library (glibc)  --->
    [*] Toolchain has SSP support? (NEW)
    [*]   Toolchain has SSP strong support? (NEW)
    [*] Toolchain has RPC support? (NEW)
    [*] Toolchain has C++ support?
    [ ] Toolchain has D support?
    [*] Toolchain has Fortran support?
    [*] Toolchain has OpenMP support?

然后就可以正常编译了,如果工具链有差异,buildroot也会在编译过程中,报错退出,并告诉你开启什么关闭什么,根据提示修改后,就可以再次尝试编译,直到成功。

二、ARM64

工具链:gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz

$ tar -xf aarch64-linux-gnu/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz
$ mv aarch64-linux-gnu/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu aarch64-linux-gnu/gcc-linaro-aarch64-linux-gnu
$ ls gcc-linaro-aarch64-linux-gnu/bin
aarch64-linux-gnu-addr2line
... ...
aarch64-linux-gnu-g++
aarch64-linux-gnu-gcc
... ...
aarch64-linux-gnu-strip

buidroot配置:qemu_aarch64_virt_defconfig.

$ make qemu_aarch64_virt_defconfig
$ make menuconfig

执行如下配置:

Toolchain  --->
    Toolchain type (External toolchain)  --->
    *** Toolchain External Options ***
    Toolchain (Custom toolchain)  --->
    Toolchain origin (Pre-installed toolchain)  --->
    (${home}/toolchain/gcc-linaro-aarch64-linux-gnu) Toolchain path
    (aarch64-linux-gnu) Toolchain prefix
    External toolchain gcc version (7.x)  --->
    External toolchain kernel headers series (4.10.x)  --->
    External toolchain C library (glibc)  --->
    [*] Toolchain has SSP support? (NEW)
    [*]   Toolchain has SSP strong support? (NEW)
    [*] Toolchain has RPC support? (NEW)
    [*] Toolchain has C++ support?
    [ ] Toolchain has D support? (NEW)
    [*] Toolchain has Fortran support?
    [*] Toolchain has OpenMP support?

注:工具请填写绝对路径。

三、C库

如果不想每个elf都静态编译,则把常用的C库放到目标板上,这样,每次elf运行就可以动态链接依赖库了。

不知道为什么,buildroot编译时,默认就把常用的C库复制到目标板了。如果没有自动复制到文件系统,可以配置如下:

$ make menuconfig

找到如下路径:

Toolchain  --->
    ()  Extra toolchain libraries to be copied to target

在其中填入如下内容(复制粘贴过去即可):

ld-linux.so.3 libc.so.6 libm.so.6 libpthread.so.0 libdl.so.2 libresolv.so.2 librt.so.1 libnss_files.so.2 libnss_dns.so.2 libutil.so.1
  • ld-linux.so.3: 动态链接器/加载器,所有动态链接程序都需要它。
  • libc.so.6: GNU C 库的核心。
  • libm.so.6: 数学库。
  • libpthread.so.0: POSIX 线程库。
  • libdl.so.2: 动态链接库(用于 dlopen 等函数)。
  • libresolv.so.2: DNS 解析库。
  • librt.so.1: POSIX 实时扩展库。
  • libnss_files.so.2, libnss_dns.so.2: Name Service Switch 库,用于解析主机名等(例如 /etc/hosts 和 DNS)。
  • libutil.so.1: 包含一些工具函数。

这样,就可以使用动态链接版的elf文件了。

posted @ 2026-02-19 23:44  this毛豆  阅读(56)  评论(0)    收藏  举报