Executable

文件頭的部分

  • May 4, 2013

我正在研究我的 C 程序,我是 Linux/UNIX 開發的新手,正在四處看看。

我創建了一個 Hello world 的簡單 C 程序,並正在檢查編譯過程。

我試圖讀取最終執行檔的文件頭並得到輸出

$ objdump -f my_output
file format elf32-i386
architecture: i386, flags 0x00000112:
EXEC_P, HAS_SYMS, D_PAGED
start address 0x08048320**

我了解 elf32-i386 部分,但我不太確定標題的其他部分。

D_PAGED與需求分頁有某種關係嗎?是什麼 EXEC_P, HAS_SYSMS意思?是起始地址,main()程序的邏輯地址?

輸出中的標誌是BFD 二進製文件描述符。它們是 binutils 包的一部分,如果您在 bfd 標頭檔/usr/include/bfd.h中查看它們的含義或在此處查看標誌的含義,您可以閱讀這些標誌的含義。

對“標誌” 0x00000112的引用就是所謂的標誌欄位。它是二進制的,每一位代表一個特定的功能,一個表示標誌打開或設置,零表示它不是。另請注意,“0x …”表示它是一個十六進制值,因此如果將其從 HEX 轉換為 BIN:

0x00000112 = 0001 0001 0010 二進制。

因此設置了標誌欄位中第 2、第 5 和第 9 位對應的標誌。objdump這些是在命令輸出的第 3 行中按名稱顯示的標誌。

標誌的含義

您的執行檔具有的 3 個標誌非常標準。從右到左讀取位!

第 1 位 - 0000 0000 0010

 /* BFD is directly executable.  */
#define EXEC_P         0x02

第二位 - 0000 0001 0000

 /* BFD has symbols.  */
#define HAS_SYMS       0x10

第 3 位 - 0001 0000 0000

 /* BFD is dynamically paged (this is like an a.out ZMAGIC file) (the
    linker sets this by default, but clears it for -r or -n or -N).  */
#define D_PAGED        0x100

所以外賣:

  • 這是一個執行檔
  • 如果您想使用 Gnu Debugger 調試它,它包含一個符號表gdb,因此函式將具有有意義的名稱
  • 執行檔動態連結到標準庫,例如 glibc 等。

起始地址

最後一行,起始地址 …,正如您所猜到的那樣,實際的 .CODE 開始於執行檔的位置。

引用自:https://unix.stackexchange.com/questions/74601