我正在使用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
的任何你尚未分配的东西”吗?
答案 0 :(得分:2)
链接器查找en-us
的原因是在libstdc++.a
部分的链接描述文件中提到了该库。
在/DISCARD/
部分中包含整个文件似乎很奇怪,其目的是省略输入的某些部分。如果您不想包含该文件,请将其保留在链接命令行之外!
调查显示/DISCARD/
在这种情况下有意外行为,因为ld
部分中的libc.a
与包含{{1}的效果非常相似(如果不相同)在链接命令行中;在这种情况下使用的链接命令行结束/DISCARD/
。应该是-lc
。这与删除特殊的-nostdlib -lgcc
部分一起解决了这个问题。