Centos

GCC 編譯 - __stack_chk_fail@GLIBC_2.4 符號來自哪裡?

  • September 28, 2013

我在 CentOS 5 上使用devtoolset包中的 GCC 4.7.2(CentOS 5 因為我們需要與舊 Linux 兼容,而 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不被引用。

這個符號來自libstdc++_nonshared.a

與發行版中的 GCC 不同,來自 devtoolset 的 GCC 具有 libstdc++ 的非共享部分。GCC 4.7 中的 libstdc++.so 是一個連結器腳本,它使用 GCC 4.1 中的 libstdc++ 和靜態連結的額外函式:

$ 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 上執行。

引用自:https://unix.stackexchange.com/questions/90312