从OS X上的C中的dlopen()ed动态库访问主程序全局结构/指针

时间:2012-12-03 16:43:41

标签: c macos pointers gcc

我实际上是将Linux应用程序移植到Mac OS X.我的问题是我可以访问变量而不是指针。

我以main.h这种方式声明变量:

uint64_t test;
uint64_t *test2;

mylib.h

extern uint64_t test;
extern uint64_t *test2;

并在mylib.c中以这种方式访问​​变量:

printf("%llu\n",test);
printf("%llu\n",*test2);

第一个printf()没有任何问题,但第二个给了我这个错误:

Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_INVALID_ADDRESS at address: 0x0000000000000008

有人知道为什么会这样吗?

我的ggc命令行有以下标志:

gcc -Wall -g -fPIC -c main.c gcc -shared -Wl,-undefined,dynamic_lookup -o mylib.so mylib.o

1 个答案:

答案 0 :(得分:0)

仅针对有类似问题的人:

我决定使用getter& amp; setter因为没有问题用动态库访问主程序的功能只是变量。

在mylib.c中:

test2 = getTest();

在main.c中:

uint64_t* getTest(){
    return &test;
}

更新

我终于找到了绕过这个吸气剂的方法。二传手。您面临的问题是您要将变量定义两次,在我的情况下,这是在对extern关键字的误解中发生的。要解决您的问题,您需要在main.h例如:

中将变量声明为extern
extern uint64_t test;
extern uint64_t *test2;

下一步是在main.c中定义变量,例如:

int main(...) {
    test = 1;
    test2 = &test;
}

最后从mylib.h

中删除extern声明

以下SO帖子导致了我的解决方案:link