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
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.
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: Ссылка
Tags und Links c gcc ld objcopy interposing