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!
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
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? –
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