-
Notifications
You must be signed in to change notification settings - Fork 78
linker
陳鍾誠 edited this page Mar 14, 2018
·
6 revisions
-
Chapter 4. GNU Compiler Collection
- gcc與Obj檔,動態連結與ELF檔
- 摘要: 一個obj檔有兩個重要的時期, 一個是正在連結(link)的時候,也就是躺在硬碟時的樣子。 一個是正在執行(execute)的時候,也就是躺在記憶體時的樣子。 我們常講的ld linker其實是叫link editor, 最後編譯的一道手續ld 把該有的資訊寫進可執行檔。 如果是static link那麼就會去找出libxxx.a的函式庫檔, 把想要的程式碼片段拷貝一份進可執行檔並且做relocation後, 把跳來跳去的參照寫進可執行檔, 這個檔就可以執行。
- ELF的image中我們可以知道 0 ~ 3G的連續位址是User Space,3G~4G是kernel space。 user kernel間每次切換都要靠軟體中斷
以下文章來源: http://www.study-area.org/cyril/opentools/opentools/x952.html
所有user建立的執行檔都是user space,只有 OS kenrel的執行程式碼才是kernel space 程式碼。 當user程式想要存取電腦上重要資源時 抱歉不準,你放一隻病毒我format硬碟還得了, 因此都必須透過System Call這個系統提供的函式API來由kernel幫你做, 通常切換到kernel的是你的程式裡面呼叫了例如fork, open, read, write, 這時編譯器分析c程式碰到這些system call, 會先放個system call ID到暫存器, 例如
mov eax, 01
然後用
int 80
做80號中斷,kernel就會根據CPU暫存器的值,知道要Jump到那一個 system call routine去做一些動作 (在/usr/src/linux/archi/xxxxx/kernel/entry.S), 那function call呢?例如printf scanf最後到要存取螢幕鍵盤時, 去看libc的source code, 其實也要用read/write來存取device file 這時又會放個中斷80了。
...
所以為什麼gcc可以做cross compiler呢?因為他知道每個cpu的指令的長相, 知道每個OS的要求,知道ELF的格式,它只是在建造出一個image而已。所以用 shell script也 能作出一個compiler,原理只要把該放的字串,該放的Byte長相,放進檔案就 可以了。
...