3

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?

+1

http://stackoverflow.com/questions/2053029/how-exactly-does-attribute-constructor-work – Brian

+0

@Brian: Ich denke, Sie können das eine Antwort machen ... obwohl - was, wenn ich nicht verwende GCC? z.B. Clang oder ICC? – einpoklum

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ür dlopen und dlclose zu nennen enthalten. Da die Abschnitte zur Laufzeit nicht vorhanden sein können, gibt es auch DT_INIT und DT_FINI dynamische Tags, die auf die entsprechenden Abschnitte verweisen.
  • Der neuere Mechanismus ist .init_array und .fini_array und entsprechende DT_INIT_ARRAY, DT_INIT_ARRAYSZ, DT_FINI_ARRAY und DT_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