linux下的目標檔案(.o檔案)採用elf格式。目標檔案裡採用段section的格式儲存,比如**段啊(存**),資料段啊(初始化了的全域性變數和區域性靜態變數),bss段啊(未初始化的全域性和區域性靜態變數),唯讀資料段啊(程式中用到的字串)等。在所有的段外,有乙個重要的結構叫做檔案頭。所以這裡從檔案頭開始說。
1 檔案頭主要包含以下內容(沒什麼用的就不寫了):
(1)e_ident:這裡面乙個重要的內容就是魔數和機器的位數。魔數用來標識檔案的型別,比如elf啊,a.out啊,mz啊等。機器位數就是32或者64.
(2)e_type:有三種,可重定位檔案(就是目標檔案),可執行檔案,共享目標檔案(就是動態鏈結庫檔案)
(4)e_ehsize :檔案頭本身的大小
2 段表。段表有很多項。每一項主要包含以下內容:
(1)sh_name:這個值記錄的是段的名字在段表字串表的下標
(3)sh_flag:段的標誌位,有三種:可寫,需要分配空間,可執行
(5)sh_offset:段的偏移
(6)sh_size:段的長度
(7)sh_link,sh_info:段的鏈結資訊。如果段的內容與鏈結有關,這兩個值才有意義。比如動態鏈結符號表啊,重定位表啊,sh_link表示這些表使用的字串表或符號表在段表中的下標,sh_info表示重定位表作用的段在段表中的下標。
(8)sh_addralign: 對齊資訊
(9)sh_entsize:項的長度。有些段,比如符號表,每個項的大小是相同的,所以需要每個項的大小。
4 字串表:字串表是將用到的字串都放到一起,然後每個用到字串的地方只需要給出字串表的下標即可。一般字串表存放程式中用到的字串,而段表字串表用來儲存段表中用到的字串,比如段名。
(1)st_name:符號名在字串表的下標
(2)st_value:簡單的說,這個表示符號(函式啊,變數啊)的位址,實際上大多數時候這個值表示的是符號相對於所在段的偏移。在可執行檔案中,這個表示符號的虛擬位址(這個對動態鏈結有用)。
(3)st_size:符號大小,比如double的大小為8個位元組
(4)st_info:它的低四位表示符號的繫結資訊(區域性符號,全域性符號,弱引用),高28位表示符號型別(資料啊,函式啊等)
(5)sh_shndx:如果符號定義在本目標檔案,這個表示符號所在段的下標。
程式設計師的自我修養 目標檔案
1.檔案頭 描述整個檔案的檔案的檔案屬性,包括檔案是否可執 行 是靜態鏈結還是動態鏈結及入口位址 可執行檔案 目標硬體 目標作業系統等資訊,檔案頭還包括乙個段表。段表其實就是乙個描述檔案中各個段的陣列,描述段在檔案中的偏移位置及段的屬性等。2.text段 編譯後執行語句都編譯成機器 儲存在該段。3....
《程式設計師自我修養》閱讀筆記 動態鏈結
1 動態鏈結的含義。動態鏈結就是將鏈結時的重定位推遲到載入時。相比於靜態鏈結,動態鏈結的乙個優點是可以節省記憶體。因為共享檔案的 可以共享。使用動態鏈結的時候,可執行檔案和共享檔案都會載入到記憶體。但是,如果很多可執行檔案都使用了同乙個共享檔案的時候,共享檔案的 部分只需要裝載一次,這樣就達到了節省...
程式設計師的自我修養閱讀筆記03
今天來談一下程式設計師的煩惱,哦哦哦哦哦。大多數如我一般的初學者,最大的煩惱就是 不會程式設計,程式設計好難。嗯。至少我的是如此。1.也是我們比較關心的問題 是否還應該留在一線城市 大人們的思想搞不懂,2.這個我比較感興趣 小公司做的事太繁雜了 3.好像與我無關的樣子 創業公司中的危機感 4.還好 ...