Anzeige:
Ergebnis 1 bis 9 von 9

Thema: Shared library dynamisch laden (dlopen(), dlsym)

  1. #1
    Registrierter Benutzer Avatar von sschlarb
    Registriert seit
    27.09.2004
    Beiträge
    25

    Shared library dynamisch laden (dlopen(), dlsym)

    Hallo,
    ich habe mich jetzt durch einige Anleitungen gekaempft um eine shared library dynamisch zu laden, jedoch findet dlsym meine Funktion nicht.

    Ich habe folgendes Beispiel:

    dynlib.h
    Code:
    void print_message();
    dynlib.cpp
    Code:
    #include <stdio.h>
    #include "dynlib.h"
    
    void print_message()
    {
        printf("Message from lib!\n");
    }
    Dieses wird als shared library libdynlib.so kompiliert.

    Der dynamische Aufruf soll in der Beispieldatei dynload.cpp erfolgen:

    dynload.cpp
    Code:
    #include <stdio.h>
    #include <dlfcn.h>
    #include "dynlib.h"
    
    int main()
    {
        void* lib_handle; 
    
        lib_handle = dlopen("/home/mynick/dynload/libdynlib.so", RTLD_LAZY);
        if (!lib_handle) 
        {
            fprintf(stderr, "Error during dlopen(): %s\n", dlerror());
            return 1;
        }
        else
        {
            printf("I have function handle!\n");
        }
        void *print_message;
        const char* error_msg;
        print_message = dlsym(lib_handle,"print_message");
        error_msg = dlerror();
        if(error_msg)
        {
            fprintf(stderr, "Error locating 'print_message' - %s\n", error_msg);
            return 1;
        }
    }
    Damit erhalte ich zwar immer einen handle, aber die Funktion print_message() wird nicht gefunden. Ich habe auch schon alle moeglichen Varianten der Definition des Funktionspointers versucht. Vergeblich.

    Wenn ich den Funktionspointer anlegen muss, dann ist mir auch nicht ganz klar, wie. Das koennte in diesem Fall void*(*)() sein, oder?

    Ich haenge das Beispiel mit Makefiles an ('make' um Bibliothek und Beispiel zu erzeugen).

  2. #2
    Registrierter Benutzer
    Registriert seit
    24.09.2005
    Beiträge
    66
    Wenn die Library in C++ erstellt wurde, kodiert der Compiler weitere Informationen wie die Funktionssignatur (Parameter und Rückgabewert) in den Namen der Funktion.
    Dieser Vorgang (genannt name mangling) ist nötig um Parameterüberladung zu implementieren, da mehrere Funktionen mit gleichem Namen unterschieden werden müssen.
    Aus diesem Grund taucht die Funktion nicht mit ihrem ursprünglichen Namen in der Symboltabelle auf.
    Um das zu verhindern musst du die Funktion in der Library mit extern "C" deklarieren, also so:
    Code:
    extern "C" void print_message();

  3. #3
    Registrierter Benutzer Avatar von sschlarb
    Registriert seit
    27.09.2004
    Beiträge
    25
    Danke fuer die schnelle Antwort.

    Und was ist, wenn die library mit cc kompiliert wurde? Muss die Funktion dann auch mit extern deklariert werden?

  4. #4
    Registrierter Benutzer
    Registriert seit
    18.03.2005
    Beiträge
    211
    Wenn deine Umgebungsvariablen etc richtig gesetzt sind, dann vielleicht ^^

    Bei meiner Installation ist cc einfach auf den gcc gelinkt, mit paar gesetzten flags was den gcc dann im reinem c modus fahren muesste.

    und nen reiner c compiler sollte nichts mergeln, oder (funktionsueberladung sollt er auch ned koennen) ?

    Weiss ned genau wie *nixe es machen, aber unter windows braucht ne dll ne exportliste. Das ist ne map wo zum namen der funktion der funktionspointer steht. Die generiert der linker eigentlich. Unter windows braucht man dafuer ne .def datei, wo steht welche funktion in der map gelistet wird, alle anderen werden nur intern verlinkt. Nehm mal an unter *nix ist es aehnlich.

    Ciao ...

  5. #5
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Zitat Zitat von RHBaum Beitrag anzeigen
    und nen reiner c compiler sollte nichts mergeln, oder (funktionsueberladung sollt er auch ned koennen) ?
    Korrekt.

    Nehm mal an unter *nix ist es aehnlich.
    Nein, da reicht die Library selbst. Aber neuere Compiler, ich glaube bei GCC ab 4.0, können die Visbility von Symbolen berücksichtigen und Default könnte da durchaus "hidden" sein.

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  6. #6
    Registrierter Benutzer
    Registriert seit
    18.03.2005
    Beiträge
    211
    Nein, da reicht die Library selbst.
    also wird fuer jedes symbol global die map erstellt ?

    wie ist das mit funktionen die normal kein symbol erzeugen wuerden (inline) ignoriert der compiler dann das inline oder erstellt er kein symbol ?
    Faende das etwas unperformant, wenn bei ner .so fuer wirklich alles nen symbol erzwungen wird ....

    Ciao ...

  7. #7
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Zitat Zitat von RHBaum Beitrag anzeigen
    Faende das etwas unperformant, wenn bei ner .so fuer wirklich alles nen symbol erzwungen wird ....
    Darum gibt es eben visibility Informationen. Sonst ist jedes Symbol, das nicht explizit im Source als static deklariert wurde, vorhanden.

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  8. #8
    Registrierter Benutzer
    Registriert seit
    18.03.2005
    Beiträge
    211
    Darum gibt es eben visibility Informationen. Sonst ist jedes Symbol, das nicht explizit im Source als static deklariert wurde, vorhanden.
    wieso static ?

    kommt sich das nicht mit der normalen bedeutung von static in die quere ?
    kann ich keine static memberfunktionen von oeffentlichen klassen exportieren ?

    also irgendwie wird mir das grad immer undurchsichtiger ^^

    Ciao ...

  9. #9
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    static als Attribut einer Methode hat eine andere Bedeutung als static einer Funktion, die in einer Quelldatei sowohl deklariert als auch definiert wird.

    Sie ist dann ein nur lokal (nur in dieser Übersetzungseinheit) gültiges Symbol.

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •