當前位置:
首頁 >
《深入理解计算机系统》第七章读书笔记
發(fā)布時間:2025/7/14
47
豆豆
生活随笔
收集整理的這篇文章主要介紹了
《深入理解计算机系统》第七章读书笔记
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
《深入理解計算機系統(tǒng)》第七章讀書筆記
第七章:連接
連接
1.連接:將各種代碼和數(shù)據(jù)部分收集起來并組合成為一個單一文件的過程。這個文件可被加載或拷貝到存儲器并執(zhí)行。 2.連接可以執(zhí)行于編譯時,也就是在源代碼被翻譯成機器代碼也可以執(zhí)行于加載時,也就是程序被加載器加載到存儲器并執(zhí)行時執(zhí)行于運行時,有應用程序來執(zhí)行。 3.連接是由鏈接器的程序自動執(zhí)行的。 4.連接使分離編譯成為可能。
PS:X86-64系統(tǒng)上用gcc -m32產(chǎn)生32位代碼
7.1編譯器驅動程序
1.大部分編譯系統(tǒng)提供編譯驅動程序:代表用戶在需要時調用語言預處理器、編譯器、匯編器和鏈接器。(1)C預處理器:源程序main.c->ASCII碼中間文件main.i(2)C編譯器:main.i->ASCII碼匯編語言文件main.s(3)C匯編器:main.s->可重定位目標文件 2.運行鏈接器程序ld,將各種.o文件以及必要的系統(tǒng)目標文件組合起來,創(chuàng)建可執(zhí)行文件。 3.運行可執(zhí)行文件:./可執(zhí)行文件名字 4.外殼調用操作系統(tǒng)中加載器函數(shù),拷貝可執(zhí)行文件中的代碼和數(shù)據(jù)到存儲器,將控制轉移到這個程序的開頭
7.2靜態(tài)鏈接
ld靜態(tài)鏈接器:
1.以一組可重定位目標文件和命令行參數(shù)作為輸入,生成一個完全鏈接的可以加載和運行的可執(zhí)行目標文件作為輸出。 2.輸入的可重定位的目標文件由各種不同的代碼和數(shù)據(jù)節(jié)組成 3.指令在一個節(jié)中,初始化的全局變量在另一個節(jié)中,而未初始化的變量又在另外一個節(jié)中。為了構造可執(zhí)行文件,鏈接器的任務:符號解析,重定位
7.3目標文件
目標文件三種形式:可重定位目標文件,可執(zhí)行目標文件,共享目標文件。目標文件格式:Linux——可執(zhí)行可連接(ELF格式)Windows——可移植可執(zhí)行格式(PE)
7.4可重定位目標文件
ELF可重定位目標文件包含下面幾個節(jié): .test已編譯程序的機器代碼。 .rodata只讀數(shù)據(jù) .data已初始化的全局C變量 .bss未初始化的全局C變量。.symtab:一個符號表,存放在程序中定義和引用的函數(shù)和全局變量的信息
7.5符號和符號表
每個可重定位目標模塊m都有一個符號表,包含m所定義和引用的符號的信息。 在鏈接器的上下文中,三種不同的符號: 1.有m定義并能被其他模塊引用的全局符號。全局鏈接器對應于非靜態(tài)的C函數(shù)以及被定義為Cstatic 屬性的全局變量。 2.有其他模塊定義并被模塊m以引用的全局符號——外部符號,對應于定義在其他模塊中的C函數(shù)和變量 3.只被模塊m定義和引用的本地符號。
?1.任何聲明帶有static屬性的全局變量或者函數(shù)都是模塊私有的。
?2.任河聲明為不帶static屬性的全局變量和函數(shù)都是共有的,可以被其他模塊訪問
7.6符號解析
鏈接器解析符號引用方法:每個引用與它輸入的可重定位目標文件的符號表中的一個確定的符號定義聯(lián)系起來。 編譯器只允許每個模塊每個本地符號只有一個定義。 編譯器還確保靜態(tài)本地變量,它們也會有本地鏈接器符號,擁有唯一的名字。
7.6.1鏈接器如何解析多重定義的全局符號
在編譯時:編譯器向匯編器輸出每個全局符號,或者是強或弱,而匯編器把這個信息隱含地編碼在可重定位目標文件的符號表里。 強符號:函數(shù)和已初始化的全局變量。 弱符號:未初始化的全局變量。 Unix鏈接器關于多重定義符號的規(guī)則: 1.不允許有多個強符號 2.如果有一個強符號和多個弱符號,選強符號 3.如有多個弱符號,則從弱符號中任意選擇一個。
7.6.2與靜態(tài)庫的連接
靜態(tài)庫:將所有相關的目標模塊打包成為一個單獨的文件7.7重定位 重定位兩步: 1.重定位節(jié)和符號定義 2.重定位節(jié)中的符號引用。
重定位條目:
8.可執(zhí)行目標文件
9.加載可執(zhí)行目標文件
加載:將程序拷貝到存儲器并運行的過程 在32位Linux系統(tǒng)中代碼段從地址0x08048000處開始。10.動態(tài)鏈接共享庫?
共享庫是一個目標,在運行時,可以加載到任意的存儲器地址,并和一個在存儲器中的程序鏈接起來。這個過程稱為動態(tài)鏈接,是由動態(tài)鏈接器的程序來執(zhí)行的。 通常用.so后綴來表示,稱為DLL(動態(tài)鏈接庫)。 ? 1.在任何給定的文件系統(tǒng)中,對于一個庫只有一個.so文件。所有引用該庫的可執(zhí)行目標文件共享這個.so文件中的代碼和數(shù)據(jù)。 2.一種共享方式就是隱式鏈接,基本的思路:當創(chuàng)建可執(zhí)行文件時,靜態(tài)執(zhí)行一些鏈接,然后在程序加載時,動態(tài)完成鏈接過程。 3.一種共享方式就是“顯式鏈接”,應用程序被加載時,動態(tài)鏈接器加載和鏈接共享庫的情景。應用程序還可能在它運行時要求動態(tài)鏈接器加載和鏈接任意共享庫,而無需在編譯時鏈接那些庫到應用中。11.從應用程序中加載和連接共享庫
12.處理目標文件的工具
AR:創(chuàng)建靜態(tài)庫,插入、刪除、列出和提取成員。 STRINGS:列出一個目標文件中所有可打印的字符串。 STRIP:從目標文件中刪除符號的信息。
轉載于:https://www.cnblogs.com/zhengwei0712/p/5352535.html
總結
以上是生活随笔為你收集整理的《深入理解计算机系统》第七章读书笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Oracle12c 在windonSer
- 下一篇: 关于如何修改Redmine系统中的字段问