Linux 内核手动构建:生成的二进制文件比预编译的二进制文件大 10 倍

Linux 内核手动构建:生成的二进制文件比预编译的二进制文件大 10 倍

我正在使用 Linux Mint 13 MATE 32 位,我正在尝试构建内核(主要是为了体验和乐趣)。

目前,我喜欢使用与预编译内核相同的配置来构建它,因此首先我安装了预编译内核 3.16.0-031600rc6kernel.ubuntu.com,成功启动。

然后我从下载了 3.16.rc6 内核内核.org,解压它,将其配置为使用现有预编译内核中的配置:

$ make oldconfig

它没有问我任何事情,因此,预编译的内核包含所有必要的信息。然后我构建了它(大约花了 6 个小时):

$ make

然后安装:

$ sudo make modules_install install

然后我启动了手动编译的内核,它可以工作,但启动过程有点慢。但后来我发现所有的二进制文件(/boot/initrd.img-3.16.0-rc6以及其中的所有*.ko模块/lib/modules/3.16.0-rc6/kernel都比预编译版本大10倍左右!比如说,initrd.img-3.16.0-rc6160 658 665字节,但预编译的initrd.img-3.16.0-031600rc6-generic16 819 611字节。每个*.ko模块都类似地更大。

为什么是这样?我没有为构建指定任何特殊选项(我输入了与上面提到的完全相同的命令)。如何“正确”地构建它?

答案1

不管怎么说file,它毕竟是在调试符号。 LKML 上有一个关于此问题的帖子引导我尝试:

make INSTALL_MOD_STRIP=1 modules_install

瞧,/lib/modules/x.x.x目录内的比较;前:

> ls -hs kernel/crypto/anubis.ko 
112K kernel/crypto/anubis.ko

之后:

> ls -hs kernel/crypto/anubis.ko 
16K kernel/crypto/anubis.ko

.config此外,所报告的目录总大小(使用相同的)du -h从 185 MB 增加到 13 MB。

请记住,除了使用磁盘空间之外,这并不像看起来那么重要。正常运行时不会加载调试符号,因此无论文件大小如何,内存中每个模块的实际大小可能都是相同的.ko。我认为唯一显着的区别是它的大小initramfs,唯一的区别是解压缩文件系统所需的时间。即,如果您使用未压缩的initramfs,没关系。

strip --strip-all也有效,并file以任何一种方式正确报告它们stripped。为什么它说not stripped适用于发行版仍然是个谜。

答案2

在你之后make oldconfig,做一个make vmlinuz.我想你会发现预编译的内核是一个“可执行的bzImage”,这意味着它被压缩在磁盘上。如果您仔细观察启动消息,您会发现它在此过程的早期就解压缩了内核。

相关内容