解决 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 $@ > $@.id"'

   %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



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值