Gcc 链接器--根据需要标记不修剪库

Gcc 链接器--根据需要标记不修剪库,gcc,linker,ld,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标志完成了它的工作,删除了所有列

在将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标志完成了它的工作,删除了所有列出的不需要的lib

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中开始失败

这是通用构建infra的一部分,构建行中包含的库是通用的,预计将根据需要通过进行修剪。我可以用--allow shlib undefined来修复这个问题,但我更愿意在构建时找到真正的未解析符号。如果我确实设置了--allow shlib undefined,那么我最终得到的是与运行的构建相同的一组必需的lib


任何洞察都将不胜感激。

是test.c只是
int main(){return 0;}
还是它有更多可能使用不吉利名称的内容?如果删除-lrte,它会工作吗?实际链接了哪些库?是所有的lib.so还是其中一个是a.a?是的,test.c只是一个空的主函数。所有的都是共享的,所以图书馆。如果我删除[-lcrypto,-lprojcommon,-lproj,-lrte]中任何一个不需要的lib,那么链接可以工作,实际链接的库保持不变,就像我列出它们并使用--allow shlib undefined、[linux-gate.so、libc.so、ld linux.so]一样。我开始认为这可能是一个链接器bug…是的,向链接器人员(对于GNU binutils)报告它是有意义的,尽管您可能希望首先使用更新版本的ld来尝试,因此您的报告会得到更多的考虑。一旦他们发现发生了什么,请记住在这里发布结果。