2012-03-30 74 views
5

我們需要訪問net/ipv4/af_inet.c中的內核全局變量,這些變量不會從可加載內核模塊顯式導出。我們目前使用2.6.18內核。訪問未通過EXPORT_SYMBOL導出的Linux內核符號*

kallsyms_lookup_name不會出現可用了(不出口)

__symbol_get返回NULL(在進一步閱讀,symbol_get/__ symbol_get看起來通過只包含出口標誌的內核和現有模塊的符號表,它是否有確保從中導出符號的模塊實際上已加載)

有無論如何訪問不從內核模塊導出的符號嗎?

經過大量閱讀並查看人們提供的答案後,似乎很難在許多內核版本中找到一種方法,因爲kAPI會隨着時間的推移發生顯着變化。

+0

'objdump path/to/modulename.ko'會做你需要的嗎?您將不得不解碼輸出以確定模塊中的相應偏移量,然後應用該偏移量。獲取未導出符號的目的是什麼? – wallyk 2012-03-30 23:35:13

+0

是的,我們可以通過用戶空間中的/ proc/kallsyms來獲取地址,並且可能傳遞給模塊,但是這看起來有點詭異,所以我想知道是否有更好的東西。我們試圖將部分網絡代碼拉出來,並將其作爲一個模塊,以便我們可以在不必重新啓動內核的情況下修復錯誤。 – 2012-03-30 23:42:16

回答

4

您可以使用您從/ proc/kallsyms得到它之前提到的方法或只使用在System.map(這是一回事)給出的地址,它可能看起來的hackish,但我這是怎麼樣了看到它之前完成(從來沒有真的必須自己做)。無論是這個,還是您可以構建您自己的自定義內核,無論您想要導出哪個內容,實際上都會執行EXPORT_SYMBOL,但這不是可移植的。

+0

耶穌,你在哪裏見過/ proc/kallsyms方法?這是在生產環境中嗎?你是對的,我們希望使用標準內核而不必重新編譯它。 – 2012-03-31 05:16:00

+0

@softwareengineer通常在測試我們想要添加到內核中的一些功能時,無需重新編譯它,或者只是將它作爲一個可移動的模塊化功能。我見過它可能有一兩次。在此之前,我看到了System.map,他們只是將地址硬編碼到模塊中。 – 2012-03-31 05:17:27

+0

謝謝,我會等幾天,看看有沒有人能拿出任何東西,但如果沒有,我很樂意接受你的。 – 2012-03-31 05:21:38

5

如果性能不是一個大問題,可以使用kallsyms_on_each_symbol()(由內核爲GPL模塊導出)遍歷整個符號列表,並檢查名稱以獲取所需的符號。除非沒有其他選擇,否則我不會推薦這麼做。

如果你想要這樣做,這裏是我們的其中一個項目an example。請參閱kallsyms_on_each_symbol()的用法以及symbol_walk_callback()的代碼,其他部分與此問題無關。

+0

。然而,這個函數似乎只在更新的內核中可用。它不是在2.6.18或2.6.25,而是在2.6.30。儘管如此,我應該在我的原始問題中指定2.6.18內核。 – 2012-04-02 18:24:23