gpt4 book ai didi

arm - cross-ld 找不到 libstdc++.a,但不应该一直找

转载 作者:行者123 更新时间:2023-12-01 02:07:09 25 4
gpt4 key购买 nike

我正在使用 OS X 和 Debian 上托管的 GCC 构建 arm-eabi(arm-none-eabi 的别名)。相关代码不使用 C++。但是,链接在 Debian 上失败

/opt/gnat-gpl-2015/bin/../lib/gcc/arm-eabi/4.9.3/../../../../arm-eabi/bin/ld: cannot find libstdc++.a
collect2: error: ld returned 1 exit status

这让我感到惊讶,因为报告的链接行(带有 -Wl,-v )没有提到 libstdc++要么(见文末)。

Debian 版本没有交叉 libstdc++.a ,而 OS X 版本确实如此(我不知道这是怎么发生的;它只包含 empty_arm_object.o )。如果我复制这个 libstdc++.a在 Debian 方面,构建工作正常;但我想首先了解为什么需要它。

链接命令行(为了清晰起见进行了编辑,我希望)是
/opt/gnat-gpl-2015/bin/../lib/gcc/arm-eabi/4.9.3/../../../../arm-eabi/bin/ld                            \
-plugin \
/opt/gnat-gpl-2015/bin/../libexec/gcc/arm-eabi/4.9.3/liblto_plugin.so \
-plugin-opt=/opt/gnat-gpl-2015/bin/../libexec/gcc/arm-eabi/4.9.3/lto-wrapper \
-plugin-opt=-fresolution=/tmp/cctcp4CP.res \
-EL \
-X \
-o \
/home/simon/cortex-gnat-rts/test-stm32f4//testbed \
-L/home/simon/cortex-gnat-rts/test-stm32f4/.build/ \
-L/home/simon/cortex-gnat-rts/test-stm32f4/.build/ \
-L/home/simon/cortex-gnat-rts/test-stm32f4/../stm32f429i-disco-rtos/adalib/ \
-L/opt/gnat-gpl-2015/bin/../lib/gcc/arm-eabi/4.9.3/fpu \
-L/opt/gnat-gpl-2015/bin/../lib/gcc/arm-eabi/4.9.3/../../../../arm-eabi/lib/fpu \
-L/opt/gnat-gpl-2015/bin/../lib/gcc/arm-eabi/4.9.3 \
-L/opt/gnat-gpl-2015/bin/../lib/gcc \
-L/opt/gnat-gpl-2015/bin/../lib/gcc/arm-eabi/4.9.3/../../../../arm-eabi/lib \
testbed.o \
b__testbed.o \
/home/simon/cortex-gnat-rts/test-stm32f4/.build/last_chance_handler.o \
/home/simon/cortex-gnat-rts/test-stm32f4/.build/memory_streams.o \
/home/simon/cortex-gnat-rts/test-stm32f4/.build/containing.o \
/home/simon/cortex-gnat-rts/test-stm32f4/.build/dispatching.o \
/home/simon/cortex-gnat-rts/test-stm32f4/.build/iteration.o \
/home/simon/cortex-gnat-rts/test-stm32f4/.build/so.o \
/home/simon/cortex-gnat-rts/test-stm32f4/.build/streams.o \
/home/simon/cortex-gnat-rts/test-stm32f4/.build/strings.o \
/home/simon/cortex-gnat-rts/test-stm32f4/../stm32f429i-disco-rtos//adalib/libgnat.a \
/home/simon/cortex-gnat-rts/test-stm32f4/../stm32f429i-disco-rtos//adalib/libbsp-rtos.a \
-lgcc \
-Map /home/simon/cortex-gnat-rts/test-stm32f4/testbed.map \
-T /home/simon/cortex-gnat-rts/test-stm32f4/../stm32f429i-disco-rtos//adalib/stm32f429i-flash.ld
/opt/gnat-gpl-2015/bin/../lib/gcc/arm-eabi/4.9.3/../../../../arm-eabi/bin/ld: cannot find libstdc++.a
collect2: error: ld returned 1 exit status

链接描述文件的结尾包含
/DISCARD/ :
{
libc.a ( * )
libm.a ( * )
libgcc.a ( * )
libstdc++.a ( * )
}

/DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink) *(.gnu.lto_*) }

第一个显然是 arm-eabi-ld正在查找对 libstdc++.a 的引用.恐怕这些部分是从网络上的某个地方盲目复制的,我不知道第一个实际上是做什么的。是“来自 libstdc++.a 的任何东西”吗?你还没有分配”?

最佳答案

链接器正在寻找的原因 libstdc++.a是在 /DISCARD/ 中的链接描述文件中提到了该库。部分。

/DISCARD/ 中包含整个文件似乎很奇怪部分,其目的是省略输入的某些部分。如果您不想包含该文件,请将其排除在链接命令行之外!

调查显示ld在这种情况下有一个意外的行为,其中包括 libc.a/DISCARD/部分与包含 -lc 的效果非常相似(如果不相同)在链接命令行中;并且在这种情况下使用的链接命令行结束 -nostdlib -lgcc .应该是 -nostdlib -lgcc -lc .这,连同删除奇特的 /DISCARD/部分,解决了问题。

关于arm - cross-ld 找不到 libstdc++.a,但不应该一直找,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31656189/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com