編譯命令:
# 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