鏈結的基本概念

2021-09-24 01:40:02 字數 1324 閱讀 9253

鏈結是將各種**和資料片段收集並組合成為單一檔案的過程

int

sum(

int*a,

int n)

;int array[2]

=;intmain()

main.c

int

sum(

int*a,

int n)

return s;

}

sum.c

我們可以通過下面的語句來呼叫gcc驅動程式

$ gcc -og -o prog main.c sum.c
??這裡我不知道怎麼用-v 來檢視步驟

我們可以來看一下這個過程(那main.c來說)

首先:預處理器(cpp)將main.c翻譯成乙個ascii碼的中間檔案main.i:

cpp [other arguments] main.c /tmp/main.i

接下來,驅動程式執行c編譯器(cc1)將main.i->main.s(ascll組合語言檔案)

cc1 /tmp/main.i -og[other arguments ] -o /tmp/main.s

然後執行彙編器(as)將main.s轉為main.o(可重定位目標檔案)

as [other argument ] -o /tmp/main.o /tmp/main.s

最後執行聯結器(ld),將main.o和sum.o和有關**組合起來,形成乙個可執行目標檔案

ld -o prog [system object files and args] /tmp/main.o /tmp/sum.o

將符號定義與引用對應起來

比如想上面的main.o和sum.o鏈結的過程中,鏈結器就得將main.o中對sum的引用與sum.o中的sum的定義對應起來。

這裡的符號可以是乙個函式,乙個全域性變數,乙個靜態變數

思考:這裡為什麼沒有提到區域性變數
因為我們的鏈結器和彙編器生成的是從0位元組開始的**段,鏈結器首先對把每乙個符號定義與乙個具體的記憶體位置關聯起來,從而重定位這些節,然後修改所有對這些符號的引用,使他們指向這個記憶體位置,

包含二進位制**和資料,其形式可以在編譯時與其他可重定位目標檔案合併起來

包含二進位制,**和資料,其形式可以被直接複製到記憶體並執行

一種特殊型別的可重定位目標檔案,可以在載入或者執行時被動態載入進記憶體並鏈結

注:一般各個系統的可執行文都不同,老版unix 使用的是a.out,windows 使用的是可移植可執行的pe格式,現代linux 和unix 是elf格式

基本概念 C 基本概念

由於工作中需要用到c 編寫的一些工具,有時候需要根據需求修改或者定製工具,所以現在不得不學習一下c 的基礎語法,此為筆記,不成章法!機器語言 組合語言 高階語言 面向過程的程式設計方法 物件導向的程式設計方法 泛型程式設計方法 1 演算法設計 2 源程式編輯 3 編譯 4 連線 5 執行除錯 輸入裝...

SEO基本概念 什麼叫反向鏈結?

簡單概括如下 網頁a 上有乙個鏈結指向網頁b,則網頁a 上的鏈結是網頁b 的反向鏈結。seo 中談到的反向鏈結又叫匯入鏈結 backlinks 外部鏈結。注意 以上的定義只是在seo 中的說法。如需了解反向鏈結更廣泛的意思請往下看。如以上第乙個例子,本文可以通過 如 href 直接指向到其他的已經存...

基本概念 數控系統基本概念

第一章 基本概念 數控工具機cnc是一種按事先編制好的加工零件程式進行加工的高效 自動化加工裝置。是 computer numerical control machine tools 的簡稱。數控工具機較好地解決了複雜 精密 小批量 多品種的零件加工問題,是一種柔性的 高效能的自動化工具機。西門子系...