2011-12-15 74 views
7

我使用LD_PRELOAD掛鉤庫函數,並在Linux中它完美的作品。但我無法弄清楚如何在OSX中做同樣的事情。OSX上與LD_PRELOAD的確切等價物是什麼?

的設置我在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上的工作方式相當於什麼?我已使用Google搜索並且無法使用它提供的信息,因爲某些步驟的信息丟失。

在此先感謝!

回答

9

看一看DYLD_INSERT_LIBRARIES。這是你正在尋找的變量。請參閱this answer

+0

謝謝,我知道這很多:)但它不只是設置,我發現,我必須對我的來源進行重大修改,編譯步驟也不同。這是執行這些步驟,我不知道該怎麼辦:( – horseyguy 2011-12-15 04:41:33

相關問題