-l
选项指定库时,并且不需要该库(在该库中没有引用任何符号),有时链接器会存储对该库的引用(选项
--no-as-needed
),有时不会(选项--as-needed
)。记录的(man ld
)行为是包括库。因此,默认选项为--no-as-needed
。
wo,在ubuntu上,似乎默认值为--as-needed
你知道为什么吗?llet的例子。考虑空的程序
man ld
,除了标准C库外,什么也没有引用:
test1.c
int main(int argc, char* argv[])
{
}
ubuntu 24.10与GCC 14.2.0,我们得到了:
-lsrt
另一方面,在Fedora 41的GCC 14.2.1上,默认值与gcc -c test1.c
echo "=== default"
gcc test1.o -lsrt -o test1
ldd test1
echo "=== --as-needed"
gcc test1.o -Wl,--as-needed -lsrt -o test1
ldd test1
echo "=== --no-as-needed"
gcc test1.o -Wl,--no-as-needed -lsrt -o test1
ldd test1
.。
这个问题已经在2018年在这里得到了
,但没有答案。
/
=== default
linux-vdso.so.1 (0x0000f2c7dae1c000)
libc.so.6 => /lib/aarch64-linux-gnu/libc.so.6 (0x0000f2c7dabe0000)
/lib/ld-linux-aarch64.so.1 (0x0000f2c7dadd0000)
=== --as-needed
linux-vdso.so.1 (0x0000ff893479c000)
libc.so.6 => /lib/aarch64-linux-gnu/libc.so.6 (0x0000ff8934560000)
/lib/ld-linux-aarch64.so.1 (0x0000ff8934750000)
=== --no-as-needed
linux-vdso.so.1 (0x0000e80830bea000)
libsrt.so.1.5 => /lib/aarch64-linux-gnu/libsrt.so.1.5 (0x0000e80830a90000)
libc.so.6 => /lib/aarch64-linux-gnu/libc.so.6 (0x0000e808308d0000)
libcrypto.so.3 => /lib/aarch64-linux-gnu/libcrypto.so.3 (0x0000e80830200000)
libstdc++.so.6 => /lib/aarch64-linux-gnu/libstdc++.so.6 (0x0000e8082fe00000)
libm.so.6 => /lib/aarch64-linux-gnu/libm.so.6 (0x0000e80830820000)
libgcc_s.so.1 => /lib/aarch64-linux-gnu/libgcc_s.so.1 (0x0000e808307e0000)
/lib/ld-linux-aarch64.so.1 (0x0000e80830ba0000)
libz.so.1 => /lib/aarch64-linux-gnu/libz.so.1 (0x0000e808307a0000)
libzstd.so.1 => /lib/aarch64-linux-gnu/libzstd.so.1 (0x0000e80830140000)
/
--no-as-needed
-Schism于2013年与Debian发生 惠兹(Wheezy 默认情况下的链接器。随后,德比安(Debian)衍生的发行版(包括Ubuntu)跟随套房,而Fedora及其衍生产品保持了老式。连接器(
--as-needed
)没有更改。区别是是否 默认情况下,发行版的GCC构建
--no-as-needed
将链接传递给链接器
在显式和隐式库(从而覆盖列链接默认)之前。
debian为什么要这样去? 这里是理由。
如您自己的示例所示,您可以使用--as-needed
ld
链接 比
--as-needed
的工作更多。因此,有一个判断的权衡
可能有所不同