鏈結
這個步驟在什麼時候執行:
乙個c源程式到可執行檔案的過程
乙個c源程式可以被執行,得經過下面四個步驟:
編譯, 驅動程式執行編譯器(cc1)將main.i翻譯成乙個ascii組合語言檔案main.s
驅動程式執行彙編器(as),將main.s翻譯成乙個可重定位目標檔案main.o檔案。
執行聯結器ld,將main.o和其它必要的可重定位目標檔案,以及一些必要的系統檔案,建立乙個可執行檔案。
將多個模組合成乙個可執行檔案
/* sum.c */
/* $begin sum */
int sum(int *a, int n)
return s;
}
/* $end sum */
/* main.c */
/* $begin main */
int sum(int *a, int n);
int array[2] = ;
int main()
/* $end main */
執行截圖:
可重定位目標檔案
可重定位目標檔案包括elf頭,節,節頭部表
符號和符號表
每個可重定位目標模組m有乙個符號表,包含定義和引用的資訊,總共有三種符號:
符號解析
將每個符號引用與它輸入的可重定位目標檔案的符號表中的乙個確定的符號定義關聯起來,對於只引用在自己模組定義和的引用,十分好處理,但對於碰到乙個不是在當前模組定義的全域性符號, 就假設該符號在其他模組定義,交由鏈結器處理。如果說多個目標檔案有相同的名字,是如下規定的:
強符號: 函式和已初始化的全域性變數
弱符號:未初始化的全域性變數
看乙個程式
/* mismatch-main.c */
#include long int x; /* weak symbol */
int main(int argc, char *ar**)
/*mismatch-variable.c */
/* global strong symbol */
double x = 3.14;
在第乙個** x是弱符號,因為它沒有初始化,而在第二個**中x是賦了初值,那麼它是強符號,則整個程式在為x引用時是取得強符號為其定義。則最後輸出:
重定位
兩種最基本的重定位型別:
乙個具體程式的例子
**如下:
#include int time;
int foo(int a)
int main(int argc, char *ar**)
/*main.c*/
首先看elf檔案頭:
再看可重定位檔案的符號條目:
看節資訊:
看重定位資訊:
ld 鏈結相關知識
1 bss 不儲存在 bin檔案 bin檔案 bin檔案 bin檔案 bin檔案 重要的事情說四遍 2 arm linux ld ttext 0 tdata 0x800 好像也可以設定 tbss 那麼生成檔案燒錄到jz2440 text位址為0 data位址為0x800 因為jz2440 不管是no...
linux 相關知識
一 shell的基本概念 shell是作業系統中執行的程式 位於作業系統核心和使用者之間 shell定義使用者與os程序互動的乙個介面,命令直譯器 二 shell的分類 種類 bsh csh ksh bash bash是linux的預設shell bash是bsh的公升級替代品 tcsh是csh的相...
Linux相關知識
1 安裝五筆 sudo apt get install ibus ibus table ibus table wubi2 linux如何切換到root使用者 預設安裝完成之後並不知道root使用者的密碼,那麼如何應用root許可權呢?1 sudo 命令 這樣輸入當前管理員使用者密碼就可以得到超級使用...