readelf的elf 二進制文件格式分析工具小記

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章