Könnte selbstmodifizierender Code verwendet werden, um den Funktionsaufruf in dynamisch verknüpften Bibliotheken zu beschleunigen?
Soweit ich weiß, verwenden gemeinsam genutzte ELF-Bibliotheken eine Art indirekte Sprungtabelle (die Prozedurverknüpfungstabelle oder PLT), um eine verzögerte Bindung von Bibliotheksfunktionen zu ermöglichen. Der Zweck scheint darin zu bestehen, zu vermeiden, dass die Tabelle im Codesegment geändert werden muss, während die verzögerte Auflösung von Funktionspositionen beim ersten Aufruf weiterhin ermöglicht wird.
Wäre es nicht schneller, den Code für diese Tabelle beim Laden oder möglicherweise sogar beim ersten Funktionsaufruf dynamisch zu erstellen?
Ist es möglich, die gemeinsame Nutzung des Codesegments zwischen Prozessen so weit wie möglich zu ermöglichen (eine dynamische Tabelle wäre für einen Prozess privat)? Ist dies aus Sicherheitsgründen der Fall (beschreibbarer Code sollte nicht ausführbar sein - JITs tun dies jedoch ständig, und die Schreibberechtigung kann vom Loader hinzugefügt und entfernt werden, bevor das Programm tatsächlich gestartet wird)?
Oder ist es eine Kombination davon, und der geringe Leistungsgewinn pro Funktionsaufruf wäre die Mühe einfach nicht wert?
ELF-DSOs können ein Flag (DF_TEXREL) verwenden, um anzukündigen, dass sie durch Ändern ihres Textabschnitts (der normalerweise schreibgeschützt ist) eine Neuzuweisung benötigen. Der Sprungtabellenansatz zusammen mit dem positionsunabhängigen PIE-Code sollte jedoch optimaler sein.
(Gefunden, dass in http://www.akkadia.org/drepper/dsohowto.pdf , aber andere Ressourcen erwähnen dies auch).
quelle