编译命令:
# rpmbuild -bb kernel-4.9-patch.spec
编译报错打印:
……
+ test -s vmlinux.id
+ echo '*** ERROR *** no vmlinux build ID! ***'
*** ERROR *** no vmlinux build ID! ***
+ exit 1
错误:/var/tmp/rpm-tmp.yMVeIn (%build) 退出状态不好
RPM 构建错误:
/var/tmp/rpm-tmp.yMVeIn (%build) 退出状态不好
解决:1. 在 $ RPM_BUILD_DIR 中出现 vmlinux 文件后,进入 $ RPM_BUILD_DIR 目录手动执行命令生成 vmlinux.id 文件[不推荐]
进入到 ...\rpmbuild\BUILD\kernel-4.9.94-debug\linux-4.9.94-debug.x86_64 目录中,手动执行命令生成 vmlinux.id 文件
# sh -xc "/usr/lib/rpm/debugedit -b /home/....../rpmbuild/BUILD/kernel-4.9.94-debug/linux-4.9.94-debug.tiandy.x86_64 -d /usr/src/debug -i vmlinux > vmlinux.id"
# cat vmlinux.id
7fad32dece5b0399af477a9f5bda251934057b0a
注:此命令从编译rpm包的 SPEC 文件中获取。
2. 查看 spec 文件,找到生成 vmlinux.id 的代码位置,可以看到生成 vmlinux.id 的命令被赋予 AFTER_LINK 变量。
%if %{with_debuginfo}
# …… #
export AFTER_LINK='sh -xc "/usr/lib/rpm/debugedit -b $$RPM_BUILD_DIR -d /usr/src/debug -i $@ > [email protected]"'
%endif
在 kernel 4.9.94 源码顶层 Makefile 末尾添加命令,实现在编译 kernel 时执行 spec 文件中定义的 AFTER_LINK 命令:
ifdef AFTER_LINK
cmd_link-vmlinux += ; $(AFTER_LINK)
endif
重新打包成 linux-4.9.tar.xz 源码包,再次编译即可.3. [推荐方法]参考 Fedora 中生成 vmlinux.id 的实现:
%if %{with_debuginfo}
eu-readelf -n vmlinux | grep "Build ID" | awk '{print $NF}' > vmlinux.id
cp vmlinux.id $RPM_BUILD_ROOT/lib/modules/$KernelVer/build/vmlinux.id
#
# save the vmlinux file for kernel debugging into the kernel-debuginfo rpm
#
mkdir -p $RPM_BUILD_ROOT%{debuginfodir}/lib/modules/$KernelVer
cp vmlinux $RPM_BUILD_ROOT%{debuginfodir}/lib/modules/$KernelVer
%endif
使用 eu-readelf 命令从 elf 格式 vmlinux 内核镜像中提取出 "Build ID" 信息,写入 vmlinux.id 文件
具体修改:在 ../SPECS/kernel-4.9-patch.spec 文件 BuildKernel() 函数中,检测 vmlinux.id 是否存在的代码段中(此时BuildKernel() 函数已经编译过内核,$RPM_BUILD_DIR 下已有 vmlinux 文件)加入上面命令:
%if %{with_debuginfo}
# xxx add in 2018/05/02 #
eu-readelf -n vmlinux | grep "Build ID" | awk '{print $NF}' > vmlinux.id
if test -s vmlinux.id; then
cp vmlinux.id $RPM_BUILD_ROOT/lib/modules/$KernelVer/build/vmlinux.id
else
echo >&2 "*** ERROR *** no vmlinux build ID! ***"
exit 1
fi
#
# save the vmlinux file for kernel debugging into the kernel-debuginfo rpm
#
mkdir -p $RPM_BUILD_ROOT%{debuginfodir}/lib/modules/$KernelVer
cp vmlinux $RPM_BUILD_ROOT%{debuginfodir}/lib/modules/$KernelVer
%endif
重新编译可以到 $RPM_BUILD_DIR 下查看 vmlinux.id: $ cat vmlinux.id
058f5bdabfb969540ac5842ba5517c0c40dcad4f