/ / Linux Il disassemblaggio a 32 bit ha istruzioni di chiamata al byte successivo - linux, gcc, x86, 32 bit-64 bit, disassemblaggio

Lo smontaggio di Linux a 32 bit ha istruzioni di chiamata al byte successivo - linux, gcc, x86, 32 bit-64 bit, disassemblaggio

Sto creando un driver per SO Linux a 32 e 64 bit. Uno dei requisiti è che tutto il codice deve essere autonomo senza chiamate. Su 64-bit non ho problemi, ma su GCC a 32-bit sembra aggiungere un'istruzione di chiamata al byte successivo. Dopo aver cercato un po 'ho trovato questo link:

http://forum.soft32.com/linux/Strange-problem-disassembling-shared-lib-ftopict439936.html

C'è un modo per disabilitare questo su Linux a 32 bit?

Esempio: Smontaggio a 32 bit:

<testfunc>:
0: push %ebp
1: mov  %esp, %ebp
3: call 4 <test_func+0x4>
<...some operation on ebx as mentioned in the link above>

64 bit disassebmly:

<testfunc>:
0: push %rbp
1: mov  %rsp, %rbp
3: <...no call here>

Non c'è nessuna chiamata nel "testfunc". Anche allora perché il compilatore a 32 bit aggiunge queste istruzioni di "chiamata"? Qualsiasi aiuto è apprezzato.

risposte:

4 per risposta № 1

Quello che stai vedendo nello smontaggio a 32 bit potrebbe essere un modo per rendere il codice indipendente dalla posizione call spinge in pila l'indirizzo di ritorno, che è uguale eip+ Costante? In modalità 64 bit c'è rip-indirizzamento relativo. In 32-bit non c'è t. Quindi questa chiamata può simulare quell'indirizzamento relativo all'indice-puntatore.


0 per risposta № 2

Questa istruzione di chiamata al prossimo byte proviene dalla funzione di profiling per lo strumento "gprof". Sono stato in grado di sbarazzarmi di queste istruzioni di "chiamata" rimuovendo l'opzione "-pg" dalla compilazione.

Dato che si trattava di un driver, questo veniva prelevato dalla configurazione del kernel di Linux - CONFIG_FUNCTION_TRACER.