为啥编译内核时不能得到相同的符号?
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.symvers
和symvers-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内核的时候,我在.config文件中修改了配置选项,然后执行make,为啥它又给我改回去了?
为啥在编译 Linux 内核和 uBoot 时使用 arm-linux-gnueabi-gcc 而不是 arm-none-eabi-gcc?