如何从 *.ko 文件中获取默认内核模块名称?

How to get default kernel module name from *.ko files?

通常,内核模块的文件名与模块名相同。例如,在执行 insmod fuse.ko 之后,我可以看到 fuse 插入 /proc/modules

但是,重命名内核模块 (mv fuse.ko foo.ko) 不会影响插入的模块名称。执行 insmod foo.ko 仍然会在 /proc/modules.

中插入 fuse

是否有任何系统调用或glibc 函数可以从内核模块文件中提取模块名称?在前面的示例中,我想从 foo.ko.

中提取名称 fuse

模块名称包含在 THIS_MODULE 模块对象(struct module 类型)中。此对象作为 .gnu.linkonce.this_module.

部分存储在内核模块文件中

因此,您可以检查该部分的内容并在那里找到模块名称:

objdump -s -j .gnu.linkonce.this_module foo.ko

readelf -x .gnu.linkonce.this_module foo.ko

模块名称位于偏移量 12(在 32 位机器上)或偏移量 24(在 64 位机器上)。


modinfo 不打印模块的名称。可能是因为 struct module 结构中名称的偏移量未标准化。