2011-12-15 12 views
7

Estoy usando LD_PRELOAD para conectar una función de biblioteca, y en Linux funciona perfectamente. Pero no puedo entender cómo hacer el equivalente en OSX.¿Cuál es el equivalente exacto a LD_PRELOAD en OSX?

La configuración que tengo en Linux es el siguiente:

El código es:

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

que luego compilar con:

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

luego ejecuto con:

LD_PRELOAD=./raise_shim.so ruby 

Al l de lo anterior funciona bien en Linux, ¿cuál es el equivalente de cada paso para que esto funcione en OSX? Lo busqué en Google y no he podido hacer que funcione con la información proporcionada, ya que falta información sobre algunos de los pasos.

¡Gracias de antemano!

Respuesta

9

Eche un vistazo a DYLD_INSERT_LIBRARIES. Esa es la variable que estás buscando.

Véase también this answer.

+0

Gracias, sabía esto :) Pero no es tan simple como la configuración que encontré, tengo que hacer modificaciones importantes a mi fuente, y el paso de compilación también es diferente. Es la ejecución de estos pasos que no sé cómo hacer :( – horseyguy

+0

¿Estás seguro? Estoy bastante seguro de haber usado esto antes (pero no al 100%, solo sé que lo he visto): P) ¿Qué es exactamente lo que no funciona? –

+1

¿Qué línea exactamente debería usar para construir la biblioteca, la que se muestra en la pregunta anterior ya no funciona. ¿Tengo que modificar mi código fuente de alguna manera? ¿Qué es esto? escuchar sobre la necesidad de establecer otra macro 'FLAT_NAMESPACES', y algo sobre' DYLD_INTERPOSE'Sé que no se trata simplemente de sustituir 'DYLD_INSERT_LIBRARIES' por' LD_PRELOAD'. – horseyguy

Cuestiones relacionadas