readeklf工具和 objdump 命令提供的功能類似,但是它顯示的信息更爲具體,並且它不依賴 BFD 庫( BFD 庫是一個 GNU 項目,它的目標就是希望通過一種統一的接口來處理不同的目標文件);
ELF 文件類型 ELF(Executable and Linking Format)是一種對象文件的格式,用於定義不同類型的對象文件(Object files)中都放了什麼東西、以及都以什麼樣的格式去放這些東西。它自最早在 System V 系統上出現後,被 xNIX 世界所廣泛接受,作爲缺省的二進制文件格式來使用。可以說,ELF 是構成衆多 xNIX 系統的基礎之一。
ELF是一種用於二進制文件、可執行文件、目標代碼、共享庫和核心轉儲格式文件。ELF文件由4部分組成,分別是ELF頭(ELF header)、程序頭表(Program header table)、節(Section)和節頭表(Section header table)
-
ELF文件有三種類型:
- 可重定位的對象文件(Relocatable file) 由彙編器彙編生成的 .o 文件
- 可執行的對象文件(Executable file) 可執行應用程序
- 可被共享的對象文件(Shared object file) 動態庫文件,也即 .so 文件
-
ELF文件的結構簡述:
- elf文件頭(ELF Header)包含了elf文件版本,目標及其型號、程序入口地址
- 程序頭表(Program header table),Program header描述的是一個段在文件中的位置、大小以及它被放進內存後所在的位置和大小
- elf節,文件各個段(代碼段、數據段、BSS段)
- text section 裏裝載了可執行代碼;
- data section 裏面裝載了被初始化的數據;
- bss section 裏面裝載了未被初始化的數據;
- 以 .rec 打頭的 sections 裏面裝載了重定位條目;
- symtab 或者 .dynsym section 裏面裝載了符號信息;
- strtab 或者 .dynstr section 裏面裝載了字符串信息;
- 節表頭(Section header table),也成段表,ELF文件中所有段的信息,比如段名、段長度、段在文件中的偏移、段的讀寫權限和其他屬性
- 其他的輔助結構,比如字符串表、符號表等
-
readelf參數:
參數說明
-a |
--all 顯示全部信息,等價於 -h -l -S-s -r -d -V -A -I. |
-h |
--file-header 顯示elf文件開始的文件頭信息. |
-l |
--program-headers --segments 顯示程序頭(段頭)信息(如果有的話)。 |
-S |
--section-headers --sections 顯示節頭信息(如果有的話)。 |
-g |
--section-groups 顯示節組信息(如果有的話)。 |
-t |
--section-details 顯示節的詳細信息(-S 的)。 |
-s |
--syms --symbols 顯示符號表段中的項(如果有的話)。 |
-e |
--headers 顯示全部頭信息,等價於: -h -l -S |
-n |
--notes 顯示note段(內核註釋)的信息。 |
-r |
--relocs 顯示可重定位段的信息。 |
-u |
--unwind 顯示unwind段信息。當前只支持 IA64ELF 的 unwind 段信息。 |
-d |
--dynamic 顯示動態段的信息。 |
-V |
--version-info 顯示版本段的信息。 |
-A |
--arch-specific 顯示CPU構架信息。 |
-D |
--use-dynamic 使用動態段中的符號表顯示符號,而不是使用符號段。 |
-x <number or name> |
--hex-dump=<number or name> 以16進制方式顯示指定段內內容。number 指定段表中段的索引,或字符串指定文件中的段名。 |
-w[liaprmfFsoR] |
--debug-dump[=line,=info,=abbrev,=pubnames,=aranges,=macro,=frames,=frames-interp,=str,=loc,=Ranges] 顯示調試段中指定的內容。 |
-I |
--histogram 顯示符號的時候,顯示 bucketlist 長度的柱狀圖。 |
-v |
--version 顯示 readelf 的版本信息。 |
-H |
--help 顯示 readelf 所支持的命令行選項。 |
-W |
--wide 寬行輸出。 |
@file |
可以將選項集中到一個文件中,然後使用這個 @file 選項載入。 |
這篇博客寫的比較詳細。https://www.jianshu.com/p/132412ca73ce
參考鏈接:
https://blog.csdn.net/king_cpp_py/article/details/80334086
https://baike.baidu.com/item/ELF/7120560?fr=aladdin
https://www.jianshu.com/p/132412ca73ce