天天看點

readelf和ldd分析elf檔案

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

readelf和ldd分析elf檔案

注意,ld-linux.so 本身就是一個 ELF 共享庫,但它是靜态編譯的并且不具備共享庫依賴項。當需要動态連結時,核心會引導動态連結(ELF 解釋器),該連結首先會初始化自身,然後加載指定的共享對象(已加載則不必)。接着它會執行必要的再定位,包括目标共享對象所使用的共享對象。

#readelf -l cpuid2.o

There are no program headers in this file.

ldd指令

Linux 提供了很多種檢視和解析 ELF 對象(包括共享庫)的工具。其中最有用的一個當屬 ldd指令,可以使用它來發現共享庫依賴項。

#ldd cpuid2

readelf和ldd分析elf檔案

ldd所告訴您的是:該 ELF 映像依賴于 linux-gate.so(一個特殊的共享對象,它處理系統調用,它在檔案系統中無關聯檔案),GNU C庫(libc.so)以及 Linux 動态加載器(因為它裡面有共享庫依賴項)。

#ldd cpuid2.o

ldd: 警告: 你沒有執行權限 `./cpuid2.o'

不是動态可執行檔案

readelf識别對象内可再定位的C庫

readelf 指令是一個有很多特性的實用程式,它讓您能夠解析和讀取 ELF 對象。readelf 有一個有趣的用途,就是用來識别對象内可再定位的項。對于我們這個簡單的程式來說,可以看到需要再定位的符号

#readelf -r cpuid2

readelf和ldd分析elf檔案

從這個清單中,您可以看到各種各樣的需要再定位(到 libc.so)的 C庫調用。

#readelf -r cpuid2.o

readelf和ldd分析elf檔案

readelf檢視共享庫的依賴庫(NEEDED)和搜尋名(SONAME)

#readelf -d cpuid2

readelf和ldd分析elf檔案

#readelf -d cpuid2.o

無輸出

readelf檢視ELF頭資訊

#readelf -h cpuid2

readelf和ldd分析elf檔案

#readelf -h cpuid2.o

readelf和ldd分析elf檔案

附錄

#man readelf

繼續閱讀