鏈結 裝載與庫

2021-09-06 15:18:43 字數 1848 閱讀 7525

二、編譯和鏈結

1、預處理過程主要處理那些以 # 開始的預編譯命令如 #include/#define/#if 等,但保留 #pragma 編譯器指令(因為編譯器要使用它們),另外刪除所有注釋,新增行號和檔名標識。 

gcc -e test.c >test.i

cpp test.c > test.i

2、編譯,生成 *.s 的彙編**

gcc -s test.c

cc1 test.c

3、彙編,根據彙編指令和機器指令對照表翻譯

gcc -c test.s -o test.o

as test.s -o test.o

4、鏈結,ld 命令要加上 crt 庫和入口等東西,記不住的話,可以使用 gcc test.c -wl,-v 來檢視。

gcc test.o -o test

ld --eh-frame-hdr -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 /usr/lib/../lib64/crt1.o /usr/lib/../lib64/crti.o /usr/local/gcc-4.8.2/lib/gcc/x86_64-unknown-linux-gnu/4.8.2/crtbegin.o -l/usr/local/gcc-4.8.2/lib/gcc/x86_64-unknown-linux-gnu/4.8.2 -l/usr/local/gcc-4.8.2/lib/gcc/x86_64-unknown-linux-gnu/4.8.2/../../../../lib64 -l/lib/../lib64 -l/usr/lib/../lib64 -l/usr/local/gcc-4.8.2/lib/gcc/x86_64-unknown-linux-gnu/4.8.2/../../.. -v -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/local/gcc-4.8.2/lib/gcc/x86_64-unknown-linux-gnu/4.8.2/crtend.o /usr/lib/../lib64/crtn.o test.o

編譯器的編譯過程,一般分為6步:掃瞄、語法分析、語義分析、源**優化、**生成和目標**優化。

現在 pc 平台上流行的可執行檔案格式,分為 windows 下的 pe (portable executable) 和 linux 下的 elf (executable linkable format),它們都是 coff (common file format) 格式的變種。

目標檔案 (即 .o 檔案) 與可執行檔案的內容和結構很相似,所以與可執行檔案採用同一種格式儲存,除了目標檔案之外,動態鏈結庫和靜態鏈結庫(只是目標檔案的打包,再加上一些索引)、核心轉儲檔案也是按照可執行檔案格式來儲存的。

目標檔案的內容包含了及其指令**、資料,還有鏈結的時候需要的如符號表、除錯資訊、字串等。目標檔案格式將這些資訊按不同的屬性,以「節(section)」的形式儲存,有時候也叫「段(segment)」,他們都表示乙個一定長度的區域。

linux 下可以使用 file 命令來檢視相應的檔案格式。

一般編譯後的機器**儲存在 .text 段,已初始化的全域性變數和區域性靜態變數儲存在 .data 段,未初始化的全域性變數和區域性靜態變數儲存在 .bss 段。.data 段會為變數分配空間,而未初始化的全域性變數和區域性靜態變數預設值都為0,為其分配空間沒有必要。

將程式指令和程式資料分離開來,.bss 段是唯讀的,而且當多個副本同時執行時還可以實現共享指令(比如動態鏈結庫)。

.bss 段只是為未初始化的全域性變數和區域性靜態變數預留位置,並沒有內容,所以也不佔據空間。

裝載 鏈結與庫

第五部分 windows動態鏈結 1 dll函式和變數必須在檔案顯示是匯入還是匯出,declspec dllexport 匯出,declspec dllimport 匯入.建立dll檔案的時候.c檔案生成.dll,lib,exp檔案,然後用.lib檔案和exe中的.c檔案生成的目標檔案鏈結在一起,生...

鏈結 裝載與庫

鏈結 裝載與庫 在linux下,當我們使用 gcc來編譯 helloword 程式時,只需要 gcc hello.c a.out hello world 其中實際包括4步驟 預處理 prepressinng 編譯 compliation 彙編 assembly 鏈結 linking 1.預編譯 gc...

鏈結裝載庫

一般應用程式記憶體空間有如下區域 棧棧儲存了乙個函式呼叫所需要的維護資訊,常被稱為堆疊幀 stack frame 或活動記錄 activate record 一般包含以下幾方面 堆堆分配演算法 段錯誤 segment fault 或 非法操作,該記憶體位址不能 read write 典型的非法指標解...