From 5b29c09c31982a712844cb2bbcd0bfff09c457d1 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Thu, 16 Jun 2016 14:24:22 +0200 Subject: [PATCH] Add option to have unique debug file names across version/release/arch. Introduce a new macro _unique_debug_names that when set will pass --unique-debug-arch "%{_arch}" to find-debuginfo.sh to create debuginfo files which end in "--..debug" instead of simply ".debug". Adds testcases for dwz and buildid with and without unique debug file names. Signed-off-by: Mark Wielaard (cherry picked from commit 45bfecbf7dd4249abc197a5fc908e4efcc3108ad) --- build/files.c | 19 ++- macros.debug | 3 + macros.in | 9 +- scripts/find-debuginfo.sh | 18 ++- tests/rpmbuild.at | 168 +++++++++++++++++++----- tests/rpmbuildid.at | 316 +++++++++++++++++++++++++++++++++++++++++++++- 6 files changed, 494 insertions(+), 39 deletions(-) diff --git a/build/files.c b/build/files.c index b010483e4..eb398562a 100644 --- a/build/files.c +++ b/build/files.c @@ -1790,6 +1790,16 @@ static int generateBuildIDs(FileList fl) } } + /* In case we need ALLDEBUG links we might need the vra as + tagged onto the .debug file name. */ + char *vra = NULL; + if (rc == 0 && needDbg && build_id_links == BUILD_IDS_ALLDEBUG) { + int unique_debug_names = + rpmExpandNumeric("%{?_unique_debug_names}"); + if (unique_debug_names == 1) + vra = rpmExpand("-%{version}-%{release}.%{_arch}", NULL); + } + /* Now add a subdir and symlink for each buildid found. */ for (i = 0; i < nr_ids; i++) { /* Don't add anything more when an error occured. But do @@ -1884,15 +1894,17 @@ static int generateBuildIDs(FileList fl) int pathlen = strlen(paths[i]); int debuglen = strlen(".debug"); int prefixlen = strlen("/usr/lib/debug"); - if (pathlen > prefixlen - && strcmp (paths[i] + pathlen - debuglen, + int vralen = vra == NULL ? 0 : strlen(vra); + if (pathlen > prefixlen + debuglen + vralen + && strcmp ((paths[i] + pathlen - debuglen), ".debug") == 0) { free(linkpath); free(targetpath); char *targetstr = xstrdup (paths[i] + prefixlen); int targetlen = pathlen - prefixlen; - targetstr[targetlen - debuglen] = '\0'; + int targetend = targetlen - debuglen - vralen; + targetstr[targetend] = '\0'; rasprintf(&linkpath, "%s/%s", buildidsubdir, &ids[i][2]); rasprintf(&targetpath, "../../../../..%s", @@ -1911,6 +1923,7 @@ static int generateBuildIDs(FileList fl) free(paths[i]); free(ids[i]); } + free(vra); free(paths); free(ids); } diff --git a/macros.debug b/macros.debug index d273c0876..ee0cc9ebe 100644 --- a/macros.debug +++ b/macros.debug @@ -1,4 +1,7 @@ # macros to include to generate debuginfo +# Note don't define/enable a feature here if it is already the default in +# macros.in. Otherwise it cannot simply be --undefined on the command line +# in the tests (it needs to be undefined multiple times then). %_enable_debug_packages 1 %_include_minidebuginfo 1 diff --git a/macros.in b/macros.in index c845f5841..68bf39194 100644 --- a/macros.in +++ b/macros.in @@ -180,7 +180,7 @@ # the script. See the script for details. # %__debug_install_post \ - %{_rpmconfigdir}/find-debuginfo.sh %{?_missing_build_ids_terminate_build:--strict-build-id} %{?_include_minidebuginfo:-m} %{?_include_gdb_index:-i} %{?_unique_build_ids:--ver-rel "%{version}-%{release}"} %{?_find_debuginfo_dwz_opts} %{?_find_debuginfo_opts} "%{_builddir}/%{?buildsubdir}"\ + %{_rpmconfigdir}/find-debuginfo.sh %{?_missing_build_ids_terminate_build:--strict-build-id} %{?_include_minidebuginfo:-m} %{?_include_gdb_index:-i} %{?_unique_build_ids:--ver-rel "%{version}-%{release}"} %{?_unique_debug_names:--unique-debug-arch "%{_arch}"} %{?_find_debuginfo_dwz_opts} %{?_find_debuginfo_opts} "%{_builddir}/%{?buildsubdir}"\ %{nil} # Template for debug information sub-package. @@ -488,6 +488,13 @@ package or when debugging this package.\ # onto debugedit --build-id-seed to be used to prime the build-id note hash. %_unique_build_ids 1 +# Whether .debug files should be made unique between package version, +# release and architecture. If set to 1 this will pass +# --unique-debug-arch "%{_arch}" to find-debuginfo.sh to create +# debuginfo files which end in --..debug +# Requires _unique_build_ids. +%_unique_debug_names 1 + # # Use internal dependency generator rather than external helpers? %_use_internal_dependency_generator 1 diff --git a/scripts/find-debuginfo.sh b/scripts/find-debuginfo.sh index 8e608134f..3653c4848 100644 --- a/scripts/find-debuginfo.sh +++ b/scripts/find-debuginfo.sh @@ -64,6 +64,9 @@ dwz_max_die_limit= # Version and release of the spec. Given by --ver-rel ver_rel= +# Arch given by --unique-debug-arch +unique_debug_arch= + BUILDDIR=. out=debugfiles.list nout=0 @@ -87,6 +90,10 @@ while [ $# -gt 0 ]; do ver_rel=$2 shift ;; + --unique-debug-arch) + unique_debug_arch=$2 + shift + ;; -g) strip_g=true ;; @@ -125,6 +132,11 @@ while [ $# -gt 0 ]; do shift done +if test -z "$ver_rel" -a -n "$unique_debug_arch"; then + echo >&2 "*** ERROR: --unique-debug-arch (${unique_debug_arch}) needs --ver-rel (${ver_rel})" + exit 2 +fi + i=0 while ((i < nout)); do outs[$i]="$BUILDDIR/${outs[$i]}" @@ -232,7 +244,11 @@ debug_link() get_debugfn() { dn=$(dirname "${1#$RPM_BUILD_ROOT}") - bn=$(basename "$1" .debug).debug + if test -n "${unique_debug_arch}"; then + bn=$(basename "$1" .debug)-${ver_rel}.${unique_debug_arch}.debug + else + bn=$(basename "$1" .debug).debug + fi debugdn=${debugdir}${dn} debugfn=${debugdn}/${bn} diff --git a/tests/rpmbuild.at b/tests/rpmbuild.at index a3123244c..0a2c01efe 100644 --- a/tests/rpmbuild.at +++ b/tests/rpmbuild.at @@ -386,8 +386,9 @@ AT_CLEANUP # Check if rpmbuild runs dwz and generates a multi file that with shared # debuginfo. This is simply the hello example with one binary build twice # so dwz has enough slightly similar debug data. +# Test the case without unique debug file names. AT_SETUP([rpmbuild debuginfo dwz]) -AT_KEYWORDS([build] [debuginfo]) +AT_KEYWORDS([build] [debuginfo] [dwz]) AT_CHECK([ rm -rf ${TOPDIR} AS_MKDIR_P(${TOPDIR}/SOURCES) @@ -397,63 +398,170 @@ cp "${abs_srcdir}"/data/SOURCES/hello-1.0.tar.gz "${abs_srcdir}"/data/SOURCES/he run rpmbuild --quiet \ --macros=${abs_top_builddir}/macros:${abs_top_builddir}/tests/testing/usr/local/lib/rpm/platform/%{_target_cpu}-%{_target_os}/macros:${top_srcdir}/macros.debug \ --rcfile=${abs_top_builddir}/rpmrc \ + --undefine "_unique_debug_names" \ -ba "${abs_srcdir}"/data/SPECS/hello2.spec # The debuginfo package should contain a .debug file for each binary # and a dwz multi file that contains the shared debuginfo between them. rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello2-debuginfo-1.0-1.*.rpm \ | cpio -diu -test -f ./usr/lib/debug/usr/local/bin/hello.debug || exit 1 -test -f ./usr/lib/debug/usr/local/bin/hello2.debug || exit 1 -test -f ./usr/lib/debug/.dwz/hello2-1.0-1.* || exit 1 + +hello_file_debug=./usr/lib/debug/usr/local/bin/hello.debug +hello2_file_debug=./usr/lib/debug/usr/local/bin/hello2.debug +hello_multi_file=./usr/lib/debug/.dwz/hello2-1.0-1.* +test -f $hello_file_debug || echo "no hello debug file: $hello_file_debug" +test -f $hello2_file_debug || echo "no hello2 debug file: $hello2_file_debug" +test -f $hello_multi_file || echo "no dwz multi file: $hello_multi_file" # Make sure the main package binaries contain the correct build-ids # linking them to the debug packages. rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello2-1.0-1.*.rpm \ | cpio -diu -id1=$(file ./usr/local/bin/hello | sed 's/.*, BuildID[.*]=\(.*\),.*/\1/') -id2=$(file ./usr/local/bin/hello2 | sed 's/.*, BuildID[.*]=\(.*\),.*/\1/') -id1debug=$(file ./usr/lib/debug/usr/local/bin/hello.debug \ - | sed 's/.*, BuildID[.*]=\(.*\),.*/\1/') -id2debug=$(file ./usr/lib/debug/usr/local/bin/hello2.debug \ - | sed 's/.*, BuildID[.*]=\(.*\),.*/\1/') -idmulti=$(file ./usr/lib/debug/.dwz/hello2-1.0-1.* \ - | sed 's/.*, BuildID[.*]=\(.*\),.*/\1/') - -test "$id1" = "$id1debug" || exit 1 -test "$id2" = "$id2debug" || exit 1 +hello_file=./usr/local/bin/hello +hello2_file=./usr/local/bin/hello2 +test -f $hello_file || echo "no hello file: $hello_file" +test -f $hello2_file || echo "no hello2 file: $hello2_file" + +id1=$(file $hello_file | sed 's/.*, BuildID[.*]=\(.*\),.*/\1/') +id2=$(file $hello2_file | sed 's/.*, BuildID[.*]=\(.*\),.*/\1/') +id1debug=$(file $hello_file_debug | sed 's/.*, BuildID[.*]=\(.*\),.*/\1/') +id2debug=$(file $hello2_file_debug | sed 's/.*, BuildID[.*]=\(.*\),.*/\1/') +idmulti=$(file $hello_multi_file | sed 's/.*, BuildID[.*]=\(.*\),.*/\1/') + +test "$id1" = "$id1debug" || echo "id1: $id1 != id1debug: $id1debug" +test "$id2" = "$id2debug" || echo "id2: $id2 != id2debug: $id2debug" + +# The build-id files should link to the .debug files. +id1file="./usr/lib/debug/.build-id/${id1:0:2}/${id1:2}" +canonid1file=$(readlink -f ${id1file}) +canonfile1=$(readlink -f $hello_file) +canonid1debug=$(readlink -f ${id1file}.debug) +canondebug1=$(readlink -f $hello_file_debug) + +test "$canonid1file" = "$canonfile1" \ + || echo "canonid1file: $canonid1file != $canonfile1" +test "$canonid1debug" = "$canondebug1" \ + || echo "canonid1debug: $canonid1debug != $canondebug1" + +id2file="./usr/lib/debug/.build-id/${id2:0:2}/${id2:2}" +canonid2file=$(readlink -f ${id2file}) +canonfile2=$(readlink -f $hello2_file) +canonid2debug=$(readlink -f ${id2file}.debug) +canondebug2=$(readlink -f $hello2_file_debug) + +test "$canonid2file" = "$canonfile2" \ + || echo "canonid2: $canonid2file != $canonfile2" +test "$canonid2debug" = "$canondebug2" \ + || echo "canonid2debug: $canonid2debug" != "$canondebug2" + +# Both .debug files should point to the dwz multi file. +# It would be nice to also test that they contain the correct dwz build-id +# but that is a bit hard to grep out of the section data. +multiref1=$(readelf --string-dump=.gnu_debugaltlink $hello_file_debug \ + | grep '[ 0]' | cut -c13-) +multiref2=$(readelf --string-dump=.gnu_debugaltlink $hello2_file_debug \ + | grep '[ 0]' | cut -c13-) + +test "$multiref1" = "$multiref2" || echo "multiref: $multiref1 != $multiref2" + +canonmultiref=$(readlink -f $(dirname $canondebug1)/$multiref1) +canonmultifile=$(readlink -f $hello_multi_file) + +test "$canonmultiref" = "$canonmultifile" \ + || echo "canonmultiref: $canonmultiref" != "$canonmultifile" +], +[0], +[], +[ignore]) +AT_CLEANUP + +# ------------------------------ +# Check if rpmbuild runs dwz and generates a multi file that with shared +# debuginfo. This is simply the hello example with one binary build twice +# so dwz has enough slightly similar debug data. +# Test with unique debug file names. +AT_SETUP([rpmbuild debuginfo dwz unique debug names]) +AT_KEYWORDS([build] [debuginfo] [dwz]) +AT_CHECK([ +rm -rf ${TOPDIR} +AS_MKDIR_P(${TOPDIR}/SOURCES) + +cp "${abs_srcdir}"/data/SOURCES/hello-1.0.tar.gz "${abs_srcdir}"/data/SOURCES/hello-1.0-modernize.patch ${TOPDIR}/SOURCES + +run rpmbuild --quiet \ + --macros=${abs_top_builddir}/macros:${abs_top_builddir}/tests/testing/usr/local/lib/rpm/platform/%{_target_cpu}-%{_target_os}/macros:${top_srcdir}/macros.debug \ + --rcfile=${abs_top_builddir}/rpmrc \ + --define "_unique_debug_names 1" \ + -ba "${abs_srcdir}"/data/SPECS/hello2.spec + +# The debuginfo package should contain a .debug file for each binary +# and a dwz multi file that contains the shared debuginfo between them. +rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello2-debuginfo-1.0-1.*.rpm \ + | cpio -diu + +hello_file_debug=./usr/lib/debug/usr/local/bin/hello-*.debug +hello2_file_debug=./usr/lib/debug/usr/local/bin/hello2-*.debug +hello_multi_file=./usr/lib/debug/.dwz/hello2-1.0-1.* +test -f $hello_file_debug || echo "no hello debug file: $hello_file_debug" +test -f $hello2_file_debug || echo "no hello2 debug file: $hello2_file_debug" +test -f $hello_multi_file || echo "no dwz multi file: $hello_multi_file" + +# Make sure the main package binaries contain the correct build-ids +# linking them to the debug packages. +rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello2-1.0-1.*.rpm \ + | cpio -diu +hello_file=./usr/local/bin/hello +hello2_file=./usr/local/bin/hello2 +test -f $hello_file || echo "no hello file: $hello_file" +test -f $hello2_file || echo "no hello2 file: $hello2_file" + +id1=$(file $hello_file | sed 's/.*, BuildID[.*]=\(.*\),.*/\1/') +id2=$(file $hello2_file | sed 's/.*, BuildID[.*]=\(.*\),.*/\1/') +id1debug=$(file $hello_file_debug | sed 's/.*, BuildID[.*]=\(.*\),.*/\1/') +id2debug=$(file $hello2_file_debug | sed 's/.*, BuildID[.*]=\(.*\),.*/\1/') +idmulti=$(file $hello_multi_file | sed 's/.*, BuildID[.*]=\(.*\),.*/\1/') + +test "$id1" = "$id1debug" || echo "id1: $id1 != id1debug: $id1debug" +test "$id2" = "$id2debug" || echo "id2: $id2 != id2debug: $id2debug" # The build-id files should link to the .debug files. id1file="./usr/lib/debug/.build-id/${id1:0:2}/${id1:2}" canonid1file=$(readlink -f ${id1file}) -canonfile1=$(readlink -f ./usr/local/bin/hello) +canonfile1=$(readlink -f $hello_file) canonid1debug=$(readlink -f ${id1file}.debug) -canondebug1=$(readlink -f ./usr/lib/debug/usr/local/bin/hello.debug) +canondebug1=$(readlink -f $hello_file_debug) -test "$canonid1file" = "$canonfile1" || exit 1 -test "$canonid1debug" = "$canondebug1" || exit 1 +test "$canonid1file" = "$canonfile1" \ + || echo "canonid1file: $canonid1file != $canonfile1" +test "$canonid1debug" = "$canondebug1" \ + || echo "canonid1debug: $canonid1debug != $canondebug1" id2file="./usr/lib/debug/.build-id/${id2:0:2}/${id2:2}" -canonid2file=$(readlink -f ${id1file}) -canonfile2=$(readlink -f ./usr/local/bin/hello) -canonid2debug=$(readlink -f ${id1file}.debug) -canondebug2=$(readlink -f ./usr/lib/debug/usr/local/bin/hello.debug) +canonid2file=$(readlink -f ${id2file}) +canonfile2=$(readlink -f $hello2_file) +canonid2debug=$(readlink -f ${id2file}.debug) +canondebug2=$(readlink -f $hello2_file_debug) -test "$canonid2file" = "$canonfile2" || exit 1 -test "$canonid2debug" = "$canondebug2" || exit 1 +test "$canonid2file" = "$canonfile2" \ + || echo "canonid2: $canonid2file != $canonfile2" +test "$canonid2debug" = "$canondebug2" \ + || echo "canonid2debug: $canonid2debug" != "$canondebug2" # Both .debug files should point to the dwz multi file. # It would be nice to also test that they contain the correct dwz build-id # but that is a bit hard to grep out of the section data. -multiref1=$(readelf --string-dump=.gnu_debugaltlink ./usr/lib/debug/usr/local/bin/hello.debug | grep '[ 0]' | cut -c13-) -multiref2=$(readelf --string-dump=.gnu_debugaltlink ./usr/lib/debug/usr/local/bin/hello2.debug | grep '[ 0]' | cut -c13-) +multiref1=$(readelf --string-dump=.gnu_debugaltlink $hello_file_debug \ + | grep '[ 0]' | cut -c13-) +multiref2=$(readelf --string-dump=.gnu_debugaltlink $hello2_file_debug \ + | grep '[ 0]' | cut -c13-) -test "$multiref1" = "$multiref2" || exit 1 +test "$multiref1" = "$multiref2" || echo "multiref: $multiref1 != $multiref2" canonmultiref=$(readlink -f $(dirname $canondebug1)/$multiref1) -canonmultifile=$(readlink -f ./usr/lib/debug/.dwz/hello2-1.0-1.*) +canonmultifile=$(readlink -f $hello_multi_file) -test "$canonmultiref" = "$canonmultifile" || exit 1 +test "$canonmultiref" = "$canonmultifile" \ + || echo "canonmultiref: $canonmultiref" != "$canonmultifile" ], [0], [], diff --git a/tests/rpmbuildid.at b/tests/rpmbuildid.at index 1da63022d..ede1181e1 100644 --- a/tests/rpmbuildid.at +++ b/tests/rpmbuildid.at @@ -54,7 +54,8 @@ hello debuginfo build-id files: 0 AT_CLEANUP # ------------------------------ -# Check if rpmbuild "alldebug" generates debuginfo buildid symlinks +# Check if rpmbuild "alldebug" generates debuginfo buildid symlinks. +# Without unique debug file names. AT_SETUP([rpmbuild buildid alldebug]) AT_KEYWORDS([build] [debuginfo] [buildid]) AT_CHECK([ @@ -69,6 +70,7 @@ run rpmbuild \ --macros=${abs_top_builddir}/macros:${abs_top_builddir}/tests/testing/usr/local/lib/rpm/platform/%{_target_cpu}-%{_target_os}/macros:${top_srcdir}/macros.debug \ --rcfile=${abs_top_builddir}/rpmrc \ --define="_build_id_links alldebug" \ + --undefine "_unique_debug_names" \ --quiet -ba "${abs_srcdir}"/data/SPECS/hello.spec # There should be zero build-id files in the main package @@ -114,7 +116,100 @@ test "$canon_main_file" = "$canon_main_id_file" \ # And check the same for the debug file. debug_file=./usr/lib/debug/usr/local/bin/hello.debug -test -f "${debug_file}" || echo "No debug file ${debug_file}" +test -f ${debug_file} || echo "No debug file ${debug_file}" + +# Extract the build-id from the .debug file +id_debug=$(file $debug_file | sed 's/.*, BuildID[.*]=\(.*\),.*/\1/') + +test ${id_main} = ${id_debug} || echo "unequal main and debug id" + +id_debug_file="./usr/lib/debug/.build-id/${id_debug:0:2}/${id_debug:2}.debug" +test -L "$id_debug_file" || echo "No build-id file $id_debug_file" + +canon_debug_file=$(readlink -f ${debug_file}) + +test -f "$canon_debug_file" \ + || echo "Cannot resolve debug file ${debug_file} -> ${canon_debug_file}" + +canon_debug_id_file=$(readlink -f ${id_debug_file}) + +test -f "$canon_debug_id_file" \ + || echo "Cannot resolve debug build-id file ${id_debug_file} -> ${canon_debug_id_file}" + +test "$canon_debug_file" = "$canon_debug_id_file" \ + || echo "debug and build-id not linked" +], +[0], +[hello build-id files: 0 +hello debuginfo build-id files: 3 +], +[ignore]) +AT_CLEANUP + +# ------------------------------ +# Check if rpmbuild "alldebug" generates debuginfo buildid symlinks. +# With unique debug file names. +AT_SETUP([rpmbuild buildid alldebug unique debug names]) +AT_KEYWORDS([build] [debuginfo] [buildid]) +AT_CHECK([ +rm -rf ${TOPDIR} +AS_MKDIR_P(${TOPDIR}/SOURCES) + +# Setup sources +cp "${abs_srcdir}"/data/SOURCES/hello-1.0.tar.gz "${abs_srcdir}"/data/SOURCES/hello-1.0-modernize.patch ${TOPDIR}/SOURCES + +# Build, contains one ELF which should have a buildid. +run rpmbuild \ + --macros=${abs_top_builddir}/macros:${abs_top_builddir}/tests/testing/usr/local/lib/rpm/platform/%{_target_cpu}-%{_target_os}/macros:${top_srcdir}/macros.debug \ + --rcfile=${abs_top_builddir}/rpmrc \ + --define="_build_id_links alldebug" \ + --define="_unique_debug_names 1" \ + --quiet -ba "${abs_srcdir}"/data/SPECS/hello.spec + +# There should be zero build-id files in the main package +# Main and debug should be in the debuginfo package, +# plus the .build-id/xx subdir, 3 in total. +echo -n "hello build-id files: " +run rpm -ql -p "${TOPDIR}"/RPMS/*/hello-1.0-1.*.rpm \ + | grep /.build-id/ | wc --lines + +echo -n "hello debuginfo build-id files: " +run rpm -ql -p "${TOPDIR}"/RPMS/*/hello-debuginfo-1.0-1.*.rpm \ + | grep /.build-id/ | wc --lines + +# Extract the both packages to check the build-id files link to the +# main and .debug files. +rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello-1.0-1.*.rpm \ + | cpio -diu +rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello-debuginfo-1.0-1.*.rpm \ + | cpio -diu + +# Check there is a build-id symlink for the main file. +main_file=./usr/local/bin/hello +test -f "${main_file}" || echo "No main file ${main_file}" + +# Extract the build-id from the main file +id_main=$(file $main_file | sed 's/.*, BuildID[.*]=\(.*\),.*/\1/') + +id_main_file="./usr/lib/debug/.build-id/${id_main:0:2}/${id_main:2}" +test -L "$id_main_file" || echo "No build-id file $id_main_file" + +canon_main_file=$(readlink -f ${main_file}) + +test -f "$canon_main_file" \ + || echo "Cannot resolve main file ${main_file} -> ${canon_main_file}" + +canon_main_id_file=$(readlink -f ${id_main_file}) + +test -f "$canon_main_id_file" \ + || echo "Cannot resolve main build-id file ${id_main_file} -> ${canon_main_id_file}" + +test "$canon_main_file" = "$canon_main_id_file" \ + || echo "main and build-id file not linked" + +# And check the same for the debug file. +debug_file=./usr/lib/debug/usr/local/bin/hello-*.debug +test -f ${debug_file} || echo "No debug file ${debug_file}" # Extract the build-id from the .debug file id_debug=$(file $debug_file | sed 's/.*, BuildID[.*]=\(.*\),.*/\1/') @@ -146,6 +241,7 @@ AT_CLEANUP # ------------------------------ # Check if rpmbuild "separate" generates main and debuginfo buildid symlinks +# Without unique debug file names AT_SETUP([rpmbuild buildid separate]) AT_KEYWORDS([build] [debuginfo] [buildid]) AT_CHECK([ @@ -160,6 +256,7 @@ run rpmbuild \ --macros=${abs_top_builddir}/macros:${abs_top_builddir}/tests/testing/usr/local/lib/rpm/platform/%{_target_cpu}-%{_target_os}/macros:${top_srcdir}/macros.debug \ --rcfile=${abs_top_builddir}/rpmrc \ --define="_build_id_links separate" \ + --undefine "_unique_debug_names" \ --quiet -ba "${abs_srcdir}"/data/SPECS/hello.spec # There should be one build-id files in the main and debuginfo package @@ -204,7 +301,99 @@ test "$canon_main_file" = "$canon_main_id_file" \ # And check the same for the debug file. debug_file=./usr/lib/debug/usr/local/bin/hello.debug -test -f "${debug_file}" || echo "No debug file ${debug_file}" +test -f ${debug_file} || echo "No debug file ${debug_file}" + +# Extract the build-id from the .debug file +id_debug=$(file $debug_file | sed 's/.*, BuildID[.*]=\(.*\),.*/\1/') + +test ${id_main} = ${id_debug} || echo "unequal main and debug id" + +id_debug_file="./usr/lib/debug/.build-id/${id_debug:0:2}/${id_debug:2}.debug" +test -L "$id_debug_file" || echo "No build-id file $id_debug_file" + +canon_debug_file=$(readlink -f ${debug_file}) + +test -f "$canon_debug_file" \ + || echo "Cannot resolve debug file ${debug_file} -> ${canon_debug_file}" + +canon_debug_id_file=$(readlink -f ${id_debug_file}) + +test -f "$canon_debug_id_file" \ + || echo "Cannot resolve debug build-id file ${id_debug_file} -> ${canon_debug_id_file}" + +test "$canon_debug_file" = "$canon_debug_id_file" \ + || echo "debug and build-id not linked" +], +[0], +[hello build-id files: 2 +hello debuginfo build-id files: 2 +], +[ignore]) +AT_CLEANUP + +# ------------------------------ +# Check if rpmbuild "separate" generates main and debuginfo buildid symlinks +# With unique debug file names +AT_SETUP([rpmbuild buildid separate unique debug names]) +AT_KEYWORDS([build] [debuginfo] [buildid]) +AT_CHECK([ +rm -rf ${TOPDIR} +AS_MKDIR_P(${TOPDIR}/SOURCES) + +# Setup sources +cp "${abs_srcdir}"/data/SOURCES/hello-1.0.tar.gz "${abs_srcdir}"/data/SOURCES/hello-1.0-modernize.patch ${TOPDIR}/SOURCES + +# Build, contains one ELF which should have a buildid. +run rpmbuild \ + --macros=${abs_top_builddir}/macros:${abs_top_builddir}/tests/testing/usr/local/lib/rpm/platform/%{_target_cpu}-%{_target_os}/macros:${top_srcdir}/macros.debug \ + --rcfile=${abs_top_builddir}/rpmrc \ + --define="_build_id_links separate" \ + --define="_unique_debug_names 1" \ + --quiet -ba "${abs_srcdir}"/data/SPECS/hello.spec + +# There should be one build-id files in the main and debuginfo package +# plus the .build-id/xx subdir, 2 in total. +echo -n "hello build-id files: " +run rpm -ql -p "${TOPDIR}"/RPMS/*/hello-1.0-1.*.rpm \ + | grep /.build-id/ | wc --lines + +echo -n "hello debuginfo build-id files: " +run rpm -ql -p "${TOPDIR}"/RPMS/*/hello-debuginfo-1.0-1.*.rpm \ + | grep /.build-id/ | wc --lines + +# Extract the both packages to check the build-id files link to the +# main and .debug files. +rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello-1.0-1.*.rpm \ + | cpio -diu +rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello-debuginfo-1.0-1.*.rpm \ + | cpio -diu + +# Check there is a build-id symlink for the main file. +main_file=./usr/local/bin/hello +test -f "${main_file}" || echo "No main file ${main_file}" + +# Extract the build-id from the main file +id_main=$(file $main_file | sed 's/.*, BuildID[.*]=\(.*\),.*/\1/') + +id_main_file="./usr/lib/.build-id/${id_main:0:2}/${id_main:2}" +test -L "$id_main_file" || echo "No build-id file $id_main_file" + +canon_main_file=$(readlink -f ${main_file}) + +test -f "$canon_main_file" \ + || echo "Cannot resolve main file ${main_file} -> ${canon_main_file}" + +canon_main_id_file=$(readlink -f ${id_main_file}) + +test -f "$canon_main_id_file" \ + || echo "Cannot resolve main build-id file ${id_main_file} -> ${canon_main_id_file}" + +test "$canon_main_file" = "$canon_main_id_file" \ + || echo "main and build-id file not linked" + +# And check the same for the debug file. +debug_file=./usr/lib/debug/usr/local/bin/hello-*.debug +test -f ${debug_file} || echo "No debug file ${debug_file}" # Extract the build-id from the .debug file id_debug=$(file $debug_file | sed 's/.*, BuildID[.*]=\(.*\),.*/\1/') @@ -236,6 +425,7 @@ AT_CLEANUP # ------------------------------ # Check if rpmbuild "compat" generates main and debuginfo buildid symlinks +# Without unique debug file names AT_SETUP([rpmbuild buildid compat]) AT_KEYWORDS([build] [debuginfo] [buildid]) AT_CHECK([ @@ -250,6 +440,7 @@ run rpmbuild \ --macros=${abs_top_builddir}/macros:${abs_top_builddir}/tests/testing/usr/local/lib/rpm/platform/%{_target_cpu}-%{_target_os}/macros:${top_srcdir}/macros.debug \ --rcfile=${abs_top_builddir}/rpmrc \ --define="_build_id_links compat" \ + --undefine "_unique_debug_names" \ --quiet -ba "${abs_srcdir}"/data/SPECS/hello.spec # There should be one build-id files in the main and debuginfo package. @@ -295,7 +486,112 @@ test "$canon_main_file" = "$canon_main_id_file" \ # And check the same for the debug file. debug_file=./usr/lib/debug/usr/local/bin/hello.debug -test -f "${debug_file}" || echo "No debug file ${debug_file}" +test -f ${debug_file} || echo "No debug file ${debug_file}" + +# Extract the build-id from the .debug file +id_debug=$(file $debug_file | sed 's/.*, BuildID[.*]=\(.*\),.*/\1/') + +test ${id_main} = ${id_debug} || echo "unequal main and debug id" + +id_debug_file="./usr/lib/debug/.build-id/${id_debug:0:2}/${id_debug:2}.debug" +test -L "$id_debug_file" || echo "No build-id file $id_debug_file" + +canon_debug_file=$(readlink -f ${debug_file}) + +test -f "$canon_debug_file" \ + || echo "Cannot resolve debug file ${debug_file} -> ${canon_debug_file}" + +canon_debug_id_file=$(readlink -f ${id_debug_file}) + +test -f "$canon_debug_id_file" \ + || echo "Cannot resolve debug build-id file ${id_debug_file} -> ${canon_debug_id_file}" + +test "$canon_debug_file" = "$canon_debug_id_file" \ + || echo "debug and build-id not linked" + +# The compat link should also point to the same (indirectly). +id_compat_file="./usr/lib/debug/.build-id/${id_main:0:2}/${id_main:2}" +test -L "$id_compat_file" || echo "No build-id compat file $id_compat_file" + +canon_compat_file=$(readlink -f ${id_compat_file}) + +test -f "$canon_compat_file" \ + || echo "Cannot resolve compat file ${id_compat_file} -> ${canon_compat_file}" + +test "$canon_compat_file" = "$canon_main_file" \ + || echo "compat and build-id not linked" +], +[0], +[hello build-id files: 2 +hello debuginfo build-id files: 3 +], +[ignore]) +AT_CLEANUP + +# ------------------------------ +# Check if rpmbuild "compat" generates main and debuginfo buildid symlinks +# With unique debug file names +AT_SETUP([rpmbuild buildid compat unique debug names]) +AT_KEYWORDS([build] [debuginfo] [buildid]) +AT_CHECK([ +rm -rf ${TOPDIR} +AS_MKDIR_P(${TOPDIR}/SOURCES) + +# Setup sources +cp "${abs_srcdir}"/data/SOURCES/hello-1.0.tar.gz "${abs_srcdir}"/data/SOURCES/hello-1.0-modernize.patch ${TOPDIR}/SOURCES + +# Build, contains one ELF which should have a buildid. +run rpmbuild \ + --macros=${abs_top_builddir}/macros:${abs_top_builddir}/tests/testing/usr/local/lib/rpm/platform/%{_target_cpu}-%{_target_os}/macros:${top_srcdir}/macros.debug \ + --rcfile=${abs_top_builddir}/rpmrc \ + --define="_build_id_links compat" \ + --define="_unique_debug_names 1" \ + --quiet -ba "${abs_srcdir}"/data/SPECS/hello.spec + +# There should be one build-id files in the main and debuginfo package. +# the debuginfo package has one extra main build-id compat symlink +# plus the .build-id/xx subdir, 2 in total in main, 3 in total in debug +echo -n "hello build-id files: " +run rpm -ql -p "${TOPDIR}"/RPMS/*/hello-1.0-1.*.rpm \ + | grep /.build-id/ | wc --lines + +echo -n "hello debuginfo build-id files: " +run rpm -ql -p "${TOPDIR}"/RPMS/*/hello-debuginfo-1.0-1.*.rpm \ + | grep /.build-id/ | wc --lines + +# Extract the both packages to check the build-id files link to the +# main and .debug files. +rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello-1.0-1.*.rpm \ + | cpio -diu +rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello-debuginfo-1.0-1.*.rpm \ + | cpio -diu + +# Check there is a build-id symlink for the main file. +main_file=./usr/local/bin/hello +test -f "${main_file}" || echo "No main file ${main_file}" + +# Extract the build-id from the main file +id_main=$(file $main_file | sed 's/.*, BuildID[.*]=\(.*\),.*/\1/') + +id_main_file="./usr/lib/.build-id/${id_main:0:2}/${id_main:2}" +test -L "$id_main_file" || echo "No build-id file $id_main_file" + +canon_main_file=$(readlink -f ${main_file}) + +test -f "$canon_main_file" \ + || echo "Cannot resolve main file ${main_file} -> ${canon_main_file}" + +canon_main_id_file=$(readlink -f ${id_main_file}) + +test -f "$canon_main_id_file" \ + || echo "Cannot resolve main build-id file ${id_main_file} -> ${canon_main_id_file}" + +test "$canon_main_file" = "$canon_main_id_file" \ + || echo "main and build-id file not linked" + +# And check the same for the debug file. +debug_file=./usr/lib/debug/usr/local/bin/hello-*debug +test -f ${debug_file} || echo "No debug file ${debug_file}" # Extract the build-id from the .debug file id_debug=$(file $debug_file | sed 's/.*, BuildID[.*]=\(.*\),.*/\1/') @@ -784,8 +1080,12 @@ rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello-1.0-1.*.rpm \ hello_file=./usr/local/bin/hello # Extract the build-id from the main file +test -f $hello_file || echo "No $hello_file" id1=$(file $hello_file | sed 's/.*, BuildID[.*]=\(.*\),.*/\1/') +# Make sure we generate a new one +rm $hello_file + # Build the "next" release, which has no changes except for the release update. run rpmbuild --quiet \ --macros=${abs_top_builddir}/macros:${abs_top_builddir}/tests/testing/usr/local/lib/rpm/platform/%{_target_cpu}-%{_target_os}/macros:${top_srcdir}/macros.debug \ @@ -797,6 +1097,7 @@ rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello-1.0-2.*.rpm \ | cpio -diu --quiet # Extract the build-id from the main file +test -f $hello_file || echo "No $hello_file" id2=$(file $hello_file | sed 's/.*, BuildID[.*]=\(.*\),.*/\1/') if test "$id1" == "$id2"; then echo "equal $id1"; else echo "unequal"; fi @@ -823,6 +1124,7 @@ run rpmbuild --quiet \ --macros=${abs_top_builddir}/macros:${abs_top_builddir}/tests/testing/usr/local/lib/rpm/platform/%{_target_cpu}-%{_target_os}/macros:${top_srcdir}/macros.debug \ --rcfile=${abs_top_builddir}/rpmrc \ --undefine="_unique_build_ids" \ + --undefine="_unique_debug_names" \ -ba "${abs_srcdir}"/data/SPECS/hello.spec rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello-1.0-1.*.rpm \ @@ -831,19 +1133,25 @@ rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello-1.0-1.*.rpm \ hello_file=./usr/local/bin/hello # Extract the build-id from the main file +test -f $hello_file || echo "No $hello_file" id1=$(file $hello_file | sed 's/.*, BuildID[.*]=\(.*\),.*/\1/') +# Make sure we generate a new one +rm $hello_file + # Build the "next" release, which has no changes except for the release update. run rpmbuild --quiet \ --macros=${abs_top_builddir}/macros:${abs_top_builddir}/tests/testing/usr/local/lib/rpm/platform/%{_target_cpu}-%{_target_os}/macros:${top_srcdir}/macros.debug \ --rcfile=${abs_top_builddir}/rpmrc \ --undefine="_unique_build_ids" \ + --undefine="_unique_debug_names" \ -ba "${abs_srcdir}"/data/SPECS/hello-r2.spec rpm2cpio ${abs_builddir}/testing/build/RPMS/*/hello-1.0-2.*.rpm \ | cpio -diu --quiet # Extract the build-id from the main file +test -f $hello_file || echo "No $hello_file" id2=$(file $hello_file | sed 's/.*, BuildID[.*]=\(.*\),.*/\1/') if test "$id1" == "$id2"; then echo "equal"; else echo "unequal $id1 $id2"; fi