ksym 0.2.0

A Rust crate for generating kernel symbol tables (ksyms) from kernel binaries.
Documentation

ksym

该模块提供内核符号表的支持。目前,有两种方式在内核中使用符号表。

Usage

nm -n -C {your kernel file} | grep ' [Tt] ' | grep -v '\.L' | grep -v '$x' | cargo run --bin {type} --features="demangle"

其中 {type} 可以是 gen_ksymgen_ksym_assembly。前者会生成一个文本文件,内核模块可以在运行时解析该文件以获取符号表。后者会生成一个汇编文件,可以与内核一起编译,内核启动时解析并初始化符号表。

使用第二种方式,内核需要开启assembly feature。

Output

对于第一种方式,生成的文件格式如下(与/proc/kallsyms类似):

ffffffc080200000 T _start
ffffffc080378070 T core::slice::index::slice_start_index_len_fail
ffffffc080379d12 T core::slice::index::slice_start_index_len_fail::do_panic::runtime

对于第二种方式,生成的汇编文件格式如下:

.section .rodata

.global ksyms_address
.align 8
ksyms_address:
	.quad

.global ksyms_num
.align 8
ksyms_num:
    .quad

.global ksyms_names_index
.align 8
ksyms_names_index:

.global ksyms_names
.align 8
ksyms_names:

Interface

  • init_kernel_symbols(ksym: &str):从字符串ksym中解析符号表并初始化内核符号表。该字符串的格式与/proc/kallsyms相同。
  • init_kernel_symbols():使用第二种方式下,从嵌入的符号表中解析符号表并初始化内核符号表。
  • lookup_kallsyms(addr: usize) -> Option<(String, usize)> :根据地址addr查找符号表,返回符号名称和符号地址的元组。如果未找到符号,则返回None。注意,该符号可能是与传入地址不完全匹配的最近符号。
  • addr_from_symbol(symbol: &str) -> Option<usize>:根据符号名称查找符号表,返回符号地址。如果未找到符号,则返回None