Ist es möglich, statische Funktionen in einem Objektmodul (gcc, ld, x86, objcopy) zu überschreiben?

8

Gibt es eine Möglichkeit, Funktionen mit statischem Gültigkeitsbereich zu überschreiben? innerhalb eines Objektmoduls?

Wenn ich mit so etwas anfange, ein Modul mit globalem Symbol "foo" ist eine Funktion, die anruft lokales Symbol "bar", das das lokale Symbol "baz"

aufruft %Vor%

Es hat eine globale, "foo" und zwei lokale "bar" und "baz."

Angenommen, ich möchte einige Komponententests schreiben, die bar und baz trainieren, Ich kann tun:

%Vor%

Und jetzt sind bar und baz globale Symbole und zugänglich von außerhalb des Moduls. So weit so gut.

Aber was, wenn ich meine eigene Funktion oben einfügen möchte von "baz", und haben "bar" meine intervenierte "baz" nennen?

Gibt es eine Möglichkeit, das zu tun?

- Umbruch-Option scheint es nicht zu tun ...

%Vor%

Der Baz, der von main () angerufen wurde, wurde eingewickelt, aber Bar nennt immer noch die lokale Baz nicht die eingewickelte Baz.

Gibt es eine Möglichkeit, Bar den eingepackten Baz anrufen zu lassen?

Selbst wenn es erforderlich ist, den Objektcode zu modifizieren, um mit den Adressen von Funktionsaufrufen zu basteln, wenn dies auf automatisierte Weise geschehen kann, ist das vielleicht gut genug, aber in diesem Fall muss er mindestens mit i386 und x86_64 arbeiten .

- Steve

    
smcameron 21.03.2012, 14:08
quelle

3 Antworten

3

Da static dem C-Compiler verspricht, dass die Funktion oder Variable für die Datei lokal ist, kann der Compiler diesen Code frei entfernen, wenn er das gleiche Ergebnis ohne ihn erhalten kann.

Dies könnte den Funktionsaufruf einschließen. Es könnte bedeuten, eine Variable durch Konstanten zu ersetzen. Wenn sich der Code in einer if -Anweisung befindet, die immer falsch ist, ist die Funktion möglicherweise nicht einmal im kompilierten Ergebnis vorhanden.

Das bedeutet, dass Sie Anrufe nicht zuverlässig an diese Funktion umleiten können.

Wenn Sie mit den neuen -lto -Optionen kompilieren, ist es noch schlimmer, weil der Compiler den gesamten Code im gesamten Projekt neu anordnen, entfernen oder inline einfügen kann.

    
Zan Lynx 21.03.2012 16:55
quelle
1

Ich habe eine E-Mail von Ian Lance Taylor (Autor von Gold, ein alternativer Linker zu ld) erhalten:

  
    

Gibt es eine Möglichkeit, Funktionen mit statischem Gültigkeitsbereich zu überschreiben?     innerhalb eines Objektmoduls? (Ich bin auf x86_64 und i386 linux)

  
     

Nein, ist es nicht. Insbesondere kann der Compiler Inline-Aufrufe an static weiterleiten   Funktionen, und es kann auch die Funktionen neu schreiben, um einen anderen zu verwenden   Aufrufkonvention (GCC führt diese beiden Optimierungen durch). Also da ist   keine zuverlässige Möglichkeit, eine statische Funktion nach dem Code zu überschreiben   kompiliert.

Das Inlining kann, glaube ich, mit -nein-in-line behandelt werden, aber das Ändern der Aufrufkonventionen ist wahrscheinlich zu viel.

Das heißt, die DynamoRIO-Leute behaupten, es schaffen zu können, aber ich habe es nicht verifiziert: Ссылка

    
smcameron 22.03.2012 14:05
quelle
0

Wenn Sie mit dem Ändern von Maschinencode einverstanden sind, sollten Sie kein Problem haben, den Quellcode zu ändern.

Schreiben Sie Skripte, um Komponententestquellen mechanisch aus den echten Quellen zu erzeugen. Perl macht das sehr gut.

    
Zan Lynx 26.03.2012 19:02
quelle

Tags und Links