Cross-ld找不到libstdc ++。a,但不应该一直在寻找

时间:2015-07-27 14:44:13

标签: arm ld

我正在使用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的任何你尚未分配的东西”吗?

1 个答案:

答案 0 :(得分:2)

链接器查找en-us的原因是在libstdc++.a部分的链接描述文件中提到了该库。

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

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