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