ライブラリ関数をフックするために使用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 で機能させるための各ステップに相当するものは何ですか? これをグーグルで検索しましたが、一部の手順の情報が欠落しているため、提供された情報を使用して機能させることができませんでした.
前もって感謝します!