2011-12-03 13 views
8

Necesito vincular dinámicamente una biblioteca que he creado. No estoy exactamente seguro de cuál es el problema. Todo se compila correctamente, pero siempre me captura handle como puntero NULL:Libdl de uso apropiado y bibliotecas vinculadas dinámicamente

void *handle; 
char *error; 
handle = dlopen ("./hw11-lib-michaelSchilling.so", RTLD_LAZY); 
//same error comes up with full path as well as './hw11...' 
if(!handle){ 
    error = dlerror(); 
    printf("%s\n", error); 
    printf("Error loading library.\n"); 
    exit(1); 
} 

no puedo conseguir pasado este error y no estoy seguro de lo que podría estar mal. Estoy bastante seguro de haber compilado todo correctamente. Estos son los pasos de compilación que utilicé:

gcc -rdynamic -c hw11-lib-michaelSchilling.c -o hw11-lib-michaelSchilling.so 
gcc hw11-michaelSchilling-4.c -ldl -o hw11-michaelSchilling-4 

Recibo un error que dice

única ET_DYN y ET_EXEC se pueden cargar.

Respuesta

14

Al compilar hw11-lib-michaelSchilling.so, no parece estar diciendo gcc que desea un objeto compartido (.so en el nombre no es suficiente).

Con la -c está produciendo un fichero objeto (no un compartían objeto) y decir que es michaelSchilling.so. El enlazador ni siquiera se invoca.

Retire la -c desde la línea de comandos gcc y añadir -shared:

gcc -shared -rdynamic hw11-lib-michaelSchilling.c -o hw11-lib-michaelSchilling.so 
+0

Junto con '-rdynamic'? Acabo de probarlo con ambos y con '' -shared', pero obtuve el mismo error. –

+0

@MichaelSchilling: no creo que '-rdynamic' tenga algo que ver con el problema, por lo que es mejor que lo guarde en caso de que lo necesite su código. – NPE

+0

@MichaelSchilling: ¿Has eliminado el '-c'? – NPE

0

¿Está hw11-lib-michaelSchilling.so en la raíz absoluta de su sistema de archivos? Estás afirmando que es liderando un ataque ... pero sospecho que no es así.

En el manejo de errores, incluir la salida de dlerror() en lo que se imprime, para encontrar la causa del fallo.

+0

HW11 -lib-michaelSchilling.so: no se puede abrir el archivo de objeto compartido: Ningún archivo o directorio Ese es el error que obtengo, pero es el mismo directorio que el programa que estoy tratando de ejecutar. También eliminé la barra. –

+0

Intente proporcionar la ruta absoluta completa al objeto compartido para ver si eso ayuda. – mah

+0

Lo hice, y obtuve 'solo ET_DYN y ET_EXEC se pueden cargar. –

1

Una barra inclinada (/) como primer carácter de una ruta de acceso indica que la ruta es absoluta (relativa al directorio raíz), no relativa al directorio de trabajo actual y ciertamente no relativa a la ubicación del archivo binario. Tendrá que especificar la ruta completa por averiguar la ubicación del binario (que no es un problema fácil en sí mismo) o es posible que pueda utilizar $ORIGIN con dlopen (funciona con rpath, pero estoy seguro de si funciona con dlopen).

+0

¿Qué hay de un período anterior a la ruta? ('. /') –

+0

Eso lo hace relativo al directorio de trabajo actual, no a la ubicación de su programa binario. –

0
gcc -fPIC -shared -rdynamic library.c -o library.o 

funciona para mí en Linux al compilar la biblioteca para el código que abre la tarjeta, deberá -ldl

Cuestiones relacionadas