readelf/objdum/addr2line

1、 readelf

readelf <option(s)> elf-file(s)

  • 示例:
    • 查看so依賴
      readelf -d liba.so | grep NEEDED
    • 查看so Section
      readelf -S liba.so
    • 查看so所有header信息
      readelf -e liba.so 等價于 readelf -h -l -S liba.so
  • 參數(shù)
<option(s)>:
-a 
--all 顯示全部信息,等價于 -h -l -S -s -r -d -V -A -I. 
-h --file-header 顯示elf文件開始的文件頭信息. 
-l --program-headers  --segments 顯示程序頭(段頭)信息(如果有的話)。 
-S --section-headers  --sections 顯示節(jié)頭信息(如果有的話)。 
-g --section-groups 顯示節(jié)組信息(如果有的話)。 
-t --section-details 顯示節(jié)的詳細(xì)信息(-S的)。 
-s --syms --symbols 顯示符號表段中的項(xiàng)(如果有的話)。 
-e --headers 顯示全部頭信息,等價于: -h -l -S 
-n --notes 顯示note段(內(nèi)核注釋)的信息。 
-r --relocs 顯示可重定位段的信息。 
-u --unwind 顯示unwind段信息。當(dāng)前只支持IA64 ELF的unwind段信息。 
-d --dynamic 顯示動態(tài)段的信息。 
-V --version-info 顯示版本段的信息。 
-A --arch-specific 顯示CPU構(gòu)架信息。 
-D --use-dynamic 使用動態(tài)段中的符號表顯示符號,而不是使用符號段。 
-x <number or name> --hex-dump=<number or name> 以16進(jìn)制方式顯示指定段內(nèi)內(nèi)容。number指定段表中段的索引,或字符串指定文件中的段名。 
-I  --histogram 顯示符號的時候,顯示bucket list長度的柱狀圖。 
-v --version 顯示readelf的版本信息。 
-H --help 顯示readelf所支持的命令行選項(xiàng)。 
-W --wide 寬行輸出。

2、objdump

  • 查看so依賴庫
    objdump -x libotpcalibration.so | grep NEEDED

  • 反編譯成匯編程序

    • 反編譯so
      aarch64-linux-android-objdump -d ./libxxx.so > tmp.txt
      aarch64-linux-android-objdump -dCSl camera.qcom.so > dump.txt

    • 反編譯vmlinux
      aarch64-linux-androidkernel-objdump -S --start-address=0xffffffc010e725e4 --stop-address=0xffffffc010e72618 vmlinux > tmp.txt

  • 參數(shù)選項(xiàng)

-a --archive-headers 
# 顯示檔案庫的成員信息,類似ls -l將lib*.a的信息列出。 

-b bfdname --target=bfdname 
# 指定目標(biāo)碼格式。這不是必須的,objdump能自動識別許多格式,比如: 

objdump -b oasys -m vax -h fu.o 
# 顯示fu.o的頭部摘要信息,明確指出該文件是Vax系統(tǒng)下用Oasys編譯器生成的目標(biāo)文件。objdump -i將給出這里可以指定的目標(biāo)碼格式列表。 

-C --demangle 
# 將底層的符號名解碼成用戶級名字,除了去掉所開頭的下劃線之外,還使得C++函數(shù)名以可理解的方式顯示出來。 
--debugging 
-g 
# 顯示調(diào)試信息。企圖解析保存在文件中的調(diào)試信息并以C語言的語法顯示出來。僅僅支持某些類型的調(diào)試信息。有些其他的格式被readelf -w支持。 

-e --debugging-tags 
# 類似-g選項(xiàng),但是生成的信息是和ctags工具相兼容的格式。 
--disassemble 
-d 
# 從objfile中反匯編那些特定指令機(jī)器碼的section。 

-D --disassemble-all 
# 與 -d 類似,但反匯編所有section. 

--prefix-addresses 
# 反匯編的時候,顯示每一行的完整地址。這是一種比較老的反匯編格式。 

-EB 
-EL 
--endian={big|little} 
# 指定目標(biāo)文件的小端。這個項(xiàng)將影響反匯編出來的指令。在反匯編的文件沒描述小端信息的時候用。例如S-records. 

