使用Xcode,我想从mach-o bundle二进制文件重新导出一个符号(一个特定的函数),其中符号最初是在dylib中定义的。
我已经尝试了-sub_library链接器开关,但似乎没有重新导出dylib符号,可能是因为我自己没有构建一个dylib(?)
在Xcode的链接器中,reexport-l / reexport_library开关似乎不受支持。
有什么想法吗?
答案 0 :(得分:3)
如果我理解正确的话,这可能就是你要找的东西。我将使用libpthread作为包含要重新导出的函数的假设dylib。
<强> mybundle.c 强>:
#include <pthread.h>
#include <stdio.h>
void *foo(void *ctx) {
puts((char *)ctx);
return 0;
}
<强> mybundle.exp 强>:
_foo
_pthread_create
_pthread_join
编译捆绑包,动态链接到libpthread.dylib:
josh$ gcc -bundle -lpthread -Wl,-exported_symbols_list,mybundle.exp -o mybundle.so mybundle.c
<强> myloader.c 强>:
#include <dlfcn.h>
#include <pthread.h> // merely for type definitions
#include <assert.h>
#include <stdio.h>
int main() {
void *(*foo)(void *ctx);
/* the following cannot be declared globally without changing their names,
as they are already (and unnecessarily) declared in <pthread.h> */
int (*pthread_create)(pthread_t *thrd, const pthread_attr_t *attr, void *(*proc)(void *), void *arg);
int (*pthread_join)(pthread_t thrd, void **val);
void *bundle;
assert(bundle = dlopen("mybundle.so", RTLD_NOW));
assert(foo = dlsym(bundle, "foo"));
assert(pthread_create = dlsym(bundle, "pthread_create"));
assert(pthread_join = dlsym(bundle, "pthread_join"));
pthread_t myThrd;
pthread_create(&myThrd, 0, foo, "in another thread");
pthread_join(myThrd, 0);
return 0;
}
编译加载器:
josh$ gcc myloader.c -o myloader
执行命令
josh$ ./myloader
in another thread
注意myloader没有链接到pthread,但是pthread函数在运行时通过bundle加载并可用。