/ / Linux 32 bit désassemblage a des instructions d'appel à l'octet suivant - linux, gcc, x86, 32bit-64bit, désassemblage

Le désassemblage sous Linux 32 bits a des instructions d’appel pour l’octet suivant - linux, gcc, x86, 32bit-64bit, désassemblage

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

Ce 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.