2014年8月14日 星期四

GNU linker 指令 - ld

script format 介紹
Ref: https://sourceware.org/binutils/docs-2.21/ld/Scripts.html#Scripts 


基本語法

MEMORY
            {
              ROM : ORIGIN = 0, LENGTH = 2M
              ROM2 : ORIGIN = 0x10000000, LENGTH = 1M
              RAM : ORIGIN = 0x20000000, LENGTH = 1M
            }

SECTIONS
     {
       .text : 
          *(.text) 
       } > ROM
       . = 0x1000000;
       .rodata : 
          *(.rodata) 
       } > ROM2

       .bss 0x20000000 : 
          KEEP(*(.bss)) 
       }

       .bss1 . : 
       {
          KEEP(*(.bss1))
       } > RAM

       .data : 
       {
          *(.data)
       } > RAM
     }

. 代表位置計數器值

.text / .rodata / .bss / .bss1 / .data : section 名稱

.bss 0x20000000 :
     .bss section 起始位置指定為 0x20000000

.bss . :
     .bss section 起始位置指定為目前位置計數器值
     如果不帶, section 位置可能做 alignment, 可以用參數 --warn-section-align
     看是否有 section 因為 alignment 被更改位置

{ } 內描述相關的資料區段.
    * : 代入任何字串, 包括空字串
    KEEP : 不管主程式有沒有用到, 全部帶入

一般而言,
   .text : function
   .data : 有初始值的 static / global 變數
   .bss : 沒有初始值的 static / global 變數 ( 初始值為 0 )


註解 : 和 C 相同, 採用 /* */

參數介紹:

    --whole-archive : 將參數後指定的 object file 全部帶入處理



Ref: http://www.scoberlin.de/content/media/http/informatik/gcc_docs/ld_3.html

Ref: https://www.informatik.uni-hamburg.de/RZ/software/gnu/gcc/ld_3.html

Ref: http://osr507doc.sco.com/en/tools/ld_cmd_lang_sections.html