Je crée un pilote pour les OS Linux 32 et 64 bits. L'une des exigences est que tout le code doit être autonome et sans appel. Sur 64 bits, je n'ai aucun problème, mais sur 32 bits, GCC semble ajouter une instruction d'appel à l'octet suivant. Après une recherche, j'ai trouvé le lien suivant:
http://forum.soft32.com/linux/Strange-problem-disassembling-shared-lib-ftopict439936.html
Existe-t-il un moyen de désactiver cela sur un Linux 32 bits?
Exemple: Démontage 32 bits:
<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 bits disassebmly:
<testfunc>:
0: push %rbp
1: mov %rsp, %rbp
3: <...no call here>
Il n'y a aucun appel dans le "testfunc" du tout. Même dans ce cas, pourquoi le compilateur 32 bits ajoute-t-il ces instructions "call"? Toute aide est appréciée.
Réponses:
4 pour la réponse № 1Ce que vous voyez dans le désassemblage sur 32 bits peut être un moyen de rendre le code indépendant de la position. Rappelez-vous que call
pousse sur la pile l'adresse de retour, qui est égale eip
+ constante? En mode 64 bits, il y a rip
-adressage relatif. En 32 bits, il n'y a pas de "t. Donc, cet appel peut être simuler cet adressage relatif au pointeur d'instruction.
0 pour la réponse № 2
Cette instruction d’appel au prochain octet provient du profilage de fonction pour l’outil "gprof". J'ai pu supprimer ces instructions "call" en supprimant l'option "-pg" de la compilation.
Comme il s’agissait d’un pilote, il était récupéré à partir de la configuration du noyau Linux - CONFIG_FUNCTION_TRACER.