Das Folgende ist eine wirklich gute Referenz: http://www.ibm.com/developerworks/linux/library/l-dynamic-libraries/ . Es enthält eine Bibliographie am Ende einer Vielzahl verschiedener Referenzen auf verschiedenen Ebenen. Wenn Sie jedes Detail wissen möchten, können Sie direkt zur Quelle gehen: http://www.akkadia.org/drepper/dsohowto.pdf . (Ulrich Drepper hat den dynamischen Linux-Linker geschrieben.)
Sie können sich einen wirklich guten Überblick über alle Abschnitte in Ihrer ausführbaren Datei verschaffen, indem Sie einen Befehl wie "objdump -h myexe" oder "readelf -S myexe" ausführen.
Der Abschnitt .interp enthält den Namen des dynamischen Laders, mit dem die Symbole in diesem Objekt dynamisch verknüpft werden. Der Abschnitt .dynamic ist eine Destillation des Programm-Headers, die so formatiert ist, dass sie für den dynamischen Loader leicht zu lesen ist. (Es hat also Zeiger auf alle anderen Abschnitte.)
Die .got (Global Offset Table) und .plt (Procedure Linkage Table) sind die beiden Hauptstrukturen, die vom dynamischen Linker bearbeitet werden. Die .got ist eine Indirektionstabelle für Variablen und die .plt ist eine Indirektionstabelle für Funktionen. Jede ausführbare Datei oder Bibliothek (die als "gemeinsam genutzte Objekte" bezeichnet werden) verfügt über eine eigene .got und .plt. Dies sind Tabellen der Symbole, auf die von diesem gemeinsam genutzten Objekt verwiesen wird und die tatsächlich in einem anderen gemeinsam genutzten Objekt enthalten sind.
Die .dynsyn-Datei enthält alle Informationen zu den Symbolen in Ihrem freigegebenen Objekt (sowohl die von Ihnen definierten als auch die externen Symbole, auf die Sie verweisen müssen). Die .dynsyn-Datei enthält nicht die tatsächlichen Symbolnamen. Diese sind in .dynstr enthalten und .dynsyn hat Zeiger auf .dynstr. .gnu.hash ist eine Hash-Tabelle, mit der Symbole schnell nach Namen gesucht werden können. Es enthält auch nur Zeiger (Zeiger in .dynstr und Zeiger, die zum Erstellen von Bucket-Ketten verwendet werden.)
Wenn Ihr freigegebenes Objekt ein Symbol "foo" dereferenziert, muss der dynamische Linker in allen dynamischen Objekten, mit denen Sie verknüpft sind, nach "foo" suchen, um herauszufinden, welches das gesuchte "foo" enthält (und was der Verwandte ist) Die Adresse von "foo" befindet sich in diesem freigegebenen Objekt.) Der dynamische Linker durchsucht dazu den Abschnitt .gnu.hash aller verknüpften freigegebenen Objekte (oder den Abschnitt .hash nach alten freigegebenen Objekten ohne .gnu). Hash-Abschnitt.) Sobald die richtige Adresse im verknüpften freigegebenen Objekt gefunden wurde, wird sie in die .got- oder .plt-Datei Ihres freigegebenen Objekts eingefügt.