Wenn Sie ein gemeinsam genutztes Objekt dlopen()
, gibt es einen Mechanismus zum Ausführen von Code in diesem DLL ohne explizit aufgerufen werden? Insbesondere C++ statischer Initialisierungscode für Globals/Statik, den der Aufrufer von dlopen()
möglicherweise nicht kennt? Ich bin mir ziemlich sicher, dass die Antwort "Ja" sein sollte, aber ich erinnere mich nicht, welcher Mechanismus das bewirkt und wie man es benutzt, um beliebigen Code auszuführen.Wird beim dlopen'ing statische Initialisierung (und/oder anderer) Code ausgeführt?
3
A
Antwort
2
Ja: dlopen
berücksichtigt einen ELF-Binärformat-Mechanismus zum Ausführen von Code während der Ladezeit.
Es gibt eigentlich zwei solche Mechanismen:
- Ein älteres verwendet man spezielle
.init
und.fini
s Abschnitte, die eine Reihe von Funktionszeigern fürdlopen
unddlclose
zu nennen enthalten. Da die Abschnitte zur Laufzeit nicht vorhanden sein können, gibt es auchDT_INIT
undDT_FINI
dynamische Tags, die auf die entsprechenden Abschnitte verweisen. - Der neuere Mechanismus ist
.init_array
und.fini_array
und entsprechendeDT_INIT_ARRAY
,DT_INIT_ARRAYSZ
,DT_FINI_ARRAY
undDT_FINI_ARRAYSZ
dynamische Tags.
Der Unterschied zwischen den beiden Mechanismen ist beschrieben here. Wenn Sie eine C-Funktion mit __attribute__((constructor))
dekorieren, verwendet der Compiler einen dieser beiden Mechanismen, damit er ausgeführt wird, wenn das Objekt dlopen
ed ist. Das Gleiche gilt für den Konstruktionscode für globale C++ - Objekte, die eine dynamische Initialisierung erfordern.
Verwandte Themen
- 1. Stellen Sie sicher, dass Schleife vollständig ausgeführt wird, bevor anderer Code in jQuery ausgeführt wird
- 2. Warum wird der statische Code der Subklasse ausgeführt?
- 3. Null Initialisierung und statische Initialisierung des lokalen Bereichs statische Variable
- 4. va_list Initialisierung in anderer Architektur
- 5. Statische Speicherdauer-Initialisierung
- 6. Statische Variablen Initialisierung Quiz
- 7. Mein Code ausgeführt wird
- 8. Java statische Initialisierung Block
- 9. Statische Initialisierung in Go?
- 10. Initialisierung Statische innere Klassen
- 11. Integer-Array statische Initialisierung
- 12. statische Variable Initialisierung Java
- 13. Wie wird ein anderer Code in PHP ausgeführt, wenn der Code erfolgreich ist?
- 14. Wird beim Kompilieren von Release und Debug ein anderer IL-Code und ein anderer Maschinencode generiert?
- 15. g ++, statische Initialisierung und -nostdlib
- 16. Statische Initialisierung in einer Übersetzungseinheit
- 17. Statische Initialisierung auf OpenCV Android
- 18. Statische Initialisierung von lokalen Variablen
- 19. Docker: Befehl ausführen, während ein anderer Befehl ausgeführt wird
- 20. Faule Property Initialisierung in statische Klasse C#
- 21. Statische Initialisierung mit privatem Konstruktor
- 22. Spring statische Initialisierung einer Bean
- 23. java statische innere Klasse Initialisierung Fehler
- 24. Python-Code wird beim ersten Lauf nicht ausgeführt
- 25. Wie Code beim Start in Play ausgeführt wird! Framework 2.4
- 26. Verhindern, dass das Ereignis ausgeführt wird, während ein anderer ausgeführt wird
- 27. Code ausführen, wenn dieser Code ausgeführt wird
- 28. Typüberprüfung, wenn Code ausgeführt wird
- 29. wird dieser Code serverseitig ausgeführt?
- 30. Legitime Verwendung für statische Initialisierung?
http://stackoverflow.com/questions/2053029/how-exactly-does-attribute-constructor-work – Brian
@Brian: Ich denke, Sie können das eine Antwort machen ... obwohl - was, wenn ich nicht verwende GCC? z.B. Clang oder ICC? – einpoklum