-f 
--file-headers 
顯示objfile中每個文件的整體頭部摘要信息。 

-h 
--section-headers 
--headers 
顯示目標(biāo)文件各個section的頭部摘要信息。 

-H 
--help 
簡短的幫助信息。 

-i 
--info 
顯示對于 -b 或者 -m 選項(xiàng)可用的架構(gòu)和目標(biāo)格式列表。 

-j name
--section=name 
僅僅顯示指定名稱為name的section的信息 

-l
--line-numbers 
用文件名和行號標(biāo)注相應(yīng)的目標(biāo)代碼,僅僅和-d、-D或者-r一起使用使用-ld和使用-d的區(qū)別不是很大,在源碼級調(diào)試的時候有用,要求編譯時使用了-g之類的調(diào)試編譯選項(xiàng)。 

-m machine 
--architecture=machine 
指定反匯編目標(biāo)文件時使用的架構(gòu),當(dāng)待反匯編文件本身沒描述架構(gòu)信息的時候(比如S-records),這個選項(xiàng)很有用??梢杂?i選項(xiàng)列出這里能夠指定的架構(gòu). 

--reloc 
-r 
顯示文件的重定位入口。如果和-d或者-D一起使用,重定位部分以反匯編后的格式顯示出來。 

--dynamic-reloc 
-R 
顯示文件的動態(tài)重定位入口,僅僅對于動態(tài)目標(biāo)文件意義,比如某些共享庫。 

-s 
--full-contents 
顯示指定section的完整內(nèi)容。默認(rèn)所有的非空section都會被顯示。 

-S 
--source 
盡可能反匯編出源代碼,尤其當(dāng)編譯的時候指定了-g這種調(diào)試參數(shù)時,效果比較明顯。隱含了-d參數(shù)。 

--show-raw-insn 
反匯編的時候,顯示每條匯編指令對應(yīng)的機(jī)器碼,如不指定--prefix-addresses,這將是缺省選項(xiàng)。 

--no-show-raw-insn 
反匯編時,不顯示匯編指令的機(jī)器碼,如不指定--prefix-addresses,這將是缺省選項(xiàng)。 

--start-address=address 
從指定地址開始顯示數(shù)據(jù),該選項(xiàng)影響-d、-r和-s選項(xiàng)的輸出。 

--stop-address=address 
顯示數(shù)據(jù)直到指定地址為止,該項(xiàng)影響-d、-r和-s選項(xiàng)的輸出。 

-t 
--syms 
顯示文件的符號表入口。類似于nm -s提供的信息 

-T 
--dynamic-syms 
顯示文件的動態(tài)符號表入口,僅僅對動態(tài)目標(biāo)文件意義,比如某些共享庫。它顯示的信息類似于 nm -D|--dynamic 顯示的信息。 

-V 
--version 
版本信息 

--all-headers 
-x 
顯示所可用的頭信息,包括符號表、重定位入口。-x 等價于-a -f -h -r -t 同時指定。 

-z 
--disassemble-zeroes 
一般反匯編輸出將省略大塊的零,該選項(xiàng)使得這些零塊也被反匯編。 

@file 可以將選項(xiàng)集中到一個文件中,然后使用這個@file選項(xiàng)載入

3、addr2line

Linux下addr2line命令用于將程序指令地址轉(zhuǎn)換為所對應(yīng)的函數(shù)名、以及函數(shù)所在的源文件名和行號。帶debug符號信息的so/程序可使用addr2line命令快速定位出錯的位置,語法格式:
addr2line [參數(shù)] [地址]

  • 常用參數(shù)
-a  在函數(shù)名、文件和行號信息之前,顯示地址,以十六進(jìn)制形式
-b  指定目標(biāo)文件的格式為bfdname
-e  指定需要轉(zhuǎn)換地址的可執(zhí)行文件名
-j  給出的地址代表指定section偏移,而非絕對地址
-C  將低級別的符號名解碼為用戶級別的名字
-f  在顯示文件名、行號的同時顯示函數(shù)名信息
-p  每一個地址的信息占一行
  • 示例
    addrline -Cfe liba.so 0x132c
    • 查看是否由.debug_xxx Section
      readelf -S liba.so
    • 查看so是否strip
      file liba.so
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

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