いくつかのデータ構造を特別な名前のバイナリ セクションに格納するコードを書いています。これらはすべて同じ構造体のインスタンスであり、多くの 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のバイナリ セクションへのポインタを取得するにはどうすればよいですか?