2011-12-15 5 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 Linux上でうまく動作しますが、OSX上でこれを動作させるためには、各ステップに相当するものは何ですか?私はこれをgoogledし、いくつかの手順の情報が不足しているとして提供された情報で動作するように取得することができませんでした。

ありがとうございます!

答えて

9

DYLD_INSERT_LIBRARIESをご覧ください。それがあなたが探している変数です。

this answerも参照してください。

+0

ありがとう、私はこれを多く知っていた:)しかし、それは私が見つけた設定と同じくらい単純ではなく、私は自分のソースに大きな変更を加えなければならず、コンパイルのステップも異なっている。これらのステップを実行する方法は分かりません:( – horseyguy

+0

あなたは確かですか?私はこれを以前に使ったことがあると確信していますが、100%ではありません。 P)何が正しく動作していないのですか? –

+1

ライブラリをビルドするために使うべき行は、上記の質問にある通りです。別の 'FLAT_NAMESPACES'マクロを設定する必要があることを聞き、' DYLD_INTERPOSE'について何かを知っています。単に 'LD_PRELOAD'に' DYLD_INSERT_LIBRARIES'を代入するだけではないことが分かります。 – horseyguy

関連する問題