2011-12-15 10 views
7

Sto usando LD_PRELOAD per agganciare una funzione di libreria, e in Linux funziona perfettamente. Ma non riesco a capire come fare l'equivalente in OSX.Qual è l'equivalente esatto di LD_PRELOAD su OSX?

La messa a punto che ho su Linux è la seguente:

Il codice è:

#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; 
} 

che ho poi compilo con:

gcc -Wall -O2 -fpic -shared -ldl -g -I/path/to/includes/ -o raise_shim.so raise_shim.c 

ho quindi eseguire con:

LD_PRELOAD=./raise_shim.so ruby 

Al l di quanto sopra funziona bene su Linux, qual è l'equivalente per ogni passaggio per farlo funzionare su OSX? Ho cercato su Google e non sono riuscito a farlo funzionare con le informazioni fornite poiché mancano le informazioni per alcuni passaggi.

Grazie in anticipo!

risposta

9

Dai uno sguardo allo DYLD_INSERT_LIBRARIES. Questa è la variabile che stai cercando.

Vedere anche this answer.

+0

Grazie, lo sapevo molto :) Ma non è così semplice come l'impostazione che ho trovato, devo apportare importanti modifiche alla mia fonte, e anche il passo della compilazione è diverso. È l'esecuzione di questi passaggi non riesco a capire come fare: ( – horseyguy

+0

Sei sicuro? Sono abbastanza sicuro di averlo usato prima (ma non al 100% - So solo che l'ho visto. P) Che cosa non funziona esattamente? –

+1

Quale riga dovrei usare per costruire la libreria, quella (mostrata nella domanda sopra) non funziona più Devo modificare il mio codice sorgente in qualche modo? senti parlare della necessità di impostare un'altra macro 'FLAT_NAMESPACES', e qualcosa su' DYLD_INTERPOSE'Io so che non si tratta semplicemente di sostituire 'DYLD_INSERT_LIBRARIES' per' LD_PRELOAD'. – horseyguy

Problemi correlati