Linux編譯與鏈檢查

簡單來說就是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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容