为啥编译内核时不能得到相同的符号?

Posted

技术标签:

【中文标题】为啥编译内核时不能得到相同的符号?【英文标题】:Why can't I get the same symbols when compiling kernel?为什么编译内核时不能得到相同的符号? 【发布时间】:2021-10-15 10:47:50 【问题描述】:

我正在编译 Centos 7.6.1810 的内核 (4.14.0-115.el7a.0.1.aarch64)。 源文件是来自 centos repo 的kernel-alt-4.14.0-115.el7a.0.1.src.rpm。 我做了什么:

mkdir /root/kernel
cd /root/kernel
wget http://vault.centos.org/centos/7.6.1810/os/Source/SPackages/kernel-alt-4.14.0-115.el7a.0.1.src.rpm 
rpm2cpio ./kernel-alt-4.14.0-115.el7a.0.1.src.rpm | cpio -div
tar -vxf linux-4.14.0-115.el7a.tar.xz
cd linux-4.14.0-115.el7a/
cp /boot/config-4.14.0-115.el7a.0.1.aarch64  ./.config
# comment CONFIG_MODULE_SIG_KEY and CONFIG_SYSTEM_TRUSTED_KEYS

make -j

我比较了/boot/中生成的文件Module.symverssymvers-4.14.0-115.el7a.0.1.aarch64.gz。我发现有一些不同。

原始 symvers 中有 13408 个符号,重新编译的 symvers 中有 13430 个符号。 在重新编译的 symvers 中,缺少符号 acpi_device_get_match_data fwnode_get_mac_address fwnode_get_next_available_child_node fwnode_get_phy_mode fwnode_irq_get queued_spin_lock_slowpath

为什么? 如何使用完全相同的符号编译内核?

【问题讨论】:

源、配置和应用的补丁都需要匹配才能获得相同的编号。时间戳仍然会有不同的值。 I Need the Kernel Source 的说明有效吗? 【参考方案1】:

可能是从 tar 中选择的源没有启用所有配置选项。所以在编译内核之前,我建议使用规范文件来获取完整的源代码

    下载 kernel-alt-4.14.0-115.el7a.0.1.src.rpm rpm -ivh kernel-alt-4.14.0-115.el7a.0.1.src.rpm rpmbuild -bp /root/rpmbuild/SPECS/kernel.spec cd /root/rpmbuild/BUILD

编译代码并检查 symver

【讨论】:

编译可以使用rpmbuild -bc ...来完成。

以上是关于为啥编译内核时不能得到相同的符号?的主要内容,如果未能解决你的问题,请参考以下文章

linux为啥要编译内核

编译linux内核的时候,我在.config文件中修改了配置选项,然后执行make,为啥它又给我改回去了?

为啥在编译 Linux 内核和 uBoot 时使用 arm-linux-gnueabi-gcc 而不是 arm-none-eabi-gcc?

不能在 Cuda 内核中使用 __m128i

为啥linux编译内核模块时报错,说找不到/sys/types.h,/sys/socket.h/等头文件???

Linux入门之CentOS7内核编译三部曲