Outils pour utilisateurs

Outils du site


lang:c:lieur

Conversion des prototypes en symboles (mangling)

Cas général

En C, c'est simple :

  1. Pour une variable globale exportées, on prend le nom de la variable.
  2. Pour les fonctions exportées, on prend le nom de la fonction uniquement, sans le type de retour ni les arguments. Ce qui explique que la surcharge n'est pas possible en C.
  3. Si on est en 32 bits, on préfixe le symbole par un _.

Exemple :

int tt;
int tt4(int, int) { return 0; }

Donnera en 32 bits :

_tt
_tt4

et en 64 bits :

tt
tt4

Windows

Sous Windows, il est possible de préfixer le prototype par __stdcall pour faire la liaison avec les API 32 bit de Windows. Cela ajoute au symbole un postfixe @ suivi d'un nombre égal à 4 fois le nombre d'argument. En 64 bit, aucun postfixe n'est ajouté.

Exemple :

int __stdcall tt2() { return 0; }
int __stdcall tt3(int) { return 0; }
int __stdcall tt5(int, char) { return 0; }
int __stdcall tt6(int, char, int) { return 0; }
int __stdcall tt7(char) { return 0; }
int __stdcall tt8(long) { return 0; }

Donnera en 32 bits :

_tt2@0
_tt3@4
_tt5@8
_tt6@12
_tt7@4
_tt8@4

et en 64 bits :

tt2
tt3
tt5
tt6
tt7
tt8

Documentation complète

La documentation est un peu ancienne mais c'est une bonne base. Depuis, les lieurs ont amélioré l'optimisation mais le principe reste le même.

Linkers part 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20.

Archive du 26/09/2007 le 16/07/2020

lang/c/lieur.txt · Dernière modification : 2020/07/16 08:41 de root