.ldsファイルの存在が何となく分かってきた

前までソースにはコンパイルに絡む.ldsファイルが有って、中身は例えばROMとtxtセクションとかのアドレスの開始位置と範囲とかのメモリ系の情報っぽいんだけど何に使うか意味不明だった。
時々コンパイルがうまく行かないときにこれを勘とネットを便りに修正していた。ネットでバグを調べていたらldsファイルにバグが有ったこともあるので油断できない。
で今日調べていてやっと分かって来たので忘れない内にメモ。


Makefileを追っていたらldに絡むファイルらしく-cオプションでldに渡されていた。正確にはhoge.ldsがhoge.lds.Sに変換されていてldに渡されていた。
manを見ると、

-c commandfile
commandfile からリンクコマンドを読むように ld に指示する。
これらのコマンドは ld デフォルトのリンクフォーマットを完全に上書きする (デフォルトに追加されるわけではない)。
commandfile ではターゲットフォーマットに関して必要な記述がすべてされていなければならない。

ということらしく、どうやらldにプログラムのメモリ配置とかの指示を行うコマンドファイルの為にあるっぽい。
中身の意味ははっきりとは分からないけど。コマンドファイルってことはldのコマンド?


見たことのない人の為に、ファイルの中身は例えばこんな感じ。
/usr/src/linux-headers-2.6.28-15/arch/alpha/boot/bootloader.lds

OUTPUT_FORMAT("elf64-alpha")
ENTRY(__start)
printk = srm_printk;
SECTIONS
{
  . = 0x20000000;
  .text : { *(.text) }
  _etext = .;
  PROVIDE (etext = .);
  .rodata : { *(.rodata) *(.rodata.*) }
  .data : { *(.data) CONSTRUCTORS }
  .got : { *(.got) }
  .sdata : { *(.sdata) }
  _edata = .;
  PROVIDE (edata = .);
  .sbss : { *(.sbss) *(.scommon) }
  .bss : { *(.bss) *(COMMON) }
  _end = . ;
  PROVIDE (end = .);

  .mdebug 0 : { *(.mdebug) }
  .note 0 : { *(.note) }
  .comment 0 : { *(.comment) }
}


ちなみにこのファイルはUbuntu9.04上でaptから取ってきたヘッダに入っていた。
こういうのってどこで勉強したら良いんだろうか?