解決 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



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