Подтвердить что ты не робот

Undefined ссылка на `__stack_chk_fail '

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

undefined reference to `__stack_chk_fail'

Параметры уже пробовали:

  • добавлен -fno-stack-protector при компиляции - не работает, ошибка сохраняется
  • добавлена ​​фиктивная реализация 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 из этих ошибок.

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

4b9b3361

Ответ 1

libgurobi_С++. a был скомпилирован с -fno-стеком-защитником (очевидно).

Приходят в голову несколько вещей:

  • добавьте -fno-stack-protector при связывании. Это обеспечит связь libssp.
  • Вручную ссылку -ssp
  • Сделайте свою фиктивную версию __stack_chk_fail (void) в ее собственном объектном файле и добавьте этот .o файл в вашу команду компоновщика ПОСЛЕ libgurobi_С++. a. GCC/g++ разрешает символы слева направо во время связывания, поэтому, несмотря на то, что ваш код имеет определенную функцию, копия объекта, содержащая символ __stack_chk_fail, должна находиться на линии компоновщика справа от libgurobi_С++. A.

Ответ 2

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

говорит:

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

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

Ответ 3

В 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