我正在研究我的 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 的起始位置。