1. elf 檔案格式
linux系統中,gcc編譯器編譯出的object檔案、可執行檔案都屬于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 |
查詢elf header
readelf object-file-name -h |
查詢符号表
readelf object-file-name -s |
查詢所有section詳細資訊
readelf object-file-name -t 或者 readelf object-file-name -S |
dump某個section的資訊
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 來顯示程式标題
#readelf -l cpuid2

注意,ld-linux.so 本身就是一個 ELF 共享庫,但它是靜态編譯的并且不具備共享庫依賴項。當需要動态連結時,核心會引導動态連結(ELF 解釋器),該連結首先會初始化自身,然後加載指定的共享對象(已加載則不必)。接着它會執行必要的再定位,包括目标共享對象所使用的共享對象。
#readelf -l cpuid2.o
There are no program headers in this file.
ldd指令
Linux 提供了很多種檢視和解析 ELF 對象(包括共享庫)的工具。其中最有用的一個當屬 ldd指令,可以使用它來發現共享庫依賴項。
#ldd cpuid2
ldd所告訴您的是:該 ELF 映像依賴于 linux-gate.so(一個特殊的共享對象,它處理系統調用,它在檔案系統中無關聯檔案),GNU C庫(libc.so)以及 Linux 動态加載器(因為它裡面有共享庫依賴項)。
#ldd cpuid2.o
ldd: 警告: 你沒有執行權限 `./cpuid2.o'
不是動态可執行檔案
readelf識别對象内可再定位的C庫
readelf 指令是一個有很多特性的實用程式,它讓您能夠解析和讀取 ELF 對象。readelf 有一個有趣的用途,就是用來識别對象内可再定位的項。對于我們這個簡單的程式來說,可以看到需要再定位的符号
#readelf -r cpuid2
從這個清單中,您可以看到各種各樣的需要再定位(到 libc.so)的 C庫調用。
#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