2010-12-20 4 views
20

Obtenir cette erreur lors de la compilation de code C++:référence non définie à `__stack_chk_fail »

undefined reference to `__stack_chk_fail' 

Les options déjà essayé:

  1. ajouté -fno-stack-protecteur lors de la compilation - ne fonctionnait pas, l'erreur persiste
  2. ajouté une implémentation factice de void __stack_chk_fail (void) dans mon code. Encore obtenir la même erreur.

Erreur détaillée:

/u/ac/alanger/gurobi/gurobi400/linux64/lib/libgurobi_c++.a(Env.o)(.text+0x1034): In function `GRBEnv::getPar/u/ac/alanger/gurobi/gurobi400/linux64/lib/libgurobi_c++.a(Env.o)(.text+0x1034): In function `GRBEnv::getParamInfo(GRB_StringParam, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&)': 
: undefined reference to `__stack_chk_fail' 
amInfo(GRB_StringParam, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&)': 
: **undefined reference to `__stack_chk_fail'** 

Plus tôt, je recevais 10 de ce telles erreurs. Trouvé qu'il y avait une incompatibilité de version entre les gcc des bibliothèques précompilées que j'utilise et la version gcc que j'utilisais pour compiler le code. Mis à jour gcc et maintenant je reçois seulement 2 de ces erreurs.

Toute aide, s'il vous plaît?

Répondre

25

libgurobi_C++. A été compilé avec -fno-stack-protector (évidemment).

Quelques choses viennent à l'esprit:

  1. ajouter -fno-stack-protecteur lors de la liaison. Cela s'assurera que libssp est lié.
  2. lien manuellement -lssp
  3. Faites votre version fictive de __stack_chk_fail (void) dans son propre fichier objet et et ajoutez ce fichier .o à votre commande linker APRÈS libgurobi_C++. A. GCC/G ++ résout les symboles de gauche à droite lors de la liaison. Ainsi, malgré la définition de votre code, une copie d'un objet contenant le symbole __stack_chk_fail doit se trouver sur la ligne de l'éditeur de liens à droite de libgurobi_C++.
+0

1. J'avais ajouté -fno-stack-protecteur plus tôt mais cela n'avait pas aidé. 2. Merci beaucoup, en ajoutant -lssp travaillé. 3. Merci beaucoup! Cette information était utile. J'avais oublié ça. – Akhil

+1

Content de l'avoir résolu. Aviez-vous ajouté -fno-stack-protector lors de la liaison? Peut-être qu'il a mis le -lssp dans le mauvais ordre, qui sait ... – gravitron

+1

Bien qu'il compilé quand je cours le programme j'obtiens cette erreur: ./jetAlloc: erreur lors du chargement des bibliothèques partagées: libssp.so.0: impossible d'ouvrir le fichier d'objet partagé: aucun fichier ou répertoire – Akhil

0

https://wiki.ubuntu.com/ToolChain/CompilerFlags

dit:

« Habituellement, cela est un résultat de l'appel ld au lieu de gcc lors d'une construction pour effectuer linking »

C'est ce que je rencontrais lorsque modifié le Makefile de libjpeg manuellement. Utilisez gcc au lieu de ld pour résoudre le problème.

0

Dans gentoo j'ai eu le même problème et j'ai résolu la création de 2 fichiers. La première contient l'option à analyser par le jour et passé à gcc:

/etc/portage/env/nostackprotector.conf 
CFLAGS="-fno-stack-protector -O2" 

Et le second dit quel paquet doit utiliser ce paramètre:

/etc/portage/package.env/nostackprotector 
x11-libs/vte nostackprotector.conf 
sys-libs/glibc nostackprotector.conf 
www-client/chromium nostackprotector.conf 
app-admin/sudo nostackprotector.conf