linux -/proc/kallsyms 中标有 "T"的内核符号未导出

标签 linux module kernel export symbols

符号 machine_power_off/proc/kallsyms 中用“T”标记:

$ grep -w machine_power_off /proc/kallsyms 
ffffffff8102391b T machine_power_off

但它是not exported . kallsyms 中的“T”是否足以导出符号?导出是否足以在其他模块中使用?

我使用它的模块编译时出现警告:

WARNING: "machine_power_off" [/path/to/module.ko] undefined!

在主机 (3.2.0-4-amd64) 上我可以加载这个模块,但在 VirtualBox (3.16.0-4-amd64) 上它会产生以下消息:

insmod: ERROR: could not insert module module.ko: Unknown symbol in module

为什么这个模块加载到我的主机系统中,而不是在 VirtualBox 中?

最佳答案

/proc/kallsyms中标记“T”意味着该符号是全局可见的,并且可以在其他内核代码中使用(例如,通过驱动程序、编译的内置)。

但是为了在内核模块的代码中可用,需要使用EXPORT_SYMBOL 导出符号或类似的。导出符号列表与内核中所有符号列表分开维护。

导出的符号可以在文件 /lib/modules/<kernel-version>/build/Module.symvers 中找到.

(此文件应该存在,以便针对给定内核构建内核模块)。

关于linux -/proc/kallsyms 中标有 "T"的内核符号未导出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32965535/

相关文章:

java - 如何在 Ubuntu Linux 中安装 Amazon Corretto?

linux - 获取内核中套接字事件的通知

module - 如何在 Rust cargo 项目中使用另一个模块中的一个模块?

multithreading - 为什么 Windows NT 线程具有独立的用户模式/内核模式堆栈?

linux - 编译内核不使用 initrd

html - Linux 上的 Doxygen 配置在放到 Windows 上时忽略大小写敏感

linux - 用新的 UUID 字符串替换所有 UUID 字符串

linux - 致命 : Module kvm_intel is in use

module - 在 Racket 中找到模块的名称?

c - 获得内核模块的正常运行时间?