2010-11-08 13 views
5

Als ich dieses Stück Code kompilierenGCC hotpatching?

unsigned char A[] = {1, 2, 3, 4}; 

unsigned int 
f (unsigned int x) 
{ 
    return A[x]; 
} 

gcc Ausgänge

mov edi, edi 
movzx eax, BYTE PTR A[rdi] 
ret 

auf einer x86_64 Maschine.

Die Frage ist: Warum ist ein NOP-Befehl (mov edi, edi) da?

Im bin mit gcc-4.4.4.

+0

Natürlich ist es nur, um den Code zu verschleiern! –

Antwort

3

Im 64-Bit-Modus ist mov edi, edi kein No-Op. Es setzt die oberen 32 Bits von rdi auf 0.

Dies ist ein Sonderfall der allgemeinen Tatsache, dass alle 32-Bit-Operationen die oberen 32 Bits des Zielregisters im 64-Bit-Modus löschen. (Dies ermöglicht eine effizientere CPU, als sie unverändert zu lassen und ist vielleicht auch nützlicher.)

+0

oh .. können Sie Quellen dafür angeben? – osgx

+0

scheint die Antwort zu sein. – osgx

+1

Okay. Ich denke du hast Recht damit. es ist nur eine schicke Art, die Spitze von rdi zu befreien. Nach dem erneuten Lesen der Frage, die ich verstehe, fragt das OP nicht "Warum beginnt diese Hotpatchable-Funktion mit' mov edi, edi' ", sondern etwas wie" Warum sieht dieser x86-64-Assemblercode wie eine hotpatchable-Funktion aus? " Außerdem gibt der Code nicht einmal das 'ms_hook_prologue' Attribut an, das neueste Release von gcc unterstützt ms_hook_prologue für x86-64 nicht und es scheint, dass auf x86-64 ein' leaq [% rsp + 0],% verwendet wird. rsp' prologue statt 'mov edi, edi' (http://tinyurl.com/39fye3w). Ich werde meine Antwort löschen –