Я использую LD_PRELOAD
, чтобы подключить библиотечную функцию, а в Linux он отлично работает. Но я не могу понять, как сделать эквивалент в OSX.Что такое точный эквивалент LD_PRELOAD на 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
Al l из вышеперечисленного хорошо работает в Linux, что эквивалентно для каждого шага, чтобы заставить это работать на OSX? Я искал это и не смог заставить его работать с предоставленной информацией, поскольку информация о некоторых из этих шагов отсутствует.
Заранее благодарен!
Спасибо, я знал это много :) Но это не так просто, как настройка, которую я нашел, я должен внести существенные изменения в свой источник, а также шаг компиляции. Это выполнение этих шагов, я не могу понять, как это сделать :( – horseyguy
Я уверен, что я использовал это раньше (но не на 100% - я просто знаю, что я посмотрел на него: P) Что именно не работает? –
Какую строку я должен использовать, чтобы построить библиотеку, то, что (показано в вопросе выше) больше не работает. Мне нужно каким-либо образом изменить исходный код? услышать о необходимости установить еще один макрос FLAT_NAMESPACES, и что-то о 'DYLD_INTERPOSE'I знаю, что это не просто вопрос замены DYLD_INSERT_LIBRARIES' на' LD_PRELOAD'. – horseyguy