[packages/gdb] up to 15.2
atler
atler at pld-linux.org
Mon Oct 7 14:18:53 CEST 2024
commit 4528ecde4121e96e86f0a532c3a6b9b341162e18
Author: Jan Palus <atler at pld-linux.org>
Date: Mon Oct 7 13:29:32 2024 +0200
up to 15.2
buildid-locate-rpm-pld.patch | 20 +-
gdb-6.3-gstack-20050411.patch | 24 +-
gdb-6.6-buildid-locate-rpm.patch | 1084 ------------------------
gdb-6.6-buildid-locate-solib-missing-ids.patch | 130 +--
gdb-6.6-buildid-locate.patch | 925 +++-----------------
gdb.spec | 29 +-
6 files changed, 215 insertions(+), 1997 deletions(-)
---
diff --git a/gdb.spec b/gdb.spec
index 1d4b3d5..65d0775 100644
--- a/gdb.spec
+++ b/gdb.spec
@@ -21,18 +21,17 @@ Summary(uk.UTF-8): Символьний відладчик для С та інш
Summary(zh_CN.UTF-8): [开发]C和其他语言的调试器
Summary(zh_TW.UTF-8): [.-A開發]C和.$)B其.-A他語.$)B言的調試器
Name: gdb
-Version: 14.2
+Version: 15.2
Release: 1
License: GPL v3+
Group: Development/Debuggers
Source0: https://ftp.gnu.org/gnu/gdb/%{name}-%{version}.tar.xz
-# Source0-md5: 4452f575d09f94276cb0a1e95ecff856
+# Source0-md5: 85c722e2f2baea2b7820a6a7eaea2ce8
Source1: http://www.mif.pg.gda.pl/homepages/ankry/man-PLD/%{name}-non-english-man-pages.tar.bz2
# Source1-md5: 2e8a48939ae282c12bbacdd54e398247
Source3: %{name}-gstack.man
Patch100: gdb-6.6-buildid-locate.patch
Patch101: gdb-6.6-buildid-locate-solib-missing-ids.patch
-Patch102: gdb-6.6-buildid-locate-rpm.patch
Patch104: gdb-6.6-buildid-locate-rpm-librpm-workaround.patch
Patch105: gdb-6.6-buildid-locate-misleading-warning-missing-debuginfo-rhbz981154.patch
Patch110: gdb-6.3-gstack-20050411.patch
@@ -59,14 +58,13 @@ BuildRequires: libipt-devel
%endif
BuildRequires: libmpc-devel >= 0.8.1
BuildRequires: libselinux-devel
-BuildRequires: libstdc++-devel >= 6:4.8
+BuildRequires: libstdc++-devel >= 6:8
BuildRequires: libtool >= 2:2
-BuildRequires: make >= 3.81
+BuildRequires: make >= 1:3.81
BuildRequires: mpfr-devel >= 3.1.6
BuildRequires: ncurses-devel >= 5.2
BuildRequires: pkgconfig
BuildRequires: readline-devel
-BuildRequires: rpm-devel >= 1:4.6
BuildRequires: rpmbuild(macros) >= 1.219
BuildRequires: source-highlight-devel >= 3.0
BuildRequires: tar >= 1:1.22
@@ -75,8 +73,10 @@ BuildRequires: xxHash-devel
BuildRequires: xz
BuildRequires: xz-devel
BuildRequires: zlib-devel
+BuildRequires: zstd-devel
%if %{with python}
BuildRequires: python3-devel >= 1:3.2
+BuildRequires: python3-modules >= 1:3.2
BuildRequires: rpm-pythonprov
Obsoletes: python-gdb < 7.3
# for traceback module
@@ -193,7 +193,6 @@ GDB w postaci biblioteki statycznej.
%patch100 -p1
%patch101 -p1
-%patch102 -p1
%patch104 -p1
%patch105 -p1
%patch110 -p1
@@ -210,20 +209,20 @@ cat > gdb/version.in << EOF
EOF
%{__sed} -i -e '1s,/usr/bin/python$,%{__python},' \
- contrib/dg-extract-results.py \
+ contrib/dg-extract-results.py \
%{__sed} -i -e '1s,/usr/bin/env python$,%{__python},' \
- gdb/contrib/test_pubnames_and_indexes.py \
- gdb/testsuite/print-ts.py
+ gdb/contrib/test_pubnames_and_indexes.py \
+ gdb/testsuite/print-ts.py
%{__sed} -i -e '1s,/usr/bin/env python3,%{__python3},' \
- gdb/testsuite/analyze-racy-logs.py \
- gdb/copyright.py
+ gdb/testsuite/analyze-racy-logs.py \
+ gdb/copyright.py
%{__sed} -i -e '1s,/usr/bin/env bash,/bin/bash,' \
- gdb/contrib/cc-with-tweaks.sh \
- gdb/gcore.in \
- src-release.sh
+ gdb/contrib/cc-with-tweaks.sh \
+ gdb/gcore.in \
+ src-release.sh
sed -i -e 's/\[2\.69\]/[%{autoconf_ver}]/' config/override.m4
diff --git a/buildid-locate-rpm-pld.patch b/buildid-locate-rpm-pld.patch
index d5e0914..a4fd3fb 100644
--- a/buildid-locate-rpm-pld.patch
+++ b/buildid-locate-rpm-pld.patch
@@ -1,18 +1,18 @@
--- gdb-14.1/gdb/build-id.c.old 2014-06-05 14:31:11.000000000 +0200
+++ gdb-14.1/gdb/build-id.c 2014-06-05 14:33:12.248235380 +0200
@@ -1306,13 +1306,8 @@ debug_print_missing (const char *binary,
- if (debug != NULL)
- {
- if (access (debug, F_OK) == 0) {
-- gdb_printf (gdb_stdlog, _("Try: %s %s\n"),
+ _("Missing separate debuginfo for %s.\n"), binary);
+ if (debug != NULL)
+ {
+- gdb_printf (gdb_stdlog, _("Try: %s %s\n"),
-#ifdef DNF_DEBUGINFO_INSTALL
-- "dnf"
+- "dnf"
-#else
-- "yum"
+- "yum"
-#endif
-- " --enablerepo='*debug*' install", debug);
+- " --enablerepo='*debug*' install", debug);
+ gdb_printf (gdb_stdlog, _("Try to install package that provides `%s' file\n"),
+ debug);
- } else
- gdb_printf (gdb_stdlog, _("The debuginfo package for this file is probably broken.\n"));
- }
+ }
+ }
+
diff --git a/gdb-6.3-gstack-20050411.patch b/gdb-6.3-gstack-20050411.patch
index 01e8ffa..90fbfa1 100644
--- a/gdb-6.3-gstack-20050411.patch
+++ b/gdb-6.3-gstack-20050411.patch
@@ -16,7 +16,7 @@ Subject: gdb-6.3-gstack-20050411.patch
diff --git a/gdb/Makefile.in b/gdb/Makefile.in
--- a/gdb/Makefile.in
+++ b/gdb/Makefile.in
-@@ -2035,7 +2035,7 @@ info install-info clean-info dvi pdf install-pdf html install-html: force
+@@ -2071,7 +2071,7 @@ info install-info clean-info dvi install-dvi pdf install-pdf html install-html:
install: all
@$(MAKE) $(FLAGS_TO_PASS) install-only
@@ -25,7 +25,7 @@ diff --git a/gdb/Makefile.in b/gdb/Makefile.in
transformed_name=`t='$(program_transform_name)'; \
echo gdb | sed -e "$$t"` ; \
if test "x$$transformed_name" = x; then \
-@@ -2085,7 +2085,25 @@ install-guile:
+@@ -2121,7 +2121,25 @@ install-guile:
install-python:
$(SHELL) $(srcdir)/../mkinstalldirs $(DESTDIR)$(GDB_DATADIR)/python/gdb
@@ -52,7 +52,7 @@ diff --git a/gdb/Makefile.in b/gdb/Makefile.in
transformed_name=`t='$(program_transform_name)'; \
echo gdb | sed -e $$t` ; \
if test "x$$transformed_name" = x; then \
-@@ -2116,6 +2134,18 @@ uninstall: force $(CONFIG_UNINSTALL)
+@@ -2152,6 +2170,28 @@ uninstall: force $(CONFIG_UNINSTALL)
rm -f $(DESTDIR)$(bindir)/$$transformed_name
@$(MAKE) DO=uninstall "DODIRS=$(SUBDIRS)" $(FLAGS_TO_PASS) subdir_do
@@ -68,9 +68,19 @@ diff --git a/gdb/Makefile.in b/gdb/Makefile.in
+ rm -f $(DESTDIR)$(bindir)/$$transformed_name$(EXEEXT) \
+ $(DESTDIR)$(man1dir)/$$transformed_name.1
+
- # The C++ name parser can be built standalone for testing.
- test-cp-name-parser.o: cp-name-parser.c
- $(COMPILE) -DTEST_CPNAMES cp-name-parser.c
++# The C++ name parser can be built standalone for testing.
++test-cp-name-parser.o: cp-name-parser.c
++ $(COMPILE) -DTEST_CPNAMES cp-name-parser.c
++ $(POSTCOMPILE)
++
++test-cp-name-parser$(EXEEXT): test-cp-name-parser.o $(LIBIBERTY)
++ $(ECHO_CXXLD) $(CC_LD) $(INTERNAL_LDFLAGS) \
++ -o test-cp-name-parser$(EXEEXT) test-cp-name-parser.o \
++ $(LIBIBERTY)
++
+ # We do this by grepping through sources. If that turns out to be too slow,
+ # maybe we could just require every .o file to have an initialization routine
+ # of a given name (top.o -> _initialize_top, etc.).
diff --git a/gdb/gstack.sh b/gdb/gstack.sh
new file mode 100644
--- /dev/null
@@ -226,7 +236,7 @@ new file mode 100644
+# exiting the function. Still we could retry the gstack command if we fail.
+
+set test "spawn gstack"
-+set command "sh -c GDB=$GDB\\ GDBARGS=-data-directory\\\\\\ $BUILD_DATA_DIRECTORY\\ sh\\ ${srcdir}/../gstack.sh\\ $pid\\;echo\\ GSTACK-END"
++set command "sh -c GDB=$GDB\\ GDBARGS=-data-directory\\\\\\ $GDB_DATA_DIRECTORY\\ sh\\ ${srcdir}/../gstack.sh\\ $pid\\;echo\\ GSTACK-END"
+set res [remote_spawn host $command];
+if { $res < 0 || $res == "" } {
+ perror "Spawning $command failed."
diff --git a/gdb-6.6-buildid-locate-rpm.patch b/gdb-6.6-buildid-locate-rpm.patch
deleted file mode 100644
index f38fdd5..0000000
--- a/gdb-6.6-buildid-locate-rpm.patch
+++ /dev/null
@@ -1,1084 +0,0 @@
-From FEDORA_PATCHES Mon Sep 17 00:00:00 2001
-From: Kevin Buettner <kevinb at redhat.com>
-Date: Wed, 22 Feb 2023 22:30:40 -0700
-Subject: gdb-6.6-buildid-locate-rpm.patch
-
-;;=push+jan
-
-diff --git a/gdb/aclocal.m4 b/gdb/aclocal.m4
---- a/gdb/aclocal.m4
-+++ b/gdb/aclocal.m4
-@@ -11,7 +11,223 @@
- # even the implied warranty of MERCHANTABILITY or FITNESS FOR A
- # PARTICULAR PURPOSE.
-
-+# pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*-
-+# serial 1 (pkg-config-0.24)
-+#
-+# Copyright © 2004 Scott James Remnant <scott at netsplit.com>.
-+#
-+# This program is free software; you can redistribute it and/or modify
-+# it under the terms of the GNU General Public License as published by
-+# the Free Software Foundation; either version 2 of the License, or
-+# (at your option) any later version.
-+#
-+# This program is distributed in the hope that it will be useful, but
-+# WITHOUT ANY WARRANTY; without even the implied warranty of
-+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-+# General Public License for more details.
-+#
-+# You should have received a copy of the GNU General Public License
-+# along with this program; if not, write to the Free Software
-+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-+#
-+# As a special exception to the GNU General Public License, if you
-+# distribute this file as part of a program that contains a
-+# configuration script generated by Autoconf, you may include it under
-+# the same distribution terms that you use for the rest of that program.
-+
-+# PKG_PROG_PKG_CONFIG([MIN-VERSION])
-+# ----------------------------------
-+AC_DEFUN([PKG_PROG_PKG_CONFIG],
-+[m4_pattern_forbid([^_?PKG_[A-Z_]+$])
-+m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$])
-+m4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$])
-+AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility])
-+AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path])
-+AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path])
-+
-+if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
-+ AC_PATH_TOOL([PKG_CONFIG], [pkg-config])
-+fi
-+if test -n "$PKG_CONFIG"; then
-+ _pkg_min_version=m4_default([$1], [0.9.0])
-+ AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version])
-+ if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then
-+ AC_MSG_RESULT([yes])
-+ else
-+ AC_MSG_RESULT([no])
-+ PKG_CONFIG=""
-+ fi
-+fi[]dnl
-+])# PKG_PROG_PKG_CONFIG
-+
-+# PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
-+#
-+# Check to see whether a particular set of modules exists. Similar
-+# to PKG_CHECK_MODULES(), but does not set variables or print errors.
-+#
-+# Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG])
-+# only at the first occurence in configure.ac, so if the first place
-+# it's called might be skipped (such as if it is within an "if", you
-+# have to call PKG_CHECK_EXISTS manually
-+# --------------------------------------------------------------
-+AC_DEFUN([PKG_CHECK_EXISTS],
-+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
-+if test -n "$PKG_CONFIG" && \
-+ AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then
-+ m4_default([$2], [:])
-+m4_ifvaln([$3], [else
-+ $3])dnl
-+fi])
-+
-+# _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES])
-+# ---------------------------------------------
-+m4_define([_PKG_CONFIG],
-+[if test -n "$$1"; then
-+ pkg_cv_[]$1="$$1"
-+ elif test -n "$PKG_CONFIG"; then
-+ PKG_CHECK_EXISTS([$3],
-+ [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null`
-+ test "x$?" != "x0" && pkg_failed=yes ],
-+ [pkg_failed=yes])
-+ else
-+ pkg_failed=untried
-+fi[]dnl
-+])# _PKG_CONFIG
-+
-+# _PKG_SHORT_ERRORS_SUPPORTED
-+# -----------------------------
-+AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED],
-+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])
-+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
-+ _pkg_short_errors_supported=yes
-+else
-+ _pkg_short_errors_supported=no
-+fi[]dnl
-+])# _PKG_SHORT_ERRORS_SUPPORTED
-+
-+
-+# PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND],
-+# [ACTION-IF-NOT-FOUND])
-+#
-+#
-+# Note that if there is a possibility the first call to
-+# PKG_CHECK_MODULES might not happen, you should be sure to include an
-+# explicit call to PKG_PROG_PKG_CONFIG in your configure.ac
-+#
-+#
-+# --------------------------------------------------------------
-+AC_DEFUN([PKG_CHECK_MODULES],
-+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
-+AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl
-+AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl
-+
-+pkg_failed=no
-+AC_MSG_CHECKING([for $1])
-+
-+_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2])
-+_PKG_CONFIG([$1][_LIBS], [libs], [$2])
-+
-+m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS
-+and $1[]_LIBS to avoid the need to call pkg-config.
-+See the pkg-config man page for more details.])
-+
-+if test $pkg_failed = yes; then
-+ AC_MSG_RESULT([no])
-+ _PKG_SHORT_ERRORS_SUPPORTED
-+ if test $_pkg_short_errors_supported = yes; then
-+ $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1`
-+ else
-+ $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1`
-+ fi
-+ # Put the nasty error message in config.log where it belongs
-+ echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD
-+
-+ m4_default([$4], [AC_MSG_ERROR(
-+[Package requirements ($2) were not met:
-+
-+$$1_PKG_ERRORS
-+
-+Consider adjusting the PKG_CONFIG_PATH environment variable if you
-+installed software in a non-standard prefix.
-+
-+_PKG_TEXT])[]dnl
-+ ])
-+elif test $pkg_failed = untried; then
-+ AC_MSG_RESULT([no])
-+ m4_default([$4], [AC_MSG_FAILURE(
-+[The pkg-config script could not be found or is too old. Make sure it
-+is in your PATH or set the PKG_CONFIG environment variable to the full
-+path to pkg-config.
-+
-+_PKG_TEXT
-+
-+To get pkg-config, see <http://pkg-config.freedesktop.org/>.])[]dnl
-+ ])
-+else
-+ $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS
-+ $1[]_LIBS=$pkg_cv_[]$1[]_LIBS
-+ AC_MSG_RESULT([yes])
-+ $3
-+fi[]dnl
-+])# PKG_CHECK_MODULES
-+
-+
-+# PKG_INSTALLDIR(DIRECTORY)
-+# -------------------------
-+# Substitutes the variable pkgconfigdir as the location where a module
-+# should install pkg-config .pc files. By default the directory is
-+# $libdir/pkgconfig, but the default can be changed by passing
-+# DIRECTORY. The user can override through the --with-pkgconfigdir
-+# parameter.
-+AC_DEFUN([PKG_INSTALLDIR],
-+[m4_pushdef([pkg_default], [m4_default([$1], ['${libdir}/pkgconfig'])])
-+m4_pushdef([pkg_description],
-+ [pkg-config installation directory @<:@]pkg_default[@:>@])
-+AC_ARG_WITH([pkgconfigdir],
-+ [AS_HELP_STRING([--with-pkgconfigdir], pkg_description)],,
-+ [with_pkgconfigdir=]pkg_default)
-+AC_SUBST([pkgconfigdir], [$with_pkgconfigdir])
-+m4_popdef([pkg_default])
-+m4_popdef([pkg_description])
-+]) dnl PKG_INSTALLDIR
-+
-+
-+# PKG_NOARCH_INSTALLDIR(DIRECTORY)
-+# -------------------------
-+# Substitutes the variable noarch_pkgconfigdir as the location where a
-+# module should install arch-independent pkg-config .pc files. By
-+# default the directory is $datadir/pkgconfig, but the default can be
-+# changed by passing DIRECTORY. The user can override through the
-+# --with-noarch-pkgconfigdir parameter.
-+AC_DEFUN([PKG_NOARCH_INSTALLDIR],
-+[m4_pushdef([pkg_default], [m4_default([$1], ['${datadir}/pkgconfig'])])
-+m4_pushdef([pkg_description],
-+ [pkg-config arch-independent installation directory @<:@]pkg_default[@:>@])
-+AC_ARG_WITH([noarch-pkgconfigdir],
-+ [AS_HELP_STRING([--with-noarch-pkgconfigdir], pkg_description)],,
-+ [with_noarch_pkgconfigdir=]pkg_default)
-+AC_SUBST([noarch_pkgconfigdir], [$with_noarch_pkgconfigdir])
-+m4_popdef([pkg_default])
-+m4_popdef([pkg_description])
-+]) dnl PKG_NOARCH_INSTALLDIR
-+
-+
-+# PKG_CHECK_VAR(VARIABLE, MODULE, CONFIG-VARIABLE,
-+# [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
-+# -------------------------------------------
-+# Retrieves the value of the pkg-config variable for the given module.
-+AC_DEFUN([PKG_CHECK_VAR],
-+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
-+AC_ARG_VAR([$1], [value of $3 for $2, overriding pkg-config])dnl
-+
-+_PKG_CONFIG([$1], [variable="][$3]["], [$2])
-+AS_VAR_COPY([$1], [pkg_cv_][$1])
-+
-+AS_VAR_IF([$1], [""], [$5], [$4])dnl
-+])# PKG_CHECK_VAR
-+
- m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])])
-+
- # AM_AUX_DIR_EXPAND -*- Autoconf -*-
-
- # Copyright (C) 2001-2017 Free Software Foundation, Inc.
-diff --git a/gdb/build-id.c b/gdb/build-id.c
---- a/gdb/build-id.c
-+++ b/gdb/build-id.c
-@@ -780,10 +780,10 @@ missing_rpm_enlist_1 (const char *filename, int verify_vendor)
- static rpmts (*rpmtsCreate_p) (void);
- extern rpmts rpmtsFree(rpmts ts);
- static rpmts (*rpmtsFree_p) (rpmts ts);
-- extern rpmdbMatchIterator rpmtsInitIterator(const rpmts ts, rpmTag rpmtag,
-+ extern rpmdbMatchIterator rpmtsInitIterator(const rpmts ts, rpmDbiTagVal rpmtag,
- const void * keyp, size_t keylen);
- static rpmdbMatchIterator (*rpmtsInitIterator_p) (const rpmts ts,
-- rpmTag rpmtag,
-+ rpmDbiTagVal rpmtag,
- const void *keyp,
- size_t keylen);
- #else /* !DLOPEN_LIBRPM */
-@@ -838,7 +838,7 @@ missing_rpm_enlist_1 (const char *filename, int verify_vendor)
- && (rpmdbNextIterator_p = (Header (*) (rpmdbMatchIterator mi)) dlsym (h, "rpmdbNextIterator"))
- && (rpmtsCreate_p = (rpmts (*) (void)) dlsym (h, "rpmtsCreate"))
- && (rpmtsFree_p = (rpmts (*) (rpmts ts)) dlsym (h, "rpmtsFree"))
-- && (rpmtsInitIterator_p = (rpmdbMatchIterator (*) (const rpmts ts, rpmTag rpmtag, const void *keyp, size_t keylen)) dlsym (h, "rpmtsInitIterator"))))
-+ && (rpmtsInitIterator_p = (rpmdbMatchIterator (*) (const rpmts ts, rpmDbiTagVal rpmtag, const void *keyp, size_t keylen)) dlsym (h, "rpmtsInitIterator"))))
- {
- warning (_("Opened library \"%s\" is incompatible (%s), "
- "missing debuginfos notifications will not be displayed"),
-@@ -926,7 +926,7 @@ missing_rpm_enlist_1 (const char *filename, int verify_vendor)
-
- /* RPMDBI_PACKAGES requires keylen == sizeof (int). */
- /* RPMDBI_LABEL is an interface for NVR-based dbiFindByLabel(). */
-- mi_debuginfo = rpmtsInitIterator_p (ts, (rpmTag) RPMDBI_LABEL, debuginfo, 0);
-+ mi_debuginfo = rpmtsInitIterator_p (ts, (rpmDbiTagVal) RPMDBI_LABEL, debuginfo, 0);
- xfree (debuginfo);
- if (mi_debuginfo)
- {
-diff --git a/gdb/config.in b/gdb/config.in
---- a/gdb/config.in
-+++ b/gdb/config.in
-@@ -42,6 +42,9 @@
- /* Handle .ctf type-info sections */
- #undef ENABLE_LIBCTF
-
-+/* librpm version specific library name to dlopen. */
-+#undef DLOPEN_LIBRPM
-+
- /* Define to 1 if translation of program messages to the user's native
- language is requested. */
- #undef ENABLE_NLS
-@@ -265,6 +268,9 @@
- /* Define to 1 if you have the `m' library (-lm). */
- #undef HAVE_LIBM
-
-+/* Define if librpm library is being used. */
-+#undef HAVE_LIBRPM
-+
- /* Define to 1 if you have the <libunwind-ia64.h> header file. */
- #undef HAVE_LIBUNWIND_IA64_H
-
-diff --git a/gdb/configure b/gdb/configure
---- a/gdb/configure
-+++ b/gdb/configure
-@@ -778,6 +778,11 @@ AMD_DBGAPI_CFLAGS
- ENABLE_BFD_64_BIT_FALSE
- ENABLE_BFD_64_BIT_TRUE
- subdirs
-+RPM_LIBS
-+RPM_CFLAGS
-+PKG_CONFIG_LIBDIR
-+PKG_CONFIG_PATH
-+PKG_CONFIG
- GDB_DATADIR
- DEBUGDIR
- MAKEINFO_EXTRA_FLAGS
-@@ -911,6 +916,7 @@ with_gdb_datadir
- with_relocated_sources
- with_auto_load_dir
- with_auto_load_safe_path
-+with_rpm
- enable_targets
- enable_64_bit_bfd
- with_amd_dbgapi
-@@ -988,6 +994,8 @@ AMD_DBGAPI_CFLAGS
- AMD_DBGAPI_LIBS
- DEBUGINFOD_CFLAGS
- DEBUGINFOD_LIBS
-+RPM_CFLAGS
-+RPM_LIBS
- YACC
- YFLAGS
- ZSTD_CFLAGS
-@@ -1679,6 +1687,8 @@ Optional Packages:
- --with-amd-dbgapi support for the amd-dbgapi target (yes / no / auto)
- --with-debuginfod Enable debuginfo lookups with debuginfod
- (auto/yes/no)
-+ --with-rpm query rpm database for missing debuginfos (yes/no,
-+ def. auto=librpm.so)
- --with-libunwind-ia64 use libunwind frame unwinding for ia64 targets
- --with-curses use the curses library instead of the termcap
- library
-@@ -1759,6 +1769,8 @@ Some influential environment variables:
- C compiler flags for DEBUGINFOD, overriding pkg-config
- DEBUGINFOD_LIBS
- linker flags for DEBUGINFOD, overriding pkg-config
-+ RPM_CFLAGS C compiler flags for RPM, overriding pkg-config
-+ RPM_LIBS linker flags for RPM, overriding pkg-config
- YACC The `Yet Another Compiler Compiler' implementation to use.
- Defaults to the first program found out of: `bison -y', `byacc',
- `yacc'.
-@@ -18039,6 +18051,495 @@ _ACEOF
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_auto_load_safe_path" >&5
- $as_echo "$with_auto_load_safe_path" >&6; }
-
-+# Integration with rpm library to support missing debuginfo suggestions.
-+# --without-rpm: Disable any rpm support.
-+# --with-rpm=libname.so: Try to dynamically open `libname.so' during runtime.
-+# Even with runtime missing `libname.so' GDB will still other run correctly.
-+# Missing `libname.so' during ./configure will abort the configuration.
-+# --with-rpm=librpm.so: Like `--with-rpm=libname.so' but try to find specific
-+# minor version first such as `librpm-4.6.so' as minor version differences
-+# mean API+ABI incompatibility. If the specific match versioned library name
-+# could not be found still open dynamically at least `librpm.so'.
-+# --with-rpm: Like `--with-rpm=librpm.so' but if any of its detection fails try
-+# to find librpm for compilation-time linking by pkg-config. GDB binary will
-+# be probably linked with the version specific library (as `librpm-4.6.so').
-+# Failure to find librpm by pkg-config will abort the configuration.
-+# (default) --with-rpm=auto: Like `--with-rpm=librpm.so' but if even pkg-config
-+# cannot find librpm use to the rpmless compilation (like `--without-rpm').
-+
-+
-+# Check whether --with-rpm was given.
-+if test "${with_rpm+set}" = set; then :
-+ withval=$with_rpm;
-+else
-+ with_rpm="auto"
-+fi
-+
-+
-+
-+
-+if test "x$with_rpm" != "xno"; then
-+ if test "x$with_rpm" = "xyes"; then
-+ LIBRPM="librpm.so"
-+ RPM_REQUIRE=true
-+ DLOPEN_REQUIRE=false
-+ elif test "x$with_rpm" = "xauto"; then
-+ LIBRPM="librpm.so"
-+ RPM_REQUIRE=false
-+ DLOPEN_REQUIRE=false
-+ else
-+ LIBRPM="$with_rpm"
-+ RPM_REQUIRE=true
-+ DLOPEN_REQUIRE=true
-+ fi
-+ LIBRPM_STRING='"'"$LIBRPM"'"'
-+
-+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking specific librpm version" >&5
-+$as_echo_n "checking specific librpm version... " >&6; }
-+ HAVE_DLOPEN_LIBRPM=false
-+ save_LIBS="$LIBS"
-+ LIBS="$LIBS -ldl"
-+ if test "$cross_compiling" = yes; then :
-+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-+as_fn_error "cannot run test program while cross compiling
-+See \`config.log' for more details." "$LINENO" 5; }
-+else
-+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-+/* end confdefs.h. */
-+
-+#include <rpm/rpmlib.h>
-+#include <dlfcn.h>
-+#include <errno.h>
-+#include <string.h>
-+
-+int
-+main ()
-+{
-+
-+ void *h;
-+ const char *const *rpmverp;
-+ FILE *f;
-+
-+ f = fopen ("conftest.out", "w");
-+ if (!f)
-+ {
-+ fprintf (stderr, "Cannot write \"%s\": %s\n", "conftest.out",
-+ strerror (errno));
-+ return 1;
-+ }
-+ h = dlopen ($LIBRPM_STRING, RTLD_LAZY);
-+ if (!h)
-+ {
-+ fprintf (stderr, "dlopen (\"%s\"): %s\n", $LIBRPM_STRING, dlerror ());
-+ return 1;
-+ }
-+ rpmverp = dlsym (h, "RPMVERSION");
-+ if (!rpmverp)
-+ {
-+ fprintf (stderr, "dlsym (\"RPMVERSION\"): %s\n", dlerror ());
-+ return 1;
-+ }
-+ fprintf (stderr, "RPMVERSION is: \"");
-+ fprintf (stderr, "%s\"\n", *rpmverp);
-+
-+ /* Try to find the specific librpm version only for "librpm.so" as we do
-+ not know how to assemble the version string otherwise. */
-+
-+ if (strcmp ("librpm.so", $LIBRPM_STRING) != 0)
-+ {
-+ fprintf (f, "%s\n", $LIBRPM_STRING);
-+ return 0;
-+ }
-+ else
-+ {
-+ char *h2_name;
-+ void *h2;
-+ int major, minor;
-+
-+ if (sscanf (*rpmverp, "%d.%d", &major, &minor) != 2)
-+ {
-+ fprintf (stderr, "Unable to parse RPMVERSION.\n");
-+ fprintf (f, "%s\n", $LIBRPM_STRING);
-+ return 0;
-+ }
-+ /* Avoid the square brackets by malloc. */
-+ h2_name = malloc (64);
-+ sprintf (h2_name, "librpm-%d.%d.so", major, minor);
-+ h2 = dlopen (h2_name, RTLD_LAZY);
-+ if (!h2)
-+ {
-+ fprintf (stderr, "dlopen (\"%s\"): %s\n", h2_name, dlerror ());
-+ fprintf (f, "%s\n", $LIBRPM_STRING);
-+ return 0;
-+ }
-+ if (h2 != h)
-+ {
-+ fprintf (stderr, "dlopen of \"%s\" and \"%s\" are different.\n",
-+ $LIBRPM_STRING, h2_name);
-+ fprintf (f, "%s\n", $LIBRPM_STRING);
-+ return 0;
-+ }
-+ /* Found the valid .so name with a specific version. */
-+ fprintf (f, "%s\n", h2_name);
-+ return 0;
-+ }
-+
-+ ;
-+ return 0;
-+}
-+_ACEOF
-+if ac_fn_c_try_run "$LINENO"; then :
-+
-+ DLOPEN_LIBRPM="`cat conftest.out`"
-+ if test "x$DLOPEN_LIBRPM" != "x"; then
-+ HAVE_DLOPEN_LIBRPM=true
-+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLOPEN_LIBRPM" >&5
-+$as_echo "$DLOPEN_LIBRPM" >&6; }
-+ fi
-+
-+fi
-+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-+ conftest.$ac_objext conftest.beam conftest.$ac_ext
-+fi
-+
-+ rm -f conftest.out
-+
-+
-+
-+ if $HAVE_DLOPEN_LIBRPM; then
-+
-+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking rpm library API compatibility" >&5
-+$as_echo_n "checking rpm library API compatibility... " >&6; }
-+ # The compilation requires -Werror to verify anything.
-+ save_CFLAGS="$CFLAGS"
-+ CFLAGS="$CFLAGS -Werror"
-+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-+/* end confdefs.h. */
-+
-+/* Duplicate here the declarations to verify they match "elfread.c". */
-+#include <rpm/rpmlib.h>
-+#include <rpm/rpmts.h>
-+#include <rpm/rpmdb.h>
-+#include <rpm/header.h>
-+extern char * headerFormat(Header h, const char * fmt, errmsg_t * errmsg);
-+extern int rpmReadConfigFiles(const char * file, const char * target);
-+extern rpmdbMatchIterator rpmdbFreeIterator(rpmdbMatchIterator mi);
-+extern Header rpmdbNextIterator(rpmdbMatchIterator mi);
-+extern rpmts rpmtsCreate(void);
-+extern rpmts rpmtsFree(rpmts ts);
-+extern rpmdbMatchIterator rpmtsInitIterator(const rpmts ts, rpmDbiTagVal rpmtag,
-+ const void * keyp, size_t keylen);
-+
-+int
-+main ()
-+{
-+
-+ ;
-+ return 0;
-+}
-+_ACEOF
-+if ac_fn_c_try_compile "$LINENO"; then :
-+
-+ LIBRPM_COMPAT=true
-+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-+$as_echo "yes" >&6; }
-+
-+else
-+
-+ LIBRPM_COMPAT=false
-+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-+$as_echo "no" >&6; }
-+
-+fi
-+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-+ CFLAGS="$save_CFLAGS"
-+
-+ if ! $LIBRPM_COMPAT; then
-+ HAVE_DLOPEN_LIBRPM=false
-+ fi
-+ fi
-+
-+ if $HAVE_DLOPEN_LIBRPM; then
-+ DLOPEN_LIBRPM_STRING='"'"$DLOPEN_LIBRPM"'"'
-+
-+cat >>confdefs.h <<_ACEOF
-+#define DLOPEN_LIBRPM $DLOPEN_LIBRPM_STRING
-+_ACEOF
-+
-+
-+$as_echo "#define HAVE_LIBRPM 1" >>confdefs.h
-+
-+ else
-+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-+$as_echo "no" >&6; }
-+ LIBS="$save_LIBS"
-+ if $DLOPEN_REQUIRE; then
-+ as_fn_error "Specific name $LIBRPM was requested but it could not be opened." "$LINENO" 5
-+ fi
-+
-+
-+
-+
-+
-+
-+
-+if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
-+ if test -n "$ac_tool_prefix"; then
-+ # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args.
-+set dummy ${ac_tool_prefix}pkg-config; ac_word=$2
-+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-+$as_echo_n "checking for $ac_word... " >&6; }
-+if test "${ac_cv_path_PKG_CONFIG+set}" = set; then :
-+ $as_echo_n "(cached) " >&6
-+else
-+ case $PKG_CONFIG in
-+ [\\/]* | ?:[\\/]*)
-+ ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path.
-+ ;;
-+ *)
-+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-+for as_dir in $PATH
-+do
-+ IFS=$as_save_IFS
-+ test -z "$as_dir" && as_dir=.
-+ for ac_exec_ext in '' $ac_executable_extensions; do
-+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-+ ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
-+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-+ break 2
-+ fi
-+done
-+ done
-+IFS=$as_save_IFS
-+
-+ ;;
-+esac
-+fi
-+PKG_CONFIG=$ac_cv_path_PKG_CONFIG
-+if test -n "$PKG_CONFIG"; then
-+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5
-+$as_echo "$PKG_CONFIG" >&6; }
-+else
-+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-+$as_echo "no" >&6; }
-+fi
-+
-+
-+fi
-+if test -z "$ac_cv_path_PKG_CONFIG"; then
-+ ac_pt_PKG_CONFIG=$PKG_CONFIG
-+ # Extract the first word of "pkg-config", so it can be a program name with args.
-+set dummy pkg-config; ac_word=$2
-+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-+$as_echo_n "checking for $ac_word... " >&6; }
-+if test "${ac_cv_path_ac_pt_PKG_CONFIG+set}" = set; then :
-+ $as_echo_n "(cached) " >&6
-+else
-+ case $ac_pt_PKG_CONFIG in
-+ [\\/]* | ?:[\\/]*)
-+ ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path.
-+ ;;
-+ *)
-+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-+for as_dir in $PATH
-+do
-+ IFS=$as_save_IFS
-+ test -z "$as_dir" && as_dir=.
-+ for ac_exec_ext in '' $ac_executable_extensions; do
-+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-+ ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
-+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-+ break 2
-+ fi
-+done
-+ done
-+IFS=$as_save_IFS
-+
-+ ;;
-+esac
-+fi
-+ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG
-+if test -n "$ac_pt_PKG_CONFIG"; then
-+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5
-+$as_echo "$ac_pt_PKG_CONFIG" >&6; }
-+else
-+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-+$as_echo "no" >&6; }
-+fi
-+
-+ if test "x$ac_pt_PKG_CONFIG" = x; then
-+ PKG_CONFIG=""
-+ else
-+ case $cross_compiling:$ac_tool_warned in
-+yes:)
-+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-+ac_tool_warned=yes ;;
-+esac
-+ PKG_CONFIG=$ac_pt_PKG_CONFIG
-+ fi
-+else
-+ PKG_CONFIG="$ac_cv_path_PKG_CONFIG"
-+fi
-+
-+fi
-+if test -n "$PKG_CONFIG"; then
-+ _pkg_min_version=0.9.0
-+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5
-+$as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; }
-+ if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then
-+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-+$as_echo "yes" >&6; }
-+ else
-+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-+$as_echo "no" >&6; }
-+ PKG_CONFIG=""
-+ fi
-+fi
-+
-+pkg_failed=no
-+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for RPM" >&5
-+$as_echo_n "checking for RPM... " >&6; }
-+
-+if test -n "$RPM_CFLAGS"; then
-+ pkg_cv_RPM_CFLAGS="$RPM_CFLAGS"
-+ elif test -n "$PKG_CONFIG"; then
-+ if test -n "$PKG_CONFIG" && \
-+ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"rpm\""; } >&5
-+ ($PKG_CONFIG --exists --print-errors "rpm") 2>&5
-+ ac_status=$?
-+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-+ test $ac_status = 0; }; then
-+ pkg_cv_RPM_CFLAGS=`$PKG_CONFIG --cflags "rpm" 2>/dev/null`
-+ test "x$?" != "x0" && pkg_failed=yes
-+else
-+ pkg_failed=yes
-+fi
-+ else
-+ pkg_failed=untried
-+fi
-+if test -n "$RPM_LIBS"; then
-+ pkg_cv_RPM_LIBS="$RPM_LIBS"
-+ elif test -n "$PKG_CONFIG"; then
-+ if test -n "$PKG_CONFIG" && \
-+ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"rpm\""; } >&5
-+ ($PKG_CONFIG --exists --print-errors "rpm") 2>&5
-+ ac_status=$?
-+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-+ test $ac_status = 0; }; then
-+ pkg_cv_RPM_LIBS=`$PKG_CONFIG --libs "rpm" 2>/dev/null`
-+ test "x$?" != "x0" && pkg_failed=yes
-+else
-+ pkg_failed=yes
-+fi
-+ else
-+ pkg_failed=untried
-+fi
-+
-+
-+
-+if test $pkg_failed = yes; then
-+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-+$as_echo "no" >&6; }
-+
-+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
-+ _pkg_short_errors_supported=yes
-+else
-+ _pkg_short_errors_supported=no
-+fi
-+ if test $_pkg_short_errors_supported = yes; then
-+ RPM_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "rpm" 2>&1`
-+ else
-+ RPM_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "rpm" 2>&1`
-+ fi
-+ # Put the nasty error message in config.log where it belongs
-+ echo "$RPM_PKG_ERRORS" >&5
-+
-+ HAVE_LIBRPM=false
-+elif test $pkg_failed = untried; then
-+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-+$as_echo "no" >&6; }
-+ HAVE_LIBRPM=false
-+else
-+ RPM_CFLAGS=$pkg_cv_RPM_CFLAGS
-+ RPM_LIBS=$pkg_cv_RPM_LIBS
-+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-+$as_echo "yes" >&6; }
-+ HAVE_LIBRPM=true
-+fi
-+
-+ if $HAVE_LIBRPM; then
-+
-+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking rpm library API compatibility" >&5
-+$as_echo_n "checking rpm library API compatibility... " >&6; }
-+ # The compilation requires -Werror to verify anything.
-+ save_CFLAGS="$CFLAGS"
-+ CFLAGS="$CFLAGS -Werror"
-+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-+/* end confdefs.h. */
-+
-+/* Duplicate here the declarations to verify they match "elfread.c". */
-+#include <rpm/rpmlib.h>
-+#include <rpm/rpmts.h>
-+#include <rpm/rpmdb.h>
-+#include <rpm/header.h>
-+extern char * headerFormat(Header h, const char * fmt, errmsg_t * errmsg);
-+extern int rpmReadConfigFiles(const char * file, const char * target);
-+extern rpmdbMatchIterator rpmdbFreeIterator(rpmdbMatchIterator mi);
-+extern Header rpmdbNextIterator(rpmdbMatchIterator mi);
-+extern rpmts rpmtsCreate(void);
-+extern rpmts rpmtsFree(rpmts ts);
-+extern rpmdbMatchIterator rpmtsInitIterator(const rpmts ts, rpmDbiTagVal rpmtag,
-+ const void * keyp, size_t keylen);
-+
-+int
-+main ()
-+{
-+
-+ ;
-+ return 0;
-+}
-+_ACEOF
-+if ac_fn_c_try_compile "$LINENO"; then :
-+
-+ LIBRPM_COMPAT=true
-+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-+$as_echo "yes" >&6; }
-+
-+else
-+
-+ LIBRPM_COMPAT=false
-+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-+$as_echo "no" >&6; }
-+
-+fi
-+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-+ CFLAGS="$save_CFLAGS"
-+
-+ if ! $LIBRPM_COMPAT; then
-+ HAVE_LIBRPM=false
-+ RPM_PKG_ERRORS="Found $LIBRPM API is incompatibile with this GDB"
-+ fi
-+ fi
-+
-+ if $HAVE_LIBRPM; then
-+
-+$as_echo "#define HAVE_LIBRPM 1" >>confdefs.h
-+
-+ CFLAGS="$CFLAGS $RPM_CFLAGS"
-+ LIBS="$LIBS $RPM_LIBS"
-+ else
-+ if $RPM_REQUIRE; then
-+ as_fn_error "$RPM_PKG_ERRORS" "$LINENO" 5
-+ else
-+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $RPM_PKG_ERRORS" >&5
-+$as_echo "$as_me: WARNING: $RPM_PKG_ERRORS" >&2;}
-+ fi
-+ fi
-+ fi
-+fi
-+
-
-
- subdirs="$subdirs testsuite"
-diff --git a/gdb/configure.ac b/gdb/configure.ac
---- a/gdb/configure.ac
-+++ b/gdb/configure.ac
-@@ -173,6 +173,200 @@ AC_DEFINE_DIR(AUTO_LOAD_SAFE_PATH, escape_dir,
- [Directories safe to hold auto-loaded files.])
- AC_MSG_RESULT([$with_auto_load_safe_path])
-
-+# Integration with rpm library to support missing debuginfo suggestions.
-+# --without-rpm: Disable any rpm support.
-+# --with-rpm=libname.so: Try to dynamically open `libname.so' during runtime.
-+# Even with runtime missing `libname.so' GDB will still other run correctly.
-+# Missing `libname.so' during ./configure will abort the configuration.
-+# --with-rpm=librpm.so: Like `--with-rpm=libname.so' but try to find specific
-+# minor version first such as `librpm-4.6.so' as minor version differences
-+# mean API+ABI incompatibility. If the specific match versioned library name
-+# could not be found still open dynamically at least `librpm.so'.
-+# --with-rpm: Like `--with-rpm=librpm.so' but if any of its detection fails try
-+# to find librpm for compilation-time linking by pkg-config. GDB binary will
-+# be probably linked with the version specific library (as `librpm-4.6.so').
-+# Failure to find librpm by pkg-config will abort the configuration.
-+# (default) --with-rpm=auto: Like `--with-rpm=librpm.so' but if even pkg-config
-+# cannot find librpm use to the rpmless compilation (like `--without-rpm').
-+
-+AC_ARG_WITH([rpm],
-+ [AS_HELP_STRING([--with-rpm],
-+ [query rpm database for missing debuginfos (yes/no, def. auto=librpm.so)])], [], [with_rpm="auto"])
-+
-+m4_pattern_allow([^AC_MSG_ERROR$])
-+m4_pattern_allow([^AC_MSG_WARN$])
-+if test "x$with_rpm" != "xno"; then
-+ if test "x$with_rpm" = "xyes"; then
-+ LIBRPM="librpm.so"
-+ RPM_REQUIRE=true
-+ DLOPEN_REQUIRE=false
-+ elif test "x$with_rpm" = "xauto"; then
-+ LIBRPM="librpm.so"
-+ RPM_REQUIRE=false
-+ DLOPEN_REQUIRE=false
-+ else
-+ LIBRPM="$with_rpm"
-+ RPM_REQUIRE=true
-+ DLOPEN_REQUIRE=true
-+ fi
-+ LIBRPM_STRING='"'"$LIBRPM"'"'
-+
-+ AC_MSG_CHECKING([specific librpm version])
-+ HAVE_DLOPEN_LIBRPM=false
-+ save_LIBS="$LIBS"
-+ LIBS="$LIBS -ldl"
-+ AC_RUN_IFELSE(AC_LANG_PROGRAM([[
-+#include <rpm/rpmlib.h>
-+#include <dlfcn.h>
-+#include <errno.h>
-+#include <string.h>
-+ ]], [[
-+ void *h;
-+ const char *const *rpmverp;
-+ FILE *f;
-+
-+ f = fopen ("conftest.out", "w");
-+ if (!f)
-+ {
-+ fprintf (stderr, "Cannot write \"%s\": %s\n", "conftest.out",
-+ strerror (errno));
-+ return 1;
-+ }
-+ h = dlopen ($LIBRPM_STRING, RTLD_LAZY);
-+ if (!h)
-+ {
-+ fprintf (stderr, "dlopen (\"%s\"): %s\n", $LIBRPM_STRING, dlerror ());
-+ return 1;
-+ }
-+ rpmverp = dlsym (h, "RPMVERSION");
-+ if (!rpmverp)
-+ {
-+ fprintf (stderr, "dlsym (\"RPMVERSION\"): %s\n", dlerror ());
-+ return 1;
-+ }
-+ fprintf (stderr, "RPMVERSION is: \"");
-+ fprintf (stderr, "%s\"\n", *rpmverp);
-+
-+ /* Try to find the specific librpm version only for "librpm.so" as we do
-+ not know how to assemble the version string otherwise. */
-+
-+ if (strcmp ("librpm.so", $LIBRPM_STRING) != 0)
-+ {
-+ fprintf (f, "%s\n", $LIBRPM_STRING);
-+ return 0;
-+ }
-+ else
-+ {
-+ char *h2_name;
-+ void *h2;
-+ int major, minor;
-+
-+ if (sscanf (*rpmverp, "%d.%d", &major, &minor) != 2)
-+ {
-+ fprintf (stderr, "Unable to parse RPMVERSION.\n");
-+ fprintf (f, "%s\n", $LIBRPM_STRING);
-+ return 0;
-+ }
-+ /* Avoid the square brackets by malloc. */
-+ h2_name = malloc (64);
-+ sprintf (h2_name, "librpm-%d.%d.so", major, minor);
-+ h2 = dlopen (h2_name, RTLD_LAZY);
-+ if (!h2)
-+ {
-+ fprintf (stderr, "dlopen (\"%s\"): %s\n", h2_name, dlerror ());
-+ fprintf (f, "%s\n", $LIBRPM_STRING);
-+ return 0;
-+ }
-+ if (h2 != h)
-+ {
-+ fprintf (stderr, "dlopen of \"%s\" and \"%s\" are different.\n",
-+ $LIBRPM_STRING, h2_name);
-+ fprintf (f, "%s\n", $LIBRPM_STRING);
-+ return 0;
-+ }
-+ /* Found the valid .so name with a specific version. */
-+ fprintf (f, "%s\n", h2_name);
-+ return 0;
-+ }
-+ ]]), [
-+ DLOPEN_LIBRPM="`cat conftest.out`"
-+ if test "x$DLOPEN_LIBRPM" != "x"; then
-+ HAVE_DLOPEN_LIBRPM=true
-+ AC_MSG_RESULT($DLOPEN_LIBRPM)
-+ fi
-+ ])
-+ rm -f conftest.out
-+
-+ m4_define([CHECK_LIBRPM_COMPAT], [
-+ AC_MSG_CHECKING([rpm library API compatibility])
-+ # The compilation requires -Werror to verify anything.
-+ save_CFLAGS="$CFLAGS"
-+ CFLAGS="$CFLAGS -Werror"
-+ AC_COMPILE_IFELSE(AC_LANG_PROGRAM([[
-+/* Duplicate here the declarations to verify they match "elfread.c". */
-+#include <rpm/rpmlib.h>
-+#include <rpm/rpmts.h>
-+#include <rpm/rpmdb.h>
-+#include <rpm/header.h>
-+extern char * headerFormat(Header h, const char * fmt, errmsg_t * errmsg);
-+extern int rpmReadConfigFiles(const char * file, const char * target);
-+extern rpmdbMatchIterator rpmdbFreeIterator(rpmdbMatchIterator mi);
-+extern Header rpmdbNextIterator(rpmdbMatchIterator mi);
-+extern rpmts rpmtsCreate(void);
-+extern rpmts rpmtsFree(rpmts ts);
-+extern rpmdbMatchIterator rpmtsInitIterator(const rpmts ts, rpmDbiTagVal rpmtag,
-+ const void * keyp, size_t keylen);
-+ ]]), [
-+ LIBRPM_COMPAT=true
-+ AC_MSG_RESULT(yes)
-+ ], [
-+ LIBRPM_COMPAT=false
-+ AC_MSG_RESULT(no)
-+ ])
-+ CFLAGS="$save_CFLAGS"
-+ ])
-+
-+ if $HAVE_DLOPEN_LIBRPM; then
-+ CHECK_LIBRPM_COMPAT
-+ if ! $LIBRPM_COMPAT; then
-+ HAVE_DLOPEN_LIBRPM=false
-+ fi
-+ fi
-+
-+ if $HAVE_DLOPEN_LIBRPM; then
-+ DLOPEN_LIBRPM_STRING='"'"$DLOPEN_LIBRPM"'"'
-+ AC_DEFINE_UNQUOTED(DLOPEN_LIBRPM, $DLOPEN_LIBRPM_STRING, [librpm version specific library name to dlopen.])
-+ AC_DEFINE(HAVE_LIBRPM, 1, [Define if librpm library is being used.])
-+ else
-+ AC_MSG_RESULT(no)
-+ LIBS="$save_LIBS"
-+ if $DLOPEN_REQUIRE; then
-+ AC_MSG_ERROR([Specific name $LIBRPM was requested but it could not be opened.])
-+ fi
-+ PKG_CHECK_MODULES(RPM, rpm, [HAVE_LIBRPM=true], [HAVE_LIBRPM=false])
-+
-+ if $HAVE_LIBRPM; then
-+ CHECK_LIBRPM_COMPAT
-+ if ! $LIBRPM_COMPAT; then
-+ HAVE_LIBRPM=false
-+ RPM_PKG_ERRORS="Found $LIBRPM API is incompatibile with this GDB"
-+ fi
-+ fi
-+
-+ if $HAVE_LIBRPM; then
-+ AC_DEFINE(HAVE_LIBRPM, 1, [Define if librpm library is being used.])
-+ CFLAGS="$CFLAGS $RPM_CFLAGS"
-+ LIBS="$LIBS $RPM_LIBS"
-+ else
-+ if $RPM_REQUIRE; then
-+ AC_MSG_ERROR($RPM_PKG_ERRORS)
-+ else
-+ AC_MSG_WARN($RPM_PKG_ERRORS)
-+ fi
-+ fi
-+ fi
-+fi
-+
- AC_CONFIG_SUBDIRS(testsuite)
-
- # Check whether to support alternative target configurations
-diff --git a/gdb/event-top.c b/gdb/event-top.c
---- a/gdb/event-top.c
-+++ b/gdb/event-top.c
-@@ -43,6 +43,7 @@
- #include "async-event.h"
- #include "bt-utils.h"
- #include "pager.h"
-+#include "symfile.h"
-
- /* readline include files. */
- #include "readline/readline.h"
-@@ -404,6 +405,8 @@ display_gdb_prompt (const char *new_prompt)
- /* Reset the nesting depth used when trace-commands is set. */
- reset_command_nest_depth ();
-
-+ debug_flush_missing ();
-+
- /* Do not call the python hook on an explicit prompt change as
- passed to this function, as this forms a secondary/local prompt,
- IE, displayed but not set. */
-@@ -788,7 +791,10 @@ command_line_handler (gdb::unique_xmalloc_ptr<char> &&rl)
- command_handler (cmd);
-
- if (ui->prompt_state != PROMPTED)
-- display_gdb_prompt (0);
-+ {
-+ debug_flush_missing ();
-+ display_gdb_prompt (0);
-+ }
- }
- }
-
-diff --git a/gdb/symfile.h b/gdb/symfile.h
---- a/gdb/symfile.h
-+++ b/gdb/symfile.h
-@@ -367,6 +367,7 @@ extern void generic_load (const char *args, int from_tty);
- /* build-id support. */
- extern struct bfd_build_id *build_id_addr_get (CORE_ADDR addr);
- extern void debug_print_missing (const char *binary, const char *debug);
-+extern void debug_flush_missing (void);
- #define BUILD_ID_MAIN_EXECUTABLE_FILENAME _("the main executable file")
-
- /* From minidebug.c. */
diff --git a/gdb-6.6-buildid-locate-solib-missing-ids.patch b/gdb-6.6-buildid-locate-solib-missing-ids.patch
index e9ec7b5..897f691 100644
--- a/gdb-6.6-buildid-locate-solib-missing-ids.patch
+++ b/gdb-6.6-buildid-locate-solib-missing-ids.patch
@@ -14,62 +14,87 @@ https://bugzilla.redhat.com/show_bug.cgi?id=1339862
diff --git a/gdb/solib-svr4.c b/gdb/solib-svr4.c
--- a/gdb/solib-svr4.c
+++ b/gdb/solib-svr4.c
-@@ -1320,14 +1320,28 @@ svr4_read_so_list (svr4_info *info, CORE_ADDR lm, CORE_ADDR prev_lm,
+@@ -347,11 +347,13 @@ lm_addr_check (const solib &so, bfd *abfd)
+
+ struct svr4_so
+ {
+- svr4_so (const char *name, lm_info_svr4_up lm_info)
+- : name (name), lm_info (std::move (lm_info))
++ svr4_so (const char *name, lm_info_svr4_up lm_info, const char *orig_name = nullptr)
++ : name (name), original_name (orig_name == nullptr ? name : orig_name),
++ lm_info (std::move (lm_info))
+ {}
+
+ std::string name;
++ std::string original_name;
+ lm_info_svr4_up lm_info;
+ };
+
+@@ -1002,6 +1004,7 @@ so_list_from_svr4_sos (const std::vector<svr4_so> &sos)
+
+ newobj->so_name = so.name;
+ newobj->so_original_name = so.name;
++ newobj->so_original_name = so.original_name;
+ newobj->lm_info = std::make_unique<lm_info_svr4> (*so.lm_info);
+
+ dst.push_back (*newobj);
+@@ -1263,11 +1266,28 @@ svr4_read_so_list (svr4_info *info, CORE_ADDR lm, CORE_ADDR prev_lm,
+ continue;
}
- {
-- struct bfd_build_id *build_id;
-+ struct bfd_build_id *build_id = NULL;
++ /* Preserve original name since name may be changed below. */
++ gdb::unique_xmalloc_ptr<char> original_name = make_unique_xstrdup (name.get ());
+ {
+- struct bfd_build_id *build_id;
++ struct bfd_build_id *build_id = nullptr;
- strncpy (newobj->so_original_name, buffer.get (), SO_NAME_MAX_PATH_SIZE - 1);
- newobj->so_original_name[SO_NAME_MAX_PATH_SIZE - 1] = '\0';
- /* May get overwritten below. */
- strcpy (newobj->so_name, newobj->so_original_name);
+- build_id = build_id_addr_get (li->l_ld);
+- if (build_id != NULL)
++ /* In the case the main executable was found according to its build-id
++ (from a core file) prevent loading a different build of a library
++ with accidentally the same SO_NAME.
++
++ It suppresses bogus backtraces (and prints "??" there instead) if
++ the on-disk files no longer match the running program version.
++ If the main executable was not loaded according to its build-id do
++ not do any build-id checking of the libraries. There may be missing
++ build-ids dumped in the core file and we would map all the libraries
++ to the only existing file loaded that time - the executable. */
++ if (current_program_space->symfile_object_file != NULL
++ && (current_program_space->symfile_object_file->flags
++ & OBJF_BUILD_ID_CORE_LOADED) != 0)
++ build_id = build_id_addr_get (li->l_ld);
++
++
++ if (build_id != nullptr)
+ {
+ char *bid_name, *build_id_filename;
-- build_id = build_id_addr_get (((lm_info_svr4 *) newobj->lm_info)->l_ld);
-+ /* In the case the main executable was found according to its build-id
-+ (from a core file) prevent loading a different build of a library
-+ with accidentally the same SO_NAME.
-+
-+ It suppresses bogus backtraces (and prints "??" there instead) if
-+ the on-disk files no longer match the running program version.
-+
-+ If the main executable was not loaded according to its build-id do
-+ not do any build-id checking of the libraries. There may be missing
-+ build-ids dumped in the core file and we would map all the libraries
-+ to the only existing file loaded that time - the executable. */
-+ if (current_program_space->symfile_object_file != NULL
-+ && (current_program_space->symfile_object_file->flags
-+ & OBJF_BUILD_ID_CORE_LOADED) != 0)
-+ build_id = build_id_addr_get (li->l_ld);
- if (build_id != NULL)
- {
- char *name, *build_id_filename;
-@@ -1342,23 +1356,7 @@ svr4_read_so_list (svr4_info *info, CORE_ADDR lm, CORE_ADDR prev_lm,
- xfree (name);
- }
- else
-- {
-- debug_print_missing (newobj->so_name, build_id_filename);
+@@ -1280,23 +1300,7 @@ svr4_read_so_list (svr4_info *info, CORE_ADDR lm, CORE_ADDR prev_lm,
+ xfree (bid_name);
+ }
+ else
+- {
+- debug_print_missing (name.get (), build_id_filename);
-
-- /* In the case the main executable was found according to
-- its build-id (from a core file) prevent loading
-- a different build of a library with accidentally the
-- same SO_NAME.
+- /* In the case the main executable was found according to
+- its build-id (from a core file) prevent loading
+- a different build of a library with accidentally the
+- same SO_NAME.
-
-- It suppresses bogus backtraces (and prints "??" there
-- instead) if the on-disk files no longer match the
-- running program version. */
+- It suppresses bogus backtraces (and prints "??" there
+- instead) if the on-disk files no longer match the
+- running program version. */
-
-- if (current_program_space->symfile_object_file != NULL
-- && (current_program_space->symfile_object_file->flags
-- & OBJF_BUILD_ID_CORE_LOADED) != 0)
-- newobj->so_name[0] = 0;
-- }
-+ debug_print_missing (newobj->so_name, build_id_filename);
+- if (current_program_space->symfile_object_file != NULL
+- && (current_program_space->symfile_object_file->flags
+- & OBJF_BUILD_ID_CORE_LOADED) != 0)
+- name = make_unique_xstrdup ("");
+- }
++ debug_print_missing (name.get (), build_id_filename);
- xfree (build_id_filename);
- xfree (build_id);
+ xfree (build_id_filename);
+ xfree (build_id);
diff --git a/gdb/testsuite/gdb.base/gcore-buildid-exec-but-not-solib-lib.c b/gdb/testsuite/gdb.base/gcore-buildid-exec-but-not-solib-lib.c
new file mode 100644
--- /dev/null
@@ -130,7 +155,7 @@ diff --git a/gdb/testsuite/gdb.base/gcore-buildid-exec-but-not-solib.exp b/gdb/t
new file mode 100644
--- /dev/null
+++ b/gdb/testsuite/gdb.base/gcore-buildid-exec-but-not-solib.exp
-@@ -0,0 +1,105 @@
+@@ -0,0 +1,104 @@
+# Copyright 2016 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
@@ -146,9 +171,7 @@ new file mode 100644
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
-+if {[skip_shlib_tests]} {
-+ return 0
-+}
++require allow_shlib_tests
+
+set testfile "gcore-buildid-exec-but-not-solib"
+set srcmainfile ${testfile}-main.c
@@ -226,7 +249,8 @@ new file mode 100644
+remote_exec build "ln -s /lib64 ${debugdir}/"
+# /usr is not needed, all the libs are in /lib64: libm.so.6 libc.so.6 ld-linux-x86-64.so.2
+
-+gdb_test "set solib-absolute-prefix $debugdir"
++gdb_test_no_output "set solib-absolute-prefix $debugdir" \
++ "set solib-absolute-prefix"
+
+gdb_test_no_output "set debug-file-directory $debugdir" "set debug-file-directory"
+
diff --git a/gdb-6.6-buildid-locate.patch b/gdb-6.6-buildid-locate.patch
index 1350051..d407b43 100644
--- a/gdb-6.6-buildid-locate.patch
+++ b/gdb-6.6-buildid-locate.patch
@@ -6,34 +6,10 @@ Subject: gdb-6.6-buildid-locate.patch
;; New locating of the matching binaries from the pure core file (build-id).
;;=push+jan
-diff --git a/bfd/libbfd-in.h b/bfd/libbfd-in.h
---- a/bfd/libbfd-in.h
-+++ b/bfd/libbfd-in.h
-@@ -110,7 +110,7 @@ static inline char *
- bfd_strdup (const char *str)
- {
- size_t len = strlen (str) + 1;
-- char *buf = bfd_malloc (len);
-+ char *buf = (char *) bfd_malloc (len);
- if (buf != NULL)
- memcpy (buf, str, len);
- return buf;
-diff --git a/bfd/libbfd.h b/bfd/libbfd.h
---- a/bfd/libbfd.h
-+++ b/bfd/libbfd.h
-@@ -116,7 +116,7 @@ static inline char *
- bfd_strdup (const char *str)
- {
- size_t len = strlen (str) + 1;
-- char *buf = bfd_malloc (len);
-+ char *buf = (char *) bfd_malloc (len);
- if (buf != NULL)
- memcpy (buf, str, len);
- return buf;
diff --git a/gdb/build-id.c b/gdb/build-id.c
--- a/gdb/build-id.c
+++ b/gdb/build-id.c
-@@ -24,14 +24,72 @@
+@@ -23,9 +23,67 @@
#include "gdbsupport/gdb_vecs.h"
#include "symfile.h"
#include "objfiles.h"
@@ -44,8 +20,8 @@ diff --git a/gdb/build-id.c b/gdb/build-id.c
+#include "elf/internal.h"
#include "filenames.h"
+#include "gdb_bfd.h"
-+#include "gdbcmd.h"
#include "gdbcore.h"
++#include "cli/cli-cmds.h"
#include "cli/cli-style.h"
+#include "inferior.h"
+#include "objfiles.h"
@@ -101,13 +77,7 @@ diff --git a/gdb/build-id.c b/gdb/build-id.c
/* See build-id.h. */
- const struct bfd_build_id *
--build_id_bfd_get (bfd *abfd)
-+build_id_bfd_shdr_get (bfd *abfd)
- {
- /* Dynamic objfiles such as ones created by JIT reader API
- have no underlying bfd structure (that is, objfile->obfd
-@@ -50,6 +108,348 @@ build_id_bfd_get (bfd *abfd)
+@@ -49,6 +107,349 @@ build_id_bfd_get (bfd *abfd)
return NULL;
}
@@ -416,12 +386,13 @@ diff --git a/gdb/build-id.c b/gdb/build-id.c
+ bfd_vma loadbase = 0;
+ unsigned e_phnum = 0;
+
-+ if (core_bfd == NULL)
++ if (current_program_space->core_bfd () == NULL)
+ return NULL;
+
+ build_id_addr = addr;
+ gdb_assert (build_id_addr_sect == NULL);
-+ bfd_map_over_sections (core_bfd, build_id_addr_candidate, NULL);
++ bfd_map_over_sections (current_program_space->core_bfd (),
++ build_id_addr_candidate, NULL);
+
+ /* Sections are sorted in the high-to-low VMAs order.
+ Stop the search on the first ELF header we find.
@@ -430,7 +401,7 @@ diff --git a/gdb/build-id.c b/gdb/build-id.c
+ for (candidate = build_id_addr_sect; candidate != NULL;
+ candidate = candidate->next)
+ {
-+ i_phdr = elf_get_phdr (core_bfd,
++ i_phdr = elf_get_phdr (current_program_space->core_bfd (),
+ bfd_section_vma (candidate->sect),
+ &e_phnum, &loadbase);
+ if (i_phdr != NULL)
@@ -439,7 +410,7 @@ diff --git a/gdb/build-id.c b/gdb/build-id.c
+
+ if (i_phdr != NULL)
+ {
-+ retval = build_id_phdr_get (core_bfd, loadbase, e_phnum, i_phdr);
++ retval = build_id_phdr_get (current_program_space->core_bfd (), loadbase, e_phnum, i_phdr);
+ xfree (i_phdr);
+ }
+
@@ -456,16 +427,7 @@ diff --git a/gdb/build-id.c b/gdb/build-id.c
/* See build-id.h. */
int
-@@ -58,7 +458,7 @@ build_id_verify (bfd *abfd, size_t check_len, const bfd_byte *check)
- const struct bfd_build_id *found;
- int retval = 0;
-
-- found = build_id_bfd_get (abfd);
-+ found = build_id_bfd_shdr_get (abfd);
-
- if (found == NULL)
- warning (_("File \"%s\" has no build-id, file skipped"),
-@@ -73,63 +473,166 @@ build_id_verify (bfd *abfd, size_t check_len, const bfd_byte *check)
+@@ -73,63 +474,166 @@ build_id_verify (bfd *abfd, size_t check_len, const bfd_byte *check)
return retval;
}
@@ -527,7 +489,7 @@ diff --git a/gdb/build-id.c b/gdb/build-id.c
- /* lrealpath() is expensive even for the usually non-existent files. */
- gdb::unique_xmalloc_ptr<char> filename_holder;
- const char *filename = nullptr;
-- if (startswith (link, TARGET_SYSROOT_PREFIX))
+- if (is_target_filename (link))
- filename = link.c_str ();
- else if (access (link.c_str (), F_OK) == 0)
+ for (unsigned seqno = 0;; seqno++)
@@ -592,13 +554,13 @@ diff --git a/gdb/build-id.c b/gdb/build-id.c
+
+ /* We expect to be silent on the non-existing files. */
+ gdb_bfd_ref_ptr debug_bfd = gdb_bfd_open (filename, gnutarget);
-+
+
+- return {};
+ if (debug_bfd == NULL)
+ {
+ if (separate_debug_file_debug)
+ gdb_printf (gdb_stdlog, _(" no, unable to open.\n"));
-
-- return {};
++
+ continue;
+ }
+
@@ -622,6 +584,8 @@ diff --git a/gdb/build-id.c b/gdb/build-id.c
{
if (separate_debug_file_debug)
- gdb_printf (gdb_stdlog, _(" no, build-id does not match.\n"));
+-
+- return {};
+ gdb_printf (gdb_stdlog, _(" yes!\n"));
+ }
+ else
@@ -629,8 +593,7 @@ diff --git a/gdb/build-id.c b/gdb/build-id.c
+ /* If none of the real files is found report as missing file
+ always the non-.%u-suffixed file. */
+ std::string link0 = orig_link;
-
-- return {};
++
+ /* If the symlink has target request to install the target.
+ BASE-debuginfo.rpm contains the symlink but BASE.rpm may be missing.
+ https://bugzilla.redhat.com/show_bug.cgi?id=981154 */
@@ -665,7 +628,7 @@ diff --git a/gdb/build-id.c b/gdb/build-id.c
}
/* Common code for finding BFDs of a given build-id. This function
-@@ -138,7 +641,7 @@ build_id_to_debug_bfd_1 (const std::string &link, size_t build_id_len,
+@@ -138,7 +642,7 @@ build_id_to_debug_bfd_1 (const std::string &link, size_t build_id_len,
static gdb_bfd_ref_ptr
build_id_to_bfd_suffix (size_t build_id_len, const bfd_byte *build_id,
@@ -674,7 +637,7 @@ diff --git a/gdb/build-id.c b/gdb/build-id.c
{
/* Keep backward compatibility so that DEBUG_FILE_DIRECTORY being "" will
cause "/.build-id/..." lookups. */
-@@ -161,16 +664,17 @@ build_id_to_bfd_suffix (size_t build_id_len, const bfd_byte *build_id,
+@@ -161,16 +665,17 @@ build_id_to_bfd_suffix (size_t build_id_len, const bfd_byte *build_id,
if (size > 0)
{
size--;
@@ -695,7 +658,7 @@ diff --git a/gdb/build-id.c b/gdb/build-id.c
if (debug_bfd != NULL)
return debug_bfd;
-@@ -181,7 +685,7 @@ build_id_to_bfd_suffix (size_t build_id_len, const bfd_byte *build_id,
+@@ -181,7 +686,7 @@ build_id_to_bfd_suffix (size_t build_id_len, const bfd_byte *build_id,
if (!gdb_sysroot.empty ())
{
link = gdb_sysroot + link;
@@ -704,7 +667,7 @@ diff --git a/gdb/build-id.c b/gdb/build-id.c
if (debug_bfd != NULL)
return debug_bfd;
}
-@@ -190,31 +694,663 @@ build_id_to_bfd_suffix (size_t build_id_len, const bfd_byte *build_id,
+@@ -190,20 +695,178 @@ build_id_to_bfd_suffix (size_t build_id_len, const bfd_byte *build_id,
return {};
}
@@ -722,446 +685,6 @@ diff --git a/gdb/build-id.c b/gdb/build-id.c
+ return result;
+}
+
-+void debug_flush_missing (void);
-+
-+#ifdef HAVE_LIBRPM
-+
-+#include <rpm/rpmlib.h>
-+#include <rpm/rpmts.h>
-+#include <rpm/rpmdb.h>
-+#include <rpm/header.h>
-+#ifdef DLOPEN_LIBRPM
-+#include <dlfcn.h>
-+#endif
-+
-+/* Workarodun https://bugzilla.redhat.com/show_bug.cgi?id=643031
-+ librpm must not exit() an application on SIGINT
-+
-+ Enable or disable a signal handler. SIGNUM: signal to enable (or disable
-+ if negative). HANDLER: sa_sigaction handler (or NULL to use
-+ rpmsqHandler()). Returns: no. of refs, -1 on error. */
-+extern int rpmsqEnable (int signum, /* rpmsqAction_t handler */ void *handler);
-+int
-+rpmsqEnable (int signum, /* rpmsqAction_t handler */ void *handler)
-+{
-+ return 0;
-+}
-+
-+/* This MISSING_RPM_HASH tracker is used to collect all the missing rpm files
-+ and avoid their duplicities during a single inferior run. */
-+
-+static struct htab *missing_rpm_hash;
-+
-+/* This MISSING_RPM_LIST tracker is used to collect and print as a single line
-+ all the rpms right before the nearest GDB prompt. It gets cleared after
-+ each such print (it is questionable if we should clear it after the print).
-+ */
-+
-+struct missing_rpm
-+ {
-+ struct missing_rpm *next;
-+ char rpm[1];
-+ };
-+static struct missing_rpm *missing_rpm_list;
-+static int missing_rpm_list_entries;
-+
-+/* Returns the count of newly added rpms. */
-+
-+static int
-+#ifndef GDB_INDEX_VERIFY_VENDOR
-+missing_rpm_enlist (const char *filename)
-+#else
-+missing_rpm_enlist_1 (const char *filename, int verify_vendor)
-+#endif
-+{
-+ static int rpm_init_done = 0;
-+ rpmts ts;
-+ rpmdbMatchIterator mi;
-+ int count = 0;
-+
-+#ifdef DLOPEN_LIBRPM
-+ /* Duplicate here the declarations to verify they match. The same sanity
-+ check is present also in `configure.ac'. */
-+ extern char * headerFormat(Header h, const char * fmt, errmsg_t * errmsg);
-+ static char *(*headerFormat_p) (Header h, const char * fmt, errmsg_t *errmsg);
-+ extern int rpmReadConfigFiles(const char * file, const char * target);
-+ static int (*rpmReadConfigFiles_p) (const char * file, const char * target);
-+ extern rpmdbMatchIterator rpmdbFreeIterator(rpmdbMatchIterator mi);
-+ static rpmdbMatchIterator (*rpmdbFreeIterator_p) (rpmdbMatchIterator mi);
-+ extern Header rpmdbNextIterator(rpmdbMatchIterator mi);
-+ static Header (*rpmdbNextIterator_p) (rpmdbMatchIterator mi);
-+ extern rpmts rpmtsCreate(void);
-+ static rpmts (*rpmtsCreate_p) (void);
-+ extern rpmts rpmtsFree(rpmts ts);
-+ static rpmts (*rpmtsFree_p) (rpmts ts);
-+ extern rpmdbMatchIterator rpmtsInitIterator(const rpmts ts, rpmTag rpmtag,
-+ const void * keyp, size_t keylen);
-+ static rpmdbMatchIterator (*rpmtsInitIterator_p) (const rpmts ts,
-+ rpmTag rpmtag,
-+ const void *keyp,
-+ size_t keylen);
-+#else /* !DLOPEN_LIBRPM */
-+# define headerFormat_p headerFormat
-+# define rpmReadConfigFiles_p rpmReadConfigFiles
-+# define rpmdbFreeIterator_p rpmdbFreeIterator
-+# define rpmdbNextIterator_p rpmdbNextIterator
-+# define rpmtsCreate_p rpmtsCreate
-+# define rpmtsFree_p rpmtsFree
-+# define rpmtsInitIterator_p rpmtsInitIterator
-+#endif /* !DLOPEN_LIBRPM */
-+
-+ gdb_assert (filename != NULL);
-+
-+ if (strcmp (filename, BUILD_ID_MAIN_EXECUTABLE_FILENAME) == 0)
-+ return 0;
-+
-+ if (is_target_filename (filename))
-+ return 0;
-+
-+ if (filename[0] != '/')
-+ {
-+ warning (_("Ignoring non-absolute filename: <%s>"), filename);
-+ return 0;
-+ }
-+
-+ if (!rpm_init_done)
-+ {
-+ static int init_tried;
-+
-+ /* Already failed the initialization before? */
-+ if (init_tried)
-+ return 0;
-+ init_tried = 1;
-+
-+#ifdef DLOPEN_LIBRPM
-+ {
-+ void *h;
-+
-+ h = dlopen (DLOPEN_LIBRPM, RTLD_LAZY);
-+ if (!h)
-+ {
-+ warning (_("Unable to open \"%s\" (%s), "
-+ "missing debuginfos notifications will not be displayed"),
-+ DLOPEN_LIBRPM, dlerror ());
-+ return 0;
-+ }
-+
-+ if (!((headerFormat_p = (char *(*) (Header h, const char * fmt, errmsg_t *errmsg)) dlsym (h, "headerFormat"))
-+ && (rpmReadConfigFiles_p = (int (*) (const char * file, const char * target)) dlsym (h, "rpmReadConfigFiles"))
-+ && (rpmdbFreeIterator_p = (rpmdbMatchIterator (*) (rpmdbMatchIterator mi)) dlsym (h, "rpmdbFreeIterator"))
-+ && (rpmdbNextIterator_p = (Header (*) (rpmdbMatchIterator mi)) dlsym (h, "rpmdbNextIterator"))
-+ && (rpmtsCreate_p = (rpmts (*) (void)) dlsym (h, "rpmtsCreate"))
-+ && (rpmtsFree_p = (rpmts (*) (rpmts ts)) dlsym (h, "rpmtsFree"))
-+ && (rpmtsInitIterator_p = (rpmdbMatchIterator (*) (const rpmts ts, rpmTag rpmtag, const void *keyp, size_t keylen)) dlsym (h, "rpmtsInitIterator"))))
-+ {
-+ warning (_("Opened library \"%s\" is incompatible (%s), "
-+ "missing debuginfos notifications will not be displayed"),
-+ DLOPEN_LIBRPM, dlerror ());
-+ if (dlclose (h))
-+ warning (_("Error closing library \"%s\": %s\n"), DLOPEN_LIBRPM,
-+ dlerror ());
-+ return 0;
-+ }
-+ }
-+#endif /* DLOPEN_LIBRPM */
-+
-+ if (rpmReadConfigFiles_p (NULL, NULL) != 0)
-+ {
-+ warning (_("Error reading the rpm configuration files"));
-+ return 0;
-+ }
-+
-+ rpm_init_done = 1;
-+ }
-+
-+ ts = rpmtsCreate_p ();
-+
-+ mi = rpmtsInitIterator_p (ts, RPMTAG_BASENAMES, filename, 0);
-+ if (mi != NULL)
-+ {
-+#ifndef GDB_INDEX_VERIFY_VENDOR
-+ for (;;)
-+#else
-+ if (!verify_vendor) for (;;)
-+#endif
-+ {
-+ Header h;
-+ char *debuginfo, **slot, *s, *s2;
-+ errmsg_t err;
-+ size_t srcrpmlen = sizeof (".src.rpm") - 1;
-+ size_t debuginfolen = sizeof ("-debuginfo") - 1;
-+ rpmdbMatchIterator mi_debuginfo;
-+
-+ h = rpmdbNextIterator_p (mi);
-+ if (h == NULL)
-+ break;
-+
-+ /* Verify the debuginfo file is not already installed. */
-+
-+ debuginfo = headerFormat_p (h, "%{sourcerpm}-debuginfo.%{arch}",
-+ &err);
-+ if (!debuginfo)
-+ {
-+ warning (_("Error querying the rpm file `%s': %s"), filename,
-+ err);
-+ continue;
-+ }
-+ /* s = `.src.rpm-debuginfo.%{arch}' */
-+ s = strrchr (debuginfo, '-') - srcrpmlen;
-+ s2 = NULL;
-+ if (s > debuginfo && memcmp (s, ".src.rpm", srcrpmlen) == 0)
-+ {
-+ /* s2 = `-%{release}.src.rpm-debuginfo.%{arch}' */
-+ s2 = (char *) memrchr (debuginfo, '-', s - debuginfo);
-+ }
-+ if (s2)
-+ {
-+ /* s2 = `-%{version}-%{release}.src.rpm-debuginfo.%{arch}' */
-+ s2 = (char *) memrchr (debuginfo, '-', s2 - debuginfo);
-+ }
-+ if (!s2)
-+ {
-+ warning (_("Error querying the rpm file `%s': %s"), filename,
-+ debuginfo);
-+ xfree (debuginfo);
-+ continue;
-+ }
-+ /* s = `.src.rpm-debuginfo.%{arch}' */
-+ /* s2 = `-%{version}-%{release}.src.rpm-debuginfo.%{arch}' */
-+ memmove (s2 + debuginfolen, s2, s - s2);
-+ memcpy (s2, "-debuginfo", debuginfolen);
-+ /* s = `XXXX.%{arch}' */
-+ /* strlen ("XXXX") == srcrpmlen + debuginfolen */
-+ /* s2 = `-debuginfo-%{version}-%{release}XX.%{arch}' */
-+ /* strlen ("XX") == srcrpmlen */
-+ memmove (s + debuginfolen, s + srcrpmlen + debuginfolen,
-+ strlen (s + srcrpmlen + debuginfolen) + 1);
-+ /* s = `-debuginfo-%{version}-%{release}.%{arch}' */
-+
-+ /* RPMDBI_PACKAGES requires keylen == sizeof (int). */
-+ /* RPMDBI_LABEL is an interface for NVR-based dbiFindByLabel(). */
-+ mi_debuginfo = rpmtsInitIterator_p (ts, (rpmTag) RPMDBI_LABEL, debuginfo, 0);
-+ xfree (debuginfo);
-+ if (mi_debuginfo)
-+ {
-+ rpmdbFreeIterator_p (mi_debuginfo);
-+ count = 0;
-+ break;
-+ }
-+
-+ /* The allocated memory gets utilized below for MISSING_RPM_HASH. */
-+ debuginfo = headerFormat_p (h,
-+ "%{name}-%{version}-%{release}.%{arch}",
-+ &err);
-+ if (!debuginfo)
-+ {
-+ warning (_("Error querying the rpm file `%s': %s"), filename,
-+ err);
-+ continue;
-+ }
-+
-+ /* Base package name for `debuginfo-install'. We do not use the
-+ `yum' command directly as the line
-+ yum --enablerepo='*debug*' install NAME-debuginfo.ARCH
-+ would be more complicated than just:
-+ debuginfo-install NAME-VERSION-RELEASE.ARCH
-+ Do not supply the rpm base name (derived from .src.rpm name) as
-+ debuginfo-install is unable to install the debuginfo package if
-+ the base name PKG binary rpm is not installed while for example
-+ PKG-libs would be installed (RH Bug 467901).
-+ FUTURE: After multiple debuginfo versions simultaneously installed
-+ get supported the support for the VERSION-RELEASE tags handling
-+ may need an update. */
-+
-+ if (missing_rpm_hash == NULL)
-+ {
-+ /* DEL_F is passed NULL as MISSING_RPM_LIST's HTAB_DELETE
-+ should not deallocate the entries. */
-+
-+ missing_rpm_hash = htab_create_alloc (64, htab_hash_string,
-+ (int (*) (const void *, const void *)) streq,
-+ NULL, xcalloc, xfree);
-+ }
-+ slot = (char **) htab_find_slot (missing_rpm_hash, debuginfo, INSERT);
-+ /* XCALLOC never returns NULL. */
-+ gdb_assert (slot != NULL);
-+ if (*slot == NULL)
-+ {
-+ struct missing_rpm *missing_rpm;
-+
-+ *slot = debuginfo;
-+
-+ missing_rpm = (struct missing_rpm *) xmalloc (sizeof (*missing_rpm) + strlen (debuginfo));
-+ strcpy (missing_rpm->rpm, debuginfo);
-+ missing_rpm->next = missing_rpm_list;
-+ missing_rpm_list = missing_rpm;
-+ missing_rpm_list_entries++;
-+ }
-+ else
-+ xfree (debuginfo);
-+ count++;
-+ }
-+#ifdef GDB_INDEX_VERIFY_VENDOR
-+ else /* verify_vendor */
-+ {
-+ int vendor_pass = 0, vendor_fail = 0;
-+
-+ for (;;)
-+ {
-+ Header h;
-+ errmsg_t err;
-+ char *vendor;
-+
-+ h = rpmdbNextIterator_p (mi);
-+ if (h == NULL)
-+ break;
-+
-+ vendor = headerFormat_p (h, "%{vendor}", &err);
-+ if (!vendor)
-+ {
-+ warning (_("Error querying the rpm file `%s': %s"), filename,
-+ err);
-+ continue;
-+ }
-+ if (strcmp (vendor, "Red Hat, Inc.") == 0)
-+ vendor_pass = 1;
-+ else
-+ vendor_fail = 1;
-+ xfree (vendor);
-+ }
-+ count = vendor_pass != 0 && vendor_fail == 0;
-+ }
-+#endif
-+
-+ rpmdbFreeIterator_p (mi);
-+ }
-+
-+ rpmtsFree_p (ts);
-+
-+ return count;
-+}
-+
-+#ifdef GDB_INDEX_VERIFY_VENDOR
-+missing_rpm_enlist (const char *filename)
-+{
-+ return missing_rpm_enlist_1 (filename, 0);
-+}
-+
-+extern int rpm_verify_vendor (const char *filename);
-+int
-+rpm_verify_vendor (const char *filename)
-+{
-+ return missing_rpm_enlist_1 (filename, 1);
-+}
-+#endif
-+
-+static bool
-+missing_rpm_list_compar (const char *ap, const char *bp)
-+{
-+ return strcoll (ap, bp) < 0;
-+}
-+
-+/* It returns a NULL-terminated array of strings needing to be FREEd. It may
-+ also return only NULL. */
-+
-+static void
-+missing_rpm_list_print (void)
-+{
-+ struct missing_rpm *list_iter;
-+
-+ if (missing_rpm_list_entries == 0)
-+ return;
-+
-+ std::vector<const char *> array (missing_rpm_list_entries);
-+ size_t idx = 0;
-+
-+ for (list_iter = missing_rpm_list; list_iter != NULL;
-+ list_iter = list_iter->next)
-+ {
-+ array[idx++] = list_iter->rpm;
-+ }
-+ gdb_assert (idx == missing_rpm_list_entries);
-+
-+ std::sort (array.begin (), array.end (), missing_rpm_list_compar);
-+
-+ /* We zero out the number of missing RPMs here because of a nasty
-+ bug (see RHBZ 1801974).
-+
-+ When we call 'puts_unfiltered' below, if pagination is on and if
-+ the number of missing RPMs is big enough to trigger pagination,
-+ we will end up in an infinite recursion. The call chain looks
-+ like this:
-+
-+ missing_rpm_list_print -> puts_unfiltered -> fputs_maybe_filtered
-+ -> prompt_for_continue -> display_gdb_prompt ->
-+ debug_flush_missing -> missing_rpm_list_print ...
-+
-+ For this reason, we make sure MISSING_RPM_LIST_ENTRIES is zero
-+ *before* calling any print function.
-+
-+ Note: kevinb/2023-02-22: The code below used to call
-+ puts_unfiltered() and printf_unfiltered(), but calls to these
-+ functions have been replaced by calls to gdb_printf(). The call
-+ chain shown above (probably) used to be the case at one time and
-+ hopefully something similar is still the case now that
-+ gdb_printf() is being used instead. */
-+ missing_rpm_list_entries = 0;
-+
-+ gdb_printf (_("Missing separate debuginfos, use: %s"),
-+#ifdef DNF_DEBUGINFO_INSTALL
-+ "dnf "
-+#endif
-+ "debuginfo-install");
-+ for (const char *el : array)
-+ {
-+ gdb_printf (" %s", el);
-+ }
-+ gdb_printf ("\n");
-+
-+ while (missing_rpm_list != NULL)
-+ {
-+ list_iter = missing_rpm_list;
-+ missing_rpm_list = list_iter->next;
-+ xfree (list_iter);
-+ }
-+}
-+
-+static void
-+missing_rpm_change (void)
-+{
-+ debug_flush_missing ();
-+
-+ gdb_assert (missing_rpm_list == NULL);
-+ if (missing_rpm_hash != NULL)
-+ {
-+ htab_delete (missing_rpm_hash);
-+ missing_rpm_hash = NULL;
-+ }
-+}
-+
-+enum missing_exec
-+ {
-+ /* Init state. EXEC_BFD also still could be NULL. */
-+ MISSING_EXEC_NOT_TRIED,
-+ /* We saw a non-NULL EXEC_BFD but RPM has no info about it. */
-+ MISSING_EXEC_NOT_FOUND,
-+ /* We found EXEC_BFD by RPM and we either have its symbols (either embedded
-+ or separate) or the main executable's RPM is now contained in
-+ MISSING_RPM_HASH. */
-+ MISSING_EXEC_ENLISTED
-+ };
-+static enum missing_exec missing_exec = MISSING_EXEC_NOT_TRIED;
-+
-+#endif /* HAVE_LIBRPM */
-+
-+void
-+debug_flush_missing (void)
-+{
-+#ifdef HAVE_LIBRPM
-+ missing_rpm_list_print ();
-+#endif
-+}
-+
+/* This MISSING_FILEPAIR_HASH tracker is used only for the duplicite messages
+ yum --enablerepo='*debug*' install ...
+ avoidance. */
@@ -1217,17 +740,11 @@ diff --git a/gdb/build-id.c b/gdb/build-id.c
+ /* All their memory came just from missing_filepair_OBSTACK. */
+ missing_filepair_hash = NULL;
+ }
-+#ifdef HAVE_LIBRPM
-+ missing_exec = MISSING_EXEC_NOT_TRIED;
-+#endif
+}
+
+static void
+debug_print_executable_changed (struct program_space *pspace, bool reload_p)
+{
-+#ifdef HAVE_LIBRPM
-+ missing_rpm_change ();
-+#endif
+ missing_filepair_change ();
+}
+
@@ -1294,55 +811,30 @@ diff --git a/gdb/build-id.c b/gdb/build-id.c
+
+ *slot = missing_filepair;
+
-+#ifdef HAVE_LIBRPM
-+ if (missing_exec == MISSING_EXEC_NOT_TRIED)
-+ {
-+ const char *execfilename = get_exec_file (0);
-+
-+ if (execfilename != NULL)
-+ {
-+ if (missing_rpm_enlist (execfilename) == 0)
-+ missing_exec = MISSING_EXEC_NOT_FOUND;
-+ else
-+ missing_exec = MISSING_EXEC_ENLISTED;
-+ }
-+ }
-+ if (missing_exec != MISSING_EXEC_ENLISTED)
-+ if ((binary[0] == 0 || missing_rpm_enlist (binary) == 0)
-+ && (debug == NULL || missing_rpm_enlist (debug) == 0))
-+#endif /* HAVE_LIBRPM */
-+ {
-+ /* We do not collect and flush these messages as each such message
-+ already requires its own separate lines. */
++ /* We do not collect and flush these messages as each such message
++ already requires its own separate lines. */
+
-+ gdb_printf (gdb_stdlog,
-+ _("Missing separate debuginfo for %s.\n"), binary);
-+ if (debug != NULL)
-+ {
-+ if (access (debug, F_OK) == 0) {
-+ gdb_printf (gdb_stdlog, _("Try: %s %s\n"),
++ gdb_printf (gdb_stdlog,
++ _("Missing separate debuginfo for %s.\n"), binary);
++ if (debug != NULL)
++ {
++ gdb_printf (gdb_stdlog, _("Try: %s %s\n"),
+#ifdef DNF_DEBUGINFO_INSTALL
-+ "dnf"
++ "dnf"
+#else
-+ "yum"
++ "yum"
+#endif
-+ " --enablerepo='*debug*' install", debug);
-+ } else
-+ gdb_printf (gdb_stdlog, _("The debuginfo package for this file is probably broken.\n"));
-+ }
-+ }
++ " --enablerepo='*debug*' install", debug);
++ }
+}
+
/* See build-id.h. */
gdb_bfd_ref_ptr
--build_id_to_debug_bfd (size_t build_id_len, const bfd_byte *build_id)
-+build_id_to_debug_bfd (size_t build_id_len, const bfd_byte *build_id,
-+ char **link_return)
+ build_id_to_debug_bfd (size_t build_id_len, const bfd_byte *build_id)
{
- return build_id_to_bfd_suffix (build_id_len, build_id, ".debug");
-+ return build_id_to_bfd_suffix (build_id_len, build_id, ".debug",
-+ link_return);
++ return build_id_to_bfd_suffix (build_id_len, build_id, ".debug", nullptr);
}
/* See build-id.h. */
@@ -1357,47 +849,15 @@ diff --git a/gdb/build-id.c b/gdb/build-id.c
}
/* See build-id.h. */
+@@ -224,6 +887,7 @@ find_separate_debug_file_by_buildid (struct objfile *objfile,
- std::string
- find_separate_debug_file_by_buildid (struct objfile *objfile,
-- deferred_warnings *warnings)
-+ deferred_warnings *warnings,
-+ gdb::unique_xmalloc_ptr<char> *build_id_filename_return)
- {
- const struct bfd_build_id *build_id;
-
-- build_id = build_id_bfd_get (objfile->obfd.get ());
-+ if (build_id_filename_return)
-+ *build_id_filename_return = NULL;
-+
-+ build_id = build_id_bfd_shdr_get (objfile->obfd.get ());
- if (build_id != NULL)
- {
- if (separate_debug_file_debug)
-@@ -222,8 +1358,21 @@ find_separate_debug_file_by_buildid (struct objfile *objfile,
- _("\nLooking for separate debug info (build-id) for "
- "%s\n"), objfile_name (objfile));
-
-+ char *build_id_filename_cstr = NULL;
gdb_bfd_ref_ptr abfd (build_id_to_debug_bfd (build_id->size,
-- build_id->data));
-+ build_id->data,
-+ (!build_id_filename_return ? NULL : &build_id_filename_cstr)));
-+ if (build_id_filename_return)
-+ {
-+ if (!build_id_filename_cstr)
-+ gdb_assert (!*build_id_filename_return);
-+ else
-+ {
-+ *build_id_filename_return = gdb::unique_xmalloc_ptr<char> (build_id_filename_cstr);
-+ build_id_filename_cstr = NULL;
-+ }
-+ }
+ build_id->data));
+
/* Prevent looping on a stripped .debug file. */
if (abfd != NULL
&& filename_cmp (bfd_get_filename (abfd.get ()),
-@@ -243,3 +1392,22 @@ find_separate_debug_file_by_buildid (struct objfile *objfile,
+@@ -243,3 +907,22 @@ find_separate_debug_file_by_buildid (struct objfile *objfile,
return std::string ();
}
@@ -1423,30 +883,13 @@ diff --git a/gdb/build-id.c b/gdb/build-id.c
diff --git a/gdb/build-id.h b/gdb/build-id.h
--- a/gdb/build-id.h
+++ b/gdb/build-id.h
-@@ -23,9 +23,10 @@
- #include "gdb_bfd.h"
- #include "gdbsupport/rsp-low.h"
-
--/* Locate NT_GNU_BUILD_ID from ABFD and return its content. */
-+/* Separate debuginfo files have corrupted PHDR but SHDR is correct there.
-+ Locate NT_GNU_BUILD_ID from ABFD and return its content. */
-
--extern const struct bfd_build_id *build_id_bfd_get (bfd *abfd);
-+extern const struct bfd_build_id *build_id_bfd_shdr_get (bfd *abfd);
-
- /* Return true if ABFD has NT_GNU_BUILD_ID matching the CHECK value.
- Otherwise, issue a warning and return false. */
-@@ -38,14 +39,19 @@ extern int build_id_verify (bfd *abfd,
- can be found, return NULL. */
-
+@@ -40,12 +40,16 @@ extern int build_id_verify (bfd *abfd,
extern gdb_bfd_ref_ptr build_id_to_debug_bfd (size_t build_id_len,
-- const bfd_byte *build_id);
-+ const bfd_byte *build_id,
-+ char **link_return = NULL);
-+
+ const bfd_byte *build_id);
+
+extern char *build_id_to_filename (const struct bfd_build_id *build_id,
+ char **link_return);
-
++
/* Find and open a BFD for an executable file given a build-id. If no BFD
can be found, return NULL. The returned reference to the BFD must be
released by the caller. */
@@ -1458,43 +901,20 @@ diff --git a/gdb/build-id.h b/gdb/build-id.h
/* Find the separate debug file for OBJFILE, by using the build-id
associated with OBJFILE's BFD. If successful, returns the file name for the
-@@ -58,7 +64,8 @@ extern gdb_bfd_ref_ptr build_id_to_exec_bfd (size_t build_id_len,
- will be printed. */
-
- extern std::string find_separate_debug_file_by_buildid
-- (struct objfile *objfile, deferred_warnings *warnings);
-+ (struct objfile *objfile, deferred_warnings *warnings,
-+ gdb::unique_xmalloc_ptr<char> *build_id_filename_return);
-
- /* Return an hex-string representation of BUILD_ID. */
-
-diff --git a/gdb/coffread.c b/gdb/coffread.c
---- a/gdb/coffread.c
-+++ b/gdb/coffread.c
-@@ -729,7 +729,7 @@ coff_symfile_read (struct objfile *objfile, symfile_add_flags symfile_flags)
- {
- deferred_warnings warnings;
- std::string debugfile
-- = find_separate_debug_file_by_buildid (objfile, &warnings);
-+ = find_separate_debug_file_by_buildid (objfile, &warnings, NULL);
-
- if (debugfile.empty ())
- debugfile
diff --git a/gdb/corelow.c b/gdb/corelow.c
--- a/gdb/corelow.c
+++ b/gdb/corelow.c
-@@ -22,6 +22,10 @@
+@@ -21,6 +21,9 @@
#include <signal.h>
#include <fcntl.h>
#include "frame.h"
+#include "auxv.h"
+#include "build-id.h"
+#include "elf/common.h"
-+#include "gdbcmd.h"
#include "inferior.h"
#include "infrun.h"
#include "symtab.h"
-@@ -380,6 +384,8 @@ add_to_thread_list (asection *asect, asection *reg_sect, inferior *inf)
+@@ -383,6 +386,8 @@ add_to_thread_list (asection *asect, asection *reg_sect, inferior *inf)
switch_to_thread (thr); /* Yes, make it current. */
}
@@ -1503,12 +923,7 @@ diff --git a/gdb/corelow.c b/gdb/corelow.c
/* Issue a message saying we have no core to debug, if FROM_TTY. */
static void
-@@ -563,12 +569,14 @@ rename_vmcore_idle_reg_sections (bfd *abfd, inferior *inf)
- static void
- locate_exec_from_corefile_build_id (bfd *abfd, int from_tty)
- {
-- const bfd_build_id *build_id = build_id_bfd_get (abfd);
-+ const bfd_build_id *build_id = build_id_bfd_shdr_get (abfd);
+@@ -570,8 +575,10 @@ locate_exec_from_corefile_build_id (bfd *abfd, int from_tty)
if (build_id == nullptr)
return;
@@ -1520,7 +935,7 @@ diff --git a/gdb/corelow.c b/gdb/corelow.c
if (execbfd == nullptr)
{
-@@ -596,7 +604,12 @@ locate_exec_from_corefile_build_id (bfd *abfd, int from_tty)
+@@ -599,7 +606,12 @@ locate_exec_from_corefile_build_id (bfd *abfd, int from_tty)
exec_file_attach (bfd_get_filename (execbfd.get ()), from_tty);
symbol_file_add_main (bfd_get_filename (execbfd.get ()),
symfile_add_flag (from_tty ? SYMFILE_VERBOSE : 0));
@@ -1533,7 +948,7 @@ diff --git a/gdb/corelow.c b/gdb/corelow.c
}
/* See gdbcore.h. */
-@@ -1506,4 +1519,11 @@ _initialize_corelow ()
+@@ -1524,4 +1536,11 @@ _initialize_corelow ()
maintenance_print_core_file_backed_mappings,
_("Print core file's file-backed mappings."),
&maintenanceprintlist);
@@ -1548,7 +963,7 @@ diff --git a/gdb/corelow.c b/gdb/corelow.c
diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
--- a/gdb/doc/gdb.texinfo
+++ b/gdb/doc/gdb.texinfo
-@@ -22296,6 +22296,27 @@ information files.
+@@ -22487,6 +22487,27 @@ information files.
@end table
@@ -1576,110 +991,10 @@ diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
@cindex @code{.gnu_debuglink} sections
@cindex debug link sections
A debug link is a special section of the executable file named
-diff --git a/gdb/dwarf2/index-cache.c b/gdb/dwarf2/index-cache.c
---- a/gdb/dwarf2/index-cache.c
-+++ b/gdb/dwarf2/index-cache.c
-@@ -96,7 +96,7 @@ index_cache_store_context::index_cache_store_context (const index_cache &ic,
- return;
-
- /* Get build id of objfile. */
-- const bfd_build_id *build_id = build_id_bfd_get (per_bfd->obfd);
-+ const bfd_build_id *build_id = build_id_bfd_shdr_get (per_bfd->obfd);
- if (build_id == nullptr)
- {
- index_cache_debug ("objfile %s has no build id",
-@@ -111,7 +111,8 @@ index_cache_store_context::index_cache_store_context (const index_cache &ic,
-
- if (dwz != nullptr)
- {
-- const bfd_build_id *dwz_build_id = build_id_bfd_get (dwz->dwz_bfd.get ());
-+ const bfd_build_id *dwz_build_id
-+ = build_id_bfd_shdr_get (dwz->dwz_bfd.get ());
-
- if (dwz_build_id == nullptr)
- {
-diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c
---- a/gdb/dwarf2/read.c
-+++ b/gdb/dwarf2/read.c
-@@ -3355,7 +3355,7 @@ get_gdb_index_contents_from_section (objfile *obj, T *section_owner)
- static gdb::array_view<const gdb_byte>
- get_gdb_index_contents_from_cache (objfile *obj, dwarf2_per_bfd *dwarf2_per_bfd)
- {
-- const bfd_build_id *build_id = build_id_bfd_get (obj->obfd.get ());
-+ const bfd_build_id *build_id = build_id_bfd_shdr_get (obj->obfd.get ());
- if (build_id == nullptr)
- return {};
-
-@@ -3368,7 +3368,7 @@ get_gdb_index_contents_from_cache (objfile *obj, dwarf2_per_bfd *dwarf2_per_bfd)
- static gdb::array_view<const gdb_byte>
- get_gdb_index_contents_from_cache_dwz (objfile *obj, dwz_file *dwz)
- {
-- const bfd_build_id *build_id = build_id_bfd_get (dwz->dwz_bfd.get ());
-+ const bfd_build_id *build_id = build_id_bfd_shdr_get (dwz->dwz_bfd.get ());
- if (build_id == nullptr)
- return {};
-
-diff --git a/gdb/elfread.c b/gdb/elfread.c
---- a/gdb/elfread.c
-+++ b/gdb/elfread.c
-@@ -1220,8 +1220,10 @@ elf_symfile_read_dwarf2 (struct objfile *objfile,
- {
- deferred_warnings warnings;
-
-+ gdb::unique_xmalloc_ptr<char> build_id_filename;
- std::string debugfile
-- = find_separate_debug_file_by_buildid (objfile, &warnings);
-+ = find_separate_debug_file_by_buildid (objfile, &warnings,
-+ &build_id_filename);
-
- if (debugfile.empty ())
- debugfile = find_separate_debug_file_by_debuglink (objfile, &warnings);
-@@ -1239,7 +1241,7 @@ elf_symfile_read_dwarf2 (struct objfile *objfile,
- {
- has_dwarf2 = false;
- const struct bfd_build_id *build_id
-- = build_id_bfd_get (objfile->obfd.get ());
-+ = build_id_bfd_shdr_get (objfile->obfd.get ());
- const char *filename = bfd_get_filename (objfile->obfd.get ());
-
- if (build_id != nullptr)
-@@ -1265,6 +1267,11 @@ elf_symfile_read_dwarf2 (struct objfile *objfile,
- has_dwarf2 = true;
- }
- }
-+ /* Check if any separate debug info has been extracted out. */
-+ else if (bfd_get_section_by_name (objfile->obfd.get (),
-+ ".gnu_debuglink")
-+ != NULL)
-+ debug_print_missing (objfile_name (objfile), build_id_filename.get ());
- }
- }
- /* If all the methods to collect the debuginfo failed, print the
-diff --git a/gdb/exec.c b/gdb/exec.c
---- a/gdb/exec.c
-+++ b/gdb/exec.c
-@@ -237,7 +237,7 @@ validate_exec_file (int from_tty)
- current_exec_file = get_exec_file (0);
-
- const bfd_build_id *exec_file_build_id
-- = build_id_bfd_get (current_program_space->exec_bfd ());
-+ = build_id_bfd_shdr_get (current_program_space->exec_bfd ());
- if (exec_file_build_id != nullptr)
- {
- /* Prepend the target prefix, to force gdb_bfd_open to open the
-@@ -250,7 +250,7 @@ validate_exec_file (int from_tty)
- if (abfd != nullptr)
- {
- const bfd_build_id *target_exec_file_build_id
-- = build_id_bfd_get (abfd.get ());
-+ = build_id_bfd_shdr_get (abfd.get ());
-
- if (target_exec_file_build_id != nullptr)
- {
diff --git a/gdb/objfiles.h b/gdb/objfiles.h
--- a/gdb/objfiles.h
+++ b/gdb/objfiles.h
-@@ -884,6 +884,10 @@ struct objfile
+@@ -877,6 +877,10 @@ struct objfile
bool object_format_has_copy_relocs = false;
};
@@ -1690,27 +1005,6 @@ diff --git a/gdb/objfiles.h b/gdb/objfiles.h
/* A deleter for objfile. */
struct objfile_deleter
-diff --git a/gdb/python/py-objfile.c b/gdb/python/py-objfile.c
---- a/gdb/python/py-objfile.c
-+++ b/gdb/python/py-objfile.c
-@@ -158,7 +158,7 @@ objfpy_get_build_id (PyObject *self, void *closure)
-
- try
- {
-- build_id = build_id_bfd_get (objfile->obfd.get ());
-+ build_id = build_id_bfd_shdr_get (objfile->obfd.get ());
- }
- catch (const gdb_exception &except)
- {
-@@ -629,7 +629,7 @@ gdbpy_lookup_objfile (PyObject *self, PyObject *args, PyObject *kw)
- if (obfd == nullptr)
- return 0;
-
-- const bfd_build_id *obfd_build_id = build_id_bfd_get (obfd);
-+ const bfd_build_id *obfd_build_id = build_id_bfd_shdr_get (obfd);
- if (obfd_build_id == nullptr)
- return 0;
-
diff --git a/gdb/solib-svr4.c b/gdb/solib-svr4.c
--- a/gdb/solib-svr4.c
+++ b/gdb/solib-svr4.c
@@ -1722,84 +1016,57 @@ diff --git a/gdb/solib-svr4.c b/gdb/solib-svr4.c
#include <map>
-@@ -1318,9 +1319,51 @@ svr4_read_so_list (svr4_info *info, CORE_ADDR lm, CORE_ADDR prev_lm,
+@@ -1262,6 +1263,46 @@ svr4_read_so_list (svr4_info *info, CORE_ADDR lm, CORE_ADDR prev_lm,
continue;
}
-- strncpy (newobj->so_name, buffer.get (), SO_NAME_MAX_PATH_SIZE - 1);
-- newobj->so_name[SO_NAME_MAX_PATH_SIZE - 1] = '\0';
-- strcpy (newobj->so_original_name, newobj->so_name);
-+ {
-+ struct bfd_build_id *build_id;
-+
-+ strncpy (newobj->so_original_name, buffer.get (), SO_NAME_MAX_PATH_SIZE - 1);
-+ newobj->so_original_name[SO_NAME_MAX_PATH_SIZE - 1] = '\0';
-+ /* May get overwritten below. */
-+ strcpy (newobj->so_name, newobj->so_original_name);
-+
-+ build_id = build_id_addr_get (((lm_info_svr4 *) newobj->lm_info)->l_ld);
-+ if (build_id != NULL)
-+ {
-+ char *name, *build_id_filename;
-+
-+ /* Missing the build-id matching separate debug info file
-+ would be handled while SO_NAME gets loaded. */
-+ name = build_id_to_filename (build_id, &build_id_filename);
-+ if (name != NULL)
-+ {
-+ strncpy (newobj->so_name, name, SO_NAME_MAX_PATH_SIZE - 1);
-+ newobj->so_name[SO_NAME_MAX_PATH_SIZE - 1] = '\0';
-+ xfree (name);
-+ }
-+ else
-+ {
-+ debug_print_missing (newobj->so_name, build_id_filename);
-+
-+ /* In the case the main executable was found according to
-+ its build-id (from a core file) prevent loading
-+ a different build of a library with accidentally the
-+ same SO_NAME.
-+
-+ It suppresses bogus backtraces (and prints "??" there
-+ instead) if the on-disk files no longer match the
-+ running program version. */
-+
-+ if (current_program_space->symfile_object_file != NULL
-+ && (current_program_space->symfile_object_file->flags
-+ & OBJF_BUILD_ID_CORE_LOADED) != 0)
-+ newobj->so_name[0] = 0;
-+ }
-+
-+ xfree (build_id_filename);
-+ xfree (build_id);
-+ }
-+ }
-
++ {
++ struct bfd_build_id *build_id;
++
++ build_id = build_id_addr_get (li->l_ld);
++ if (build_id != NULL)
++ {
++ char *bid_name, *build_id_filename;
++
++ /* Missing the build-id matching separate debug info file
++ would be handled while SO_NAME gets loaded. */
++ bid_name = build_id_to_filename (build_id, &build_id_filename);
++ if (bid_name != NULL)
++ {
++ name = make_unique_xstrdup (bid_name);
++ xfree (bid_name);
++ }
++ else
++ {
++ debug_print_missing (name.get (), build_id_filename);
++
++ /* In the case the main executable was found according to
++ its build-id (from a core file) prevent loading
++ a different build of a library with accidentally the
++ same SO_NAME.
++
++ It suppresses bogus backtraces (and prints "??" there
++ instead) if the on-disk files no longer match the
++ running program version. */
++
++ if (current_program_space->symfile_object_file != NULL
++ && (current_program_space->symfile_object_file->flags
++ & OBJF_BUILD_ID_CORE_LOADED) != 0)
++ name = make_unique_xstrdup ("");
++ }
++
++ xfree (build_id_filename);
++ xfree (build_id);
++ }
++ }
++
/* If this entry has no name, or its name matches the name
for the main executable, don't include it in the list. */
-diff --git a/gdb/source.c b/gdb/source.c
---- a/gdb/source.c
-+++ b/gdb/source.c
-@@ -1167,7 +1167,7 @@ open_source_file (struct symtab *s)
- }
-
- const struct bfd_build_id *build_id
-- = build_id_bfd_get (ofp->obfd.get ());
-+ = build_id_bfd_shdr_get (ofp->obfd.get ());
-
- /* Query debuginfod for the source file. */
- if (build_id != nullptr && !srcpath.empty ())
+ if (*name == '\0' || match_main (name.get ()))
diff --git a/gdb/symfile.h b/gdb/symfile.h
--- a/gdb/symfile.h
+++ b/gdb/symfile.h
-@@ -357,12 +357,18 @@ bool expand_symtabs_matching
- void map_symbol_filenames (gdb::function_view<symbol_filename_ftype> fun,
- bool need_fullname);
-
-+
- /* Target-agnostic function to load the sections of an executable into memory.
-
- ARGS should be in the form "EXECUTABLE [OFFSET]", where OFFSET is an
+@@ -363,6 +363,11 @@ void map_symbol_filenames (gdb::function_view<symbol_filename_ftype> fun,
optional offset to apply to each section. */
extern void generic_load (const char *args, int from_tty);
@@ -1864,10 +1131,12 @@ diff --git a/gdb/testsuite/gdb.base/gdbinit-history.exp b/gdb/testsuite/gdb.base
diff --git a/gdb/testsuite/gdb.base/new-ui-pending-input.exp b/gdb/testsuite/gdb.base/new-ui-pending-input.exp
--- a/gdb/testsuite/gdb.base/new-ui-pending-input.exp
+++ b/gdb/testsuite/gdb.base/new-ui-pending-input.exp
-@@ -62,6 +62,7 @@ proc test_command_line_new_ui_pending_input {} {
+@@ -60,6 +60,9 @@ proc test_command_line_new_ui_pending_input {} {
+ set bpline [gdb_get_line_number "set breakpoint here"]
+
set options ""
- append options " -iex \"set height 0\""
- append options " -iex \"set width 0\""
++ append options " -iex \"set height 0\""
++ append options " -iex \"set width 0\""
+ append options " -iex \"set build-id-verbose 0\""
append options " -iex \"new-ui console $extra_tty_name\""
append options " -ex \"b $bpline\""
@@ -1875,7 +1144,7 @@ diff --git a/gdb/testsuite/gdb.base/new-ui-pending-input.exp b/gdb/testsuite/gdb
diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp
--- a/gdb/testsuite/lib/gdb.exp
+++ b/gdb/testsuite/lib/gdb.exp
-@@ -226,7 +226,8 @@ if ![info exists INTERNAL_GDBFLAGS] {
+@@ -238,7 +238,8 @@ if ![info exists INTERNAL_GDBFLAGS] {
"-nx" \
"-q" \
{-iex "set height 0"} \
@@ -1885,7 +1154,7 @@ diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp
# If DEBUGINFOD_URLS is set, gdb will try to download sources and
# debug info for f.i. system libraries. Prevent this.
-@@ -2434,6 +2435,17 @@ proc default_gdb_start { } {
+@@ -2493,6 +2494,17 @@ proc default_gdb_start { } {
}
}
================================================================
---- gitweb:
http://git.pld-linux.org/gitweb.cgi/packages/gdb.git/commitdiff/4528ecde4121e96e86f0a532c3a6b9b341162e18
More information about the pld-cvs-commit
mailing list