неопределенная ссылка на ` стек ЧК Фаиль
получение этой ошибки при компиляции кода C++:
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 из этих ошибок.
любая помощь, пожалуйста?
3 ответов
libgurobi_c++.a был скомпилирован с помощью-fno-stack-protector (очевидно).
несколько вещей приходят на ум:
- добавить - fno-stack-protector при связывании. Это гарантирует, что libssp будет связан.
- link вручную - lssp
- Сделайте свою фиктивную версию _ _ stack_chk_fail (void) в своем собственном объектном файле и добавьте это .o файл для вашей команды компоновщика после libgurobi_c++.a. Gcc / G++ разрешает символы слева направо во время связывания поэтому, несмотря на то, что ваш код имеет определенную функцию, копия объекта, содержащего символ __stack_chk_fail, должна находиться в строке компоновщика справа от libgurobi_c++.a.
https://wiki.ubuntu.com/ToolChain/CompilerFlags
говорит:
"обычно это результат вызова ld вместо gcc во время сборки для выполнения связывания"
Это то, с чем я столкнулся при изменении Makefile libjpeg вручную. Использование gcc вместо ld решило проблему.
в 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