Richtige Verwendung von libdl und dynamisch verknüpften Bibliotheken

Lesezeit: 2 Minuten

Benutzeravatar von Michael Schilling
Michael Schilling

Ich muss eine von mir erstellte Bibliothek dynamisch verknüpfen. Ich bin mir nicht ganz sicher, was das Problem ist. Es kompiliert alles richtig, aber ich fange immer an handle als die NULL Zeiger:

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

Ich kann diesen Fehler nicht weitergeben und bin mir nicht sicher, was möglicherweise falsch sein könnte. Ich bin mir ziemlich sicher, dass ich alles richtig zusammengestellt habe. Hier sind die Kompilierungsschritte, die ich verwendet habe:

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

Ich erhalte einen Fehler, der liest

nur ET_DYN und ET_EXEC können geladen werden.

Beim Bauen hw11-lib-michaelSchilling.sodu scheinst es nicht zu sagen gcc dass Sie ein gemeinsam genutztes Objekt (die .so im Namen reicht nicht).

Mit dem -c es erzeugt eine Objektdatei (keine geteilt Objekt) und es aufrufen michaelSchilling.so. Der Linker wird nicht einmal aufgerufen.

Entferne das -c von dem gcc Befehlszeile und hinzufügen -shared:

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

  • Zusammen mit -rdynamic? Habe es gerade mit beidem und mit just probiert -sharedaber ich habe den gleichen Fehler.

    – Michael Schilling

    3. Dezember 2011 um 22:16 Uhr


  • @MichaelSchilling: Ich glaube nicht -rdynamic irgendetwas mit dem Problem zu tun hat, also können Sie es genauso gut behalten, falls es von Ihrem Code benötigt wird.

    – NPE

    3. Dezember 2011 um 22:18 Uhr

  • @MichaelSchilling: Hast du die entfernt -c?

    – NPE

    3. Dezember 2011 um 22:19 Uhr

Ein Schrägstrich (/) als erstes Zeichen eines Pfadnamens zeigt an, dass der Pfadname absolut (relativ zum Stammverzeichnis), nicht relativ zum aktuellen Arbeitsverzeichnis und schon gar nicht relativ zum Speicherort der Binärdatei ist. Sie müssen den vollständigen Pfad angeben, indem Sie den Speicherort der Binärdatei herausfinden (was an sich kein einfaches Problem ist), oder Sie können ihn verwenden $ORIGIN mit dlopen (Es funktioniert mit rpath, aber ich bin mir nicht sicher, ob es mit funktioniert dlopen).

  • Was ist mit einer Periode vor dem Pfad? (./)

    – Michael Schilling

    3. Dezember 2011 um 21:59 Uhr

  • Das macht es relativ zum aktuellen Arbeitsverzeichnis, nicht zum Speicherort Ihrer Programmbinärdatei.

    – R.. GitHub HÖR AUF, EIS ZU HELFEN

    4. Dezember 2011 um 15:21 Uhr

Benutzeravatar von colmustard
Senf

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

funktioniert für mich unter Linux beim Kompilieren der Bibliothek für den Code, der sie öffnet, den Sie benötigen -ldl

Ist hw11-lib-michaelSchilling.so im absoluten Stammverzeichnis Ihres Dateisystems? Sie behaupten, es wäre so, indem Sie einen Schrägstrich darauf führen … aber ich vermute, das ist es nicht.

Schließen Sie in Ihre Fehlerbehandlung die Ausgabe von ein dlerror() in dem, was Sie drucken, um die Fehlerursache zu finden.

1437360cookie-checkRichtige Verwendung von libdl und dynamisch verknüpften Bibliotheken

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy