c - studio - dlls moneda
Uso apropiado libdl y bibliotecas vinculadas dinĂ¡micamente (4)
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 tomo handle
como el puntero NULL
:
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 haber compilado todo correctamente. Aquí están 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
Me ./hw11-lib-michaelSchilling.so: only ET_DYN and ET_EXEC can be loaded.
un error que dice ./hw11-lib-michaelSchilling.so: only ET_DYN and ET_EXEC can be loaded.
¿Qué significa esto?
Gracias.
¿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, incluya la salida de dlerror()
en lo que imprima, para encontrar la causa de la falla.
Al construir hw11-lib-michaelSchilling.so
, no parece decirle a gcc
que quiere un objeto compartido (el .so
en el nombre no es suficiente).
Con el -c
está produciendo un archivo de objeto (no un objeto compartido ) y llamándolo michaelSchilling.so
. El enlazador ni siquiera se invoca.
Elimine el -c
de la línea de comando gcc
y agregue -shared
:
gcc -shared -rdynamic hw11-lib-michaelSchilling.c -o hw11-lib-michaelSchilling.so
Una barra inclinada ( /
) como 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. Necesitarás especificar la ruta completa al descubrir la ubicación del dlopen
binario (que no es un problema fácil en sí mismo) o podrías usar $ORIGIN
con dlopen
(funciona con rpath pero no estoy seguro de si trabaja con dlopen
).
gcc -fPIC -shared -rdynamic library.c -o library.o
funciona para mí en Linux al compilar la biblioteca para el código que la abre, necesita -ldl