[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4. 機種依存の機能

ld はいくつかのプラットフォームで機能を追加している. 以下の節でそれを説明する. 追加機能のないプラットフォームは 記載しない.

4.1 ld と H8/300  
4.2 ld と Intel 960 シリーズ  
4.3 ARM と Thumb コード間の協調作業のサポート  ld と ARM シリーズ
4.4 ld と HPPA 32ビット ELF サポート  
4.5 色々な TI COFF バージョンのサポート  ld と TI COFF


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.1 ld と H8/300

H8/300 の場合は, ld は, コマンド行オプション `--relax' を 指定すると以下のグローバルな最適化を行なう.

アドレスモードの緩和
飛び先が 8 ビットで表される範囲内にある jsr 命令や jmp 命令を見つけると, 全て, それぞれ 8ビットの, PC 相対の bsr 命令と bra 命令に置き換える.

命令の合成
16ビットの絶対アドレス形式を使っているが, トップページのメモリを 参照している mov.b 命令を見つけると, 全て 8 ビットのアドレス形式を 使うように変更する. (つまり, `mov.b @aa:16' という 命令で, アドレス aa がトップページのメモリにある場合は, `mov.b @aa:8' に変換するのである. )


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.2 ld と Intel 960 シリーズ

コマンド行オプション `-Aarchitecture' を使って, 960 シリーズのメンバを特定する二文字から名前の一つを指定することが できる. このオプションは, 出力ターゲットを指定し, 入力ファイルに 出力ターゲットで使えない命令があると警告を出す. また, リンカの アーカイブライブラリの探し方も変わる. それぞれの特定のアーキテクチャに 固有のライブラリを使うようにするために, アーキテクチャを特定する 文字列をサフィックスとする名前も検索するのである.

例えば, コマンド行に `-ltry' に加えて `-ACA' も 指定すると, 以下の名前のライブラリを(組み込み検索パスと, `-L' で指定したパスから)探す.

 
try
libtry.a
tryca
libtryca.a

最初の二つの候補は, どんな場合でも考慮される. 最後の二つが `-ACA' によるものである.

`-A' を複数回指定するのは意味がある. 960 アーキテクチャシリーズは, ターゲットアーキテクチャを組み合わせることが可能だからである. 一つのアーキテクチャを指定する毎に, `-l' で ライブラリを指定した時に検索する名前に, もう一つの名前の組を追加するのである.

ld は, i960 シリーズ用に `--relax' オプションを用意している. `--relax' を指定すると, 飛び先が 24 ビットの範囲内に収まる balx 命令と calx 命令を見つけると, それらを全て, それぞれ 24 ビットの PC 相対の bal 命令と cal 命令に置き換えるのである. また, cal の飛び先 サブルーチンが末端ルーチン(つまり, 他のサブルーチンを一切呼び出さない ルーチン)であることがわかると, その calbal 命令に 置き換える.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.3 ARM と Thumb コード間の協調作業のサポート

ARM の場合,ld は ARM と Thumb のコードの間で, 関数呼び出しを行なうことができるコードスタブを生成する. このスタブは,コマンド行オプション `-mthumb-interwork' を指定して コンパイルとアセンブルを行なったコードとしか動作しない. 古い ARM のオブジェクトファイルやライブラリとリンクするときは, `-mthumb-interwork' オプションなしでコンパイルされている はずだから,コマンド行オプション `--support-old-code' を 指定する必要がある.これにより,協調化されていないARM コードと 組み合わせても動作する,大きめのスタブ関数を生成する. ただし,協調化されていない Thumb コードへの関数呼び出し用の スタブの生成はサポートしていないことに注意.

`--thumb-entry' オプションは,一般ターゲット向け `--entry' と同じであり,プログラムの開始アドレスを設定するものである. ただし,そのアドレスの基底ビットも設定するので,BX 命令を使って そこへ分岐することができるので,プログラムは Thumb モードでも 単純に実行を開始することができる.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.4 ld と HPPA 32ビット ELF サポート

共有ライブラリを生成する時,デフォルトでは,サブスペース一個の アプリケーションに対して使用するのに適切なインポートスタブを生成する. `--multi-subspace' オプションを指定すると,ld は, エクスポートスタブ,さらに,複数のサブスペースで使うのに適切な, 異なった(より大きい)インポートスタブを生成する.

長い分岐スタブやインポート/エクスポートスタブは,入力セクションの グループの間に位置するスタブセクションにおかれる. `--stub-group-size' は,一つのスタブセクションで取り扱う 入力セクショングループの最大の大きさを指定する.分岐オフセットは 符合つきなので,一個のスタブセクションで入力セクショングループ二つに 対処できる.一つのグループをスタブセクションの前に,もう一つを 後に置くのである.ただし,スタブを必要とする条件分岐を使うなら, スタブセクションは,入力セクション一個だけに対処させた方が 良いだろう(分岐予測のため). `N' の値を負にするとこの方式を選び,スタブへの分岐は常に 負のオフセットを使うことを保証する.`N' の値として 特別に認識される値が二つある.`1'`-1' である. このどちらも,検出した分岐型用の入力セクショングループの大きさを 自動的に変える. スタブの位置に関しては、`N' のその他の正または 負の値の場合とそれぞれ同じ動作になる。

`--stub-group-size' は,入力セクションを分割しないことに 注意.指定されたグループサイズより大きな一個の入力セクションがあれば, 当然(一個のセクションの)より大きなグループを作る.入力セクションが 大き過ぎる場合,分岐がスタブに到達できない可能性がある.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.5 色々な TI COFF バージョンのサポート

`--format' オプションは,色々な TI COFF バージョンの一つを 選択する.これを書いている時点での最新は 2 である.バージョン 0 と 1 もサポートしている.TI COFF のバージョンは,ヘッダのバイト順形式も 色々ある.ld は,どのバージョンでもどのバイト順でも読み込みを 行なうが,出力ヘッダ形式は, 特定のターゲットにより指定されるデフォルト に依存する.


[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

This document was generated by YABUKI Youichi on March, 15 2002 using texi2html