a.c
#include extern
intshared;
int main()
b.c
int shared = 1;
void swap(int* a, int* b)
操作:gcc -c a.c b.c
生成a.o b.o
操作:ld a.o b.o -e main -o ab
-e main 使用ld鏈結器,將main函式作為程式入口
-o ab 獲得ab可執行檔案
檢視各個檔案各個段的屬性objdump -h a.o b.o ab
分別是:
這裡只關心size(大小),vma(virtual memory addres 虛擬位址)。
// lam(load memory address 載入位址)
符號位址的確定
a.o中只有main函式所在虛擬位址是0x08048094
b.o中的swap函式在賣弄函式結束之後,main函式大小是0x34,+0x08048094 = 0x080480c8
中的變數shared所在虛擬位址是0x08048108
靜態鏈結 空間的位址和分配
參考文獻 對於鏈結器來說,在連線過程中。它的工作就是把多個輸入的目標檔案加工成合併成乙個輸出檔案。這一篇部落格就是介紹的靜態鏈結中空間與位址分配的,有關靜態鏈結的其他內容以及動態鏈結的資訊我會在之後的部落格介紹。按序疊加可以說是最簡單的乙個方案,就是將輸入的目標檔案按照次序疊加起來。但是從圖中我們可...
Linux C 編譯和鏈結
linux系統中最常用的編譯器是g 這是來自free software foundation的gun c 編譯器。linux的多數版本都包含該編譯器,但並不一定總會安裝它。g 編譯器的工作方式很像標準unix編譯器。例如,下面的命令將生成可執行檔案a.out g spiffy.cxxg spiffy...
靜態鏈結和動態鏈結
靜態載入dll dll工程b 專案屬性 配置屬性 常規 配置型別 動態庫 dll 在宣告檔案中,宣告匯出函式 declspec dllexport int xx 如果是c檔案,要在c 檔案中被呼叫,註明extern c 可以 ifdef cplusplus extern c endif 呼叫dll的...