readelf和ldd分析elf文件
1. elf 文件格式
linux系統(tǒng)中,gcc編譯器編譯出的object文件、可執(zhí)行文件都屬于elf文件。
elf文件由三個部分組成:elf header、program headers|section headers、sections|program segments。
如果是executable文件,則section部分是不需要的;如果是loadable文件,則program segment部分是不需要的。
2. readelf工具
readelf命令用途: Displays information about an elf file.
查詢文件所有信息
| readelf object-file-name -a |
| readelf object-file-name -h |
| readelf object-file-name -s |
| readelf object-file-name -t 或者 readelf object-file-name -S |
| readelf object-file-name -p section-name|section-index readelf object-file-name -x section-name|section-index readelf object-file-name -R section-name|section-index |
?
使用 readelf 來顯示程序標(biāo)題
#readelf -l cpuid2
注意,ld-linux.so 本身就是一個 ELF 共享庫,但它是靜態(tài)編譯的并且不具備共享庫依賴項。當(dāng)需要動態(tài)鏈接時,內(nèi)核會引導(dǎo)動態(tài)鏈接(ELF 解釋器),該鏈接首先會初始化自身,然后加載指定的共享對象(已加載則不必)。接著它會執(zhí)行必要的再定位,包括目標(biāo)共享對象所使用的共享對象。
#readelf -l cpuid2.o
There are no program headers in this file.
ldd命令
Linux 提供了很多種查看和解析 ELF 對象(包括共享庫)的工具。其中最有用的一個當(dāng)屬 ldd命令,可以使用它來發(fā)現(xiàn)共享庫依賴項。
#ldd cpuid2
ldd所告訴您的是:該 ELF 映像依賴于 linux-gate.so(一個特殊的共享對象,它處理系統(tǒng)調(diào)用,它在文件系統(tǒng)中無關(guān)聯(lián)文件),GNU C庫(libc.so)以及 Linux 動態(tài)加載器(因為它里面有共享庫依賴項)。
#ldd cpuid2.o
ldd: 警告: 你沒有執(zhí)行權(quán)限 `./cpuid2.o'
不是動態(tài)可執(zhí)行文件
readelf識別對象內(nèi)可再定位的C庫
readelf 命令是一個有很多特性的實用程序,它讓您能夠解析和讀取 ELF 對象。readelf 有一個有趣的用途,就是用來識別對象內(nèi)可再定位的項。對于我們這個簡單的程序來說,可以看到需要再定位的符號
#readelf -r cpuid2
從這個列表中,您可以看到各種各樣的需要再定位(到 libc.so)的 C庫調(diào)用。
#readelf -r cpuid2.o
readelf查看共享庫的依賴庫(NEEDED)和搜索名(SONAME)
#readelf -d cpuid2
#readelf -d cpuid2.o
無輸出
readelf查看ELF頭信息
#readelf -h cpuid2
#readelf -h cpuid2.o
附錄
#man readelf
總結(jié)
以上是生活随笔為你收集整理的readelf和ldd分析elf文件的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: objdump查看目标文件构成
- 下一篇: objdump与readelf