5

いくつかのデータ構造を特別な名前のバイナリ セクションに格納するコードを書いています。これらはすべて同じ構造体のインスタンスであり、多くの C ファイルに散らばっており、相互のスコープ内にはありません。それらすべてを名前付きセクションに配置することで、それらすべてを反復処理できます。

これは、GCC および GNU ld で完全に機能します。__start___mysectionおよび__stop___mysection記号が見つからないため、Mac OS X では失敗します。llvm ld は、それらを自動的に提供できるほどスマートではないと思います。

GCC と GNU ld では__attribute__((section(...))、リンカによって魔法のように埋められる特別な名前の extern ポインタをいくつか使用します。以下に簡単な例を示します。

#include <stdio.h>

extern int __start___mysection[];
extern int __stop___mysection[];

static int x __attribute__((section("__mysection"))) = 4;
static int y __attribute__((section("__mysection"))) = 10;
static int z __attribute__((section("__mysection"))) = 22;

#define SECTION_SIZE(sect) \
    ((size_t)((__stop_##sect - __start_##sect)))

int main(void)
{
    size_t sz = SECTION_SIZE(__mysection);
    int i;

    printf("Section size is %u\n", sz);

    for (i=0; i < sz; i++) {
        printf("%d\n", __start___mysection[i]);
    }

    return 0;
}

FreeBSD リンカを使用してセクションの先頭/末尾へのポインタを取得する一般的な方法は何ですか? 誰にもアイデアはありますか?

参照リンカーは次のとおりです。

@(#)PROGRAM:ld  PROJECT:ld64-127.2
llvm version 3.0svn, from Apple Clang 3.0 (build 211.12)

ここで MSVC について同様の質問がされました: MSVCのバイナリ セクションへのポインタを取得するにはどうすればよいですか?

4

2 に答える 2