目標文件格式 (Object file)
- 可重定位目標文件 (Relocatable Object File)
- 這類文件包含了二進制程式碼和數據,其形式可以再編一時與其他可重新店為目標文件合併起來,建立一個可執行的目標文件
- 可執行目標文件 (Executable Object File)
- 包含二進制程式碼和數據,其形式可以直接複製到記憶體並執行
- 共享的目標文件 (Shared Object File)
- 一種特殊類型的可重定位目標文件,可在執行時期動態連結並載入到主記憶體,也可在載入到記憶體時期,才動態連結此檔案
可執行目標文件格式
一個程式碼Source code檔案被Compile後,會依照指令和資料部份分開存到Obj File上不同的Section中。
Section 介紹
- .text, .bss, .data 是一般編譯器之預設記憶體區段名稱, linker script 會安排實際的記憶體位址給各個區段.
- .text 為唯讀區段, 包含 Const string,及Arm 指令程式(程式碼),安置於ROM
- .data 為可讀寫區段, 放置初值不為 0 的變數 (安置於 RAM中)
- RAM的內容會在斷電、或是系統重置後消失,Reset的程序需從ROM取得data初值(Copy from ROM to RAM)
- .bss 為可讀寫區段, 放置初值為 0 的變數. Reset的程序.bss 區段會被清為 0
- stack 為堆疊區 一般是呼叫函數時的作業區 (返回位址暫存, 傳遞參數, 區域變數和返回值之儲存區), heap 為堆積區 是呼叫 malloc() 時取得記憶區塊的來源.
- symtal 一個符號表,它存放在程序中定義和引用函數和全域變數的訊息
- .rel.text 當Linker 把目標文件和其他文件組合時,需要修改那些 text 的位置(Relocation),可執行文件中並不需要重新為訊息,因此通常會省略
- rel.date 被程序塊引用或定義的所有全域變數的 Relocation 訊息
- .debug 一個除錯符號表 只有以 -g 選項調用編譯器驅動程式時,才會有這個 section
- .strtab 字串表
- .dynamic 動態連結訊息
其他Section(還有很多未被列出)
可執行目標文件與可重定位目標文件的有甚麼差別 ?
- 多了 .init section 與 .fini section其中 .init 節中定義了一個 _init 函數,用於可執行目標文件執行初始化工作。.fini 包含程序終止要執行的指令
- 少了 .rel.text 和 .rel.data 節等重定位訊息
整個檔有兩個重要的段
唯讀程式碼段:(ELF header + .init .fini 節 + .text 節 + .rodata 節 )
可讀寫數據段:(.data 節 + .bss 節),由於在執行檔時這兩個段必須分配空間所以又可以叫做可裝入段
參考資料
程式設計師的自我修養