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 № 1Quello 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.