AVR32 C Project from templateのリンク・オプション

AVR32 StudioでAVR32 C Project from templateからStandalone版のアプリケーションを指定し、ビルドするとリンクで以下のようなコマンドが実行される(オブジェクトファイルの指定は削除)。
デバイスはAT32UC3B0256、プロジェクト名「SimpleTest」。

avr32-gcc -nostartfiles -L../src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS -march=ucr1 -Wl,--gc-sections -Wl,-e,_trampoline -mpart=uc3b0256 -Wl,--gc-sections --rodata-writable --direct-data -oSimpleTest.elf -lnewlib_addons-at32ucr1-speed_opt

-Lや-oの有名なオプションはともかく、組み込みであることから見かけないオプションもあり、今回調べてみることにした。
とりあえず参考リンク
コマンドはavr32-gccであるが、実際にはavr32-ldがサブコマンドとして実行される。このときオプションは基本的にavr32-gccで解釈されるが、「-Wl,」と付いたものはこの部分を削除した上でavr32-ldへ渡される。



-nostartfiles
デフォルトのスタートアップ・ファイルを使用しないことを示す。
組み込みなので自分でスタートアップ・ルーチンのソースファイルを記述し、コンパイル&リンクする場合、このオプションを使用する。

-L
おなじみのライブラリ検索パスを指定する。オプションの直後にディレクトリ・パスが続く。

-march=
AVR32アーキテクチャを指定する。AVR32-gccだとわざわざ-mcpuを指定せず、アーキテクチャから指定すればよい。AT32UC3B0256の場合「ucr1」を続けて記述する。
現在指定できるのは「ap」、「ucr1」、「ucr2」、「ucr3」、「all-insn」だ。
何でAT32UC3Bが「ucr1」なのかは不明(追記:昨日書いていた)。現状AVR32 Studioにお任せだ。
この辺のCPU依存オプションについては、以下のコマンドの出力を読んで欲しい。

"%AVR32_HOME%\bin\avr32-gcc" --target-help



-Wl,--gc-sections
gc」とはガベージ・コレクションのことで「ゴミ集め」。セクションは定義してあるのにコードもデータも無い、といった無入力セクションを片付ける(削除する)。動的ライブラリをリンクする場合は、これを付けてはいけない。

-Wl,-e,
このプログラムのエントリ・ポイントを指定する。スタートアップ・ルーチンの先頭アドレスがエントリ・ポイントとなる。これはシンボル名でも良いし、アドレス値でも良い(0xで始まれば16進数、0なら8進数、その他は10進数)。
スタートアップ・ルーチンが、resetベクタのアドレスを含むセクションであってもresetベクタと一致するとは限らない。エントリ・ポイントが指定されると、その辺を調整あるいはチェックしてくれるのかもしれない(エラーが起きるよう試したことはない)。
個人的には、このオプションが無くても、1セクション=スタートアップ・ルーチンにして、問題なくリセット→スタート開始できるのが良いと思っている。

-mpart=
パートを指定する。AT32UC3B0256なら「uc3b0256」である。製品が存在してもAVR32-gccがサポートしているとは限らないので、AVR32 Studioにお任せした方がよいかもしれない。

--rodata-writable
リード・オンリーなデータを書き込み可能なデータ・セクションへ配置するオプション。

--direct-data
最適化するとき、直接データ参照を許可する。

-o
ご存じ出力ファイルを指定するオプション。ここで出力ファイルは、ELF形式のロード・モジュールを指す。

-l
存在しないシンボルを、直後に続く名称のライブラリから検索し、見つけたらリンクする。実際のライブラリ・ファイルは、名称の先頭に「lib」が付き、末尾に「.a」が付く。動的ライブラリのときは末尾が「.so」。