链接器--as-needed标志不修剪库

时间:2014-05-08 19:16:10

标签: gcc linker ld

我将gcc从4.1.1升级到4.7.2后遇到了问题。问题是如果列出了足够的具有相互依赖关系的库,则ld --as-needed标志不会修剪不需要的库。

例如,如果我构建一个不需要任何特殊库的简单程序,但在构建行中包含它们,那么

gcc -m32 test.c -Wl,--as-needed -L/usr/local/lib -lrt -lprojcommon -lproj -lrte  -o test

然后它构建正常,并且--as-needed标志是否会修复所有列出的不需要的库。

ldd test
linux-gate.so.1 =>  (0x00bfc000)
libc.so.6 => /lib/libc.so.6 (0x001ac000)
/lib/ld-linux.so.2 (0x0018a000

但是,如果我再添加一个库(在本例中为crypto),则构建将失败并显示未定义的引用错误。

gcc -m32 test.c -Wl,--as-needed -L/usr/local/lib -lcrypto -lrt -lprojcommon -lproj -lrte  -o test

/usr/local/lib/librte.so: error: undefined reference to 'tla_decap_data'
/usr/local/lib/librte.so: error: undefined reference to 'do_db'
collect2: error: ld returned 1 exit status

这个完全相同的版本适用于4.1.1,但是在4.7.2开始失败。

这是一般构建基础设施的一部分,构建线上包含的库是通用的,预计将通过--as-needed进行修剪。我可以用--allow-shlib-undefined解决这个问题,但我更喜欢在构建时找到真正未解析的符号。如果我设置了--allow-shlib-undefined,那么我最终会得到与生成的构建相同的必需库集。

任何见解都将受到赞赏。

0 个答案:

没有答案
相关问题