程式設計師的自我修養4

2021-08-07 14:24:08 字數 1762 閱讀 6104

目標檔案裡有什麼?

編譯器編譯源**後生成的檔案叫做目標檔案,目標檔案從結構上來講,它是已經編譯後的可執行檔案格式,只是還沒有經歷過鏈結的過程,其中可能有些符號和位址還沒有被調整。其實它本身就是按照可執行檔案格式儲存的,只是跟真正的可執行檔案在結構上稍有不同。現在pc平台流行的可執行檔案格式(executable)主要是pe(portable executable)和linux下的elf(executable linkable format),它們都是coff(common file format)格式的變種

目標檔案即編譯後未鏈結的中間檔案(windows下的.obj和linux下的.o),其他不太常見的可執行檔案格式還有intel/microsoft的omf(objectmodule format),unix下的a.out格式和ms-dos下的.com格式

動態鏈結庫(dll)(windows的dll和linux的so)及靜態鏈結庫(static linking library)(windows下的lib和linux下的.a)都按照可執行檔案格式儲存。靜態鏈結庫稍有不同,他是把很多目標檔案**在一起形成乙個檔案,在加上一些索引,你可以簡單地把它理解為乙個包含很多檔案的檔案包

elf檔案標準把elf格式的檔案歸為4類:

可重定位檔案(relocatable file)      包含**和資料,可被鏈結成可執行檔案或共享目標檔案。靜態鏈結庫歸入這類   linux的.o和windows的.obj

可執行檔案(executable file)   包含可直接執行程式,一般無副檔名      /bin/bash檔案和windows的.exe

共享目標檔案(shared object file)  包含**和資料,以下2種情況使用:一種是將此檔案與其他可重定位檔案和共享目標檔案鏈結,產生新的目標檔案。第二種是將幾個此種檔案與可執行檔案結合,作為程序映像的一部分來執行   linux下的/lib/glibc-2.5.so和windows下的dll

核心轉儲檔案(core dump file )    當程序意外中止時,系統可以將該程序的位址空間的內容終止時的一些其他資訊轉儲到核心檔案中   linux下的core dump

程式源**編譯的機器指令放在**段(code section)裡,**段常見的名字有.code和.text;全域性變數的區域性靜態變數資料經常放在資料段(data section)一般名字叫.data,elf檔案的開頭是乙個「檔案頭」,描述了整個檔案的檔案屬性,包括檔案是否可執行,是靜態鏈結還是動態鏈結及入口位址(如果是可執行檔案)、目標硬體、目標作業系統等資訊。檔案頭還包括乙個段表(section table),段表其實是乙個描述了檔案中各個段的陣列。段表描述了檔案中各個段在檔案中的偏移位置及段的屬性等。從段表裡面可以得到,每個段的所有資訊。

未初始化的全域性變數和區域性靜態變數一般放在」.bss」段裡。它們預設值為0,可執行檔案必須記錄所有未初始化的全域性變數和區域性靜態變數的大小總和,記為.bss段,所以,.bss段只是為未初始化的全域性變數和區域性靜態變數預留位置而已,它並無內容,所以它在檔案中也不佔據空間

程式被裝載後,資料和指令分別被對映到兩個虛擬區域,由於資料區域對程序可讀寫,指令區域對程序來說只是唯讀。

指令區和資料區的分離有利於提高程式的區域性性。現代cpu的快取一般都被設定成資料快取和指令快取分離,使得cpu的快取命中率提高

共享指令

elf的資料夾中定義了elf魔、文字機器位元組長度、資料儲存方式、版本、執行平台、api版本、elf重定位型別、硬體平台、硬體平台版本、入口位址、程式頭入口和長度、段表的位置和長度及段的數量

在鏈結中,我們將函式和變數統稱為符號(symbol),函式名或變數名就是符號名(symbol name)

程式設計師的自我修養

一忌 輕易言敗,沒有自信 沒有永不放棄精神的程式設計師,只是乙個有程式設計師名號的假程式設計師。乙個真正的程式設計師,知道在程式設計的過程中,可能會遇到不計其數的困難和問題,可能有極多的挫折和失敗,而成功只有一次。就為解決乙個問題,我們可能連續十幾甚至幾十小時的坐在計算機前不停的工作。乙個問題解決了...

程式設計師的自我修養

一忌 輕易言敗,沒有自信 沒有永不放棄精神的程式設計師,只是乙個有程式設計師名號的假程式設計師。乙個真正的程式設計師,知道在程式設計的過程中,可能會遇到不計其數的困難和問題,可能有極多的挫折和失敗,而成功只有一次。就為解決乙個問題,我們可能連續十幾甚至幾十小時的坐在計算機前不停的工作。乙個問題解決了...

程式設計師的自我修養

對合作夥伴的尊重與包容 每個人的水平必然是不相同,大家各有擅長,並且在不斷進步中。所以遇到同事或者合作的友商犯了比較低階 對你來說可能是 的錯誤是很正常的事情,我們更多的是應該給與尊重與包容,而不是嘲笑或者消極對待。在不斷的鼓勵同事和合作夥伴之後,能感受到大家對我的信賴,特別是和友商的合作變得非常的...