簡單來說就是gcc與ld。
我也是沒完全搞懂澈魄。
先記錄下來:
#編寫一個c代碼文件景鼠,編譯
echo 'main(){}' > dummy.c
cc dummy.c -v -Wl,--verbose &> dummy.log //日志信息輸出到dummy.log
# 此時dummy.c編譯之后會生成一個a.out的可執(zhí)行文件
readelf -l a.out | grep ': /lib'
# readelf命令,了解源碼編譯痹扇,匯編過程最后一個步驟類似elf文件處理
# elf文件包括{可重定位文件lib*.a}{可執(zhí)行文件a.out}{共享目標文件lib*.so}
# readelf命令輸出結果:/lib64/ld-linux-x86-64.so.2就是動態(tài)鏈接器
[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]
確認啟動文件設置正確:
grep -o '/usr/lib.*/crt[1in].*succeeded' dummy.log
# 輸出結果
/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../lib64/crt1.o succeeded
/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../lib64/crti.o succeeded
/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../lib64/crtn.o succeeded
驗證編譯器能搜索正確的頭文件:
grep -B4 '^ /usr/include' dummy.log // -B 找到某行且顯示此行的前4行铛漓,-A是顯示此行的后#行
# 輸出結果
#include "..." 搜索從這里開始:
#include <...> 搜索從這里開始:
/usr/local/include
/usr/lib/gcc/x86_64-redhat-linux/4.4.7/include
/usr/include
驗證鏈接器使用了正確的搜索路徑:
grep 'SEARCH.*/usr/lib' dummy.log |sed 's|; |\n|g'
# 輸出結果:
SEARCH_DIR("/usr/x86_64-redhat-linux/lib64")
SEARCH_DIR("/usr/local/lib64")
SEARCH_DIR("/lib64")
SEARCH_DIR("/usr/lib64")
SEARCH_DIR("/usr/x86_64-redhat-linux/lib")
SEARCH_DIR("/usr/lib64")
SEARCH_DIR("/usr/local/lib")
SEARCH_DIR("/lib")
SEARCH_DIR("/usr/lib");
確認使用正確的libc:
# grep "/lib.*/libc.so.6 " dummy.log
#輸出結果:
attempt to open /lib64/libc.so.6 succeeded
確認GCC使用的正確的動態(tài)編譯器:有些程序習慣用cc編譯,其實就是gcc名字不一樣而已
grep found dummy.log
# 輸出結果:
found ld-linux-x86-64.so.2 at /lib64/ld-linux-x86-64.so.2