Récemment, mon entreprise souhaite mettre à jour le compilateur de GCC-3.4 à GCC-4.5. Cependant, la machine de notre client peut ne pas avoir le Notre programme a besoin de personnalisé J'ai modifié le makefile, ajouté un LIBSTDC ++ à jour. SO CODE>, donc nous voulons que nous souhaitons static Notre binaire.
MALLOC () / gratuit ( ) code> pour une exigence très haute performance. p>
-static code> lors de la liaison et du message d'erreur suivant: P>
/usr/lib64/libc.a(malloc.o)(.text+0x18c0): In function `free':
: multiple definition of `free'
../../ic/src/memmgr/libmemmgr_mt_thread.a(memmgr_mt_thread.o)(.text+0x3430): first defined here
/usr/bin/ld: Warning: size of symbol `free' changed from 271 in ../../ic/src/memmgr/libmemmgr_mt_thread.a(memmgr_mt_thread.o) to 255 in /usr/lib64/libc.a(malloc.o)
/usr/lib64/libc.a(malloc.o)(.text+0x3970): In function `malloc':
: multiple definition of `malloc'
../../ic/src/memmgr/libmemmgr_mt_thread.a(memmgr_mt_thread.o)(.text+0x29c0): first defined here
/usr/bin/ld: Warning: size of symbol `malloc' changed from 281 in ../../ic/src/memmgr/libmemmgr_mt_thread.a(memmgr_mt_thread.o) to 461 in /usr/lib64/libc.a(malloc.o)
/usr/lib64/libc.a(malloc.o)(.text+0x4050): In function `realloc':
: multiple definition of `realloc'
../../ic/src/memmgr/libmemmgr_mt_thread.a(memmgr_mt_thread.o)(.text+0x3e80): first defined here
/usr/bin/ld: Warning: size of symbol `realloc' changed from 335 in ../../ic/src/memmgr/libmemmgr_mt_thread.a(memmgr_mt_thread.o) to 927 in /usr/lib64/libc.a(malloc.o)
6 Réponses :
Très probablement, vous devrez modifier les noms de vos routines d'allocation personnalisées. Après cela, vous devez utiliser la méthode décrite dans la réponse pour gagner du temps afin que vous ne puissiez pas modifier tous les appels vers le nouveau nom:
#define malloc myMalloc #define free myFree
Merci pour votre réponse: D Mais l'idiome #define ne peut pas aider. J'avais éditer mon post.
Vous devez utiliser votre propre fonction gratuite / Alloc / Realloc dans le projet, mais je vous conseille vivement d'utiliser le même nom que la bibliothèque standard.
Par exemple P>
#define malloc(x) myProject_malloc(x) #define free() myProject_free()
Je veux utiliser la bibliothèque standard. Mais veulent seulement remplacer le malloc / libre. Je lis maintenant le document GCC pour voir s'il y a une réponse.
Ensuite, vous devez définir votre propre fonction MALLOC avec un nom différent, car je l'écrivait et utilisez une macro pour redéfinir Malloc à votre propre fonction. Vous ne pouvez pas l'appeler MALLOC parce que vous aurez deux fonctions MALLOCLES différentes, la seule dans votre bibliothèque, et celle du LIBC.
Si votre principale préoccupation est la disponibilité de libstdc ++. Donc, dans le système cible, pourquoi ne pas simplement distribuer la version plus récente de celle avec votre application? P>
Je pense que la liaison statique dans tous les cas n'est pas une bonne solution, la compilation du projet devient beaucoup plus difficile, et si vous utilisez vous-même des objets partagés vous-même (par exemple lors de l'utilisation de vos propres plug-ins), alors la liaison statique arrêterait simplement de travailler, Puisque une copie distincte em> de la bibliothèque statique devra être liée à chaque em> de vos fichiers binaires, exécutables et ainsi de suite. Et pouvez-vous imaginer ce qui se passe s'il y a plusieurs instances de variables globales, de verrous, etc. dans le même programme lorsqu'il est chargé? Je vais vous dire: Crashes. P>
Donc, ne faites pas de lien statique, copiez libstdc ++. Donc, à un répertoire privé (je ne sais pas où votre application est installée, mais s'il dispose d'un préfixe privé, c'est assez simple, utilisez $ préfixe / lib). < / p>
puis définissez ld_library_path ou utilisez -RPath pour encoder le chemin dans le binaire, de sorte que la liaison le trouve. Bien entendu, cela signifie que toutes les bibliothèques que vous connaissez, cela pourrait éventuellement utiliser LibstDC ++ aussi, doit également être distribuée avec votre application. P>
Mais taille-sage, il s'agit de la même chose, avec une liaison statique que vous porteriez ce code aussi. P>
Merci, c'est exactement ce que j'ai besoin de résoudre mon problème. J'apprécie vraiment que vous savez ce que je veux même, je ne peux pas bien exprimer ma question.
Utilisation pourrait utiliser gnu malloc hameçonne Si vous utilisez GNU Libc. Je ne suis pas si heureux du design de cette API, donc je ne recommande pas d'utiliser ceci. P>
Vous pouvez essayer de corriger libc. Supprimer tout le code dans Utilisation de la même idée, vous pouvez essayer de prendre MALLOC / CODE> et le remplacer par votre implémentation. P>
libc.a code>, supprimer tous les fichiers
code> contenant
masloc code> et amis ( Cela devrait être surtout tous les fichiers
code> correspondant à
masloc / *. C code>) et reconditionnez
libc.a code> avec votre implémentation. P >
Merci. J'avais déjà interrogé cette solution. Mais en utilisant ce besoin de peu de travail de codage supplémentaire. La solution RPATH est donc meilleure pour moi: D
Si vous n'avez besoin que de le faire pour C ++, vous pouvez remplacer les nouveaux opérateurs [] supprimer [] supprimer []. Voir 18.6.1 "Allocation de stockage et distribution" "remplaçable: Un programme C ++ peut définir une fonction avec cette signature de fonction qui déplace la version par défaut définie par la bibliothèque standard C ++." p> Je ne sais pas si cela fonctionne avec une liaison statique cependant (ne sais pas comment elle est mise en œuvre). P> p>
Vous pouvez utiliser une liaison dynamique avec RPATH . Voir "Man LD" et "Man ld.so". P>
L'expansion $ origine peut être utile: assumez chaque .so dont vous avez besoin dans le même répertoire que le même répertoire que le programme (ou un sous-répertoire) et utilisez "-RPath $ Origine" ou "-RPath", $ Origin / Lib "lors de la liaison avec ld. p>
De nombreux programmes utilisent cette approche pour regrouper leurs propres libs privés. P>
L'autre moyen est d'utiliser un script .sh pour définir ld_library_path, puis appelez le programme réel (téléchargez Firefox binaire et regardez sur RUN-MOZILLA.SH). Cependant, le LD_Library_Path fuit les sous-processus. Il n'est donc pas aussi propre mais probablement plus portable pour les systèmes non GNU. P>
Bonjour @yoco, avez-vous eu une solution à la fin avec une liaison statique? J'ai le même problème.
@ user1147800 Je n'ai pas de solution de liaison statique. Je liens dynamique à la fin.
Vous pouvez statiquement lien
libstdc ++. A code> et lien dynamique
libc.so code>