如何解释和消除编译模块大小差异

如何解释和消除编译模块大小差异

我购买了一个嵌入式(基于 ARM 的)Linux SBC,制造商提供了一张预先构建了 Ubuntu 的 SD 卡。

我正在尝试重新编译内核和模块以重现制造商提供的内容。我在用着他们的内核源代码以及我在 /boot 上找到的配置,但是他们的模块和我的模块之间存在巨大的尺寸差异。我的模块文件夹编译后为 147MB,而他们的为 8.9MB。

我想也许我以某种方式编译了额外的模块,但是我单独比较了 .ko 文件,我的文件始终要大得多。

我认为可以通过 CONFIG_MODULE_COMPRESS_* 压缩模块,但这是什么在 /boot 内的配置中:

CONFIG_MODULE_COMPRESS_NONE=y
# CONFIG_MODULE_COMPRESS_GZIP is not set
# CONFIG_MODULE_COMPRESS_XZ is not set
# CONFIG_MODULE_COMPRESS_ZSTD is not set

make modules制造商是否可以在运行时覆盖压缩设置?还能如何解释尺寸差异呢?

FWIW 我使用以下命令从 x86 Ubuntu 桌面交叉编译到 ARM:

make -j4 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- LOCALVERSION=-kstr-sama5d27 zImage
make modules -j4 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- LOCALVERSION=-kstr-sama5d27
make modules_install INSTALL_MOD_PATH=./modules ARCH=arm LOCALVERSION=-kstr-sama5d27

我看到一些指南建议添加INSTALL_MOD_STRIP=1到 install_modules 命令以减少模块大小,但这会导致错误:

strip:无法识别输入文件的格式

编辑:我尝试使用以下命令手动删除其中一个 .ko 文件:

arm-linux-gnueabihf-objcopy -g aes-arm-bs.ko aes-arm-bs-stripped.ko

特别是这个文件现在更接近原始文件。 18376 字节与最初的 19104 字节相比。

我还使用比较了我编译的模块和提供的模块size,得到以下结果:

  • 提供
$ size aes-arm-bs.ko
   text    data     bss     dec     hex filename
   9047    2755      20   11822    2e2e aes-arm-bs.ko
  • 我编译的
$ size aes-arm-bs.ko
   text    data     bss     dec     hex filename
   8893    2755      20   11668    2d94 aes-arm-bs.ko

相关内容