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

  • Изменить каталог рабочего каталога в сценарии оболочки
  • Обнаружение дистрибутивов RHEL / RPM
  • Конфигурация linux + limits.conf
  • Как установить пакет vsftpd
  • SSH прерывается с перерывами
  • Параметры настройки ядра Linux +
  • Как решить проблему dracut, когда intall Fedora 21
  • RHEL 7 (CentOS 7) security / ssh / sshd_config рекомендует
  • 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 исправить оптимизированный ассемблерный код, а затем собрать и связать его с более старой системой

    Interesting Posts

    Насколько безопасно хранить скрипты, не зависящие от root, в /etc/init.d?

    запускать сценарий удаленно и использовать результат локально с помощью ssh auto login

    Авто-спящий режим с правилом udev

    Пытаться направить содержимое переменной в команду дает Ambigious Redirect

    Передача данных между Ubuntu и CentOS

    Как настроить ssh поверх USB на встроенном Linux-устройстве?

    SSH – Как сделать приложения X на клиенте?

    Интерпретации интерпретации команд в кавычках как разделители аргументов

    Означает ли факт, что MacOS работает на ядре BSD, означает, что это лучший выбор для этого оборудования?

    удалить новые строки

    Настроить верхнюю панель / глобальное меню / Super-Wingpanel в элементарной операционной системе Luna

    Полосы пробелов после одиночных заглавных букв с sed

    Как извлечь файлы из uImage?

    Приложения не используют одни и те же сопоставления клавиатуры, кажется

    Перенаправление заголовка для файла хостов обновлений

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