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?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage