interposing

___ answer9809255 ___

Da %code% 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 %code% -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 %code% -Optionen kompilieren, ist es noch schlimmer, weil der Compiler den gesamten Code im gesamten Projekt neu anordnen, entfernen oder inline einfügen kann.

    
___ qstntxt ___

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

    
___ answer9823878 ___

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: Ссылка

    
___ answer9878100 ___

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.

    
___ tag123ld ___ Das Programm ld (Linker oder Loader) kombiniert Objektdateien, Archivdateien und (Referenzen aus) gemeinsam genutzten Bibliotheken, verschiebt ihre Daten und Adressen zusammen mit Symbolreferenzen. Die Verknüpfung ist normalerweise der letzte Schritt beim Kompilieren eines Programms. ___ tag123gcc ___ GCC ist die GNU Compiler-Sammlung. Es ist der De-facto-Standard-C-Compiler unter Linux und unterstützt auch viele andere Sprachen und Plattformen. ___ qstnhdr ___ Ist es möglich, statische Funktionen in einem Objektmodul (gcc, ld, x86, objcopy) zu überschreiben? ___ tag123c ___ C ist eine universelle Computerprogrammiersprache, die für Betriebssysteme, Bibliotheken, Spiele und andere Hochleistungsanwendungen verwendet wird. Dieses Tag sollte bei allgemeinen Fragen zur C-Sprache verwendet werden, wie in der Norm ISO 9899: 2011 definiert. Fügen Sie ggf. ein versionsspezifisches Tag wie c99 oder c90 für Fragen zu älteren Sprachstandards hinzu. C unterscheidet sich von C ++ und es sollte nicht mit dem C ++ - Tag kombiniert werden, wenn ein rationaler Grund fehlt. ___ tag123interposition ___ hilf uns dieses Wiki zu bearbeiten ___ tag123objcopy ___ hilf uns dieses Wiki zu bearbeiten ___
3
Antworten

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

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...
21.03.2012, 14:08