我将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,那么我最终会得到与生成的构建相同的必需库集。
任何见解都将受到赞赏。