2013-03-01 58 views
0

我構建的Linux內核模塊支持mips體系結構的SSP。我將-fstack-protector-all添加到編譯標誌。但是在加載這個模塊之後,我得到了一些未定義的引用,如__stack_chk_guard__stack_chk_fail。但我添加了libssp.so到鏈接器。它看起來像我應該在內核像這樣導出這些符號:內核模塊中的符號

EXPORT_SYMBOL(__stack_chk_guard); 

因爲我的內核是舊的,沒有包含他們沒有。但不幸的是我應該使用這個版本。

我的問題是:爲什麼用戶空間可以使用工具鏈庫中的這些符號,但內核空間不?

我想,我錯過了一些linux內核的要領。

回答

1

您不能將內核鏈接到共享庫。如果你有一個libssp的靜態庫,它可以工作 - 但它會要求庫不會調用其他會導致內核問題的東西。

一般來說,堆棧檢查不是你應該在內核上做的事情 - 我敢肯定它沒有特別好的目的[我也非常確定內核使用「警衛頁面」爲每個內核堆棧]。

+0

+1我想你理論上可以從文件加載代碼,映射它,執行並重新啓動:) – 2013-03-01 17:31:52

1

您不能在內核空間的任何位置使用共享庫(包括作爲內核模塊的一部分)。

您可以將內核模塊本身視爲內核空間中的共享庫的等效物,但存在很多差異。

內核模塊可能依賴於來自其他內核模塊的exported symbols

我的問題是:爲什麼用戶空間可以從工具鏈 庫中使用這個符號,但是內核空間不?

內核空間中沒有內存訪問libc C庫。內核擁有自己的內置標準字符串操作函數集等,您可以使用它們。工具鏈庫建立在libc之上。

對Mats的回答+1。你可以使用一個static library只要它不依賴於標準的C庫如libc

+0

謝謝,我用靜態庫成功構建了我的模塊! – Jurasic 2013-03-05 08:52:03