Compiler pour plusieurs conventions d'appel

Je regarde un code Linux qui sort du compilateur Intel. Il semble que les fonctions soient compilées pour deux conventions d'appel à la fois. Le fichier map a beaucoup de paires de noms de fonctions comme ceci:

0x0000000008000000   __foo
0x0000000008000008   __foo.

Le décalage entre les paires de fonctions est de 4, 8 ou 12 octets. Chacun de ceux-ci correspond à 1, 2 ou 3 instructions mov qui déplacent des arguments de pile vers des registres comme celui-ci:

__foo:
mov     eax, [esp+4]
mov     edx, [esp+8]
__foo.:
push    ebp
...

Après ces instructions, il semble qu'une fonction utilisant la convention regparm commence.

Est-ce que le compilateur Intel génère des fonctions avec deux conventions d'appel différentes et utilise ensuite l'adresse d'entrée qui est correcte pour l'appelant donné?

0
ajouté édité
Vues: 1
Quelles options utilisez-vous pour compiler le code?
ajouté l'auteur mcleod_ideafix, source
Je ne sais pas. Un client fournit ce code. J'essaie de comprendre comment leur dire de changer leurs paramètres de construction sans savoir exactement ce qu'ils sont.
ajouté l'auteur mike663, source

1 Réponses

En fait, je dirais que vous avez répondu à la question:

Est-ce que le compilateur Intel génère des fonctions avec deux appels différents   conventions et ensuite utiliser quelle adresse d'entrée est correcte pour le   interlocuteur donné?

La fonction foo semble être déclarée avec l'attribut __regcall. Ma supposition éclairée est que vous devez probablement avoir compilé votre programme en utilisant le profil Debug, car les conventions d'appel basées sur les cadres de pile permettent à certaines informations d'être disponibles plus facilement.

0
ajouté