Probleme beim Verständnis einer x86-64-Funktionspräambel

8

Ich habe einen Absturz und während der Untersuchung wurde ich von folgendem Code total blockiert:

%Vor%

Dies wird generiert, indem objdump --disassemble /usr/lib64/libc.a auf einem 64-Bit Linux x86-System ausgeführt wird und dann die Ausgabe durchsucht wird. Dies ist AT & amp; T-Syntax , so dass die Ziele auf der rechten Seite sind.

Insbesondere verstehe ich die letzte Anweisung nicht. Es scheint den Wert des rdx -Registers irgendwo im Stapel (weit, weit entfernt) in den Speicher zu schreiben, bevor die Funktion dieses Register berührt hat. Für mich ergibt das keinen Sinn.

Ich habe versucht, die Aufrufkonventionen zu lesen, und meine beste Theorie ist jetzt, dass rdx für einen Parameter verwendet wird, so dass der Code im Grunde den Parameterwert direkt "zurückgibt". Dies ist nicht das Ende der Funktion, also kommt es natürlich nicht wirklich zurück.

    
unwind 23.09.2010, 14:19
quelle

1 Antwort

12

Ja, das ist ein Parameter. Die von Linux verwendete ABI weist bis zu 6 "INTEGER" zu (& lt; = 64-Bit-Ganzzahl, oder Zeiger) Typ Parameter zu Registern, in der offensichtlichen und leicht zu merkenden Reihenfolge %rdi , %rsi , %rdx , %rcx , %r8 , %r9 .

Der Stack-Frame ist 1648 Byte ( sub 0xfffffffffffff998x648,%rsp beansprucht 1608 Byte, plus 5 64-Bit-Register wurden davor verschoben) und %code% ist -1640.

Also speichert der Code den dritten Parameter nahe dem unteren Rand des Stapelrahmens.

(Hinweis: Die Windows 64-Bit-ABI unterscheidet sich von der Linux-Version.)

    
Matthew Slattery 23.09.2010, 18:19
quelle