web-dev-qa-db-fra.com

référence non définie à `__stack_chk_fail '

Obtenir cette erreur lors de la compilation du code C++:

undefined reference to `__stack_chk_fail'

Options déjà essayées:

  1. ajout de -fno-stack-protector lors de la compilation - ne fonctionne pas, l'erreur persiste
  2. ajout d'une implémentation factice de void __stack_chk_fail (void) dans mon code. Toujours avoir 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, j'avais 10 ans de telles erreurs. Nous avons découvert qu'il existait une incompatibilité de version entre 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 ne reçois que 2 de ces erreurs.

Toute aide, s'il vous plaît? 

23
Akhil

libgurobi_c ++. a a été compilé avec -fno-stack-protector (évidemment).

Quelques points me viennent à l’esprit:

  1. ajoutez -fno-stack-protector lors de la liaison. Cela garantira que libssp est lié.
  2. Lier manuellement -lssp
  3. Créez votre version factice de __stack_chk_fail (void) dans son propre fichier objet et ajoutez ce fichier .o à votre commande de l'éditeur de liensAPR&EGRAVE;Slibgurobi_c ++. A. GCC/G ++ résout les symboles de gauche à droite lors de la liaison. Ainsi, même si votre code a la fonction définie, 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 ++.
30
gravitron

Sous gentoo, j'ai eu le même problème et j'ai résolu de créer 2 fichiers. La première contient l’option à analyser par emerge et transmise à gcc:

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

Et le second indique quel paquet doit utiliser ces paramètres:

/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
0
Alex

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

dit:

"Habituellement, cela est dû à l'appel de ld au lieu de gcc lors d'une construction pour effectuer la liaison"

C'est ce que j'ai rencontré lors de la modification manuelle du Makefile de libjpeg. Utiliser gcc au lieu de ld a résolu le problème.

0
bjc