如何为特定内核版本魔法构建内核和内核模块?
How to build kernel and kernel modules for specific kernel version magic?
我需要构建内核才能拥有 vermagic
3.10.28-gbc1b510-33899-g9fa745e SMP preempt mod_unload modversions ARMv7
但在通过 modinfo 构建和验证某些模块后显示
3.10.28 preempt mod_unload modversions ARMv6
看来我无法加载模块,因为不同的 vermagic。如何为 vermagic 构建完全相同的内核和模块?我正在使用 buildroot。
我创建这个 shell 脚本是为了准备构建
#!/bin/sh
export PATH=$PATH:/buildroot-2018.02.3/output/host/arm-buildroot-linux-gnueabi/bin:/buildroot-2018.02.3/output/host/bin:/buildroot-2018.02.3/output/host/sbin:/buildroot-2018.02.3/output/host/bin
export LD_LIBRARY_PATH=/buildroot-2018.02.3/output/host/lib
export LIBRARY_PATH=/buildroot-2018.02.3/output/host/lib
export PKG_CONFIG_PATH=/buildroot-2018.02.3/output/host/arm-buildroot-linux-gnueabi/sysroot/usr/lib/pkgconfig
exec /bin/bash
然后我进入文件夹
/buildroot-2018.02.3/output/build/linux-3.10.28/
和
make distclean
make clean
然后复制 .config 和
make ARCH=arm menuconfig
和
make -j9 ARCH=arm
我使用的是原始内核 konfig,另外选择了几个选项构建为模块,无需修改任何其他选项。
有 linux-3.10.28/arch/arm/Makefile 文件。在这个文件中有那些定义
arch-$(CONFIG_CPU_32v7) :=-D__LINUX_ARM_ARCH__=7 $(call cc-option,-march=armv7-a,-march=armv5t -Wa$(comma)-march=armv7-a)
arch-$(CONFIG_CPU_32v6) :=-D__LINUX_ARM_ARCH__=6 $(call cc-option,-march=armv6,-march=armv5t -Wa$(comma)-march=armv6)
我在某处找到了导致我更换的建议
arch-$(CONFIG_CPU_32v6) :=-D__LINUX_ARM_ARCH__=6 $(call cc-option,-march=armv6,-march=armv5t -Wa$(comma)-march=armv6)
和
arch-$(CONFIG_CPU_32v6) :=-D__LINUX_ARM_ARCH__=7 $(call cc-option,-march=armv7-a,-march=armv5t -Wa$(comma)-march=armv7-a)
我也取消了这两个的注释:
tune-$(CONFIG_CPU_V6) :=$(call cc-option,-mtune=arm1136j-s,-mtune=strongarm)
tune-$(CONFIG_CPU_V6K) :=$(call cc-option,-mtune=arm1136j-s,-mtune=strongarm)
我加了
-gbc1b510-33899-g9fa745e SMP
内核.config
中的local_version
现在 modinfo 打印的版本字符串是一样的。
我需要构建内核才能拥有 vermagic
3.10.28-gbc1b510-33899-g9fa745e SMP preempt mod_unload modversions ARMv7
但在通过 modinfo 构建和验证某些模块后显示
3.10.28 preempt mod_unload modversions ARMv6
看来我无法加载模块,因为不同的 vermagic。如何为 vermagic 构建完全相同的内核和模块?我正在使用 buildroot。
我创建这个 shell 脚本是为了准备构建
#!/bin/sh
export PATH=$PATH:/buildroot-2018.02.3/output/host/arm-buildroot-linux-gnueabi/bin:/buildroot-2018.02.3/output/host/bin:/buildroot-2018.02.3/output/host/sbin:/buildroot-2018.02.3/output/host/bin
export LD_LIBRARY_PATH=/buildroot-2018.02.3/output/host/lib
export LIBRARY_PATH=/buildroot-2018.02.3/output/host/lib
export PKG_CONFIG_PATH=/buildroot-2018.02.3/output/host/arm-buildroot-linux-gnueabi/sysroot/usr/lib/pkgconfig
exec /bin/bash
然后我进入文件夹
/buildroot-2018.02.3/output/build/linux-3.10.28/
和
make distclean
make clean
然后复制 .config 和
make ARCH=arm menuconfig
和
make -j9 ARCH=arm
我使用的是原始内核 konfig,另外选择了几个选项构建为模块,无需修改任何其他选项。
有 linux-3.10.28/arch/arm/Makefile 文件。在这个文件中有那些定义
arch-$(CONFIG_CPU_32v7) :=-D__LINUX_ARM_ARCH__=7 $(call cc-option,-march=armv7-a,-march=armv5t -Wa$(comma)-march=armv7-a)
arch-$(CONFIG_CPU_32v6) :=-D__LINUX_ARM_ARCH__=6 $(call cc-option,-march=armv6,-march=armv5t -Wa$(comma)-march=armv6)
我在某处找到了导致我更换的建议
arch-$(CONFIG_CPU_32v6) :=-D__LINUX_ARM_ARCH__=6 $(call cc-option,-march=armv6,-march=armv5t -Wa$(comma)-march=armv6)
和
arch-$(CONFIG_CPU_32v6) :=-D__LINUX_ARM_ARCH__=7 $(call cc-option,-march=armv7-a,-march=armv5t -Wa$(comma)-march=armv7-a)
我也取消了这两个的注释:
tune-$(CONFIG_CPU_V6) :=$(call cc-option,-mtune=arm1136j-s,-mtune=strongarm)
tune-$(CONFIG_CPU_V6K) :=$(call cc-option,-mtune=arm1136j-s,-mtune=strongarm)
我加了
-gbc1b510-33899-g9fa745e SMP
内核.config
中的local_version现在 modinfo 打印的版本字符串是一样的。