Linux核心符號表

2021-07-02 12:44:19 字數 3528 閱讀 6155

1、形成過程

linux核心符號表

/proc/kallsyms

的形成過程

(1)./scripts/kallsyms.c負責生成system.map

(2)./kernel/kallsyms.c負責生成

/proc/kallsyms

(3)./scripts/kallsyms.c解析

vmlinux(.tmp_vmlinux)

生成kallsyms.s(.tmp_kallsyms.s)

,然後核心編譯過程中將

kallsyms.s(

核心符號表

)編入核心映象

uimage

核心啟動後./kernel/kallsyms.c

解析uimage

形成/proc/kallsyms

2、核心配置

在2.6

核心中,為了更好地除錯核心,引入了

kallsyms

。kallsyms

抽取了核心用到的所有函式位址(全域性的、靜態的

)和非棧資料變數位址,生成乙個資料塊,作為唯讀資料鏈結進kernel image

,相當於核心中存了乙個

system.map

。需要配置

config_kallsyms

.config

config_kallsyms=y符號表中包含所有的函式

config_kallsyms_all=y符號表中包括所有的變數(

包括沒有用

export_symbol

匯出的變數

)config_kallsyms_extra_pass=y

make menuconfig

general setup  --->  

[*] configure standard kernel features (for small systems)  --->

[*]   load all symbols for debugging/ksymoops (選中此項,才有

/proc/kallsyms

介面檔案, oops問題,選中此選項即可,子選項可以忽略

[*]   include all symbols in kallsyms

[*]   do an extra kallsyms pass  

3、作用

在2.6

版的核心中,為了更方便的除錯核心**,開發者考慮將核心**中所有函式以及所有非棧變數的位址抽取出來,形成是乙個簡單的資料塊(data blob:符號和位址對應),並將此鏈結進 

vmlinux 

中去。如此,在需要的時候,核心就可以將符號位址資訊以及符號名稱都顯示出來,方便開發者對核心**的除錯。完成這一位址抽取

+資料快組織封裝功能的相關子系統就稱之為 

kallsyms

。反之,如果沒有 kallsyms

的幫助,核心只能將十六進製制的符號位址呈現給外界,因為它能理解的只有符號位址,而並不包括人類可讀的符號名稱

經常使用 windows 

的人都知道所謂的藍屏是怎麼回事,那是系統出了致命問題,而不能繼續執行下去而

show

出的乙個藍色屏。那麼對 

linux 

來說,也會有致命錯誤的出現,如果這種錯誤使得

linux

不可繼續執行,那麼

linux

就會顯示類似下面這樣的螢幕內容

(以執行在

powerpc

架構下的

linux

來舉例,其他架構也差不多)以

dump

出出現錯誤那時刻的系統狀態。這種現象就是所謂的

oops

,也就linux

下的藍屏。

上面出現的oops

訊息中,顯示了出錯時的

cpu各暫存器的值,以及以 

"call trace:" 

一行開始的

c函式呼叫棧。注意其中除了顯示在中括號內的位址,還顯示了函式的名稱,這就是受助於 

kallsyms 

的結果,否則它只能顯示位址資訊。要在乙個核心中啟用 kallsyms 

功能,你必須設定config_kallsyms

選項為y;如果你要在 kallsyms

中包含全部符號資訊,必須設定 

config_kallsyms_all 為y

4、為何/proc/kallsyms符號位址都為0?

00000000 t stext

00000000 t _sinittext

00000000 t _stext

00000000 t __init_begin

00000000 t __create_page_tables

00000000 t __enable_mmu_loc

00000000 t __fixup_pv_table

00000000 t __vet_atags

00000000 t __mmap_switched

00000000 t __mmap_switched_data

00000000 t lookup_processor_type

00000000 t set_reset_devices

00000000 t debug_kernel

00000000 t quiet_kernel

00000000 t init_setup

00000000 t rdinit_setup

00000000 t loglevel

00000000 t unknown_bootoption

00000000 t do_early_param

00000000 t parse_early_options

00000000 t parse_early_param

...為什麼/proc/kallsyms的內容中符號位址都是0呢???

answer:

因為系統為了保護這些符號位址洩露,而用的一種保護手段,從而使除root使用者外的普通使用者不能直接檢視符號位址;

seq_printf(m, "%pk %c %s\n", (void *)iter->value,

iter->type, iter->name);

只需要把其中的%pk換成%p就可以讓普通使用者檢視符號位址了;很多提權漏洞一般會用到此處的修改來獲取符號位址。

源**:

linux核心符號表

所謂核心符號表就是在核心內部函式或變數中可供外部引用的函式和變數的符號表。在 2.6 核心下,使用以下命令可以看到核心符號表 引用 beyes linux beyes cat proc kallsyms more c0100000 t text c0100000 t startup 32 c0100...

linux核心符號表

所謂核心符號表就是在核心內部函式或變數中可供外部引用的函式和變數的符號表。在 2.6 核心下,使用以下命令可以看到核心符號表 引用 beyes linux beyes cat proc kallsyms more c0100000 t text c0100000 t startup 32 c0100...

Linux核心符號表

linux核心符號表 1 形成過程 linux 核心符號表 proc kallsyms的形成過程 1 scripts kallsyms.c負責生成system.map 2 kernel kallsyms.c負責生成 proc kallsyms 3 scripts kallsyms.c解析vmlinu...