Hallo.
Ich versuche mich grade an dynamic linking mit C unter Linux. Ich mache zum Test folgendes:
Eine Datei dltest.c mit dem Inhalt
Code:
#include <stdio.h>
void hello () {
printf ("Hello World.\n");
}
Die ich compiliere mit den Kommandos
Code:
$ gcc -c -fPIC -DPIC dltest.c
$ gcc -shared -Wall dltest.o -lc -Wl,-soname -o dltest.so
Eine Datei test.c mit dem Inhalt
Code:
#include <stdio.h>
#include <dlfcn.h>
int main (int argc, char* argv[]) {
if (argc != 3) {
printf("Fehler");
return -1;
}
void* handle = dlopen(argv[1], RTLD_LAZY);
if (!handle) printf("Could not load %s\nError:%s\n", argv[1], dlerror());
typedef void (*hello_t)();
dlerror();
hello_t hello = (hello_t) dlsym (handle, argv[2]);
const char* dlsym_error = dlerror();
if (dlsym_error) {
printf("Fehler: %s\n", dlsym_error);
dlclose(handle);
return -1;
}
hello();
dlclose(handle);
return 0;
}
die ich compiliere mit
Code:
$ gcc -o test test.c -ldl
Alles quick and dirty, sollte nur mal ein Test sein, ob das Ganze funktioniert.
So. Nun hatte ich mir erhofft, dass der Aufruf
Code:
./test dltest.so hello
Irgendwie die entsprechende Funktion ausführt. Das ist leider nicht so, ich bekomme die Fehlermeldung
Code:
Fehler: ./test: undefined symbol: hello
Speicherzugriffsfehler
Bleibt die Frage: Was mache ich falsch. Sicherlich ein Anfängerfehler, aber keine Ahnung.
Lesezeichen