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.
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
beansprucht 1608 Byte, plus 5 64-Bit-Register wurden davor verschoben) und %code% ist -1640. 0xfffffffffffff998
x648,%rsp
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.)
Tags und Links assembly linux calling-convention x86-64