Centos
GCC 編譯 - __stack_chk_fail@GLIBC_2.4 符號來自哪裡?
我在 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 上執行。