2015年9月15日 星期二

CSAPP閱讀筆記之Linking



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   ....






沒有留言:

張貼留言