參考:《程式設計師的自我修養》第4章
鏈結器命令
ld file1.o file2.o -e main -o exc // 將目標檔案file1.o,file2.o以main函式作為程式入口,合成可執行檔案exc。
即gcc -c -fno-stack-protector file1.cfile2.c
objdump -r file.o // 檢視檔案的重定位表
ar -t libfile.a // 檢視庫檔案中包含了哪些目標檔案
ld -verbose // 檢視ld預設鏈結指令碼
1. 鏈結
2. 空間與位址分配
3. 符號解析與重定位
目標檔案反彙編
可執行檔案反彙編
重定位表:記錄了重定位相關資訊
4. common塊
由於編譯器允許不同型別的弱符號存在,但是鏈結器無法判斷各個符號型別是否一致,因此需要common塊機制。
編譯器為什麼不直接把未初始化的全域性變數當作未初始化的區域性靜態變數,為它在bss段分配空間,而是標記為common型別的變數?
如何將未初始化的全域性變數以非common塊處理?
5. 靜態庫鏈結
靜態庫,多個目標檔案經過壓縮打包後形成的檔案。
鏈結器在鏈結靜態庫時,是以目標檔案為單位。
6. 鏈結過程控制
鏈結器預設鏈結規則是對目標檔案進行鏈結。但對於某些特殊的程式,如作業系統核心、沒有作業系統的程式(引導程式boot loader,嵌入式程式)等,需要指定輸出檔案各個段的虛擬位址、段名稱、段存放順序等。
可使用鏈結指令碼控制鏈結過程。
linux靜態鏈結學習筆記
對於我這位初學者而言,鏈結 linking 這個名詞聽著既熟悉又陌生。我知道基本上每一次執行都會包含鏈結操作,但又不知道鏈結具體又是如何做到的。所以我想理清一下這個內容。鏈結 linking 是將各種 和資料片段收集並組合成為乙個單一檔案的過程,這個檔案可被載入 複製 到記憶體並執行。鏈結可以執行於...
學習筆記 如何使用靜態鏈結庫
程式設計環境 vs2017 第一步 建立靜態庫工程,工程名稱為 staticlib003 第二步 增加標頭檔案int.h pragma once define crt secure no warnings include include include include extern c int ad...
動態鏈結 靜態鏈結
在linux系統中,ld鏈結器將彙編器編譯出來的目標檔案和靜態庫里的.a檔案鏈結生成可執行檔案。靜態庫中的.a檔案的 會在靜態鏈結過程中新增到可執行檔案中,可執行檔案會變得很大。與靜態鏈結不同,linux系統的ld鏈結器會將動態庫.so檔案進行符號重定位生成可執行檔案,動態庫.so檔案並不新增到可執...