2010-12-20 28 views
20

Conseguir este error al compilar código C++:referencia indefinida a `__stack_chk_fail'

undefined reference to `__stack_chk_fail' 

Opciones ya se intentó:

  1. añade -fno-stack-protector durante la compilación - no funcionó, persiste el error
  2. agregó una implementación ficticia de void __stack_chk_fail (void) en mi código. Sigue recibiendo el mismo error.

error detallada:

/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'** 

Más temprano, que estaba recibiendo 10 's de dichos errores. Descubrí que había una versión no coincidente entre el gcc de las bibliotecas precompiladas que estoy usando y la versión gcc que estaba usando para compilar el código. Actualizado gcc y ahora recibo solo 2 de estos errores.

¿Alguna ayuda, por favor?

Respuesta

25

libgurobi_C++. A se compiló con -fno-stack-protector (obviamente).

Algunas cosas vienen a la mente:

  1. añadir -fno-stack-protector de al vincular. Esto asegurará que libssp se vincule.
  2. enlace manualmente -lssp
  3. Haga su versión ficticia de __stack_chk_fail (void) en su propio archivo de objeto y este archivo y añadir .o a su comando enlazador DESPUÉS libgurobi_C++. A. GCC/G ++ resuelve símbolos de izquierda a derecha durante la vinculación, por lo tanto, a pesar de que su código tenga la función definida, una copia de un objeto que contiene el símbolo __stack_chk_fail debe estar en la línea del enlazador a la derecha de libgurobi_C++. A.
+0

1. Había añadido -fno-stack-protector antes, pero eso no ha ayudado. 2. Muchas gracias, agregando -lssp funcionó. 3. ¡Muchas gracias! Esta información fue útil. Me había olvidado de esto – Akhil

+1

Me alegro de que lo haya resuelto. ¿Has agregado -fno-stack-protector durante la vinculación? Tal vez puso el -lssp en el orden incorrecto, quién sabe ... – gravitron

+1

Aunque se compiló cuando ejecuto el programa, aparece este error: ./jetAlloc: error al cargar bibliotecas compartidas: libssp.so.0: no se puede abrir el archivo de objeto compartido: No existe dicho archivo o directorio – Akhil

0

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

dice:

"Por lo general, este es un resultado de la llamada ld en lugar de gcc durante una acumulación de realizar la vinculación"

Esto es lo que me encontré cuando se modifica el Makefile de libjpeg manualmente. Usar gcc en lugar de ld resolvió el problema.

0

En gentoo tuve el mismo problema y resolví crear 2 archivos. La primera contiene la opción de ser analizado por emerger y pasó a gcc:

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

Y el segundo dice cuál es el paquete debe usar esta configuración:

/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