Automatisch ausgeführte Funktionen beim Laden von gemeinsam genutzten Bibliotheken
Beim laden von shared libraries in Windows LoadLibrary()
Aufruf bewirkt DllMain
in der Bibliothek ausführen für jeden neuen Prozess-und thread-Bibliothek beimisst, und für jeden Prozess-und thread-Bibliothek deattaches aus.
Gibt es ähnliche Mechanismus für Mac OS X, Linux und möglicherweise auch andere POSIX-kompatible OSs?
Kommentar zu dem Problem
InformationsquelleAutor der Frage toriningen | 2012-03-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Definieren Sie eine on-load-Funktion für eine linux-Bibliothek, die mit der
.init
Mechanismus. Dies ist die gleiche wie die Angabe der Last-Zeit-Einstiegspunkt für eine Binärdatei (z.B. mit etwas anderem als main als Einstiegspunkt für ein Programm).Beim verknüpfen mit
ld
direkt verwenden Sie die:oder wenn Sie mit cc/gcc-link, die Sie verwenden:
Dies ist am einfachsten level.
Bearbeiten
Für den Destruktor/Finalizer verwenden Sie die
.fini
Mechanismus. Dies funktioniert in der gleichen Weise, wie Sie die init-option, und verwenden Sie:beim aufrufen
ld
. Die Verfügbarkeit beschränkt sich auf die-init
option auf die Mac OSX Plattform.Sollten Sie auch in der Lage sein zu verwenden, die
__attribute__((constructor))
syntax für gcc:Ist wahrscheinlich ein portabler Weg, anstatt das Verschrauben mit den linker-Optionen. Alle Konstruktoren aufgerufen werden soll beim laden, aber nicht hängt von der Reihenfolge der Initialisierung, das führt zu Wahnsinn und unreproducible Fehler, Kosten, Zeit und Aufwand zu Debuggen.
Edit 2 Die Nutzung der
__attribute__((constructor))/__attribute__((destructor))
semantische ist die am meisten bevorzugte Mechanismus für die C/C++ Programmiersprache.Für die
D
Programmiersprache, die Sie sollten wirklich die statische Modul-Konstruktor/Destruktor:Oder der statische Konstruktor der Klasse:
Dies ist stark angedeutet wird, in der schreiben von win32-DLLS und in der Sprache Spezifikation in Bezug auf die statischen Konstruktoren/Destruktoren.
Edit 3, benötigen Sie einen link in einem
.o
Export-Konstruktor/Destruktor-Routinen, die den Einsatz statischer Initialisierungen. So alle Sie tun sollten, ist call Runtime.initialize(), die dies tatsächlich ruft die statische Konstruktoren/Destruktoren in derD
code.Stub-d-code für die Initialisierung (in einer Datei namens
myshared.d
):Erstellen .o für diesen stub:
Prüfen Sie die Namen der attach/detach Funktionen:
Zeigt (neben anderen Ausgabe):
Probe .c-code für diesen Aufruf (als "export" bezeichnet.c in diesem Fall), die wir auf die Namen der exportierten Routinen aus der
my shared.o
Datei:Beachten Sie, dass die
extern void
Referenzen verwenden müssen, der verstümmelte name der exportierten Funktion. Diese müssen übereinstimmen, oder der code wird nicht link.kompilieren von C-code verwenden:
link die .c.o und die .d....o-Dateien zusammen mit:
Unter der Annahme, dass die phobos2 Bibliothek ist in Ihrem standard-linker-Suchpfad. Die Brocken von
-m32
Optionen für den compiler und linker werden, weil die version von der D-compiler den ich gebaut habe-lokal unterstützt nur 32bit.Dadurch entsteht eine .dylib verknüpft werden können. Es scheint zu funktionieren auf der Grundlage der begrenzten Tests, die ich durchgeführt. Es sieht aus wie die Unterstützung für gemeinsam genutzte Objekte/dynamische Bibliotheken ist sehr begrenzt, so gibt es eine gute chance, dass es noch eine weitere Hürde zu überwinden.
InformationsquelleAutor der Antwort Petesh
Haben eine Funktion ausgeführt, wenn die shared library geladen oder entladen wird, können Sie markieren einen Konstruktor und Destruktor-Funktion mit GCC-spezifische Attribut-syntax:
Weil verschiedene Teile einer C-Umgebung abhängen Dinge initialisiert werden, die in der standard
.init
code Hinzugefügt werden, indem Sie GCC hinter die kulissen, direkt mit-Wl,-init,<function name>
kann Ihr Programm zum Absturz zu bringen.Weitere Informationen finden Sie in der Bibliothek HOWTO auf Bibliothek Konstruktor-und Destruktor-Funktionen.
InformationsquelleAutor der Antwort Daniel Roethlisberger
GCC, und auch das Geräusch ist, soweit ich weiß, unterstützt der GCC-Konstruktor und Destruktor-Attribute. Für mehr details, siehe Wie genau funktioniert __attribute__((constructor))?
InformationsquelleAutor der Antwort janneb
Für C++ kann man eine Klasse erstellen und verwenden Sie seinen Konstruktor und Destruktor zum initialisieren der Bibliothek.
Nach, müssen Sie nur definieren Sie eine variable für diese Klasse.
Beispiel initialisieren von openssl in der Bibliothek:
und nur fügen Sie diese Zeile in der cpp-Datei:
InitLibrary InitLib;
InformationsquelleAutor der Antwort oml