2011-07-29 6 views
10

私は質問How to collect data from different .a files into one array? How to keep sections in .a files with ld script?のようなものを構築しています。つまり、異なるオブジェクトファイルからの要素のリンク時に配列が作成されます。セクションをGNU ldスクリプトに注入する。 binutilsのバージョン間のスクリプトの互換性。

私の場合、いくつかの配列があり、それぞれが独自のセクションの.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セクションに直接 "注入"してもよろしいですか?

答えて

15

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

だから私の場合には、リンカに渡されたスクリプトは、のような単純なことがありますhttp://sourceware.org/binutils/docs/ld/Miscellaneous-Commands.html#Miscellaneous-Commands

:INSERTオプションの

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

詳細

関連する問題