Igor Gnatenko 082d5d
From 3edae790572203f07a28448fedfda82d0629f4fb Mon Sep 17 00:00:00 2001
Panu Matilainen 5b4d98
From: Mark Wielaard <mjw@redhat.com>
Panu Matilainen 5b4d98
Date: Tue, 14 Jun 2016 17:07:13 +0200
Igor Gnatenko 3992a6
Subject: [PATCH 05/54] Make it possible to have unique build-ids across build
Panu Matilainen 5b4d98
 versions/releases.
Panu Matilainen 5b4d98
Panu Matilainen 5b4d98
Introduce a new macro _unique_build_ids that when set will pass the
Panu Matilainen 5b4d98
version and release to find-debuginfo.sh and debugedit to recalculate
Panu Matilainen 5b4d98
the build-id of ELF files.
Panu Matilainen 5b4d98
Panu Matilainen 5b4d98
Includes two new testcases to make sure the new setting works as expected
Panu Matilainen 5b4d98
both when set and unset.
Panu Matilainen 5b4d98
Panu Matilainen 5b4d98
Signed-off-by: Mark Wielaard <mjw@redhat.com>
Igor Gnatenko 082d5d
(cherry picked from commit 5ef1166ad96e3545784fa5420a49e1b2cd481e8e)
Panu Matilainen 5b4d98
---
Panu Matilainen 5b4d98
 macros.in                      |  8 +++-
Panu Matilainen 5b4d98
 scripts/find-debuginfo.sh      | 20 ++++++++-
Panu Matilainen 5b4d98
 tests/data/SPECS/hello-r2.spec | 58 +++++++++++++++++++++++++
Panu Matilainen 5b4d98
 tests/rpmbuildid.at            | 96 +++++++++++++++++++++++++++++++++++++++++-
Panu Matilainen 5b4d98
 tools/debugedit.c              | 24 ++++++++++-
Panu Matilainen 5b4d98
 5 files changed, 201 insertions(+), 5 deletions(-)
Panu Matilainen 5b4d98
 create mode 100644 tests/data/SPECS/hello-r2.spec
Panu Matilainen 5b4d98
Panu Matilainen 5b4d98
diff --git a/macros.in b/macros.in
Igor Gnatenko 082d5d
index e43d62b0a..dcd09612c 100644
Panu Matilainen 5b4d98
--- a/macros.in
Panu Matilainen 5b4d98
+++ b/macros.in
Panu Matilainen 5b4d98
@@ -180,7 +180,7 @@
Panu Matilainen 5b4d98
 #	the script.  See the script for details.
Panu Matilainen 5b4d98
 #
Panu Matilainen 5b4d98
 %__debug_install_post   \
Panu Matilainen 5b4d98
-   %{_rpmconfigdir}/find-debuginfo.sh %{?_missing_build_ids_terminate_build:--strict-build-id} %{?_include_minidebuginfo:-m} %{?_find_debuginfo_dwz_opts} %{?_find_debuginfo_opts} "%{_builddir}/%{?buildsubdir}"\
Panu Matilainen 5b4d98
+   %{_rpmconfigdir}/find-debuginfo.sh %{?_missing_build_ids_terminate_build:--strict-build-id} %{?_include_minidebuginfo:-m} %{?_unique_build_ids:--ver-rel "%{version}-%{release}"} %{?_find_debuginfo_dwz_opts} %{?_find_debuginfo_opts} "%{_builddir}/%{?buildsubdir}"\
Panu Matilainen 5b4d98
 %{nil}
Panu Matilainen 5b4d98
 
Panu Matilainen 5b4d98
 #	Template for debug information sub-package.
Panu Matilainen 5b4d98
@@ -476,6 +476,12 @@ package or when debugging this package.\
Panu Matilainen 5b4d98
 #   ELF /usr/lib/debug/.build-id/xx/yyy -> /usr/lib/.build-id/xx/yyy
Panu Matilainen 5b4d98
 %_build_id_links compat
Panu Matilainen 5b4d98
 
