為什麼不把所有的檔案都編譯到乙個可執行檔案中:
1. 效果:分成多個模組,有利於開發不同的優秀的模組,開發不同的庫。
2. 效率:改**時,只需要重新編譯乙個模組,替換即可。
1. 符號解析。
2. 重定位:在重定位之前,每個模組中的函式和資料只對應了在本模組的偏移。鏈結器將所有的模組的函式和資料進行合併,並把他們重定位。
目標檔案有三種,所有的目標檔案都是elf格式的:
1. 可重定位目標檔案(.o):
2. 可執行目標檔案(.out可執行檔案):
3. 共享目標檔案(.so):
.p .out .so 都是elf檔案
elf檔案格式:
func1和func2中的x只是在函式內有效,儲存在.data段中。符號可能時x_func1,x_func2
多重定義的符號:
已初始化的全域性變數優先順序高於未初始化的全域性變數
1. 多個強符號的定義,報錯。
2. 如果有乙個強符號和多個弱符號同名,則選擇強符號
3. 如果有多個弱符號同名,則選擇弱符號(如果使用gcc的-fno-common選項,則多個弱符號同名則會報錯)(或時殷弘-werror選項,將所有警告變成錯誤)
強弱符號可能導致的bug:
所有的**段都是從0x400000開始的。
所有的棧底端位址都是2的48次方-1(64位機)或3g(32位機)
動態申請記憶體時,如果申請<128k記憶體,則申請的記憶體位於堆區。若申請》128k,則申請記憶體位於堆和棧之間的某處。
readelf -s ***.so | grep func
檢視so檔案的符號表中的函式
當使用dlclose解除安裝某個so,但是so裡頭開了執行緒,必須把執行緒先退出,否則呼叫dlclose就會出現問題,會coredump
練習:
1. dlopen
模擬上面的coredump
2. 庫打樁
深入理解計算機系統
關鍵路徑是在迴圈的反覆執行中形成的資料相關鏈。迴圈展開是一種程式變換,通過增加每次迭代計算的元素的數量,減少迴圈的迭代次數。重新結合變換能夠減少計算中關鍵路徑上操作的數量,通過更好地利用功能單元的流水線能力得到更好的效能。浮點運算不保證是可結合的,通常迴圈展開和並行地累積在多個值中,是提高程式效能的...
《深入理解計算機系統》
知乎 深入理解計算機系統 這本書需要什麼水平能看懂?15 213 18 218 15 513 introduction to computer systems schedule fall 2016 鏈結失效則 cmu15 213的課程主頁,有ppt,還有錄影,主講人就是這本書的作者。備註 備註 詳細...
深入理解計算機系統
系統的硬體組成 快取記憶體 作業系統管理硬體 程序虛擬記憶體 檔案amdahl定律 併發和並行 0和1組成的位序列,又稱為位元序列,8個位被組織成一組,成為位元組。每個位元組表示程式中的某些文字字元。系統中的所有資訊 包括磁碟檔案 記憶體中的程式 記憶體中存放的的使用者資料以及網路上傳送的資料,都是...