C'est une question de seconde main d'un site de développement de système d'exploitation, mais cela m'a rendu curieux car je ne trouvais nulle part une explication décente.
Lors de la compilation et de la liaison d'un programme C ++ autonome à l'aide de gcc, une erreur de l'éditeur de liens comme celle-ci se produit parfois:
out/kernel.o:(.eh_frame+0x11): undefined reference to `__gxx_personality_v0'
Ceci est apparemment dû au fait que ce symbole est défini dans libstdc ++, qui manque dans un environnement autonome. Résoudre le problème nécessite simplement de définir ce symbole quelque part:
void *__gxx_personality_v0;
Ce qui est bien, mais je n'aime pas les choses qui fonctionnent comme par magie ... Alors la question est, quel est le but de ce symbole?
-fno-exceptions
. J'ai ajoutéCPPFLAGS += -fno-exceptions
à mon makefile, et cela a résolu l'erreur.Cela fait partie de la gestion des exceptions. Le mécanisme gcc EH permet de mélanger divers modèles EH, et une routine de personnalité est appelée pour déterminer si une exception correspond, quelle finalisation appeler, etc. Cette routine de personnalité spécifique est pour la gestion des exceptions C ++ (par opposition à, disons, gcj / Java gestion des exceptions).
la source
La gestion des exceptions est incluse dans les implémentations autonomes.
La raison en est que vous utilisez éventuellement
gcc
pour compiler votre code. Si vous compilez avec l'option,-###
vous remarquerez qu'il manque l'option de l'éditeur de liens-lstdc++
lorsqu'il appelle le processus de l'éditeur de liens. Compiler avecg++
inclura cette bibliothèque, et donc les symboles qui y sont définis.la source
file.cpp
avecgcc
au lieu deg++
?libstdc++
est la seule différence entre les deux.Un grep rapide de la
libstd++
base de code a révélé les deux utilisations suivantes de__gx_personality_v0
:Dans libsupc ++ / unwind-cxx.h
Dans libsupc ++ / eh_personality.cc
(Remarque: c'est en fait un peu plus compliqué que cela; il y a une compilation conditionnelle qui peut changer certains détails).
Donc, tant que votre code n'utilise pas réellement la gestion des exceptions, définir le symbole comme
void*
n'affectera rien, mais dès que cela le fera, vous allez planter -__gxx_personality_v0
est une fonction, pas un objet global, alors essayez pour appeler la fonction va sauter à l'adresse 0 et provoquer un segfault.la source
J'ai eu cette erreur une fois et j'ai découvert l'origine:
J'utilisais un compilateur gcc et mon fichier a été appelé
CLIENT.C
alors que je faisais un programme C et non un programme C ++.gcc reconnaît l'
.C
extension en tant que programme C ++ et l'.c
extension en tant que programme C (attention au petit c et au grand C).J'ai donc renommé mon
CLIENT.c
programme de fichiers et cela a fonctionné.la source
Les réponses ci-dessus sont correctes: elles sont utilisées dans la gestion des exceptions. Le manuel de la version 6 de GCC contient plus d'informations (qui ne sont plus présentes dans le manuel de la version 7). L'erreur peut survenir lors de la liaison d'une fonction externe qui - inconnue de GCC - lève des exceptions Java.
la source