[英]what is __ksymtab? in linux kernel
當我們cat'proc / kallsyms'或'system.map'時,我們會得到這樣的符號
....
c033718c T nf_hook_slow
c04ca284 r __ksymtab_nf_hook_slow
c04ca28c r __ksymtab_nf_hooks
c04d24a0 r __kcrctab_nf_hook_slow
c04d24a4 r __kcrctab_nf_hooks
c04e9122 r __kstrtab_nf_hook_slow
c04e9179 r __kstrtab_nf_hooks
c054d854 D nf_hooks
c0571ca0 d nf_hook_mutex
....
先感謝您。
簡單來說,'T'通常表示全局(非靜態但不一定是導出的)函數,'t' - 編譯單元本地的函數(即靜態),'D' - 全局數據,'d' - 編譯單元的本地數據。 'R'和'r' - 與'D'/'d'相同,但是對於只讀數據。
這些是導出符號所需的特殊部分中的項目,以便內核模塊可以使用這些符號。
對於每個導出的符號, EXPORT_SYMBOL()
至少定義以下內容:
__kstrtab_<symbol_name>
- 作為字符串的符號名稱 __ksymtab_<symbol_name>
- 包含符號信息的結構:其地址, __kstrtab_<symbol_name>
地址等。 __kcrctab_<symbol_name>
- 符號的控制和(CRC)的地址 - 例如,它用於檢查內核或模塊是否提供給定內核模塊所需的完全相同的符號。 如果模塊需要具有給定名稱和CRC的符號,並且內核提供具有該名稱但具有不同CRC的符號(例如,如果模塊是針對不同的內核版本編譯的),則模塊加載器將拒絕加載該內核模塊(除非禁用此檢查)。 有關詳細信息,請查看linux / export.h中EXPORT_SYMBOL()
宏的實現。
不確定,但到目前為止,當System.map中存在函數(“文本符號”)或變量(“數據符號”)但在/ proc / kallsyms中未顯示(如果內核編譯正確並且完全啟用kallsyms(CONFIG_KALLSYMS = y,CONFIG_KALLSYMS_ALL = y)。 如果CONFIG_KALLSYMS_ALL = n,則只有函數(確切地說,來自* .text部分的符號)將顯示在/ proc / kallsyms中。
取決於您的內核版本。 您可以查看內核的EXPORT_SYMBOL()
定義,並找到__ksymtab_<symbol_name>
變量的類型。 在內核3.11中,它是linux / export.h中定義的struct kernel_symbol
kernel_symbol 。 有了該結構的定義及其地址,我想,你可以得到符號的地址: struct kernel_symbol::value
。 雖然我自己沒試過。
但請注意, __ksymtab_nf_hook
適用於nf_hook
但不適用於nf_hooks
。 名稱必須匹配。 nf_hooks
和nf_hook
是不同的實體。
很難說沒有看到代碼和/ proc / kallsyms的相關部分。 也許它是#ifdef'ed並且根本沒有編譯,可能還有別的東西。
此外, nf_hooks
是一個數據項,因此如果CONFIG_KALLSYMS_ALL為'n',它可能不會出現在/ proc / kallsyms中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.