Suffixe non identifié des noms de fonction dans DLL

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Suffixe non identifié des noms de fonction dans DLL

Message par Ollivier »

Bonjour à vous,

Je vous fais part d'un problème qui me cogne tranquillement mais sûrement.

Quand on demande à PB de pondre des DLLs, avec des noms de fonctions, que fait-il? Il pond des DLLs avec ces mêmes noms de fonctions.

Là, j'ai pas loin de 1600 fonctions (il y a au moins deux couches, parce qu'il y a tout un panel de fonctions qui englobent les maths, le cryptage, etc...)
avec des noms, mais alors des noms... à ressembler à Lucy...

En fait, le nom de fonction DLL démarre bien. Un sigle, suivi d'un mot anglais ou deux: impeccable.
Puis la fin du nom se met à partir en vrille avec des arobases, des lettres, etc...
Genre:
BSGetFirstValue@@A@@@Zq
(c'est fictif)

Bon, j'ai quand même demandé de quel pondoir c'était sorti. On m'a répondu, "Visual Studio chai pas quoi"...

Alors, ça parle à quelqu'un ces arobases et autres à la fin?
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Suffixe non identifié des noms de fonction dans DLL

Message par Ollivier »

On se rapproche un peu...
the
SomeFunction@@@23mangledstuff#@@@@
is mangled to give the types and class of
the C++ function.
The
actual mangling information means
something (like parameter size in
bytes and more) which might be
useful for validation and debugging
but is otherwise guff.
The decorated naming convention for pointers to member functions was changed in Visual C++ version 4.0. C++ libraries created
with Visual C++ version 2.0 should be recompiled to link properly with source files compiled with the current version of Visual C++.

Code : Tout sélectionner

 C:\>undname ?func1@a@@AAEXH@Z
Microsoft (R) C++ Name Undecorator
Copyright (C) Microsoft Corporation 1981-2000. All rights reserved.Undecoration
of :- "?func1@a@@AAEXH@Z"
is :- "private: void __thiscall a::func1(int)"
On se rapproche encore...
Wiki UK : Décorations des noms de fonction C++

Désolé pour l'absence de traduction. Le temps me manque. Je partage quand même car cela me semble nécessaire à savoir (à moins que je me plante... Comme d'hab!)
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: Suffixe non identifié des noms de fonction dans DLL

Message par nico »

J'étais au courant des décorations mais je ne savais pas que cela signifiait quelque chose!

J'ai trouvé ça:
http://openclassrooms.com/forum/sujet/p ... ocks-73344
Pour supprimer les suffixes de type @nn ajoute ceci dans les options du linker :
-Wl,--kill-at



et ça aussi:
https://groups.google.com/forum/#!topic ... 3txNlhPxCE
In the Project settings, Configuration Properties, Linker, Debuging
dialog, you need to set both the "Generate Map File" and the "Map
Exports" setting to YES (/MAPINFO:EXPORTS linker option).
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: Suffixe non identifié des noms de fonction dans DLL

Message par G-Rom »

Alors, ça parle à quelqu'un ces arobases et autres à la fin?
C'est le mangling , cela permet à des langages évolué , une fois compilé , donc "aplati" , de connaitre les paramètres de retours , les paramètre des arguments etc...
En c++ , une fonction (méthode) peu avoir différentes signature :

Code : Tout sélectionner

class MaClass
{
   public:  
       
      MaClass():mValue(0){}

     void set(unsigned int value)
     {
        mValue = value;
     }

     void set(unsigned int value, unsigned int mul)
     {
        mValue = value * mul;
     }


   private:
     unsigned int mValue;
};


MaClass Test;

Test.set(50);
//ou 
Test.set(10,5);
La méthode set() existe donc sous "différente forme" , il faut donc quand le compilo compile et lorsque il exporte ta classe faire des distinctions entre les différente méthode existante, d'ou le mangling tout simplement.
Si tu as le code source en C++/C , tu exporte tout en C pour viré la déco. a savoir que la déco n'est pas standard, chaque compilo fait sa sauce...
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Suffixe non identifié des noms de fonction dans DLL

Message par Ollivier »

Merci à vous, le lien wiki en anglais que j'ai trouvé et posté plus haut, semble bien correspondre (coup de chance).
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Suffixe non identifié des noms de fonction dans DLL

Message par Ollivier »

Je n'ai pas encore traduit la doc de l'expert en démontage de bigoudi sur le wiki UK, mais rien qu'à lire en diagonale, je constate que chez Microsoft, il n'y a pas que les rails de train qui sont suivis: ils ont pondu une convention qui mélange O et 0. Si les noms décorés étaient fait pour rester humainement lisibles, c'est loopé...
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Suffixe non identifié des noms de fonction dans DLL

Message par Ollivier »

Microsoft a récemment corrigé un bug
vieux d'une vingtaine d'années et
présent depuis... Windows 95, note 20
Minutes. Manifestement, aucun pirate
n'a exploité cette faille, "mais il était
possible de prendre le contrôle d'un PC
via un lien malicieux ouvert par Internet
Explorer" , écrit le quotidien.
Moralité : achetez le dernier OS, les autres d'avant ne lavaient pas plus blanc que blanc...

Bon, j'ai tout traduit. Ce n'est pas très compliqué. L'affaire de quelques heures de cogitation. Je pense qu'interpréter les noms décorés est une clé qui simplifie la vie quand on veut récupérer des DLLs C++. Là, j'ai focalisé sur les DLLs de Visual Studio C++, parce que c'est ce que j'ai besoin. Mais s'il y en a qui veulent s'attaquer aux codages de noms d'autres compilateurs, je pense que les conséquences seront très constructives. Notamment celui de Borland.
Répondre