Upgrade to Pro — share decks privately, control downloads, hide ads and more …

GNU ld的linker script簡介

Wen_Liao
December 25, 2014

GNU ld的linker script簡介

Dec/29/2014: 修正小錯誤以及增加封面圖片

Wen_Liao

December 25, 2014
Tweet

More Decks by Wen_Liao

Other Decks in Technology

Transcript

  1. 萬巒豬腳廠區 倉儲區 預先處理區 烹煮區 建設搬移公司 照遷移計劃書 執行 出貨區 德國豬腳廠區 倉儲區

    預先處理區 烹煮區 出貨區 里港豬腳廠區 倉儲區 預先處理區 烹煮區 出貨區 新廠區 倉儲區 萬巒豬腳預先處理區 德國豬腳預先處理區 里港豬腳預先處理區 萬巒豬腳烹煮區 德國豬腳烹煮區 里港豬腳烹煮區 萬巒豬腳出貨區 德國豬腳出貨區 里港豬腳出貨區
  2. GNU ld 是啥?問問男人吧 man ld ... ld combines a number

    of object and archive files, relocates their data and ties up symbol references. Usually the last step in compiling a program is to run ld. ... ld combines a number of object and archive files, relocates their data and ties up symbol references. Usually the last step in compiling a program is to run ld. ...
  3. file1.o 程式碼(機械碼): foo() {... 有初始值的資料: int g_var = 0xdeadbeef; 沒有初始值的資料:

    int g_var_1; main.o 程式碼(機械碼): bar() { ... main() {... 有初始值的資料: int g_var_m = 0xdeadbeef; 沒有初始值的資料: int g_var_2; linker 照 linker script執行 main (執行檔) 程式碼(機械碼): foo() { ... bar() { … main() { ... 有初始值的資料: int g_var = 0xdeadbeef; int g_var_m = 0xdeadbeef; 沒有初始值的資料: int g_var_1; int g_var_2;
  4. 名詞解釋2 • object 檔格式 ◦ 格式輸入檔案和輸出檔案所遵循的格式 • object 檔案 ◦

    linker處理時讀入除了linker script外的輸入檔案和將 結果存放的輸出檔案 • executable ◦ ld輸出的檔案,有時候會這樣稱呼
  5. 名詞解釋3 • 每個object檔案都有好幾個section ◦ input section:輸入object檔案中的section ◦ output section:輸出object檔案中的section •

    常用section ◦ .bss ▪ 存放沒有初始值全域變數的地方 ex: int g_var; ◦ .text ▪ 存放編譯過的執行機械碼的地方 ◦ .data ▪ 存放有初始值全域變數的地方 ex: int g_var = 0xdeadbeef;
  6. 名詞解釋4 • locale counter ◦ 代表目前輸出object檔案位置的最後端,表示符號為 . • region ◦

    執行平台實體的記憶體區塊。 ▪ 如0x1000~0x1999是ROM, 0x5000~0x9999是 RAM。那麼這個平台就可以設定成有兩個region ▪ 要注意RAM和ROM的差別唷
  7. 名詞解釋5 • Section ◦ object存放檔案的區塊 ▪ 可能是資料,可能是程式碼 ◦ 內容 ▪

    名稱 ▪ 長度 ▪ 要放到平台記憶體的那個位址 (VMA) ▪ 要從那塊記憶體載入 (LMA) ▪ 檔案中存放的offset ▪ alignment ▪ 資料內容
  8. 名詞解釋6 • Section狀態 ◦ LOAD ▪ 表示這個section需要從檔案載入到記憶體 ◦ DATA ▪

    表示這個section存放資料,不可以被執行 ◦ READONLY ▪ 可以望文生義吧?
  9. 終於回到主題了 • 這次要介紹的兩個主要指令 ◦ MEMORY ▪ 描述平台記憶體區塊,還記得region嘛? ◦ SECTIONS ▪

    描述輸出object檔案 section有幾個,裏面每個 section該和哪些輸入object檔案合體。以及自訂 symbol。
  10. MEMORY 欄位說明 • attr ◦ optional ◦ 告訴linker這塊記憶體有什麼值得注意的地方,一個 region可以有多個屬性,列出如下 ▪

    R: Read only ▪ W: 可讀寫 ▪ X: executable ▪ A: 可allocate ▪ I和L: Initialized section,據說是link後就用不到的 section,所以不需要存到輸出object檔案中 ▪ !: 將該符號後面所有的屬性inverse
  11. 範例 • 唯讀、可執行 • 起始位址為0 • 長度為256k • 非唯讀、不可執行 •

    起始位址為0x40000000 • 長度為4M • 使用了縮寫,縮寫規則不 想翻,請自己看參考資料
  12. 範例 • 計算結果為數字 ◦ 大部分情況代表記憶體位置 ◦ 但是還是有可能不是記憶體位置 • 這些assignment有發生時間由上往下 .

    = 0x2000 _sdata = . … (中間actions) _edata = . data_size = _edata - _sdata _estack = ORIGIN(RAM) + LENGTH(RAM); . 代表目前輸出locale 位 置,所以_data是0x2000
  13. 指定從特定位址將section載入記憶體 • 情境模擬 ◦ ROM裏面放有初始值的全域變數section, ◦ 程式要去更動全域變數 => GG ◦

    解法 ▪ 把這些section內的資料複製到RAM裏面 • LMA (load memory address) • VMA (virtual memory address) • 上面的情境模擬哪個是LMA,那個是VMA?
  14. • 格式:檔案(section1 section2 ...) ◦ 檔案支援萬用字元 • 範例 ◦ *(.text)

    ▪ 所有輸入object檔案的.text就放目前的section 輸入object 檔案的section應該要放到 輸出object檔案的那個section
  15. • SECTIONS,描述輸出object檔案有幾個section • .text section有會存放所有輸入object檔案的 ◦ .isr_vector, .text, .rom.開頭的等section •

    .text 要放在FLASH的region • symbol有_sromdev, eromdev, _sidata。它們有 用處的,請自己下載rtenv trace 程式碼
  16. 參考資料 • GNU linker ld: Linker Scripts ◦ https://sourceware.org/binutils/docs/ld/Scripts. html#Scripts

    • GNU LD 手冊略讀 (0): 目錄和簡介 ◦ http://wen00072-blog.logdown.com/posts/246068- study-on-the-linker-script-0-table-of-contents • rtenv的linker script解釋 ◦ http://wen00072-blog.logdown.com/posts/247207- rtenv-linker-script-explained