解决 CentOS 编译 rpm 升级包 vmlinux.id 错误

编译命令:

# 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



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章