Forum Programmation.c Gcc, les symboles, les underscores, et windows

Posté par  (site web personnel) .
Étiquettes : aucune
0
26
avr.
2005
Bonjour,

en compilant un programme maison ce matin au taf via cygwin, j'ai été obligé de retirer l'underscore qui débutait chacun des noms de mes variables externes, car gcc semblait me le rajouter à la compilation dans la table des symboles

Ainsi, si j'avais un export char _plop, après compilation
nm me trouvait le symbole __plop. Plutot génant pour linker ensuite, c'est ainsi que ld plantait lamentablement en me sortant un undefined reference to __plop

Bref, pourquoi ?

Merci.
  • # ABI C definie sur l'OS.

    Posté par  (site web personnel) . Évalué à 3.

    Sous Win32 l'ABI C impose de prefixer tout symbole par un underscore lorsque celui ci utilise la convention d'appel C standard.

    De meme les symboles utilisant la convention stdcall (toute l'api win32 par ex), ne prefixe pas, mais ajoute un suffixe @${n} ou n est la taille totale prise par les arguments sur la pile si je me souviens bien.

    Sous GNU/Linux, l'ABI C suivie n'est pas la meme.

    Voila la raison :-)

    En general, la solution consiste à avoir une macro:
    #if defined ( _WIN32)
    SYMBOL_NAME(symbol_name) _##symbol_name
    #else if defined (__linux__)
    SYMBOL_NAME(symbol_name) ##symbol_name
    #else
    #error SYMBOL_NAME not defined !!!
    #endif

    Je te laisse en exercise le soin de corriger les erreurs eventuelle de cette macro non testée.
  • # y a pas à tortiller

    Posté par  . Évalué à -1.

    les symboles qui commencent ou finissent par un underscore sont réservés à l'implémentation. Donc n'utilise pas ce genre de choses.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.