我有一个 Gentoo 安装。为了编译内核,我使用了 Ubuntu 14.04 内核的配置。
我发现很难理解为什么模块库的大小如此不同:
在Ubuntu中
oz123@ubuntu $ du -sh /lib/modules/4.2.0-36-generic/
202M /lib/modules/4.2.0-36-generic/
在 Gentoo 中
oz123@gentoo ~ # du -sh /lib/modules/4.2.8-gentoo-1/
1.8G /lib/modules/4.2.8-gentoo-1/
这是因为某些编译时选项吗?我在这里错过了什么吗?
更新
我做到了
DIR1=/lib/modules/4.2.0-36-generic/
DIR2=/mnt/gentoo/lib/modules/4.2.8-gentoo-1/
diff -r $DIR1 $DIR2 | grep $DIR2
这表明两个库中的模块是二进制不同的,例如:
Binary files /lib/modules/4.2.0-36-generic/kernel/sound/pci/ac97/snd-ac97-codec.ko and /mnt/gentoo/lib/modules/4.2.8-gentoo-1/kernel/sound/pci/ac97/snd-ac97-codec.ko differ
谜团开始变得更加清晰:
$ du -sh /lib/modules/4.2.0-36-generic/kernel/sound/usb/misc/snd-ua101.ko
36K /lib/modules/4.2.0-36-generic/kernel/sound/usb/misc/snd-ua101.ko
$ du -sh /mnt/gentoo/lib/modules/4.2.8-gentoo-1/kernel/sound/usb/misc/snd-ua101.ko
368K /mnt/gentoo/lib/modules/4.2.8-gentoo-1/kernel/sound/usb/misc/snd-ua101.ko
这和我检查的几个模块是一致的。
那么在 Gentoo 中编译出来的模块差不多大了 10 倍,为什么???
啊……答案是脱衣……
laptop-oz ~ # du -sh /lib/modules/4.2.8-gentoo-1/kernel/sound/usb/snd-usbmidi-lib.ko
368K /lib/modules/4.2.8-gentoo-1/kernel/sound/usb/snd-usbmidi-lib.ko
laptop-oz ~ # strip --strip-unneeded /lib/modules/4.2.8-gentoo-1/kernel/sound/usb/snd-usbmidi-lib.ko
laptop-oz ~ # du -sh /lib/modules/4.2.8-gentoo-1/kernel/sound/usb/snd-usbmidi-lib.ko
44K /lib/modules/4.2.8-gentoo-1/kernel/sound/usb/snd-usbmidi-lib.ko
更新2
脱衣并不是唯一的事情。我怀疑也编译标志。为了检查这一点,我在 Ubuntu 上安装了Figlet(版本2.2.5),并在gentoo中使用emerge编译相同的版本:
在Ubuntu中:
$ ls -l /usr/bin/figlet-figlet
-rwxr-xr-x 1 root root 43504 Nov 26 2012 /usr/bin/figlet-figlet
在 Gentoo 中:
# ls -l /usr/bin/figlet
-rwxr-xr-x 1 root root 47384 Jun 8 16:40 /usr/bin/figlet
这是我在 Gentoo 中的编译标志:
-O2 -pipe -march=haswell
看起来,当我用它构建Figlet时,-O1
我得到了与Ubuntu更相似的结果:
# ls -l /usr/bin/figlet
-rwxr-xr-x 1 root root 43288 Jun 8 17:10 /usr/bin/figlet
微小的差异实际上可能是由于 gcc 版本所致(在 Ubuntu 4.8.4 中,在 Gentoo 4.9.3 中)。
答案1
由于您自己构建了 Gentoo 模块,因此您很可能忘记从中删除调试信息。尝试
strip --strip-unneeded snd-ua101.ko
看看是否有影响。
下次为系统重建模块时,使用以下命令剥离所有模块
make INSTALL_MOD_STRIP=1 modules_install