Was ist die Suchreihenfolge für die Symbolsuche beim Auflösen dynamischer Umlagerungen?
Beim Auflösen von Symbolen für eine gemeinsam genutzte Bibliothek sucht der Loader zuerst in der 'Haupt-ausführbaren Datei' (damit die ausführbare Datei die Definitionen überschreiben kann) oder was?
Nach meinem Verständnis hat jedes ausführbare Objekt seinen eigenen "Lookup-Bereich":
LD_PRELOAD
hinzugefügt werden, werden dem globalen Suchbereich direkt nach der Hauptdatei hinzugefügt. DF_SYMBOLIC
verwendet, werden Symbolreferenzen, die aus diesem Objekt stammen, nach Definitionen im Objekt suchen, bevor im globalen Suchbereich gesucht wird. dlopen()
geöffnet wurden, können eigene Abhängigkeiten haben. Wenn das Flag RTLD_GLOBAL
beim Aufruf von dlopen()
nicht gesetzt wurde, werden diese Abhängigkeiten zum Suchbereich für dieses Objekt hinzugefügt, beeinflussen jedoch nicht den globalen Suchbereich. Wenn das RTLD_GLOBAL
-Flag an dlopen()
übergeben wurde, wird das gemeinsame Objekt (und seine Abhängigkeiten) dem "globalen" Nachschlagebereich hinzugefügt, wodurch das Verhalten nachfolgender Symbolnachschlage geändert wird. Ulrich Dreppers Leitfaden " Schreiben freigegebener Bibliotheken " wird empfohlen, zu diesem Thema zu lesen.
Beim Auflösen von Symbolen für eine gemeinsam genutzte Bibliothek sucht der Loader zuerst in der 'Haupt-ausführbaren Datei' (damit die ausführbare Datei die Definitionen überschreiben kann) oder was?
Ja genau. Der dynamische Lader hat eine verknüpfte Liste geladener ELF-Objekte (der Kopf der Liste ist _r_dynamic.r_map
) und durchsucht linear die dynamischen Symboltabellen von Objekten in dieser Liste, bis er die Symboldefinition findet, nach der er sucht.
Der Kopf der Liste zeigt immer auf die Hauptdatei. Wenn ein bestimmtes Symbol aus der Hauptdatei exportiert wird, dann "gewinnt" es (fast) immer (überschreibt andere Definitionen).
Beachten Sie jedoch, dass das Flag -Bsymbolic
linker das Bild ein wenig verändert.