неопределенная ссылка на `__stack_chk_fail ' - PullRequest
28 голосов
/ 20 декабря 2010

Получение этой ошибки при компиляции кода C ++:

undefined reference to `__stack_chk_fail'

Опции уже опробованы:

  1. добавлен -fno-stack-protector во время компиляции - не работает, ошибка сохраняется
  2. добавил фиктивную реализацию void __stack_chk_fail (void) в мой код. По-прежнему получаю ту же ошибку.

Подробная ошибка:

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

Ранее я получал 10 таких ошибок. Обнаружено, что существует несоответствие версий между gcc предварительно скомпилированных библиотек, которые я использую, и версией gcc, которую я использовал для компиляции кода. Обновлено gcc, и теперь я получаю только 2 из этих ошибок.

Любая помощь, пожалуйста?

Ответы [ 3 ]

31 голосов
/ 20 декабря 2010

libgurobi_c ++. A был скомпилирован с -fno-stack-protector (очевидно).

Несколько вещей приходят на ум:

  1. добавить -fno-stack-protector при связывании. Это гарантирует, что libssp будет связан.
  2. Ссылка вручную -lssp
  3. Создайте свою фиктивную версию __stack_chk_fail (void) в своем собственном объектном файле и добавьте этот .o-файл в команду компоновщика ПОСЛЕ libgurobi_c ++. A. GCC / G ++ разрешает символы слева направо во время компоновки, поэтому, несмотря на то, что ваш код имеет определенную функцию, копия объекта, содержащего символ __stack_chk_fail, должна находиться в строке компоновщика справа от libgurobi_c ++. A.
0 голосов
/ 15 апреля 2015

В gentoo у меня была такая же проблема, и я решил создать 2 файла.Первый содержит параметр, который должен быть проанализирован с помощью emerge и передан gcc:

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

А второй сообщает, какой пакет должен использовать эти параметры:

/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 голосов
/ 17 сентября 2014

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

говорит:

"Обычно это результат вызова ld вместо gcc во время сборки для выполнения связывания"

Это то, с чем я столкнулсякогда изменил Makefile из libjpeg вручную.Использование gcc вместо ld решило проблему.

...