Panu Matilainen 5b4d98
+# Whether build-ids should be made unique between package version/releases
Panu Matilainen 5b4d98
+# when generating debuginfo packages. If set to 1 this will pass
Panu Matilainen 5b4d98
+# --ver-rel "%{version}-%{release}" to find-debuginfo.sh which will pass it
Panu Matilainen 5b4d98
+# onto debugedit --build-id-seed to be used to prime the build-id note hash.
Panu Matilainen 5b4d98
+%_unique_build_ids	1
Panu Matilainen 5b4d98
+
Panu Matilainen 5b4d98
 #
Panu Matilainen 5b4d98
 # Use internal dependency generator rather than external helpers?
Panu Matilainen 5b4d98
 %_use_internal_dependency_generator	1
Panu Matilainen 5b4d98
diff --git a/scripts/find-debuginfo.sh b/scripts/find-debuginfo.sh
Igor Gnatenko 082d5d
index c9e2293de..2cb9570ba 100644
Panu Matilainen 5b4d98
--- a/scripts/find-debuginfo.sh
Panu Matilainen 5b4d98
+++ b/scripts/find-debuginfo.sh
Panu Matilainen 5b4d98
@@ -6,6 +6,7 @@
Panu Matilainen 5b4d98
 #	 		   [-o debugfiles.list]
Panu Matilainen 5b4d98
 #			   [--run-dwz] [--dwz-low-mem-die-limit N]
Panu Matilainen 5b4d98
 #			   [--dwz-max-die-limit N]
Panu Matilainen 5b4d98
+#			   [--ver-rel VERSION-RELEASE]
Panu Matilainen 5b4d98
 #			   [[-l filelist]... [-p 'pattern'] -o debuginfo.list]
Panu Matilainen 5b4d98
 #			   [builddir]
Panu Matilainen 5b4d98
 #
Panu Matilainen 5b4d98
@@ -26,6 +27,12 @@
Panu Matilainen 5b4d98
 # if available, and --dwz-low-mem-die-limit and --dwz-max-die-limit
Panu Matilainen 5b4d98
 # provide detailed limits.  See dwz(1) -l and -L option for details.
Panu Matilainen 5b4d98
 #
Panu Matilainen 5b4d98
+# If --ver-rel VERSION-RELEASE is given then debugedit is called to
Panu Matilainen 5b4d98
+# update the build-ids it finds adding the VERSION-RELEASE string as
Panu Matilainen 5b4d98
+# seed to recalculate the build-id hash.  This makes sure the
Panu Matilainen 5b4d98
+# build-ids in the ELF files are unique between versions and releases
Panu Matilainen 5b4d98
+# of the same package.
Panu Matilainen 5b4d98
+#
Panu Matilainen 5b4d98
 # All file names in switches are relative to builddir (. if not given).
Panu Matilainen 5b4d98
 #
Panu Matilainen 5b4d98
 
Panu Matilainen 5b4d98
@@ -49,6 +56,9 @@ run_dwz=false
Panu Matilainen 5b4d98
 dwz_low_mem_die_limit=
Panu Matilainen 5b4d98
 dwz_max_die_limit=
Panu Matilainen 5b4d98
 
Panu Matilainen 5b4d98
+# Version and release of the spec. Given by --ver-rel
Panu Matilainen 5b4d98
+ver_rel=
Panu Matilainen 5b4d98
+
Panu Matilainen 5b4d98
 BUILDDIR=.
Panu Matilainen 5b4d98
 out=debugfiles.list
Panu Matilainen 5b4d98
 nout=0
Panu Matilainen 5b4d98
@@ -68,6 +78,10 @@ while [ $# -gt 0 ]; do
Panu Matilainen 5b4d98
     dwz_max_die_limit=$2
Panu Matilainen 5b4d98
     shift
Panu Matilainen 5b4d98
     ;;
Panu Matilainen 5b4d98
+  --ver-rel)
Panu Matilainen 5b4d98
+    ver_rel=$2
Panu Matilainen 5b4d98
+    shift
Panu Matilainen 5b4d98
+    ;;
Panu Matilainen 5b4d98
   -g)
