Exportations de DLL C : comprendre les noms décorés/mutilés
En C, lors de la création de DLL avec des fonctions exportées, il est courant de rencontrer des DLL décorées ou mutilées noms après compilation. Ceux-ci peuvent prêter à confusion, car ils diffèrent des noms de fonctions non décorés attendus.
Pourquoi les noms décorés ?
La décoration des noms de fonctions est un mécanisme utilisé par les compilateurs pour garantir que les signatures de fonction sont uniques. Ceci est particulièrement important dans les cas où plusieurs fonctions portent le même nom mais des paramètres différents. La décoration comprend des informations sur la convention d'appel de la fonction, les types de paramètres et d'autres attributs.
Fichier de définition de module par rapport aux exportations de style "C"
Les deux utilisant une définition de module (.def) et le style d'exportation "C" (extern "C" __declspec(dllexport)) peuvent donner lieu à des noms décorés. En effet, ils utilisent tous deux le format Windows PE sous-jacent, qui nécessite des noms décorés pour les fonctions exportées.
Suppression du nom décoré
Pour supprimer le nom décoré après le " =", vous pouvez utiliser la directive #pragma comment(linker). Cela vous permet de spécifier le nom de la fonction exportée et le nom décoré auquel elle se résout.
Par exemple :
#pragma comment(linker, "/EXPORT:SomeFunction=_SomeFunction@@@23mangledstuff#@@@@")
Vous pouvez également utiliser ce qui suit dans le corps de la fonction pour générer automatiquement le nom décoré :
#pragma comment(linker, "/EXPORT:\"" __FUNCTION__ "\"=\"" __FUNCDNAME__ "\"")
Conclusion
Les noms décorés font partie intégrante du format Windows PE. En utilisant la directive #pragma comment(linker), vous pouvez spécifier le nom de la fonction exportée et le nom décoré auquel elle se résout, vous permettant de contrôler la façon dont les fonctions exportées apparaissent dans la sortie dumpbin.exe.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!