Wie kann ich gcc zwingen, eine Funktion direkt im PIC-Code aufzurufen?
Betrachten Sie die folgende Funktion:
extern void test1(void);
extern void test2(void) {
test1();
}
Dies ist der Code, den GCC generiert, ohne-fpic
unter amd64 Linux:
test2:
jmp test1
Wenn ich mit @ kompilie-fpic
, gcc ruft explizit die PLT auf, um die Symbolinterposition zu aktivieren:
test2:
jmp test1@PLT
Dies wird jedoch nicht unbedingt für positionsunabhängigen Code benötigt und kann weggelassen werden, wenn ich nicht unterstützen möchte. Falls erforderlich, schreibt der Linker das Sprungziel trotzdem in das PLT-Symbol.
Wie kann ich, ohne den Quellcode zu ändern und ohne den kompilierten Code für eine gemeinsam genutzte Bibliothek ungeeignet zu machen, Funktionsaufrufe direkt zu ihren Zielen führen, anstatt die PLT explizit zu durchlaufen?