FromNandの日記

自分的備忘録

リンカスクリプトにおけるMEMORYコマンドの使い方

具体的に言うと「MEMORYコマンド」を使うらしい。

MEMORYコマンドとはこんなやつ

MEMORY{
    PHDR (r) : ORIGIN = 0x8048000, LENGTH = _elf_header_size
    TEXT (rx) : ORIGIN = ORIGIN(PHDR) + LENGTH(PHDR), LENGTH = 0x2000 - _elf_header_size
    RODATA (r) : ORIGIN = ORIGIN(TEXT) + LENGTH(TEXT), LENGTH = 0x2000
    DATA (rw) : ORIGIN = ORIGIN(RODATA) + LENGTH(RODATA), LENGTH = 0x2000
    BSS (rw) : ORIGIN = ORIGIN(DATA) + LENGTH(DATA), LENGTH = 0x2000

 

こいつはSECTIONSコマンドの中で次のように使用することで、各セクションをMEMORYコマンドで作成したプログラムヘッダエントリの中のどのエントリに配置するか決定することができる。

SECTIONS{
    PROVIDE(_sphdr = ORIGIN(PHDR)); PROVIDE(_ephdr = ORIGIN(PHDR) + LENGTH(PHDR));
    .text : { PROVIDE(_stext = .); *(.text) PROVIDE(_etext = .); } > TEXT
    .rodata : { PROVIDE(_srodata = .); *(.rodata) PROVIDE(_erodata = .); } > RODATA
    .data : { PROVIDE(_sdata = .);
    value1 = .;
    BYTE(0x12);
    . = ALIGN(2);
    value2 = .;
    SHORT(0x1234);
    . = ALIGN(4);
    value3 = .;
    LONG(0x12345678);
    value4 = .;
    . += 4;
    *(.data)
    PROVIDE(_edata = .); } > DATA
    .bss : { PROVIDE(_sbss = .); *(.bss) PROVIDE(_ebss = .); } > BSS

 この例ではすべてのオブジェクトファイルの.textセクションはTEXTに、.rodataセクションはRODATAに...といった風に配置することを指定している。