如何在Mac OS X中获取指向二进制部分的指针?

时间:2013-07-16 06:35:43

标签: linker ld

我正在编写一些代码,这些代码将一些数据结构存储在一个特殊的命名二进制部分中。这些是同一结构的所有实例,它们分散在许多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的类似问题:How to get a pointer to a binary section in MSVC?

2 个答案:

答案 0 :(得分:7)

您可以让达尔文链接器为您执行此操作。

#include <stdio.h>

extern int start_mysection __asm("section$start$__DATA$__mysection");
extern int stop_mysection  __asm("section$end$__DATA$__mysection");

// If you don't reference x, y and z explicitly, they'll be dead-stripped.
// Prevent that with the "used" attribute.
static int x __attribute__((used,section("__DATA,__mysection"))) = 4;
static int y __attribute__((used,section("__DATA,__mysection"))) = 10;
static int z __attribute__((used,section("__DATA,__mysection"))) = 22;

int main(void)
{
    long sz = &stop_mysection - &start_mysection;
    long i;

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

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

    return 0;
}

答案 1 :(得分:2)

使用Mach-O信息:

#include <mach-o/getsect.h>

char *secstart;
unsigned long secsize;
secstart = getsectdata("__SEGMENT", "__section", &secsize);

以上提供了有关声明为:

的部分的信息
int x __attribute__((section("__SEGMENT,__section"))) = 123;

更多信息:https://developer.apple.com/library/mac/documentation/developertools/conceptual/machoruntime/Reference/reference.html