objdump与readelf
objdump和readelf都可以用來查看二進制文件的一些內部信息. 區別在于objdump
借助BFD而更加通用一些, 可以應付不同文件格式, readelf則并不借助BFD,
而是直接讀取ELF格式文件的信息, 按readelf手冊頁上所說, 得到的信息也略細致一些.
幾個功能對比.
1. 反匯編代碼
查看源代碼被翻譯成的匯編代碼, 大概有3種方法,
1) 通過編譯器直接從源文件生成, 如gcc -S 文件
2) 對目標代碼反匯編, 一種是靜態反匯編, 就是使用objdump? -d 文件
3) 另外一種就是對運行時的代碼反匯編, 一般通過gdb
readelf并不提供反匯編功能.
objdump可以指定反匯編哪個節, 一般只有對包含指令的節反匯編才有意義. 而對于一些
其他的類型的節, objdump也可以將特殊節的數據以解析后的形式呈現出來
?
2. 顯示relocation節的條目
-r參數顯示elf文件的類型為REL的節的信息, 使用-S參數可以列出elf文件的
所有節的信息, 其中也就包括了REL節.
對于可重定位文件兩者顯示條目一致, 最重要的offset和type以及Sym.Name都有.
#readelf -r XXX.o
#objdump -r XXX.o
readelf的顯示分節, 而objdump則將兩個節合在一起. readelf的
顯示更加清晰一些.
3. 顯示動態重定位條目(或者可以認為是動態鏈接相關的重定位條目)
(按objdump的man page說明, 只對dynamic object有效, 如某些類型的共享庫)
readelf和objdump等價的命令為readelf -D -r file和objdump -R file.
對readelf使用-r和-D -r的區別, 對于共享庫在于數據的呈現方式略有不同. 這兩種
都將數據解析后呈現出來. 前者顯示的是相對于基地址的偏移, 后者則顯示絕對偏移量.
前者顯示條目數, 后者顯示字節數.
另外有必要說明的是如果對可重定位文件(.o文件)應用這兩個命令是無效的.
?
4. 顯示節信息: readelf -S和objdump -h
對于可重定位文件, objdump -h不能顯示.rel開頭的節和.shstrtab, .symtab, .strtab.
而readelf的顯示有一個.group節, 其內容為節的group, 可以用-g參數查看.
對于共享庫, objdump -h仍然不能顯示.shstrtab, .symtab, .strtab三個節, 另外還有
一個區別在于readelf從一個NULL類型的節開始, 而objdump的輸出去掉了這個空的節.
?
5. 顯示.dynamic節信息
只readelf -d有對應的功能, objdump沒有. 另外需要注意, 看重定位文件不需要動態
鏈接(加載), 所以沒有.dynamic節.
?
6. 顯示程序段信息
第二個readelf支持而objdump沒有的功能. 命令參數為readelf -l.
同樣, 對于可重定位文件而言沒有段. 這一點也可以從ELF頭中看到, 命令為readelf -h.
7. 以字節(HEX或字符)形式dump某節的內容
readelf -x <secname>
objdump -s
后者默認一次dump所有節的內容. 如果只想dump某節的內容, 則用-j <secname>
參數指定. readelf一次只能dump某一節的內容.
?
8. 查看ELF程序頭信息
readelf -h提供完整的信息, objdump -f只提供很少的信息.
9. 查看符號信息
readelf -s
objdump -t
兩個命令都提供類似nm的信息.
注意readelf同時顯示了.dynsym的信息, 而objdump實際上只顯示了.symtab部分的信息.
如果需要顯示動態部分的符號, 使用-T參數.
?
對readelf同時使用-D -s參數無效. 對照手冊頁說明也沒弄清楚-D的主要用途,
在這里可能因為-s已經能夠都顯示了.
10. 一次全部
兩個命令都提供了一個參數, 指定多個其他參數的集合一起顯示, 但顯示內容略有不同.
readelf -a: -h -l -S -r -s -d -n -V
objdump -x: -a -f -h -p -r -t
?
擴展閱讀:
readelf和ldd分析elf文件
objdump查看目標文件構成
?參考:
http://www.newsmth.net/pc/pccon.php?id=10001977&nid=316530
總結
以上是生活随笔為你收集整理的objdump与readelf的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: readelf和ldd分析elf文件
- 下一篇: .data和.text段合并