整理組裝經驗如下,全部是Command line的文字模式
非Runtime
- 找出static library symbols
find | grep *\\.a$ | xargs nm -A | grep 要找的symbol
- 找出library搜尋路徑
ld --verbose | grep SEARCH | tr "; " "\n\r"
- 列出CC 預設define和相關資訊
echo "" | gcc -E -xc - -dM -v
- grep 加regular expression萬歲
Runtime
dump console 輸出文字
當dynamic library 不在/無法放到linker搜尋路徑造成檔案無法執行
- $
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:你的library路徑 執行檔
- $
- 看程式system call的行為
strace 執行檔
strace -e open 執行檔
- 看open system call,常用,因為有時候程式爛掉是因為開檔案失敗,用這個找很快
strace -f 執行檔
- 包含fork的process
- Linker/Loader 相關
- ld.so會和路徑以及平台相關,以Ubuntu LTS 12.04 X86有
- /lib64/ld-linux-x86-64.so.2
- 64-bit
- /lib/ld-linux.so.2
- 32-bit
- /lib64/ld-linux-x86-64.so.2
- 透過dynamic linker/loader 看檔案link的library
LD_TRACE_LOADED_OBJECTS=1 ld.so 執行檔
- 觀察dynamic linker/loader行為
LD_DEBUG=help /bin/ls
- 顯示選項
LD_DEBUG=all 執行檔
- 全部都顯示
- ld.so會和路徑以及平台相關,以Ubuntu LTS 12.04 X86有
- 合體
LD_DEBUG=all strace -f ld.so strace -f 執行檔
參考資料
man ld.so
- TLDP: Shared Libraries