我正在编写一些代码,将一些数据结构存储在一个特殊的命名二进制部分中。这些都是相同结构的所有实例,它们分散在许多 C 文件中,并且不在彼此的范围内。通过将它们全部放在命名部分中,我可以遍历所有这些。
这与 GCC 和 GNU ld 完美配合。由于缺少__start___mysection
和__stop___mysection
符号,在 Mac OS X 上失败。我猜 llvm ld 不够聪明,无法自动提供它们。
在 GCC 和 GNU ld 中,我使用__attribute__((section(...))
plus 一些特殊命名的 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 的类似问题在这里被问到:How to get a pointer to a binary section in MSVC?