Uso adecuado de libdl y bibliotecas enlazadas dinámicamente

2 minutos de lectura

Avatar de usuario de Michael Schilling
Michael Schilling

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 atrapo handle como el NULL puntero:

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 pasar este error y no estoy seguro de qué podría estar mal. Estoy bastante seguro de que he compilado todo correctamente. Estos son los pasos de compilación que usé:

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

me sale un error que dice

solo se pueden cargar ET_DYN y ET_EXEC.

al construir hw11-lib-michaelSchilling.sono pareces estar diciendo gcc que desea un objeto compartido (el .so en el nombre no es suficiente).

Con el -c está produciendo un archivo de objeto (no un compartido objeto) y llamándolo michaelSchilling.so. El enlazador ni siquiera se invoca.

Quitar el -c desde el gcc línea de comando y agregar -shared:

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

  • Junto con -rdynamic? Acabo de probarlo con ambos y con solo -sharedpero tengo el mismo error.

    – Michael Schilling

    3 de diciembre de 2011 a las 22:16


  • @MichaelSchilling: No creo -rdynamic tiene algo que ver con el problema, por lo que también puede conservarlo en caso de que su código lo necesite.

    – ENP

    3 de diciembre de 2011 a las 22:18

  • @MichaelSchilling: ¿Ha quitado el -c?

    – ENP

    3 de diciembre de 2011 a las 22:19

una barra (/) como el primer carácter de un nombre de ruta indica que el nombre de ruta es absoluto (relativo al directorio raíz), no relativo al directorio de trabajo actual y ciertamente no relativo a la ubicación del binario. Deberá especificar la ruta completa averiguando la ubicación del binario (que no es un problema fácil en sí mismo) o podría usar $ORIGIN con dlopen (funciona con rpath pero no estoy seguro si funciona con dlopen).

  • ¿Qué pasa con un período antes del camino? (./)

    – Michael Schilling

    3 de diciembre de 2011 a las 21:59

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

    – R.. GitHub DEJA DE AYUDAR A ICE

    4 de diciembre de 2011 a las 15:21

avatar de usuario de colmustard
mostaza col

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

funciona para mí en Linux al compilar la biblioteca para el código que lo abre, necesita -ldl

Es hw11-lib-michaelSchilling.so en la raíz absoluta de su sistema de archivos? Estás afirmando que es con una barra oblicua… pero sospecho que no lo es.

En su manejo de errores, incluya la salida de dlerror() en lo que imprimes, para encontrar la causa del fallo.

¿Ha sido útil esta solución?