2011-12-15 3 views
7

Я использую 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? Я искал это и не смог заставить его работать с предоставленной информацией, поскольку информация о некоторых из этих шагов отсутствует.

Заранее благодарен!

ответ

9

Посмотрите на DYLD_INSERT_LIBRARIES. Это переменная, которую вы ищете.

См. Также this answer.

+0

Спасибо, я знал это много :) Но это не так просто, как настройка, которую я нашел, я должен внести существенные изменения в свой источник, а также шаг компиляции. Это выполнение этих шагов, я не могу понять, как это сделать :( – horseyguy

+0

Я уверен, что я использовал это раньше (но не на 100% - я просто знаю, что я посмотрел на него: P) Что именно не работает? –

+1

Какую строку я должен использовать, чтобы построить библиотеку, то, что (показано в вопросе выше) больше не работает. Мне нужно каким-либо образом изменить исходный код? услышать о необходимости установить еще один макрос FLAT_NAMESPACES, и что-то о 'DYLD_INTERPOSE'I знаю, что это не просто вопрос замены DYLD_INSERT_LIBRARIES' на' LD_PRELOAD'. – horseyguy

Смежные вопросы