Panu Matilainen 5b4d98
     strip_g=true
Panu Matilainen 5b4d98
     ;;
Panu Matilainen 5b4d98
@@ -249,8 +263,12 @@ while read nlinks inum f; do
Panu Matilainen 5b4d98
   fi
Panu Matilainen 5b4d98
 
Panu Matilainen 5b4d98
   echo "extracting debug info from $f"
Panu Matilainen 5b4d98
+  build_id_seed=
Panu Matilainen 5b4d98
+  if [ ! -z "$ver_rel" ]; then
Panu Matilainen 5b4d98
+    build_id_seed="--build-id-seed=$ver_rel"
Panu Matilainen 5b4d98
+  fi
Panu Matilainen 5b4d98
   id=$(${lib_rpm_dir}/debugedit -b "$RPM_BUILD_DIR" -d /usr/src/debug \
Panu Matilainen 5b4d98
-			      -i -l "$SOURCEFILE" "$f") || exit
Panu Matilainen 5b4d98
+			      -i $build_id_seed -l "$SOURCEFILE" "$f") || exit
Panu Matilainen 5b4d98
   if [ $nlinks -gt 1 ]; then
Panu Matilainen 5b4d98
     eval linkedid_$inum=\$id
Panu Matilainen 5b4d98
   fi
Panu Matilainen 5b4d98
diff --git a/tests/data/SPECS/hello-r2.spec b/tests/data/SPECS/hello-r2.spec
Panu Matilainen 5b4d98
new file mode 100644
Igor Gnatenko 082d5d
index 000000000..ca5091d10
Panu Matilainen 5b4d98
--- /dev/null
Panu Matilainen 5b4d98
+++ b/tests/data/SPECS/hello-r2.spec
Panu Matilainen 5b4d98
@@ -0,0 +1,58 @@
Panu Matilainen 5b4d98
+Summary: hello -- hello, world rpm
Panu Matilainen 5b4d98
+Name: hello
Panu Matilainen 5b4d98
+Version: 1.0
Panu Matilainen 5b4d98
+Release: 2
Panu Matilainen 5b4d98
+Group: Utilities
Panu Matilainen 5b4d98
+License: GPL
Panu Matilainen 5b4d98
+Distribution: RPM test suite.
Panu Matilainen 5b4d98
+Vendor: Red Hat Software
Panu Matilainen 5b4d98
+Packager: Red Hat Software <bugs@redhat.com>
Panu Matilainen 5b4d98
+URL: http://www.redhat.com
Panu Matilainen 5b4d98
+Source0: hello-1.0.tar.gz
Panu Matilainen 5b4d98
+Patch0: hello-1.0-modernize.patch
Panu Matilainen 5b4d98
+Excludearch: lsi
Panu Matilainen 5b4d98
+Excludeos: cpm
Panu Matilainen 5b4d98
+Provides: hi
Panu Matilainen 5b4d98
+Conflicts: goodbye
Panu Matilainen 5b4d98
+Obsoletes: howdy
Panu Matilainen 5b4d98
+Prefix: /usr
Panu Matilainen 5b4d98
+
Panu Matilainen 5b4d98
+%description
Panu Matilainen 5b4d98
+Simple rpm demonstration.
Panu Matilainen 5b4d98
+
Panu Matilainen 5b4d98
+%prep
Panu Matilainen 5b4d98
+%setup -q
Panu Matilainen 5b4d98
+%patch0 -p1 -b .modernize
Panu Matilainen 5b4d98
+
Panu Matilainen 5b4d98
+%build
Panu Matilainen 5b4d98
+make
Panu Matilainen 5b4d98
+
Panu Matilainen 5b4d98
+%install
Panu Matilainen 5b4d98
+rm -rf $RPM_BUILD_ROOT
Panu Matilainen 5b4d98
+mkdir -p $RPM_BUILD_ROOT/usr/local/bin
Panu Matilainen 5b4d98
+make DESTDIR=$RPM_BUILD_ROOT install
Panu Matilainen 5b4d98
+
Panu Matilainen 5b4d98
+%clean
Panu Matilainen 5b4d98
+rm -rf $RPM_BUILD_ROOT
Panu Matilainen 5b4d98
+
Panu Matilainen 5b4d98
+%pre
Panu Matilainen 5b4d98
+
Panu Matilainen 5b4d98
+%post
Panu Matilainen 5b4d98
+
Panu Matilainen 5b4d98
+%preun
Panu Matilainen 5b4d98
+
Panu Matilainen 5b4d98
+%postun
Panu Matilainen 5b4d98
+
Panu Matilainen 5b4d98
+%files
Panu Matilainen 5b4d98
+%defattr(-,root,root)
Panu Matilainen 5b4d98
+%doc	FAQ
Panu Matilainen 5b4d98
+#%readme README
Panu Matilainen 5b4d98
+#%license COPYING
Panu Matilainen 5b4d98
+%attr(0751,root,root)	/usr/local/bin/hello
Panu Matilainen 5b4d98
+
Panu Matilainen 5b4d98
+%changelog
Panu Matilainen 5b4d98
+* Wed Jun  8 2016 Mark Wielaard <mjw@redhat.com>
Panu Matilainen 5b4d98
+- Update release for unique build-id generation tests.
Panu Matilainen 5b4d98
+
Panu Matilainen 5b4d98
+* Tue Oct 20 1998 Jeff Johnson <jbj@redhat.com>
Panu Matilainen 5b4d98
+- create.
Panu Matilainen 5b4d98
diff --git a/tests/rpmbuildid.at b/tests/rpmbuildid.at
Igor Gnatenko 082d5d
index eddca969b..1da63022d 100644
Panu Matilainen 5b4d98
--- a/tests/rpmbuildid.at
Panu Matilainen 5b4d98
+++ b/tests/rpmbuildid.at
Panu Matilainen 5b4d98
@@ -758,4 +758,98 @@ debug id in debug package
Panu Matilainen 5b4d98
 debug dup id in debug package
