Comment raconter l'MinGW de l'éditeur de liens ne pas exporter tous les symboles?
Je suis en train de construire une dynamique Windows de la bibliothèque à l'aide de la chaîne de compilation MinGW.
Pour construire cette bibliothèque, je suis lié statiquement à d'autres 2, qui offre une API et j'ai un .def
fichier où j'ai écrit le seul symbole que je veux être exporté dans ma bibliothèque.
Le problème est que GCC est l'exportation de tous les symboles, y compris ceux provenant des bibliothèques, je suis un lien vers. Est-il de toute façon de dire à l'éditeur de liens juste pour exporter les symboles dans la def
fichier?
Je sais qu'il existe l'option --export-all-symbols
mais il ne semble pas être le face à elle.
Dès maintenant la dernière ligne du script de construction a cette structure:
g++ -shared CXXFLAGS DEFINES INCLUDES -o library.dll library.cpp DEF_FILE \
OBJECT_FILES LIBS -Wl,--enable-stdcall-fixup
EDIT: Dans le docs à propos de l'éditeur de liens il est dit que --export-all-symbols
est le comportement par défaut et qu'il est désactivé lorsque vous n'utilisez pas cette option explicitement si vous fournissez un def
fichier, sauf quand il n'en est rien; les symboles dans la 3ème partie libs sont exportés de toute façon.
EDIT: Ajout de l'option --exclude-libs LIBS
ou –exclude-symbols SYMBOLS
n'empêche pas les symboles de la bibliothèque d'être exportés.
--exclude-libs ALL
option serait intéressant d'essayer de
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser dllwrap si votre distribution de binutils (natif ou la compilation croisée) fournit.
Il peut produire de la Dll à l'aide de l'interface dans un fichier DEF (sous le capot il appelle gcc, ld et dlltool de le faire). La différence entre le présent et le passage d'un fichier DEF à GCC directement, c'est que les définitions contenues dans le fichier sont traités différemment.
Par exemple, si vous avez un symbole renommer dans le fichier d'exportation:
GCC permettra de créer 2 exportations, l'un par le nom de
_SomeFunction
et l'autre avec le nom décoré tout en dllwrap ne exportation_SomeFuntion
. Donc, si vous ajoutez le fichier DEF les symboles que vous souhaitez être exportés vous allez vous retrouver seul avec eux dans la bibliothèque.dllwrap utilise par défaut le compilateur C de pilote car il n'a aucun moyen de le savoir autrement. Comme vous êtes reliant le code C++, vous devez utiliser l'option
--driver-name c++
pour définir le pilote. Si vous arrive d'avoir le MinGW exécutables avec un préfixe que vous avez de l'inclure aussi dans le nom du pilote (par exemple,i686-mingw32-c++
au lieu dec++
) et vous pouvez avoir besoin d'utiliser l'option--dlltool-name
trop.Essayez d'utiliser ces deux lignes à la place de celui que vous avez posté:
Le premier génère un fichier de l'objet à partir du code de
library.cpp
et le second rassemble la bibliothèque dynamique. LeOBJECT_FILES
chose (que je suppose être d'autres fichiers objets générés précédemment) doit avoirlibrary.o
là aussi.Cela dit, je dois vous dire dllwrap était déjà obsolète en 2006 et il n'y a pas de documentation sur il en la officiel le paquet binutils; pour obtenir quelques infos, vous pouvez l'appeler avec
--help
comme d'habitude. Il peut générer une bibliothèque d'importation dans le cas où vous en avez besoin aussi.def
fichier ils ne sont pas exportées, même ceux provenant des bibliothèques. Je vais utiliser dllwrap, je suis en utilisant binutils 2.20 et dllwrap est toujours là, donc c'est peut-être encore maintenu. Si c'est obsolète... ne devrait-il pas être un moyen de faire la même chose en utilisant uniquement du ccg et de la cia?dllexport/dllimport
et avoir symbole de la visibilité traitée comme ça.Ne sais pas pourquoi il n'y a pas de vraie réponse à cela, mais voici ce qui a fonctionné pour moi:
De la Compilation de vos fichiers objet:
De liens (
-Wl,--exclude-all-symbols
est important):Ensuite, vous choisissez les fonctions d'exporter directement dans le code source de votre fichier DLL:
De vérification:
(
pedump
= http://pedump.me)C'est un problème récurrent. Voici deux questions connexes dans:
extérieur AFIN de:
c'est à dire globale /locale de l'exportation sur la plate-forme Windows n'est pas géré au niveau de l'éditeur de liens, mais, mais la mise à disposition d'un
.def
fichier à compléter la.dll
.Manque d'une bonne réponse, j'ai fait un script en python qui prend soin de supprimer des trucs à partir de la dll à l'exportation de la table, vous pouvez le trouver ici .
Avez-vous lu cela sur la page que vous avez fourni alink à, concerne le comportement si l'option --export-tous-les symboles n'est pas utilisé explicitement - exportation automatique est désactivé si:
Avez-vous essayé explicitement l'exportation uniquement les fonctions qui vous intéresse? Il est très facile d'obtenir les noms de mal dans le fichier DEF, en raison de la déformation, de sorte que cette méthode devrait être plus fiable.
Vous pouvez utiliser l'option
-Wl,--retain-symbols-file=file
, puis la liste des symboles que vous souhaitez conserver (un par ligne) dansfile
. Ce sera la cause de l'éditeur de liens pour annuler tous les autres symboles, en gardant uniquement ceux que vous souhaitez.Avertissement: je ne l'ai fait sur Linux, mais autant que je sache, il devrait fonctionner sur Windows ainsi
Vous pouvez utiliser le
-fvisibility=hidden
option; pour plus d'info voir http://gcc.gnu.org/wiki/Visibility