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

  • Создание образа докеров с использованием RPM
  • FTP не происходит на сервере RHEL 6, настроенном на Vm Player 11
  • Установить пакеты локально (без учетной записи root)
  • Определение макросов для создания файлов RPM, требующих Python 3
  • Сервер OpenVPN не отвечает на запрос клиента
  • Невозможно изменить размер удаленных окон через X11VNC?
  • chmod + изменить владельца на все файлы под папкой
  • Как использовать статус выхода в crontab
  • 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

    gnome-terminal cmd оставляют процессы открытыми после закрытия родительского окна

    Как распространять значение переменной

    Создание обходного интерфейса GUI беспроводной сети

    Невозможно отключить горячую точку оболочки GNOME / горячий угол / «Функция»,

    Создание последовательной консоли для подключения последовательного USB-устройства

    Система отказывается от SSH и зацикливается на «загрузке» после установки systemd

    Список файлов в иерархии каталога

    Выберите X-окна, используя клавиатуру, например, туз-прыжок / подсказку или похожие

    Нечеткий экран при запуске

    Обновлено Fedora 23 не загружается в графический логин – только вызывает текстовый терминал

    Нужно ли вообще беспокоиться о совместимости программного обеспечения, если я использую Mono и Wine?

    Nautilus Accels на Debian 9 / Gnome 3.22.3

    Как я могу скопировать n строк после последних двух вхождений строки в файл?

    Как установить расширения gnome-shell в Fedora 19?

    Как «rm -rf /» может удалить все файлы в системе?

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