我正在使用LD_PRELOAD
来挂接库函数,在Linux中它可以完美地工作。但是我不知道如何在OSX中做到这一点。
我在Linux上的设置如下:
代码是:
#include <stdio.h>
#include <dlfcn.h>
#include <stdlib.h>
#include <unistd.h>
#include <ruby.h>
void
rb_raise(unsigned long exc, const char *fmt, ...)
{
static void (*libruby_rb_raise)
(unsigned long exc, const char *fmt, ...) = NULL;
void * handle;
char * error;
if (!libruby_rb_raise) {
handle = dlopen("/path/to/libruby.so",
RTLD_LAZY);
if (!handle) {
fputs(dlerror(), stderr);
exit(1);
}
libruby_rb_raise = dlsym(handle, "rb_raise");
if ((error = dlerror()) != NULL) {
fprintf(stderr, "%s\n", error);
exit(1);
}
}
// ...code...
return Qnil;
}
然后我用它编译:
gcc -Wall -O2 -fpic -shared -ldl -g -I/path/to/includes/ -o raise_shim.so raise_shim.c
然后执行:
LD_PRELOAD=./raise_shim.so ruby
上面所有这些在Linux上都能很好地工作,使此步骤在OSX上工作的每个步骤等效于什么?我已经对此进行了搜索,但是由于缺少某些步骤的信息,因此无法使其与所提供的信息一起使用。
提前致谢!
最佳答案
看看DYLD_INSERT_LIBRARIES
。这就是您要查找的变量。
另请参见this answer。
关于macos - 与OSX上的LD_PRELOAD完全等效吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8514783/