Executable
文件頭的部分
我正在研究我的 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 開始於執行檔的位置。