[討論] -Wl,--as-needed 該如何使用
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://www.ptt.cc/bbs/Programming/M.1684595315.A.6B7.html
※ 編輯: feelthat (114.32.93.159 臺灣), 05/30/2023 14:12:34
Programming 近期熱門文章
PTT數位生活區 即時熱門文章