Linux核心符號表

2021-07-24 12:22:49 字數 3169 閱讀 7906

**linux核心符號表

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?

通過cat /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核心符號表

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