iT邦幫忙

2021 iThome 鐵人賽

DAY 4
0
Arm Platforms

30天從0開始探索嵌入式世界系列 第 4

Day.4深入理解連結之Object file

目標文件格式 (Object file)

  • 可重定位目標文件 (Relocatable Object File)
    • 這類文件包含了二進制程式碼和數據,其形式可以再編一時與其他可重新店為目標文件合併起來,建立一個可執行的目標文件
  • 可執行目標文件 (Executable Object File)
    • 包含二進制程式碼和數據,其形式可以直接複製到記憶體並執行
  • 共享的目標文件 (Shared Object File)
    • 一種特殊類型的可重定位目標文件,可在執行時期動態連結並載入到主記憶體,也可在載入到記憶體時期,才動態連結此檔案

可執行目標文件格式

一個程式碼Source code檔案被Compile後,會依照指令和資料部份分開存到Obj File上不同的Section中。

  • ELF head

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 節),由於在執行檔時這兩個段必須分配空間所以又可以叫做‎‎可裝入段‎

參考資料

程式設計師的自我修養


上一篇
Day3.編譯器運作流程介紹
下一篇
Day.5 深入理解連結之符號解析
系列文
30天從0開始探索嵌入式世界15

尚未有邦友留言

立即登入留言