21

私は Linux で C を使用しています。__section__gcc属性(特に Linux カーネル) を使用して、データ (通常は関数ポインター) をカスタム ELF セクションに収集するのを見てきました。これらのカスタム セクションに配置された「もの」は、どのように取得および使用されますか?

4

5 に答える 5

26

セクション名が有効な C 変数名になる限り、gcc(ldむしろ) は 2 つの魔法の変数__start_SECTIONと を生成し__stop_SECTIONます。これらは、次のように、セクションの開始アドレスと終了アドレスを取得するために使用できます。

/**
 * Assuming you've tagged some stuff earlier with:
 * __attribute((__section__("my_custom_section")))
 */

struct thing *iter = &__start_my_custom_section;

for ( ; iter < &__stop_my_custom_section; ++iter) {
    /* do something with *iter */
}

この機能に関する正式なドキュメントは見つかりませんでした。不明瞭なメーリング リストのリファレンスがいくつかあるだけです。ドキュメントの場所がわかっている場合は、コメントを残してください。

独自のリンカー スクリプトを使用している場合 (Linux カーネルのように)、魔法の変数を自分で追加する必要があります (vmlinux.lds.[Sh]およびこの SO 回答を参照)。

カスタム ELF セクションを使用する別の例については、こちらを参照してください。

于 2013-05-14T20:57:00.440 に答える
5

リンカは、コードで定義されたシンボルを使用でき、リンカ スクリプトで正確な名前を使用すると、それらの初期値を割り当てることができます。

_smysection = .;
*(.mysection)
*(.mysection*)
_emysection = .;

C コードで変数を定義するだけです。

const void * _smysection;

そして、通常の変数としてアクセスできます。

u32 someVar = (u32)&_smysection;
于 2015-07-23T12:11:53.923 に答える