歡迎您光臨本站 註冊首頁

Ubuntu Linux上編譯kernel出錯__stack_chk_fail

←手機掃碼閱讀     火星人 @ 2014-03-26 , reply:0

init/built-in.o: In function `try_name':
do_mounts.c.text+0x5e3):對『__stack_chk_fail』未定義的引用
init/built-in.o: In function `name_to_dev_t':
(.text+0x8cb):對『__stack_chk_fail』未定義的引用
init/built-in.o: In function `change_floppy':
(.init.text+0xa11):對『__stack_chk_fail』未定義的引用
init/built-in.o: In function `mount_block_root':
(.init.text+0xca7):對『__stack_chk_fail』未定義的引用
init/built-in.o: In function `do_header':
initramfs.c.init.text+0x4343):對『__stack_chk_fail』未定義的引用
arch/i386/kernel/built-in.o.text+0x54c6): more undefined references to `__stack_chk_fail' follow
make[1]: *** [.tmp_vmlinux1] 錯誤 1
make[1]: Leaving directory `/usr/src/linux-2.6.17.10'
make: *** [debian/stamp-build-kernel] 錯誤 2

在頂層的Makefile里找到CFLAGS然後添加-fno-stack-protector標誌!

其實這是傳給GCC的一個編譯選項。

-fno-stack-protector參數用來disable Stack-smashing protection

Ubuntu 6.10中,gcc默認用-fstack-protector參數進行編譯,很不友好的東東

對於調試程序也不方便,因為在程序down掉的時候不會產生coredump,只會產生下面的東東

Program received signal SIGABRT, Aborted.
0xffffe410 in __kernel_vsyscall ()

儘可能不要用GCC 4.2來編譯老的程序,4.2之後又有比較嚴格的C標準的驗證,很麻煩

GCC 4.2的問題在於:

在4.2下用默認編譯選項

int main()
{
char *t = "Testing!";
fprintf(stdout,"%s",t);
return 0;
}

warning: deprecated conversion from string constant to 『char*』

只要把 char * 改成 static const char * 的話這個 Warning 就不會出現了。估計是新一代的 GCC 怕程序員在代碼中用了 char * 時又不注意的話容易出現越界操作的錯誤,所以給出個小小的 warning 來。

[火星人 ] Ubuntu Linux上編譯kernel出錯__stack_chk_fail已經有637次圍觀

http://coctec.com/docs/linux/show-post-187430.html