Wie würde eine geladene Bibliotheksfunktion ein Symbol in der Hauptanwendung aufrufen?

8

Wird beim Laden eine gemeinsame Bibliothek über die Funktion dlopen() geöffnet, gibt es eine Möglichkeit, Funktionen im Hauptprogramm aufzurufen?

    
Nikron 25.12.2008, 01:30
quelle

3 Antworten

17

Code von dlo.c (die lib):

%Vor%

Kompilieren mit

%Vor%

Hier der Code des Hauptprogramms (kopiert von dlopen manpage, und angepasst):

%Vor%

Erstellen mit

%Vor%

Ausgabe:

%Vor%

Die Option -rdynamic setzt alle Symbole in die dynamische Symboltabelle (die dem Speicher zugeordnet ist), nicht nur die Namen der verwendeten Symbole. Lesen Sie weiter darüber hier . Natürlich können Sie auch Funktionszeiger (oder eine Struktur von Funktionszeigern) angeben, die die Schnittstelle zwischen der Bibliothek und Ihrem Hauptprogramm definieren. Es ist eigentlich die Methode, die ich wahrscheinlich wählen würde. Ich habe von anderen Leuten gehört, dass es in Windows nicht so einfach ist, -rdynamic zu machen, und es würde auch für eine sauberere Kommunikation zwischen Bibliothek und Hauptprogramm sorgen (Sie haben genaue Kontrolle darüber, was aufgerufen werden kann und nicht), aber es erfordert auch mehr Hauswirtschaft.

    
Johannes Schaub - litb 25.12.2008, 01:42
quelle
4

Ja, wenn Sie Ihrer Bibliothek einen Zeiger auf diese Funktion geben, bin ich sicher, dass die Bibliothek die Funktion im Hauptprogramm ausführen / ausführen kann.

Hier ist ein Beispiel, habe es nicht kompiliert, also Vorsicht;)

%Vor%     
hhafez 25.12.2008 01:35
quelle
1

Die dlopen() -Funktion, wie von @litb beschrieben, wird hauptsächlich auf Systemen bereitgestellt, die Objektdateien im ELF-Format verwenden. Es ist ziemlich mächtig und lässt Sie kontrollieren, ob Symbole, die von der geladenen Bibliothek referenziert werden, vom Hauptprogramm erfüllt werden können, und im Allgemeinen lassen Sie sie zufriedenstellen. Nicht alle Ladesysteme für gemeinsam genutzte Bibliotheken sind so flexibel - seien Sie sich bewusst, wenn es um die Portierung Ihres Codes geht.

Der Callback-Mechanismus von @hafez funktioniert jetzt, wo die Knicke in diesem Code gerade sind.

    
Jonathan Leffler 25.12.2008 06:22
quelle

Tags und Links