更新

更新

我有一个 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

相关内容