gcc / -Wl,--as-needed、 -Wl,--no-as-needed

一、说明

gcc 提供了 -Wl,--as-needed 和 -Wl,--no-as-needed 两个选项,这两个选项一个是开启特性,一个是取消该特性。

在生成可执行文件的时候,通过 -lxxx 选项指定需要链接的库文件。以动态库为例,如果我们指定了一个需要链接的库,则连接器会在可执行文件的文件头中会记录下该库的信息。而后,在可执行文件运行的时候,动态加载器会读取文件头信息,并加载所有的链接库。在这个过程中,如果用户指定链接了一个毫不相关的库,则这个库在最终的可执行程序运行时也会被加载,如果类似这样的不相关库很多,会明显拖慢程序启动过程。

这时,通过指定 -Wl,--as-needed 选项,链接过程中,链接只会检查所有的依赖库,没有实际被引用的库,不再写入可执行文件头。最终生成的可执行文件头中包含的都是必要的链接库信息。

-Wl,--no-as-needed 选项不会做这样的检查,会把用户指定的链接库完全写入可执行文件中。

二、栗子

#include <iostream>

int main() 
{
    std::cout << "Hello, World" << std::endl;
}

1,使用 -Wl,--no-as-needed 选项,且编译时指定加载不相关的 pthread库。

g++ -Wl,--no-as-needed -lpthread -o main main.cc

(1)查看可执行文件 main 的文件头中是否包含 pthread 库:

        linux-vdso.so.1 (0x00007ffe5d13c000)
        libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fe196b88000)
        libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fe196a04000)
        libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fe196881000)
        libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fe196867000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fe1966a6000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fe196bcb000) 

可见可执行文件 main 中包含了不相关的 pthread 库。 

(2)查看运行时是否加载 pthread 库。

strace ./main

...

openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libpthread.so.0", O_RDONLY|O_CLOEXEC) = 3

...

可见,在程序运行时也加载了 pthread 库。 

2,使用 -Wl,--as-needed 选项,且编译时指定加载不相关的 pthread 库。

g++ -Wl,--as-needed -lpthread -o main main.cc

(1)查看可执行文件 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 库不是必须的,所以不会在可执行文件中记录 pthread 库。 

(2)通过执行 strace ./main 命令,运行结果显示也不会去加载 pthread 库。

三、总结

  1. -Wl,--as-needed 选项指示最终的可执行文件中只包含必要的链接库信息;
  2. -Wl,--no-as-needed 选项指示在命令行中指定加载的所有库都记录到可执行文件头中,并最终由动态加载器去加载。

转载:GCC/G++选项 -Wl,--as-needed_weixin_33832340的博客-CSDN博客

(SAW:Game Over!) 

CMake Error at /home/sniper/anaconda3/envs/yolov8/lib/python3.8/site-packages/cmake/data/share/cmake-3.25/Modules/CMakeTestCCompiler.cmake:70 (message): The C compiler "/usr/bin/gcc" is not able to compile a simple test program. It fails with the following output: Change Dir: /opt/projects/tensorrt-alpha/yolov8/build/CMakeFiles/CMakeScratch/TryCompile-TrXrKM Run Build Command(s):/usr/bin/make -f Makefile cmTC_7d457/fast && /usr/bin/make -f CMakeFiles/cmTC_7d457.dir/build.make CMakeFiles/cmTC_7d457.dir/build make[1]: 进入目录“/opt/projects/tensorrt-alpha/yolov8/build/CMakeFiles/CMakeScratch/TryCompile-TrXrKM” Building C object CMakeFiles/cmTC_7d457.dir/testCCompiler.c.o /usr/bin/gcc --sysroot=/usr/ -march=x86-64 -o CMakeFiles/cmTC_7d457.dir/testCCompiler.c.o -c /opt/projects/tensorrt-alpha/yolov8/build/CMakeFiles/CMakeScratch/TryCompile-TrXrKM/testCCompiler.c Linking C executable cmTC_7d457 /home/sniper/anaconda3/envs/yolov8/lib/python3.8/site-packages/cmake/data/bin/cmake -E cmake_link_script CMakeFiles/cmTC_7d457.dir/link.txt --verbose=1 /usr/bin/gcc --sysroot=/usr/ -march=x86-64 -Wl,-O2 -Wl,--sort-common -Wl,--as-needed -Wl,-z,relro -Wl,-z,now -Wl,--disable-new-dtags -Wl,--gc-sections -Wl,-rpath,/home/sniper/anaconda3/lib -Wl,-rpath-link,/home/sniper/anaconda3/lib -L/home/sniper/anaconda3/lib CMakeFiles/cmTC_7d457.dir/testCCompiler.c.o -o cmTC_7d457 /usr/bin/ld: 找不到 /lib/x86_64-linux-gnu/libc.so.6 于 /usr/ 内部 /usr/bin/ld: 找不到 /usr/lib/x86_64-linux-gnu/libc_nonshared.a 于 /usr/ 内部 /usr/bin/ld: 找不到 /lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 于 /usr/ 内部 collect2: error: ld returned 1 exit status make[1]: *** [CMakeFiles/cmTC_7d457.dir/build.make:99:cmTC_7d457] 错误 1 make[1]: 离开目录“/opt/projects/tensorrt-alpha/yolov8/build/CMakeFiles/CMakeScratch/TryCompile-TrXrKM” make: *** [Makefile:127:cmTC_7d457/fast] 错误 2 CMake will not be able to correctly generate this project. Call Stack (most recent call first): CMakeLists.txt:25 (PROJECT) -- Configuring incomplete, errors occurred!
06-02
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值