Panu Matilainen 5b4d98
 ],
Panu Matilainen 5b4d98
 [])
Panu Matilainen 5b4d98
-AT_CLEANUP
Panu Matilainen 5b4d98
\ No newline at end of file
Panu Matilainen 5b4d98
+AT_CLEANUP
Panu Matilainen 5b4d98
+
Panu Matilainen 5b4d98
+# ------------------------------
Panu Matilainen 5b4d98
+# Check build-ids are unique between versions/releases
Panu Matilainen 5b4d98
+# with _unique_build_ids defined.
Panu Matilainen 5b4d98
+AT_SETUP([rpmbuild buildid unique r1 r2])
Panu Matilainen 5b4d98
+AT_KEYWORDS([build] [debuginfo] [buildid])
Panu Matilainen 5b4d98
+AT_CHECK([
Panu Matilainen 5b4d98
+rm -rf ${TOPDIR}
Panu Matilainen 5b4d98
+AS_MKDIR_P(${TOPDIR}/SOURCES)
Panu Matilainen 5b4d98
+
Panu Matilainen 5b4d98
+cp "${abs_srcdir}"/data/SOURCES/hello-1.0.tar.gz "${abs_srcdir}"/data/SOURCES/hello-1.0-modernize.patch ${TOPDIR}/SOURCES
Panu Matilainen 5b4d98
+
Panu Matilainen 5b4d98
+# No warnings for hard links
Panu Matilainen 5b4d98
+run rpmbuild --quiet \
Panu Matilainen 5b4d98
+  --macros=${abs_top_builddir}/macros:${abs_top_builddir}/tests/testing/usr/local/lib/rpm/platform/%{_target_cpu}-%{_target_os}/macros:${top_srcdir}/macros.debug \
Panu Matilainen 5b4d98
+  --rcfile=${abs_top_builddir}/rpmrc \
Panu Matilainen 5b4d98
+  --define="_unique_build_ids 1" \
Panu Matilainen 5b4d98
+  -ba "${abs_srcdir}"/data/SPECS/hello.spec
Panu Matilainen 5b4d98
+
Panu Matilainen 5b4d98
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello-1.0-1.*.rpm \
Panu Matilainen 5b4d98
+  | cpio -diu --quiet
Panu Matilainen 5b4d98
+
Panu Matilainen 5b4d98
+hello_file=./usr/local/bin/hello
Panu Matilainen 5b4d98
+
Panu Matilainen 5b4d98
+# Extract the build-id from the main file
Panu Matilainen 5b4d98
+id1=$(file $hello_file | sed 's/.*, BuildID[.*]=\(.*\),.*/\1/')
Panu Matilainen 5b4d98
+
Panu Matilainen 5b4d98
+# Build the "next" release, which has no changes except for the release update.
Panu Matilainen 5b4d98
+run rpmbuild --quiet \
Panu Matilainen 5b4d98
+  --macros=${abs_top_builddir}/macros:${abs_top_builddir}/tests/testing/usr/local/lib/rpm/platform/%{_target_cpu}-%{_target_os}/macros:${top_srcdir}/macros.debug \
Panu Matilainen 5b4d98
+  --rcfile=${abs_top_builddir}/rpmrc \
Panu Matilainen 5b4d98
+  --define="_unique_build_ids 1" \
Panu Matilainen 5b4d98
+  -ba "${abs_srcdir}"/data/SPECS/hello-r2.spec
Panu Matilainen 5b4d98
+
Panu Matilainen 5b4d98
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello-1.0-2.*.rpm \
Panu Matilainen 5b4d98
+  | cpio -diu --quiet
Panu Matilainen 5b4d98
+
Panu Matilainen 5b4d98
+# Extract the build-id from the main file
Panu Matilainen 5b4d98
+id2=$(file $hello_file | sed 's/.*, BuildID[.*]=\(.*\),.*/\1/')
Panu Matilainen 5b4d98
+
Panu Matilainen 5b4d98
+if test "$id1" == "$id2"; then echo "equal $id1"; else echo "unequal"; fi
Panu Matilainen 5b4d98
+],
Panu Matilainen 5b4d98
+[0],
Panu Matilainen 5b4d98
+[unequal
Panu Matilainen 5b4d98
+],
Panu Matilainen 5b4d98
+[ignore])
Panu Matilainen 5b4d98
+AT_CLEANUP
Panu Matilainen 5b4d98
+
Panu Matilainen 5b4d98
+# ------------------------------
Panu Matilainen 5b4d98
+# Check build-ids are non-unique between versions/releases
Panu Matilainen 5b4d98
+# with _unique_build_ids undefined (and exact same sources).
Panu Matilainen 5b4d98
+AT_SETUP([rpmbuild buildid non-unique r1 r2])
Panu Matilainen 5b4d98
+AT_KEYWORDS([build] [debuginfo] [buildid])
Panu Matilainen 5b4d98
+AT_CHECK([
Panu Matilainen 5b4d98
+rm -rf ${TOPDIR}
Panu Matilainen 5b4d98
+AS_MKDIR_P(${TOPDIR}/SOURCES)
Panu Matilainen 5b4d98
+
Panu Matilainen 5b4d98
+cp "${abs_srcdir}"/data/SOURCES/hello-1.0.tar.gz "${abs_srcdir}"/data/SOURCES/hello-1.0-modernize.patch ${TOPDIR}/SOURCES
Panu Matilainen 5b4d98
+
Panu Matilainen 5b4d98
+# No warnings for hard links
Panu Matilainen 5b4d98
+run rpmbuild --quiet \
Panu Matilainen 5b4d98
+  --macros=${abs_top_builddir}/macros:${abs_top_builddir}/tests/testing/usr/local/lib/rpm/platform/%{_target_cpu}-%{_target_os}/macros:${top_srcdir}/macros.debug \
Panu Matilainen 5b4d98
+  --rcfile=${abs_top_builddir}/rpmrc \
Panu Matilainen 5b4d98
+  --undefine="_unique_build_ids" \
Panu Matilainen 5b4d98
+  -ba "${abs_srcdir}"/data/SPECS/hello.spec
Panu Matilainen 5b4d98
+
Panu Matilainen 5b4d98
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello-1.0-1.*.rpm \
Panu Matilainen 5b4d98
+  | cpio -diu --quiet
Panu Matilainen 5b4d98
+
Panu Matilainen 5b4d98
+hello_file=./usr/local/bin/hello
Panu Matilainen 5b4d98
+
Panu Matilainen 5b4d98
+# Extract the build-id from the main file
Panu Matilainen 5b4d98
+id1=$(file $hello_file | sed 's/.*, BuildID[.*]=\(.*\),.*/\1/')
Panu Matilainen 5b4d98
+
Panu Matilainen 5b4d98
+# Build the "next" release, which has no changes except for the release update.
Panu Matilainen 5b4d98
+run rpmbuild --quiet \
Panu Matilainen 5b4d98
+  --macros=${abs_top_builddir}/macros:${abs_top_builddir}/tests/testing/usr/local/lib/rpm/platform/%{_target_cpu}-%{_target_os}/macros:${top_srcdir}/macros.debug \
Panu Matilainen 5b4d98
+  --rcfile=${abs_top_builddir}/rpmrc \
Panu Matilainen 5b4d98
+  --undefine="_unique_build_ids" \
Panu Matilainen 5b4d98
+  -ba "${abs_srcdir}"/data/SPECS/hello-r2.spec
Panu Matilainen 5b4d98
+
Panu Matilainen 5b4d98
+rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello-1.0-2.*.rpm \
Panu Matilainen 5b4d98
+  | cpio -diu --quiet
Panu Matilainen 5b4d98
+
Panu Matilainen 5b4d98
+# Extract the build-id from the main file
Panu Matilainen 5b4d98
+id2=$(file $hello_file | sed 's/.*, BuildID[.*]=\(.*\),.*/\1/')
Panu Matilainen 5b4d98
+
Panu Matilainen 5b4d98
+if test "$id1" == "$id2"; then echo "equal"; else echo "unequal $id1 $id2"; fi
Panu Matilainen 5b4d98
+],
Panu Matilainen 5b4d98
+[0],
Panu Matilainen 5b4d98
+[equal
Panu Matilainen 5b4d98
+],
Panu Matilainen 5b4d98
+[ignore])
Panu Matilainen 5b4d98
+AT_CLEANUP
Panu Matilainen 5b4d98
diff --git a/tools/debugedit.c b/tools/debugedit.c
Igor Gnatenko 082d5d
index cf89312fa..c0147f086 100644
Panu Matilainen 5b4d98
--- a/tools/debugedit.c
Panu Matilainen 5b4d98
+++ b/tools/debugedit.c
Panu Matilainen 5b4d98
@@ -1,4 +1,4 @@
Panu Matilainen 5b4d98
-/* Copyright (C) 2001, 2002, 2003, 2005, 2007, 2009, 2010, 2011 Red Hat, Inc.
Panu Matilainen 5b4d98
+/* Copyright (C) 2001-2003, 2005, 2007, 2009-2011, 2016 Red Hat, Inc.
Panu Matilainen 5b4d98
    Written by Alexander Larsson <alexl@redhat.com>, 2002
Panu Matilainen 5b4d98
    Based on code by Jakub Jelinek <jakub@redhat.com>, 2001.
Panu Matilainen 5b4d98
 
Panu Matilainen 5b4d98
@@ -54,6 +54,7 @@ char *dest_dir = NULL;
Panu Matilainen 5b4d98
 char *list_file = NULL;
Panu Matilainen 5b4d98
 int list_file_fd = -1;
Panu Matilainen 5b4d98
 int do_build_id = 0;
Panu Matilainen 5b4d98
+char *build_id_seed = NULL;
Panu Matilainen 5b4d98
 
Panu Matilainen 5b4d98
 typedef struct
Panu Matilainen 5b4d98
 {
Panu Matilainen 5b4d98
@@ -1296,6 +1297,8 @@ static struct poptOption optionsTable[] = {
Panu Matilainen 5b4d98
       "file where to put list of source and header file names", NULL },
Panu Matilainen 5b4d98
     { "build-id",  'i', POPT_ARG_NONE, &do_build_id, 0,
Panu Matilainen 5b4d98
       "recompute build ID note and print ID on stdout", NULL },
Panu Matilainen 5b4d98
+    { "build-id-seed", 's', POPT_ARG_STRING, &build_id_seed, 0,
Panu Matilainen 5b4d98
+      "if recomputing the build ID note use this string as hash seed", NULL },
Panu Matilainen 5b4d98
       POPT_AUTOHELP
Panu Matilainen 5b4d98
     { NULL, 0, 0, NULL, 0, NULL, NULL }
Panu Matilainen 5b4d98
 };
Panu Matilainen 5b4d98
@@ -1400,7 +1403,7 @@ handle_build_id (DSO *dso, Elf_Data *build_id,
Panu Matilainen 5b4d98
       exit (1);
Panu Matilainen 5b4d98
     }
Panu Matilainen 5b4d98
 
Panu Matilainen 5b4d98
-  if (!dirty_elf)
Panu Matilainen 5b4d98
+  if (!dirty_elf && build_id_seed == NULL)
Panu Matilainen 5b4d98
     goto print;
Panu Matilainen 5b4d98
 
Panu Matilainen 5b4d98
   if (elf_update (dso->elf, ELF_C_NULL) < 0)
Panu Matilainen 5b4d98
@@ -1415,6 +1418,10 @@ handle_build_id (DSO *dso, Elf_Data *build_id,
Panu Matilainen 5b4d98
 
Panu Matilainen 5b4d98
   ctx = rpmDigestInit(algorithm, 0);
Panu Matilainen 5b4d98
 
Panu Matilainen 5b4d98
+  /* If a seed string was given use it to prime the hash.  */
Panu Matilainen 5b4d98
+  if (build_id_seed != NULL)
Panu Matilainen 5b4d98
+    rpmDigestUpdate(ctx, build_id_seed, strlen (build_id_seed));
Panu Matilainen 5b4d98
+
Panu Matilainen 5b4d98
   /* Slurp the relevant header bits and section contents and feed them
Panu Matilainen 5b4d98
      into the hash function.  The only bits we ignore are the offset
Panu Matilainen 5b4d98
      fields in ehdr and shdrs, since the semantically identical ELF file
Panu Matilainen 5b4d98
@@ -1541,6 +1548,19 @@ main (int argc, char *argv[])
Panu Matilainen 5b4d98
 	}
Panu Matilainen 5b4d98
     }
Panu Matilainen 5b4d98
 
Panu Matilainen 5b4d98
+  if (build_id_seed != NULL && do_build_id == 0)
Panu Matilainen 5b4d98
+    {
Panu Matilainen 5b4d98
+      fprintf (stderr, "--build-id-seed (-s) needs --build-id (-i)\n");
Panu Matilainen 5b4d98
+      exit (1);
Panu Matilainen 5b4d98
+    }
Panu Matilainen 5b4d98
+
Panu Matilainen 5b4d98
+  if (build_id_seed != NULL && strlen (build_id_seed) < 1)
Panu Matilainen 5b4d98
+    {
Panu Matilainen 5b4d98
+      fprintf (stderr,
Panu Matilainen 5b4d98
+	       "--build-id-seed (-s) string should be at least 1 char\n");
Panu Matilainen 5b4d98
+      exit (1);
Panu Matilainen 5b4d98
+    }
Panu Matilainen 5b4d98
+
Panu Matilainen 5b4d98
   /* Ensure clean paths, users can muck with these */
Panu Matilainen 5b4d98
   if (base_dir)
Panu Matilainen 5b4d98
     canonicalize_path(base_dir, base_dir);
Panu Matilainen 5b4d98
-- 
Igor Gnatenko 082d5d
2.13.2
Panu Matilainen 5b4d98