| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ld はいくつかのプラットフォームで機能を追加している.
以下の節でそれを説明する. 追加機能のないプラットフォームは
記載しない.
4.1 ldと H8/3004.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] | [ ? ] |
ld と H8/300
H8/300 の場合は, ld は, コマンド行オプション `--relax' を
指定すると以下のグローバルな最適化を行なう.
jsr 命令や
jmp 命令を見つけると, 全て, それぞれ 8ビットの, PC 相対の
bsr 命令と bra 命令に置き換える.
mov.b 命令を見つけると, 全て 8 ビットのアドレス形式を
使うように変更する. (つまり, `mov.b @aa:16' という
命令で, アドレス aa がトップページのメモリにある場合は,
`mov.b @aa:8' に変換するのである. )
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
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 の飛び先
サブルーチンが末端ルーチン(つまり, 他のサブルーチンを一切呼び出さない
ルーチン)であることがわかると, その cal を bal 命令に
置き換える.
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ARM の場合,ld は ARM と Thumb のコードの間で,
関数呼び出しを行なうことができるコードスタブを生成する.
このスタブは,コマンド行オプション `-mthumb-interwork' を指定して
コンパイルとアセンブルを行なったコードとしか動作しない.
古い ARM のオブジェクトファイルやライブラリとリンクするときは,
`-mthumb-interwork' オプションなしでコンパイルされている
はずだから,コマンド行オプション `--support-old-code' を
指定する必要がある.これにより,協調化されていないARM コードと
組み合わせても動作する,大きめのスタブ関数を生成する.
ただし,協調化されていない Thumb コードへの関数呼び出し用の
スタブの生成はサポートしていないことに注意.
`--thumb-entry' オプションは,一般ターゲット向け `--entry' と同じであり,プログラムの開始アドレスを設定するものである. ただし,そのアドレスの基底ビットも設定するので,BX 命令を使って そこへ分岐することができるので,プログラムは Thumb モードでも 単純に実行を開始することができる.
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ld と HPPA 32ビット ELF サポート ld は,
エクスポートスタブ,さらに,複数のサブスペースで使うのに適切な,
異なった(より大きい)インポートスタブを生成する.
長い分岐スタブやインポート/エクスポートスタブは,入力セクションの グループの間に位置するスタブセクションにおかれる. `--stub-group-size' は,一つのスタブセクションで取り扱う 入力セクショングループの最大の大きさを指定する.分岐オフセットは 符合つきなので,一個のスタブセクションで入力セクショングループ二つに 対処できる.一つのグループをスタブセクションの前に,もう一つを 後に置くのである.ただし,スタブを必要とする条件分岐を使うなら, スタブセクションは,入力セクション一個だけに対処させた方が 良いだろう(分岐予測のため). `N' の値を負にするとこの方式を選び,スタブへの分岐は常に 負のオフセットを使うことを保証する.`N' の値として 特別に認識される値が二つある.`1' と `-1' である. このどちらも,検出した分岐型用の入力セクショングループの大きさを 自動的に変える. スタブの位置に関しては、`N' のその他の正または 負の値の場合とそれぞれ同じ動作になる。
`--stub-group-size' は,入力セクションを分割しないことに 注意.指定されたグループサイズより大きな一個の入力セクションがあれば, 当然(一個のセクションの)より大きなグループを作る.入力セクションが 大き過ぎる場合,分岐がスタブに到達できない可能性がある.
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ld は,どのバージョンでもどのバイト順でも読み込みを
行なうが,出力ヘッダ形式は, 特定のターゲットにより指定されるデフォルト
に依存する.
| [ << ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |