作者feelthat (云端传送)
看板Programming
标题[讨论] -Wl,--as-needed 该如何使用
时间Sat May 20 23:08:33 2023
gcc 在编译时提供了 -Wl,--as-needed 和 -Wl,--no-as-needed 两个选项,
这两个选项前者是开启特性,後者是取消特性。
在生成可执行文件的时候,通过 -lxxx 选项指定需要链接的库文件。以动态库为例,如
果我们指定了一个需要链接的库,则连接器会在可执行文件的文件头中会记录下该库的
信息。而後,在可执行文件运行的时候,动态加载器会读取文件头信息,并加载所有的
链接库。在这个过程中,如果用户指定链接了一个毫不相关的库,则这个库在最终的
可执行程序运行时也会被加载,如果类似这样的不相关库很多,会明显拖慢程序启动
过程。
这时,通过指定 -Wl,--as-needed 选项,链接过程中,链接只会检查所有的依赖库,没
有实际被引用的库,不再写入可执行文件头。最终生成的可执行文件头中包含的都是必要
的链接库信息。
//main.cpp
#include <iostream>
int main()
{
std::cout << "Hello, World" << std::endl;
}
> g++ -Wl,--as-needed -lpthread -o main main.cpp
查看可执行文件 main 的文件头中是否包含 pthread 库:
ldd main
linux-vdso.so.1 (0x00007ffce44b7000)
libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fd84013f000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fd83ff7e000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fd83fdfb000)
/lib64/ld-linux-x86-64.so.2 (0x00007fd8402e5000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fd83fde1000)
可见即使在命令行中指定了 -lpthread,一旦指定了 -Wl,--as-needed 选项,由於
pthread 库不是必须的,所以不会在可执行文件中记录 libphread
(以上 from Ruo_Xiao)
-Wl,--as-needed 删除的是没用到的依赖库 不是Api function
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 218.187.81.159 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Programming/M.1684595315.A.6B7.html
※ 编辑: feelthat (114.32.93.159 台湾), 05/30/2023 14:12:34