【问题标题】:Can't access Buildroot staging libraries via ./configure when cross compiling. It fails on test compile.交叉编译时无法通过 ./configure 访问 Buildroot 暂存库。它在测试编译时失败。
【发布时间】:2016-04-17 21:13:09
【问题描述】:

案例 1 arm-linux-gcc -v hello.c ==> 工作

案例 2
arm-linux-gcc -v -L/home/peter/igep2015/09Buildroot/buildroot-2016.02-TRY5/output/staging/usr/lib hello.c ==> 不工作 错误:ld.bfd:找不到 /usr/lib/libc_nonshared.a 错误:ld.bfd:找不到 /lib/ld-linux.so.3

案例 3 arm-linux-gcc -v --sysroot=/home/peter/igep2015/09Buildroot/buildroot-2016.02-TRY5/output/host/usr/armeb-buildroot-linux-gnueabi/sysroot/hello.c ==>WORKS 但说它忽略了 sysroot,因为它找不到 /usr/include 所以就像 case#1 注意 buildroot-staging 符号链接到 buildroot-sysroot

各自的 libc 库位于:
/usr/local/xtools/arm-unknown-linux-gnueabi/arm-unknown-linux-gnueabi/sysroot/usr/lib/:/usr/local/xtools/arm-unknown-linux-gnueabi/arm-unknown-linux -gnueabi/sysroot/lib/

/home/peter/igep2015/09Buildroot/buildroot-2016.02-TRY5/output/host/usr/armeb-buildroot-linux-gnueabi/sysroot/usr/lib:/home/peter/igep2015/09Buildroot/buildroot-2016.02 -TRY5/output/host/usr/armeb-buildroot-linux-gnueabi/sysroot/lib/

/arm-linux 和 Buildroot 库似乎相同。交叉工具用于构建 Buildroot。

问题是:为什么当我链接到 Buildroot 暂存库时 arm-linux-gcc 会失败。出现这个问题是因为自动工具 ./configure 失败并带有 -L 到 Buildroot。但是我需要 -L 来访问 Buildroot 中的 libSDL2、libfreetype 等,以便交叉编译 SDL2_ttf。

注意:我使用的是 (crosstool-NG 1.21.0) 5.1.0。

【问题讨论】:

    标签: linux sdl-2 buildroot


    【解决方案1】:

    只是不要做任何你正在做的事情。 Buildroot 交叉编译器配置为自动搜索 $(STAGING_DIR)/usr/lib 中的库和 $(STAGING_DIR)/usr/include 中的头文件。不需要您描述的任何黑客攻击。

    【讨论】:

    • 不幸的是,我正在使用 Buildroot 外部的交叉编译器 - crosstool-ng-1.21.0 我测试了 Thomas 的建议,而 crosstool-ng-1.21.0 似乎无法识别环境变量$STAGING_DIR ...除非我在 ct-ng 配置中遗漏了一些东西。
    【解决方案2】:

    这是一个非常奇怪的问题。 /lib/ 有效,但 /usr/lib 无效。

    具体...

    arm-linux-gcc -L/home/peter/igep2015/09Buildroot/buildroot-2016.02-TRY5/output/host/usr/armb-buildroot-linux-gnueabi/sysroot/lib  hello.c
    

    ....有效

    但是……

    arm-linux-gcc -L/home/peter/igep2015/09Buildroot/buildroot-2016.02-TRY5/output/host/usr/armb-buildroot-linux-gnueabi/sysroot/usr/lib  hello.c
    

    ....失败

    已解决:

    注意:要解决这些链接器问题,请使用命令。

    arm-linux-gcc -Wl,--verbose -L/home/peter/igep2015/09Buildroot/buildroot- 2016.02-TRY5/output/staging/usr/lib hello.c
    

    案例2的原因

    arm-linux-gcc -Wl,--verbose -L/home/peter/igep2015/09Buildroot/buildroot-2016.02-TRY5/output/staging/usr/lib hello.c
    

    不起作用是首先搜索 -L... 并且 libc.so(包含依赖于 gcc sysroot 以查找 libc_nonshared.a 等的链接器脚本命令)在 Buildroot 中找到,然后在 gcc 库中正确找到。

    CASE 1和CASE 3的原因

    arm-linux-gcc -Wl,--verbose -L/home/peter/igep2015/09Buildroot/buildroot-2016.02-TRY5/output/staging/lib hello.c  AND   
    arm-linux-gcc -Wl,--verbose hello.c
    

    两者都起作用是没有找到包含依赖于 gcc sysroot 的链接器脚本命令的库。因此,在 gcc 库中找到了正确的链接器脚本命令 libc.so。

    阅读第二个答案 crosstools-ng can't find pthread.so

    您会看到 gcc 链接描述文件命令 GROUP 的行为如下:
    GROUP 在 sysroot 中查找 IF
    -1- 脚本在 sysroot 前缀中 AND
    -2- sysroot 前缀已配置 AND
    -3- 文件名以 /
    开头 否则 GROUP 仅在当前目录中查找。

    确认正在使用的 sysroot 前缀......

    arm-linux-gcc -print-sysroot
    /usr/local/xtools/arm-unknown-linux-gnueabi/arm-unknown-linux-gnueabi/sysroot
    

    有几种假定的方法可以解决 CASE 2 问题

    解决方案 #1

    从 Buildroot 中删除 libc.so。然后链接器会继续搜索并正确找到 gcc sysroot 中的 libc.so。

    rm /home/peter/igep2015/09Buildroot/buildroot-2016.02-TRY5/output/staging/usr/lib/libc.so
    

    解决方案 #2

    将 gcc sysroot 更改为 Buildroot,如案例 3 所示。

    解决方案 #3

    将Buildroot的libc.so中的链接脚本命令修改如下:

    发件人:

    /* GNU ld script
        Use the shared library, but some functions are only in
       the static library, so try that secondarily.  */
    OUTPUT_FORMAT(elf32-littlearm)
    GROUP ( /lib/libc.so.6 /usr/lib/libc_nonshared.a  AS_NEEDED ( /lib/ld-linux.so.3 ) )
    

    收件人:

    /* GNU ld script
       Use the shared library, but some functions are only in
       the static library, so try that secondarily.  */
    OUTPUT_FORMAT(elf32-littlearm)
    GROUP ( ../../lib/libc.so.6 libc_nonshared.a  AS_NEEDED ( ../../lib/ld-linux.so.3 ) )
    

    【讨论】:

      猜你喜欢
      • 2020-01-05
      • 1970-01-01
      • 1970-01-01
      • 2014-07-16
      • 2011-07-05
      • 2021-04-12
      • 2016-09-15
      • 2018-08-08
      • 2016-09-11
      相关资源
      最近更新 更多