具体的に言うと「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に...といった風に配置することを指定している。