linux靜態鏈結學習筆記

2021-10-01 07:51:30 字數 1382 閱讀 6668

對於我這位初學者而言,鏈結(linking)這個名詞聽著既熟悉又陌生。我知道基本上每一次執行都會包含鏈結操作,但又不知道鏈結具體又是如何做到的。所以我想理清一下這個內容。

鏈結(linking)是將各種**和資料片段收集並組合成為乙個單一檔案的過程,這個檔案可被載入(複製)到記憶體並執行。鏈結可以執行於編譯(compile)的時候,也就是在源**被翻譯成機器**時;也可以執行於載入(load)的時候,也就是有應用程式來執行。早期計算機系統中,鏈結是手動執行的。現代系統中,鏈結是由叫做鏈結器(linker)的程式自動執行的。

無論是什麼樣的作業系統、isa或者目標檔案格式,基本的鏈結概念是通用的,細節可能不盡相同,但是概念是相同的。

下面,讓我們在linux系統下做一些小測試。

main.c的**:

int

sum(

int*a,

int n)

;int array[2]

=;intmain()

sum.c的**:

int

sum(

int*a,

int n)

return s;

}

在linux系統下,輸入命令:gcc -og -o prog main.c sum.c

其中-o 命令能夠生成目標檔案,prog 是將目標檔案重新命名

由於main.c中沒有列印函式,所以我在main.c檔案中加了幾行**讓返回結果能夠列印輸出。結果如下:

main.c 和sum.c檔案經過翻譯器生成 main.o和sum.o可重定位目標檔案。再經過鏈結器(ld)生成被重新命名為prog的完全鏈結的可執行目標檔案。

這個過程可以通過用 -v選項執行gcc檢視。

驅動程式首先執行c預處理器(cpp),它將c的源程式main.c翻譯成乙個ascⅱ碼的中間檔案main.i:

cpp main.c /tmp/main.i

然後驅動程式執行c編譯器(ccl),它將main.i 翻譯成乙個ascⅱ組合語言檔案main.s:

ccl /tmp/main.i -og -o /tmp/main.s

然後,驅動程式執行彙編器(as),它將main.s翻譯成乙個可重定位目標檔案main.o:

as -o /tmp/main.o /tmp/main.s

驅動程式經過相同的過程生成sum。最後,它執行鏈結器程式ld,將main.o和sum.o以及一些必要的系統目標檔案組合起來,建立乙個可執行目標檔案prog:

ld -o prog /tmp/main.o /tmp/sum.o

最後再執行可執行檔案prog:

./prog

通過上述過程發現,目標檔案有多種形式,實際上是有三種:可重定位目標檔案、可執行目標檔案和共享目標檔案。

編碼學習筆記 靜態鏈結

參考 程式設計師的自我修養 第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...

Linux學習筆記 鏈結命令

ln 建立鏈結 ln root xx.x tmp aa.a 建立了名為aa.a的xx,x的硬鏈結檔案,aa.a可以省略,則視為源檔名 1.擁有相同的i節點和儲存block塊,相當於同乙個檔案 2.可以通過i節點識別 3.不能跨分割槽 4.不能針對目錄使用 1.類似於windows快捷方式 2.軟鏈結...

學習筆記 如何使用靜態鏈結庫

程式設計環境 vs2017 第一步 建立靜態庫工程,工程名稱為 staticlib003 第二步 增加標頭檔案int.h pragma once define crt secure no warnings include include include include extern c int ad...