如何在没有源代码的情况下构建debuginfo RPM?

时间:2015-01-16 19:04:26

标签: packages rpm debug-symbols rpmbuild

我正在使用专有代码库,其中所有者希望用户获得有用的堆栈跟踪但无法查看源代码。使用调试符号生成Debian dbg包但没有源代码是直截了当的,但Redhat debuginfo RPMs是使用源代码自动创建的。

有没有办法配置rpmbuild来构建没有源代码的debuginfo RPM?

如果没有,那么从debuginfo包中删除源代码的最佳方法是什么?有人有脚本吗?

3 个答案:

答案 0 :(得分:4)

-debuginfo包只是一个子包,可以在没有源代码的情况下手动创建。自动生成为spec文件添加了必要的语法,但您也可以手动执行此操作,在spec文件中添加调试信息包。

禁用* -debuginfo.rpm的自动生成,在find-debuginfo.sh末尾运行%install,然后删除源文件。

另一种(更简单/更清晰)删除源文件的方法会覆盖此宏

%__debug_install_post   \
   %{_rpmconfigdir}/find-debuginfo.sh %{?_missing_build_ids_terminate_build:--strict-build-id} %{?_find_debuginfo_opts} "%{_builddir}/%{?buildsubdir}"\
%{nil}

在规范文件中,将%{_rpmconfigdir}/find-debuginfo.sh替换为已修改/自定义的find-debuginfo.sh脚本。

将修改后的脚本包含在规范文件中,如

SourceN: my-find-debuginfo.sh

然后使用宏

%{SOURCEn}

(其中N == n,一些小的适当整数)而不是默认生成没有源代码的调试符号。

答案 1 :(得分:3)

刚刚完成了一轮测试,最后我们将以下内容插入到%description标记上方的.spec文件中:

# Override the macro that invokes find-debuginfo.sh to remove
# the source files before the debuginfo pkg is assembled.
# It would be nice to remove the entire /usr/src tree but
# rpmbuild is running a check-files utility that fails the
# build if /usr/src/debug/%{name} isn't there.  Tried to
# just delete the contents but it's tricky getting an
# asterisk to expand properly so we remove the entire
# directory and then restore an empty one.  Sigh!
%define __debug_install_post   \
   %{_rpmconfigdir}/find-debuginfo.sh %{?_missing_build_ids_terminate_build:--strict-build-id} %{?_find_debuginfo_opts} "%{_builddir}/%{?buildsubdir}";\
   rm -rf "${RPM_BUILD_ROOT}/usr/src/debug/%{name}"; \
   mkdir "${RPM_BUILD_ROOT}/usr/src/debug/%{name}"; \
%{nil}

这适用于RHEl 6和7,但在RHEl 5中导致bash错误,因此我们避免通过不安装redhat-rpm-config软件包为后者构建debuginfo包。

我们决定避免按照建议创建一个修改过的find-debuginfo.sh脚本,因为不同平台之间已经存在差异,我们更喜欢一个适用于所有目标的补丁,包括未来的新目标。这并不完美,但与我们提出的一样接近。

答案 2 :(得分:2)

CentOS 7需要稍微修改Guy的解决方案。以下是我成功使用的内容:

# Remove source code from debuginfo package.
%define __debug_install_post \
  %{_rpmconfigdir}/find-debuginfo.sh %{?_missing_build_ids_terminate_build:--strict-build-id} %{?_find_debuginfo_opts} "%{_builddir}/%{?buildsubdir}"; \
  rm -rf "${RPM_BUILD_ROOT}/usr/src/debug"; \
  mkdir -p "${RPM_BUILD_ROOT}/usr/src/debug/%{name}-%{version}"; \
%{nil}

以下内容可用于验证RPM中不再包含源代码:

rpm -qpl xxx-debuginfo-1.0.0-1.el7.x86_64.rpm