000
22.06.2010, 00:41 Uhr
~cmoetzing_
Gast
|
Hallo.
Ich habe hier ein abenteuerliches Konstrukt bei dem ich ein bisschen Hilfe bräuchte.
Ausgangspunkt ist ein relative großes C-Paket. Ich muss Code einfügen um das Verhalten des Paketes zu verändern. Allerdings ist das Paket zu groß um es von Hand im Quellcode zu machen.
Die Idee ist nun ein Python-Skript vor den gcc zu schalten, welches den Kompiliervorgang auseinander pflückt und zuerst alle .c-Dateien mit -S in Assembler übersetzt. Dann füge ich in die .s-Dateien meine Änderungen ein (ein Funktionsaufruf), kompiliere die zu den gewünschten .o und lasse den Compiler linken. Beim linken füge ich noch eine Objektdatei hinzu, die die Funktion enthält, die ich in Assembler aufrufe.
Soweit so gut. Das funktioniert für ein kleines Testprogramm ganz gut, für das größere Paket allerdings nicht. Da ich nicht der große Assembler-Guru bin, bräuchte ich ein paar Erklärungen, um das besser zu verstehen. Das ganze soll auf einer X86_64 Maschine laufen.
Code: |
pushfq xchgq %rax,TMP movq $0, %rax call func xchgq %rax,TMP popfq
|
Mit pushfq speichere ich die aktuellen Register und mit popfq stelle ich sie wieder her, richtig? Das q steht für quadword, so weit bin ich schon mal. Was passiert wenn ich auf meiner Maschine pushf aufrufe? Das ist soweit ich weis der Befehl um die Daten mit einer Wortbreite zu speichern? Muss ich beides aufrufen?
Das %rax-Register ist auch 4 Worte breit. Es gibt ausserdem noch das %eax-Register, das ist glaube ich 2 Worte breit. Muss ich das vor dem Funktionsaufruf auch sicher und danach wieder herstellen? Die Funktion func ist vom Typ void und nimmt keine Argumente entgegen. Daher der movq-Befehl, der passen sollte!?
Die Funktion func pfuscht nicht in den restlichen Daten des Programmes rum. Ich such in der Assembler-Datei noch bestimmten Befehlen und füge das Code-Stück danach ein. Welches Probleme/Seiteneffekte muss ich beachten um diesen Aufruf sicher ausführen zu könne? Sicher heißt in diesem Fall für mich, dass das restliche Programm so weiter läuft, als ob die Anweisungen nicht von mir eingefügt worden sind. Ich wäre um jede Hilfe sehr dankbar.
Grüße
Christian |