歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> Linux技術

Ubuntu12.04編譯openwrt過程中遇到的一些問題及處理方法

問題1:在編譯模塊luasocket時,報錯“ undefined reference to
`__stack_chk_fail_local'”。經過,網山搜索後,發現是有些版本的gcc啟用了Stack Guard堆棧保護,什麼是堆棧保護呢?Stack Guard 是第一個使用 Canaries 探測的堆棧保護實現,它於 1997 年作為 GCC 的一個擴展發布。最初版本的 Stack Guard 使用 0x00000000 作為 canary word。盡管很多人建議把 Stack Guard 納入 GCC,作為 GCC 的一部分來提供堆棧保護。但實際上,GCC 3.x 沒有實現任何的堆棧保護。直到 GCC 4.1 堆棧保護才被加入,並且 GCC4.1 所采用的堆棧保護實現並非 Stack Guard,而是 Stack-smashing Protection(SSP,又稱 ProPolice)。
SSP 在 Stack Guard 的基礎上進行了改進和提高。它是由 IBM 的工程師 Hiroaki Rtoh 開發並維護的。與 Stack Guard 相比,SSP 保護函數返回地址的同時還保護了棧中的 EBP 等信息。此外,SSP 還有意將局部變量中的數組放在函數棧的高地址,而將其他變量放在低地址。這樣就使得通過溢出一個數組來修改其他變量(比如一個函數指針)變得更為困難。
-fstack-protector:
啟用堆棧保護,不過只為局部變量中含有 char 數組的函數插入保護代碼。
-fstack-protector-all:
啟用堆棧保護,為所有函數插入保護代碼。
-fno-stack-protector:
禁用堆棧保護。
那麼我們可以知道堆棧保護是通過宏定義-fstack-protector來啟用的,當然在makefile裡面我是有用到這個宏定義的。
如果去掉這個宏定義或者加上-fno-stack-protector這個宏,yes,清靜了,沒有錯誤了。在相應的模塊下的makefile文件中修改下面的行,添加黃色背景內容,就可以了。這樣就只會影響這一個模塊,而不會影響其它模塊。
CC="$(TARGET_CC) $(TARGET_CFLAGS) $(TARGET_CPPFLAGS) -std=gnu99 -fno-stack-protector" \

但到這裡還不能結束,我們要探究一下為什麼在mipsel-openwrt-linux-gcc裡面是無法使用Stack Guard堆棧保護。
我們知道Stack Guard是需要GCC 支持libssp的,我們就去openwrt源碼看一下是否存在libssp這個庫
發現在build_dir/toolchain-mipsel_24kec+dsp_gcc-4.6-linaro_uClibc-0.9.33.2 /gcc-linaro-4.6-2013.05/libssp目錄下是存在libssp,但是我們在make menuconfig裡卻找不到可配置libssp的選項。
現在只能google一把

是的,由於ssp庫不能很好支持全平台,並沒有把ssp默認編譯。
問題已經解決,不想去折騰openssh了,如果不用Stack Guard進行堆棧保護,只能自己代碼保護了,也不用這個高級玩意了。
樓主只能默默去掉了-fstack-protector-all
問題2:無法下載軟件包“bird-1.5.0.tar.gz”:
下載網址為:http://bird.network.cz/?download
問題3:無法下載軟件包“lua-sha2.0.2.0.tar.gz”
托一個朋友從國外下載傳給我的。如附件:http://download.csdn.net/detail/shenwanjiang111/9507833
Copyright © Linux教程網 All Rights Reserved