Компиляция 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 не ссылается.

  • Настроить Невозможно записать журналы в другой файл на управляемых серверах
  • Монтирование CIFS-акций как не-root на RHEL7 без рабочего стола
  • Использование nmcli для установки маски подсети и IP-адреса шлюза
  • FTP на Linux RH - застрял на 150 Ascii
  • SELinux httpd записывает доступ к каталогу
  • почему репозиторий debian не содержит lokkit?
  • Включение настраиваемого журнала аудита в RedHat
  • Как я могу запустить сервис iptables автоматически после перезагрузки на CenOS / RHEL7?
  • 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 исправить оптимизированный ассемблерный код, а затем собрать и связать его с более старой системой

    Linux и Unix - лучшая ОС в мире.