Compiler driver
比如gcc就是一個compiler driver,而不僅僅只有編譯功能,它包含了preprocessor, compiler,
as- sembler, 以及linker 。
preprocessor: gcc -E hello.c -o hello.i
compilier: gcc -S hello.i -o hello.s
as: as hello.s -o hello.o
ld: ld *.o
Object Files Format 目的檔格式
- Relocatable object file:可重定檔
包含了程式碼(code)和資料(data) ,可被重新Relocate成新的物件檔或可執行檔。
- Executable object file:可執行檔
包含了程式碼(code)和資料(data) ,可以直接載入記憶體並執行。
- Shared object file : 可共用檔
內容與可重定檔相同,但可以被動態載入至某個正在執行的程式裡運行。
Relocatable/Shared 檔會在編譯階段(by Compilers)和組譯(by assemblers )階段產生,而Executable檔則是在連結階段(by Linkers )生成 。
Static Linking 靜態連結
要產生一執行檔 , Linking必須執行Symbol resolution與Relocation這兩個動作。
- Symbol resolution:
建立一個symbol reference與一個symbol definition的關連性。
- Relocation:
目的檔之間有會互相引用(呼叫),Relocation要做的就是重新更新這些互相引用的Symbol(函式或變數)的地址,因為目的檔在編譯的期間不會知道其他目的檔的位址,要靠在linking階段進行Relocation才能得到Symbol的真正位址。
Relocatable Object Files
ELF header:
$ : readelf –h obj-file
Magic:
魔數 ,其中前面4個 7f , 45 = ‘E’ , 4c =’L’ , 46=’F’ 為固定值。
後3碼 01=32bit ,01=little-ending , 01= version 。
當kernel要載入執行檔前會先檢查魔數是否正確。
Machine:
機器架構(如arm , x86 …) 。
Type:
EXEC 或 REL 或 DYN。
Entry point address :
程式載入後,開始執行的入口地址。
Section header table:
.text :
存放source code經過編譯轉成的二進位機器碼。
.data :
存放已初始化的全域變數。
.bss :
存放尚未初始化的全域變數。
.rodata :
存放唯讀資料(Read-only),例如printf(“string1”) -->“string1”就是唯讀的。
.symtab :
符號表(symbol-table),包含function和全域變數所有的定義(defined)和
參考(referenced),但不包含區域變數。
.rel.text :
程式碼區段的重定位資訊
.rel.data:
資料區段的重定位資訊
.debug:
A debugging symbol table with entries for local variables and typedefs
defined in the program,global variables defined and referenced in the
program, and the original C source file. It is only present if the compiler
driver is invoked with the -g option.
.line:
C原始碼和已編譯成的機器碼之間的行數對映表.若gcc有下-g選項才會出現
.strtab:
A string table for the symbol tables in the .symtab and .debug sections, and
for the section names in the section headers. A string table is a sequence of
null-terminated character strings.
Symbols and Symbol Tables
- 模組之間的全域變數可互相引用,引用時要加上extern關鍵字
- 宣告為static變數可在單一模組間讓其他區域函式使用,但其他的模組無法引用它
- static 有點類似於物件導向語言的private關鍵字
- static變數會存在.data或.bss段中,並且compiler會在symbol table為它創建一個
名稱唯一的local linker symbol
如上圖,在同一模組的不同函式中,宣告了同名的static 變數,但它們的local linker symbol是不同的,例如 可能為: x.1 以及x.2
ELF symbol table entry
Symbol Resolution
To be continued ....
沒有留言:
張貼留言