文件頭的部分

文件頭的部分

我正在研究我的 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()即程式的邏輯位址?

答案1

輸出中的標誌是BFD - 二進位檔案描述符。它們是 binutils 套件的一部分,如果您在 bfd 頭檔中查找其含義,則可以了解這些標誌的/usr/include/bfd.h含義或這裡

對「標誌」的引用0x00000112就是所謂的旗場。它是二進位的,每位代表一個特定的功能,1 表示標誌開啟或設置,0 表示標誌未開啟或設定。另請注意,「0x...」表示它是一個十六進位值,因此如果將其從 HEX 轉換為 BIN:

0x00000112 = 0001 0001 0010 二進位。

這樣就設定了標誌欄位中第2、5、9位對應的標誌。這些是在命令輸出的第三行中按名稱顯示的標誌objdump

標誌的含義

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

第 1 位 - 0000 0000 0010

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

第 2 位 - 0000 0001 0000

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

第三位 - 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 偵錯器對其進行偵錯,它包含一個符號表gdb,因此函數將具有有意義的名稱
  • 可執行檔動態連結到標準函式庫,例如 glibc 等。

起始位址

最後一行,起始位址...,正如您所猜測的那樣,是可執行檔的實際 .CODE 的起始位置。

相關內容