15

質問のようなものを構築しています 異なる.aファイルから1つの配列にデータを収集する方法? ldスクリプトを使用して.aファイルにセクションを保持する方法は? 、つまり、リンク時に異なるオブジェクト ファイルの要素から構成される配列。

私の場合、いくつかの配列があり、それぞれが独自のセクション .ld_comp_array_* に入ります。ここで、* は配列の名前と一致します。次に、ld --verbose を使用してデフォルトのリンカー スクリプトを取得し、これらすべてのセクション (異なる配列の要素が混在しないように並べ替え) を出力セクションに配置して変更します。

KEEP (*(SORT_BY_NAME(.ld_comp_array*)))

すべてが正常に動作します。

この機能を使用するアプリケーションはさまざまなプラットフォーム用に構築される可能性があるため、状況は少し複雑になります。これまでのところ、ターゲット プラットフォームとして AVR Xmega、Windows 32 ビットおよび Linux 32 を試してみました単体テスト用の 64 ビットで、リストは公開されています (新しいプラットフォームが近い将来追加される可能性があります)。

ただし、特定のプラットフォームごとに、デフォルトのリンカー スクリプトが他のプラットフォームとは異なります。現在、手動で .ld_comp_array* セクションを挿入しています。何らかの形で自動的に行うことは可能でしょうか? 私が考えた唯一の解決策は、デフォルトのスクリプトを解析して上記の入力セクションの説明を貼り付けることでしたが、これは重すぎるようです。

比較的単純な解決策がない場合は手動で行うこともできますが、ld のローカル バージョンから取得したデフォルト スクリプトが別のバージョンの binutils で壊れるかどうかはわかりません。これが安全かどうかを明確にできる人はいますか?

自動的に実行できる場合、配列が「不変」であると仮定して、入力セクションの仕様を常に .text セクションに直接「挿入」しても問題ありませんか?

4

1 に答える 1

23

その問題に対する満足のいく解決策を見つけました。GNU ld には INSERT オプションがあり、外部でサポートされているスクリプトがデフォルト スクリプトをオーバーライドせず、デフォルト スクリプトに存在するセクションに相対的な位置に新しいセクションを追加するだけです。

したがって、私の場合、リンカーに渡されるスクリプトは次のように単純です。

SECTIONS
{
  .rodata.ld_comp_array :
  {
    *(SORT_BY_NAME(.ld_comp_array*))
  }
}
INSERT AFTER .rodata;

INSERT オプションの詳細: http://sourceware.org/binutils/docs/ld/Miscellaneous-Commands.html#Miscellaneous-Commands

于 2011-08-29T01:41:17.897 に答える