如何编译/link/构建一个小型的可加载内核模块(LKM)?

How to compile / link / build a small sized Loadable Kernel Module ( LKM )?

我用 gcc 成功构建了这个简单的 LKM,但生成的二进制文件大小为 70kB。

#include <linux/init.h>
#include <linux/module.h>

MODULE_LICENSE("GPL");

static int __init LinuxKernelModule_init(void)
{
    printk("LinuxKernelModule: Hello, world!\n");
    return 0;
}

static void __exit LinuxKernelModule_exit(void)
{
    printk("LinuxKernelModule: Goodbye, world!\n");
}

module_init(LinuxKernelModule_init);
module_exit(LinuxKernelModule_exit);

您建议使用哪些 CFLAGS 和 make 参数使其更小?

尝试只用以下内容制作 Makefile:

obj-m += test.o

并在同一目录中将您的模块重命名为 test.c。

然后制作模块:

 make -C /usr/src/linux M=`pwd`

并告诉我们您的输出 .ko 文件的大小。

也有可能是你的内核.config启用了调试符号,增加了模块的大小。

标准 Linux 内核已经以最佳方式编译,除非它是调试版本或打开了一些非常具体的选项。因此,最简单的外部内核模块 Makefile 不会在用于构建内核的那些之上添加任何链接器选项的编译器就足够了,并且应该会产生一个最佳的内核模块。

对于这个简单的 LKM(我们称它为 lkm.c),下面最简单的 Makefile 会在我的系统上生成一个大小为 3986 字节的内核模块。 gcc 版本是 7.4.0ldd 版本是 2.27,内核是 4.15.0-66-generic,发行版是 Ubuntu。

KERNEL = /lib/modules/$(shell uname -r)/build

obj-m += lkm.o

all:
        ${MAKE} -C ${KERNEL} M=$(PWD) modules

clean:
        ${MAKE} -C ${KERNEL} M=$(PWD) clean