Компиляция GCC – откуда берется символ __stack_chk_fail@GLIBC_2.4?

Я использую GCC 4.7.2 из пакета devtoolset на CentOS 5 (CentOS 5, потому что нам нужна совместимость со старыми Linuxes и GCC 4.7, потому что он оптимизируется лучше, чем 4.4).

Существует один символ, который предотвращает запуск моих двоичных файлов на RHEL4: __stack_chk_fail@GLIBC_2.4 . Он включен только в некоторые C ++-программы, а -fno-stack-protector не помогает.

Вот минимальная программа, которая воспроизводит проблему (но то же самое с использованием stdio.h работает):

 #include <iostream> int main(int argc, char *argv[]) { for(int i=0; i < argc; i++) std::cout << " " << argv[i]; return 0; } 

При компиляции с оптимизацией ( -O / -O2 ) он ссылается на __stack_chk_fail .

 $ g++ -fno-stack-protector -O2 foo.cc $ readelf -s a.out | grep chk 15: 0000000000000000 0 FUNC GLOBAL DEFAULT UND __stack_chk_fail@GLIBC_2.4 (5) 105: 0000000000000000 0 FUNC GLOBAL DEFAULT UND __stack_chk_fail@@GLIBC_2 

Любая идея, почему этот символ попадает сюда и как избавиться от него?

На всякий случай, полный вывод readelf и gcc -v здесь .

Изменить: эта проблема может быть специфичной для Red Hat Developer Toolset 1.1. По умолчанию компилятор CentOS __stack_chk_fail не ссылается.

2 Solutions collect form web for “Компиляция GCC – откуда берется символ __stack_chk_fail@GLIBC_2.4?”

Этот символ исходит из libstdc++_nonshared.a .

В отличие от GCC из дистрибутива, GCC от devtoolset имеет непривязанную часть libstdc ++. libstdc ++. поэтому в GCC 4.7 – скрипт компоновщика, который использует libstdc ++ из GCC 4.1 и дополнительные функции, связанные статически:

 $ cat /opt/centos/devtoolset-1.1/root/usr/lib/gcc/i386-CentOS-linux/4.7.2/libstdc++.so /* GNU ld script Use the shared library, but some functions are only in the static library, so try that secondarily. */ OUTPUT_FORMAT(elf32-i386) INPUT ( /usr/lib/libstdc++.so.6 -lstdc++_nonshared ) 

После перекомпиляции libstdc++_nonshared.a с отключенной защитой стека окончательная программа может быть запущена на RHEL4.

Он поставляется с GLibC. Создайте против старого GLibC.

Вы можете указать GCC 4.7 исправить оптимизированный ассемблерный код, а затем собрать и связать его с более старой системой

  • Карта охватывает esc для RHEL 5?
  • Red Hat 7 GDM + NIS проверяет только первые 7 символов пароля
  • Yum не может скачать, но скручивание в порядке?
  • Использование tcpdump для извлечения содержимого NFS RPC
  • Каковы различия между runit и supervisord?
  • Присоединяйтесь к Redhat 7 без запроса пароля
  • При запуске на уровень выполнения он выполняет предыдущие уровни выполнения?
  • Совместное использование файлов между RedHat и Mac
  • Сообщение об ошибке: grub2 устаревает grub2
  • Yum fail: Требует установленные пакеты
  • Может ли RHEL 6.4 DS синхронизироваться с CentOS 5.4 DS
  • Linux и Unix - лучшая ОС в мире.