]> git.pld-linux.org Git - packages/gdb.git/blobdiff - gdb-6.6-buildid-locate-rpm.patch
- up to 8.3
[packages/gdb.git] / gdb-6.6-buildid-locate-rpm.patch
index 9e850ddb72436dca5619af925468a4df7bd690d3..3f7c6519c24ef2026ea15c31481114eb55b900e0 100644 (file)
@@ -1,89 +1,14 @@
-Index: gdb-7.9.90.20150717/gdb/event-top.c
-===================================================================
---- gdb-7.9.90.20150717.orig/gdb/event-top.c   2015-07-17 03:59:12.000000000 +0200
-+++ gdb-7.9.90.20150717/gdb/event-top.c        2015-08-01 20:07:15.822993674 +0200
-@@ -37,6 +37,7 @@
- #include "gdbcmd.h"           /* for dont_repeat() */
- #include "annotate.h"
- #include "maint.h"
-+#include "symfile.h"
- /* readline include files.  */
- #include "readline/readline.h"
-@@ -180,6 +181,8 @@ rl_callback_read_char_wrapper (gdb_clien
- void
- cli_command_loop (void *data)
- {
-+  debug_flush_missing ();
-+
-   display_gdb_prompt (0);
-   /* Now it's time to start the event loop.  */
-@@ -298,6 +301,8 @@ display_gdb_prompt (const char *new_prom
-   /* Reset the nesting depth used when trace-commands is set.  */
-   reset_command_nest_depth ();
-+  debug_flush_missing ();
-+
-   old_chain = make_cleanup (free_current_contents, &actual_gdb_prompt);
-   /* Do not call the python hook on an explicit prompt change as
-Index: gdb-7.9.90.20150717/gdb/symfile.h
-===================================================================
---- gdb-7.9.90.20150717.orig/gdb/symfile.h     2015-08-01 20:07:15.787993404 +0200
-+++ gdb-7.9.90.20150717/gdb/symfile.h  2015-08-01 20:07:15.822993674 +0200
-@@ -587,6 +587,8 @@ void map_symbol_filenames (symbol_filena
- /* 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 dwarf2read.c */
-Index: gdb-7.9.90.20150717/gdb/testsuite/lib/gdb.exp
-===================================================================
---- gdb-7.9.90.20150717.orig/gdb/testsuite/lib/gdb.exp 2015-08-01 20:07:15.789993420 +0200
-+++ gdb-7.9.90.20150717/gdb/testsuite/lib/gdb.exp      2015-08-01 20:07:15.824993689 +0200
-@@ -1573,7 +1573,7 @@ proc default_gdb_start { } {
-           warning "Couldn't set the width to 0."
-       }
-     }
--    # Turn off the missing warnings as the testsuite does not expect it.
-+    # Turn off the missing RPMs warnings as the testsuite does not expect it.
-     send_gdb "set build-id-verbose 0\n"
-     gdb_expect 10 {
-       -re "$gdb_prompt $" {
-Index: gdb-7.9.90.20150717/gdb/testsuite/lib/mi-support.exp
-===================================================================
---- gdb-7.9.90.20150717.orig/gdb/testsuite/lib/mi-support.exp  2015-08-01 20:07:15.789993420 +0200
-+++ gdb-7.9.90.20150717/gdb/testsuite/lib/mi-support.exp       2015-08-01 20:07:15.824993689 +0200
-@@ -214,7 +214,7 @@ proc default_mi_gdb_start { args } {
-           warning "Couldn't set the width to 0."
-       }
-     }
--    # Turn off the missing warnings as the testsuite does not expect it.
-+    # Turn off the missing RPMs warnings as the testsuite does not expect it.
-     send_gdb "190-gdb-set build-id-verbose 0\n"
-     gdb_expect 10 {
-       -re ".*190-gdb-set build-id-verbose 0\r\n190\\\^done\r\n$mi_gdb_prompt$" {
-Index: gdb-7.9.90.20150717/gdb/tui/tui-interp.c
-===================================================================
---- gdb-7.9.90.20150717.orig/gdb/tui/tui-interp.c      2015-07-17 03:59:13.000000000 +0200
-+++ gdb-7.9.90.20150717/gdb/tui/tui-interp.c   2015-08-01 20:07:15.825993697 +0200
-@@ -31,6 +31,7 @@
- #include "tui/tui-io.h"
- #include "infrun.h"
- #include "observer.h"
-+#include "symfile.h"
- static struct ui_out *tui_ui_out (struct interp *self);
-Index: gdb-7.9.90.20150717/gdb/aclocal.m4
-===================================================================
---- gdb-7.9.90.20150717.orig/gdb/aclocal.m4    2015-07-17 03:59:12.000000000 +0200
-+++ gdb-7.9.90.20150717/gdb/aclocal.m4 2015-08-01 20:07:15.825993697 +0200
-@@ -11,6 +11,221 @@
+From FEDORA_PATCHES Mon Sep 17 00:00:00 2001
+From: Fedora GDB patches <invalid@email.com>
+Date: Fri, 27 Oct 2017 21:07:50 +0200
+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.
  
@@ -301,592 +226,541 @@ Index: gdb-7.9.90.20150717/gdb/aclocal.m4
 +
 +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, 2003, 2005  Free Software Foundation, Inc.
-Index: gdb-7.9.90.20150717/gdb/config.in
-===================================================================
---- gdb-7.9.90.20150717.orig/gdb/config.in     2015-07-17 03:59:12.000000000 +0200
-+++ gdb-7.9.90.20150717/gdb/config.in  2015-08-01 20:07:15.826993704 +0200
-@@ -33,6 +33,9 @@
- /* Define to BFD's default target vector. */
- #undef DEFAULT_BFD_VEC
+ # 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
+@@ -35,6 +35,8 @@
+ #include "elf/common.h"
+ #include "elf-bfd.h"
+ #include <sys/stat.h>
++#include "elf/external.h"
++#include "inferior.h"
  
-+/* 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
-@@ -258,6 +261,9 @@
- /* Define if Python 2.7 is being used. */
- #undef HAVE_LIBPYTHON2_7
+ #define BUILD_ID_VERBOSE_NONE 0
+ #define BUILD_ID_VERBOSE_FILENAMES 1
+@@ -700,8 +702,366 @@ build_id_to_filename (const struct bfd_build_id *build_id, char **link_return)
+   return result;
+ }
  
-+/* Define if librpm library is being used. */
-+#undef HAVE_LIBRPM
++#ifdef HAVE_LIBRPM
 +
- /* Define to 1 if you have the <libunwind-ia64.h> header file. */
- #undef HAVE_LIBUNWIND_IA64_H
-Index: gdb-7.9.90.20150717/gdb/configure
-===================================================================
---- gdb-7.9.90.20150717.orig/gdb/configure     2015-07-17 03:59:12.000000000 +0200
-+++ gdb-7.9.90.20150717/gdb/configure  2015-08-01 20:07:15.830993735 +0200
-@@ -703,6 +703,11 @@ PKGVERSION
- HAVE_NATIVE_GCORE_TARGET
- TARGET_OBS
- subdirs
-+RPM_LIBS
-+RPM_CFLAGS
-+PKG_CONFIG_LIBDIR
-+PKG_CONFIG_PATH
-+PKG_CONFIG
- GDB_DATADIR
- DEBUGDIR
- MAKEINFO_EXTRA_FLAGS
-@@ -811,6 +816,7 @@ with_gdb_datadir
- with_relocated_sources
- with_auto_load_dir
- with_auto_load_safe_path
-+with_rpm
- enable_targets
- enable_64_bit_bfd
- enable_gdbcli
-@@ -867,6 +873,11 @@ CCC
- CPP
- MAKEINFO
- MAKEINFOFLAGS
-+PKG_CONFIG
-+PKG_CONFIG_PATH
-+PKG_CONFIG_LIBDIR
-+RPM_CFLAGS
-+RPM_LIBS
- YACC
- YFLAGS
- XMKMF'
-@@ -1538,6 +1549,8 @@ Optional Packages:
-                           [--with-auto-load-dir]
-   --without-auto-load-safe-path
-                           do not restrict auto-loaded files locations
-+  --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
-@@ -1592,6 +1605,13 @@ Some influential environment variables:
-   MAKEINFO    Parent configure detects if it is of sufficient version.
-   MAKEINFOFLAGS
-               Parameters for MAKEINFO.
-+  PKG_CONFIG  path to pkg-config utility
-+  PKG_CONFIG_PATH
-+              directories to add to pkg-config's search path
-+  PKG_CONFIG_LIBDIR
-+              path overriding pkg-config's built-in search path
-+  RPM_CFLAGS  C compiler flags for RPM, overriding pkg-config
-+  RPM_LIBS    linker flags for RPM, overriding pkg-config
-   YACC        The `Yet Another C Compiler' implementation to use. Defaults to
-               the first program found out of: `bison -y', `byacc', `yacc'.
-   YFLAGS      The list of arguments that will be passed by default to $YACC.
-@@ -5608,6 +5628,491 @@ _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').
++#include <rpm/rpmlib.h>
++#include <rpm/rpmts.h>
++#include <rpm/rpmdb.h>
++#include <rpm/header.h>
++#ifdef DLOPEN_LIBRPM
++#include <dlfcn.h>
++#endif
 +
++/* This MISSING_RPM_HASH tracker is used to collect all the missing rpm files
++   and avoid their duplicities during a single inferior run.  */
 +
-+# Check whether --with-rpm was given.
-+if test "${with_rpm+set}" = set; then :
-+  withval=$with_rpm;
-+else
-+  with_rpm="auto"
-+fi
++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.  */
 +
-+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"'"'
++static int
++missing_rpm_enlist (const char *filename)
++{
++  static int rpm_init_done = 0;
++  rpmts ts;
++  rpmdbMatchIterator mi;
++  int count = 0;
 +
-+  { $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.  */
++#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 */
 +
-+#include <rpm/rpmlib.h>
-+#include <dlfcn.h>
-+#include <errno.h>
++  gdb_assert (filename != NULL);
 +
-+int
-+main ()
-+{
++  if (strcmp (filename, BUILD_ID_MAIN_EXECUTABLE_FILENAME) == 0)
++    return 0;
 +
-+    void *h;
-+    const char *const *rpmverp;
-+    FILE *f;
++  if (is_target_filename (filename))
++    return 0;
 +
-+    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);
++  if (filename[0] != '/')
++    {
++      warning (_("Ignoring non-absolute filename: <%s>"), filename);
++      return 0;
++    }
 +
-+    /* Try to find the specific librpm version only for "librpm.so" as we do
-+       not know how to assemble the version string otherwise.  */
++  if (!rpm_init_done)
++    {
++      static int init_tried;
 +
-+    if (strcmp ("librpm.so", $LIBRPM_STRING) != 0)
-+      {
-+      fprintf (f, "%s\n", $LIBRPM_STRING);
-+      return 0;
-+      }
-+    else
++      /* Already failed the initialization before?  */
++      if (init_tried)
++              return 0;
++      init_tried = 1;
++
++#ifdef DLOPEN_LIBRPM
 +      {
-+      char *h2_name;
-+      void *h2;
-+      int major, minor;
++      void *h;
 +
-+      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)
++      h = dlopen (DLOPEN_LIBRPM, RTLD_LAZY);
++      if (!h)
 +        {
-+          fprintf (stderr, "dlopen (\"%s\"): %s\n", h2_name, dlerror ());
-+          fprintf (f, "%s\n", $LIBRPM_STRING);
++          warning (_("Unable to open \"%s\" (%s), "
++                    "missing debuginfos notifications will not be displayed"),
++                   DLOPEN_LIBRPM, dlerror ());
 +          return 0;
 +        }
-+      if (h2 != h)
++
++      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"))))
 +        {
-+          fprintf (stderr, "dlopen of \"%s\" and \"%s\" are different.\n",
-+                   $LIBRPM_STRING, h2_name);
-+          fprintf (f, "%s\n", $LIBRPM_STRING);
++          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;
 +        }
-+      /* Found the valid .so name with a specific version.  */
-+      fprintf (f, "%s\n", h2_name);
-+      return 0;
 +      }
++#endif        /* DLOPEN_LIBRPM */
 +
-+  ;
-+  return 0;
-+}
-+_ACEOF
-+if ac_fn_c_try_run "$LINENO"; then :
++      if (rpmReadConfigFiles_p (NULL, NULL) != 0)
++      {
++        warning (_("Error reading the rpm configuration files"));
++        return 0;
++      }
 +
-+    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
++      rpm_init_done = 1;
++    }
 +
-+fi
-+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-+  conftest.$ac_objext conftest.beam conftest.$ac_ext
-+fi
++  ts = rpmtsCreate_p ();
 +
-+  rm -f conftest.out
++  mi = rpmtsInitIterator_p (ts, RPMTAG_BASENAMES, filename, 0);
++  if (mi != NULL)
++    {
++      for (;;)
++      {
++        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.  */
 +
-+  if $HAVE_DLOPEN_LIBRPM; then
++        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}' */
 +
-+    { $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.  */
++        /* 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;
++          }
 +
-+/* 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, rpmTag rpmtag,
-+                                          const void * keyp, size_t keylen);
++        /* 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;
++          }
 +
-+int
-+main ()
-+{
++        /* 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.  */
 +
-+  ;
-+  return 0;
-+}
-+_ACEOF
-+if ac_fn_c_try_compile "$LINENO"; then :
++        if (missing_rpm_hash == NULL)
++          {
++            /* DEL_F is passed NULL as MISSING_RPM_LIST's HTAB_DELETE
++               should not deallocate the entries.  */
 +
-+      LIBRPM_COMPAT=true
-+      { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-+$as_echo "yes" >&6; }
++            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;
 +
-+else
++            *slot = debuginfo;
 +
-+      LIBRPM_COMPAT=false
-+      { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-+$as_echo "no" >&6; }
++            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++;
++      }
 +
-+fi
-+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-+    CFLAGS="$save_CFLAGS"
++      rpmdbFreeIterator_p (mi);
++    }
 +
-+    if ! $LIBRPM_COMPAT; then
-+      HAVE_DLOPEN_LIBRPM=false
-+    fi
-+  fi
++  rpmtsFree_p (ts);
 +
-+  if $HAVE_DLOPEN_LIBRPM; then
-+    DLOPEN_LIBRPM_STRING='"'"$DLOPEN_LIBRPM"'"'
++  return count;
++}
 +
-+cat >>confdefs.h <<_ACEOF
-+#define DLOPEN_LIBRPM $DLOPEN_LIBRPM_STRING
-+_ACEOF
++static int
++missing_rpm_list_compar (const char *const *ap, const char *const *bp)
++{
++  return strcoll (*ap, *bp);
++}
 +
++/* It returns a NULL-terminated array of strings needing to be FREEd.  It may
++   also return only NULL.  */
 +
-+$as_echo "#define HAVE_LIBRPM 1" >>confdefs.h
++static void
++missing_rpm_list_print (void)
++{
++  char **array, **array_iter;
++  struct missing_rpm *list_iter;
++  struct cleanup *cleanups;
 +
-+  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 (missing_rpm_list_entries == 0)
++    return;
 +
++  array = (char **) xmalloc (sizeof (*array) * missing_rpm_list_entries);
++  cleanups = make_cleanup (xfree, array);
 +
++  array_iter = array;
++  for (list_iter = missing_rpm_list; list_iter != NULL;
++       list_iter = list_iter->next)
++    {
++      *array_iter++ = list_iter->rpm;
++    }
++  gdb_assert (array_iter == array + missing_rpm_list_entries);
 +
++  qsort (array, missing_rpm_list_entries, sizeof (*array),
++       (int (*) (const void *, const void *)) missing_rpm_list_compar);
 +
++  printf_unfiltered (_("Missing separate debuginfos, use: %s"),
++#ifdef DNF_DEBUGINFO_INSTALL
++                   "dnf "
++#endif
++                   "debuginfo-install");
++  for (array_iter = array; array_iter < array + missing_rpm_list_entries;
++       array_iter++)
++    {
++      putchar_unfiltered (' ');
++      puts_unfiltered (*array_iter);
++    }
++  putchar_unfiltered ('\n');
 +
++  while (missing_rpm_list != NULL)
++    {
++      list_iter = missing_rpm_list;
++      missing_rpm_list = list_iter->next;
++      xfree (list_iter);
++    }
++  missing_rpm_list_entries = 0;
 +
-+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`
-+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`
-+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 "rpm" 2>&1`
-+        else
-+              RPM_PKG_ERRORS=`$PKG_CONFIG --print-errors "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, rpmTag rpmtag,
-+                                          const void * keyp, size_t keylen);
++  do_cleanups (cleanups);
++}
 +
-+int
-+main ()
++static void
++missing_rpm_change (void)
 +{
++  debug_flush_missing ();
 +
-+  ;
-+  return 0;
++  gdb_assert (missing_rpm_list == NULL);
++  if (missing_rpm_hash != NULL)
++    {
++      htab_delete (missing_rpm_hash);
++      missing_rpm_hash = NULL;
++    }
 +}
-+_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"
++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;
 +
-+      if ! $LIBRPM_COMPAT; then
-+      HAVE_LIBRPM=false
-+      RPM_PKG_ERRORS="Found $LIBRPM API is incompatibile with this GDB"
-+      fi
-+    fi
++#endif        /* HAVE_LIBRPM */
 +
-+    if $HAVE_LIBRPM; then
++void
++debug_flush_missing (void)
++{
++#ifdef HAVE_LIBRPM
++  missing_rpm_list_print ();
++#endif
++}
 +
-+$as_echo "#define HAVE_LIBRPM 1" >>confdefs.h
+ /* This MISSING_FILEPAIR_HASH tracker is used only for the duplicite messages
+-     Try to install the hash file ...
++     yum --enablerepo='*debug*' install ...
+    avoidance.  */
+ struct missing_filepair
+@@ -755,11 +1115,17 @@ missing_filepair_change (void)
+       /* 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 (void)
+ {
++#ifdef HAVE_LIBRPM
++  missing_rpm_change ();
++#endif
+   missing_filepair_change ();
+ }
+@@ -826,14 +1192,39 @@ debug_print_missing (const char *binary, const char *debug)
+   *slot = missing_filepair;
+-  /* We do not collect and flush these messages as each such message
+-     already requires its own separate lines.  */
++#ifdef HAVE_LIBRPM
++  if (missing_exec == MISSING_EXEC_NOT_TRIED)
++    {
++      char *execfilename;
+-  fprintf_unfiltered (gdb_stdlog,
+-                    _("Missing separate debuginfo for %s\n"), binary);
+-  if (debug != NULL)
+-    fprintf_unfiltered (gdb_stdlog, _("Try to install the hash file %s\n"),
+-                      debug);
++      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.  */
 +
-+      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
++      fprintf_unfiltered (gdb_stdlog,
++                          _("Missing separate debuginfo for %s\n"), binary);
++        if (debug != NULL)
++        fprintf_unfiltered (gdb_stdlog, _("Try: %s %s\n"),
++#ifdef DNF_DEBUGINFO_INSTALL
++                            "dnf"
++#else
++                            "yum"
++#endif
++                            " --enablerepo='*debug*' install", debug);
++      }
+ }
+ /* See build-id.h.  */
+diff --git a/gdb/config.in b/gdb/config.in
+--- a/gdb/config.in
++++ b/gdb/config.in
+@@ -33,6 +33,9 @@
+ /* Define to BFD's default target vector. */
+ #undef DEFAULT_BFD_VEC
++/* 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
+@@ -255,6 +258,9 @@
+ /* Define if Python 2.7 is being used. */
+ #undef HAVE_LIBPYTHON2_7
  
++/* 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
  
- subdirs="$subdirs testsuite"
-Index: gdb-7.9.90.20150717/gdb/configure.ac
-===================================================================
---- gdb-7.9.90.20150717.orig/gdb/configure.ac  2015-07-17 03:59:12.000000000 +0200
-+++ gdb-7.9.90.20150717/gdb/configure.ac       2015-08-01 20:07:15.831993743 +0200
-@@ -177,6 +177,199 @@ AC_DEFINE_DIR(AUTO_LOAD_SAFE_PATH, escap
-             [Directories safe to hold auto-loaded files.])
- AC_MSG_RESULT([$with_auto_load_safe_path])
+diff --git a/gdb/configure b/gdb/configure
+--- a/gdb/configure
++++ b/gdb/configure
+@@ -751,6 +751,11 @@ CODESIGN_CERT
+ HAVE_NATIVE_GCORE_TARGET
+ TARGET_OBS
+ subdirs
++RPM_LIBS
++RPM_CFLAGS
++PKG_CONFIG_LIBDIR
++PKG_CONFIG_PATH
++PKG_CONFIG
+ GDB_DATADIR
+ DEBUGDIR
+ MAKEINFO_EXTRA_FLAGS
+@@ -855,6 +860,7 @@ with_gdb_datadir
+ with_relocated_sources
+ with_auto_load_dir
+ with_auto_load_safe_path
++with_rpm
+ enable_targets
+ enable_64_bit_bfd
+ enable_gdbmi
+@@ -914,6 +920,11 @@ CCC
+ CPP
+ MAKEINFO
+ MAKEINFOFLAGS
++PKG_CONFIG
++PKG_CONFIG_PATH
++PKG_CONFIG_LIBDIR
++RPM_CFLAGS
++RPM_LIBS
+ YACC
+ YFLAGS
+ XMKMF'
+@@ -1585,6 +1596,8 @@ Optional Packages:
+                           [--with-auto-load-dir]
+   --without-auto-load-safe-path
+                           do not restrict auto-loaded files locations
++  --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
+@@ -1642,6 +1655,13 @@ Some influential environment variables:
+   MAKEINFO    Parent configure detects if it is of sufficient version.
+   MAKEINFOFLAGS
+               Parameters for MAKEINFO.
++  PKG_CONFIG  path to pkg-config utility
++  PKG_CONFIG_PATH
++              directories to add to pkg-config's search path
++  PKG_CONFIG_LIBDIR
++              path overriding pkg-config's built-in search path
++  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'.
+@@ -6623,6 +6643,494 @@ _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.
@@ -904,12 +778,17 @@ Index: gdb-7.9.90.20150717/gdb/configure.ac
 +# (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$])
++# 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"
@@ -926,15 +805,28 @@ Index: gdb-7.9.90.20150717/gdb/configure.ac
 +  fi
 +  LIBRPM_STRING='"'"$LIBRPM"'"'
 +
-+  AC_MSG_CHECKING([specific librpm version])
++  { $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"
-+  AC_RUN_IFELSE(AC_LANG_PROGRAM([[
++  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>
-+  ]], [[
++
++int
++main ()
++{
++
 +    void *h;
 +    const char *const *rpmverp;
 +    FILE *f;
@@ -1002,21 +894,39 @@ Index: gdb-7.9.90.20150717/gdb/configure.ac
 +      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
-+      AC_MSG_RESULT($DLOPEN_LIBRPM)
++      { $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
 +
-+  m4_define([CHECK_LIBRPM_COMPAT], [
-+    AC_MSG_CHECKING([rpm library API compatibility])
++
++
++  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"
-+    AC_COMPILE_IFELSE(AC_LANG_PROGRAM([[
++    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>
@@ -1030,18 +940,31 @@ Index: gdb-7.9.90.20150717/gdb/configure.ac
 +extern rpmts rpmtsFree(rpmts ts);
 +extern rpmdbMatchIterator rpmtsInitIterator(const rpmts ts, rpmTag rpmtag,
 +                                          const void * keyp, size_t keylen);
-+    ]]), [
++
++int
++main ()
++{
++
++  ;
++  return 0;
++}
++_ACEOF
++if ac_fn_c_try_compile "$LINENO"; then :
++
 +      LIBRPM_COMPAT=true
-+      AC_MSG_RESULT(yes)
-+    ], [
++      { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
++$as_echo "yes" >&6; }
++
++else
++
 +      LIBRPM_COMPAT=false
-+      AC_MSG_RESULT(no)
-+    ])
++      { $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 $HAVE_DLOPEN_LIBRPM; then
-+    CHECK_LIBRPM_COMPAT
 +    if ! $LIBRPM_COMPAT; then
 +      HAVE_DLOPEN_LIBRPM=false
 +    fi
@@ -1049,493 +972,543 @@ Index: gdb-7.9.90.20150717/gdb/configure.ac
 +
 +  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
-Index: gdb-7.9.90.20150717/gdb/corelow.c
-===================================================================
---- gdb-7.9.90.20150717.orig/gdb/corelow.c     2015-08-01 20:07:15.775993312 +0200
-+++ gdb-7.9.90.20150717/gdb/corelow.c  2015-08-01 20:07:15.831993743 +0200
-@@ -310,7 +310,7 @@ build_id_locate_exec (int from_tty)
-         symfile_objfile->flags |= OBJF_BUILD_ID_CORE_LOADED;
-     }
-   else
--    debug_print_missing (_("the main executable file"), build_id_filename);
-+    debug_print_missing (BUILD_ID_MAIN_EXECUTABLE_FILENAME, build_id_filename);
-   do_cleanups (back_to);
-Index: gdb-7.9.90.20150717/gdb/build-id.c
-===================================================================
---- gdb-7.9.90.20150717.orig/gdb/build-id.c    2015-08-01 20:07:15.791993435 +0200
-+++ gdb-7.9.90.20150717/gdb/build-id.c 2015-08-01 20:08:27.735546630 +0200
-@@ -35,6 +35,7 @@
- #include "elf/common.h"
- #include "elf-bfd.h"
- #include <sys/stat.h>
-+#include "elf/external.h"
- #define BUILD_ID_VERBOSE_NONE 0
- #define BUILD_ID_VERBOSE_FILENAMES 1
-@@ -665,8 +666,363 @@ build_id_to_filename (const struct bfd_b
-   return result;
- }
-+#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
-+
-+/* 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;
++cat >>confdefs.h <<_ACEOF
++#define DLOPEN_LIBRPM $DLOPEN_LIBRPM_STRING
++_ACEOF
 +
-+/* Returns the count of newly added rpms.  */
 +
-+static int
-+missing_rpm_enlist (const char *filename)
-+{
-+  static int rpm_init_done = 0;
-+  rpmts ts;
-+  rpmdbMatchIterator mi;
-+  int count = 0;
++$as_echo "#define HAVE_LIBRPM 1" >>confdefs.h
 +
-+#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 */
++  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
 +
-+  gdb_assert (filename != NULL);
 +
-+  if (strcmp (filename, BUILD_ID_MAIN_EXECUTABLE_FILENAME) == 0)
-+    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 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
 +
-+      if (!((headerFormat_p = dlsym (h, "headerFormat"))
-+            && (rpmReadConfigFiles_p = dlsym (h, "rpmReadConfigFiles"))
-+            && (rpmdbFreeIterator_p = dlsym (h, "rpmdbFreeIterator"))
-+            && (rpmdbNextIterator_p = dlsym (h, "rpmdbNextIterator"))
-+            && (rpmtsCreate_p = dlsym (h, "rpmtsCreate"))
-+            && (rpmtsFree_p = dlsym (h, "rpmtsFree"))
-+            && (rpmtsInitIterator_p = 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 */
++  ;;
++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
 +
-+      if (rpmReadConfigFiles_p (NULL, NULL) != 0)
-+      {
-+        warning (_("Error reading the rpm configuration files"));
-+        return 0;
-+      }
 +
-+      rpm_init_done = 1;
-+    }
++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
 +
-+  ts = rpmtsCreate_p ();
++  ;;
++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
 +
-+  mi = rpmtsInitIterator_p (ts, RPMTAG_BASENAMES, filename, 0);
-+  if (mi != NULL)
-+    {
-+      for (;;)
-+      {
-+        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;
++  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
 +
-+        h = rpmdbNextIterator_p (mi);
-+        if (h == NULL)
-+          break;
++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
 +
-+        /* Verify the debuginfo file is not already installed.  */
++pkg_failed=no
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for RPM" >&5
++$as_echo_n "checking for RPM... " >&6; }
 +
-+        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 = memrchr (debuginfo, '-', s - debuginfo);
-+          }
-+        if (s2)
-+          {
-+            /* s2 = `-%{version}-%{release}.src.rpm-debuginfo.%{arch}' */
-+            s2 = 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}' */
++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
 +
-+        /* RPMDBI_PACKAGES requires keylen == sizeof (int).  */
-+        /* RPMDBI_LABEL is an interface for NVR-based dbiFindByLabel().  */
-+        mi_debuginfo = rpmtsInitIterator_p (ts, 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 test $pkg_failed = yes; then
++      { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
++$as_echo "no" >&6; }
 +
-+        if (missing_rpm_hash == NULL)
-+          {
-+            /* DEL_F is passed NULL as MISSING_RPM_LIST's HTAB_DELETE
-+               should not deallocate the entries.  */
++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
 +
-+            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;
++      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
 +
-+            *slot = debuginfo;
++    if $HAVE_LIBRPM; then
 +
-+            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++;
-+      }
++    { $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.  */
 +
-+      rpmdbFreeIterator_p (mi);
-+    }
++/* 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, rpmTag rpmtag,
++                                          const void * keyp, size_t keylen);
 +
-+  rpmtsFree_p (ts);
++int
++main ()
++{
 +
-+  return count;
++  ;
++  return 0;
 +}
++_ACEOF
++if ac_fn_c_try_compile "$LINENO"; then :
 +
-+static int
-+missing_rpm_list_compar (const char *const *ap, const char *const *bp)
-+{
-+  return strcoll (*ap, *bp);
-+}
++      LIBRPM_COMPAT=true
++      { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
++$as_echo "yes" >&6; }
 +
-+/* It returns a NULL-terminated array of strings needing to be FREEd.  It may
-+   also return only NULL.  */
++else
 +
-+static void
-+missing_rpm_list_print (void)
-+{
-+  char **array, **array_iter;
-+  struct missing_rpm *list_iter;
-+  struct cleanup *cleanups;
++      LIBRPM_COMPAT=false
++      { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
++$as_echo "no" >&6; }
 +
-+  if (missing_rpm_list_entries == 0)
-+    return;
++fi
++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
++    CFLAGS="$save_CFLAGS"
 +
-+  array = xmalloc (sizeof (*array) * missing_rpm_list_entries);
-+  cleanups = make_cleanup (xfree, array);
++      if ! $LIBRPM_COMPAT; then
++      HAVE_LIBRPM=false
++      RPM_PKG_ERRORS="Found $LIBRPM API is incompatibile with this GDB"
++      fi
++    fi
 +
-+  array_iter = array;
-+  for (list_iter = missing_rpm_list; list_iter != NULL;
-+       list_iter = list_iter->next)
-+    {
-+      *array_iter++ = list_iter->rpm;
-+    }
-+  gdb_assert (array_iter == array + missing_rpm_list_entries);
++    if $HAVE_LIBRPM; then
 +
-+  qsort (array, missing_rpm_list_entries, sizeof (*array),
-+       (int (*) (const void *, const void *)) missing_rpm_list_compar);
++$as_echo "#define HAVE_LIBRPM 1" >>confdefs.h
 +
-+  printf_unfiltered (_("Missing separate debuginfos, use: %s"),
-+#ifdef DNF_DEBUGINFO_INSTALL
-+                   "dnf "
-+#endif
-+                   "debuginfo-install");
-+  for (array_iter = array; array_iter < array + missing_rpm_list_entries;
-+       array_iter++)
-+    {
-+      putchar_unfiltered (' ');
-+      puts_unfiltered (*array_iter);
-+    }
-+  putchar_unfiltered ('\n');
++      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
+@@ -166,6 +166,199 @@ 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>
++  ]], [[
++    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);
 +
-+  while (missing_rpm_list != NULL)
-+    {
-+      list_iter = missing_rpm_list;
-+      missing_rpm_list = list_iter->next;
-+      xfree (list_iter);
-+    }
-+  missing_rpm_list_entries = 0;
++    /* Try to find the specific librpm version only for "librpm.so" as we do
++       not know how to assemble the version string otherwise.  */
 +
-+  do_cleanups (cleanups);
-+}
++    if (strcmp ("librpm.so", $LIBRPM_STRING) != 0)
++      {
++      fprintf (f, "%s\n", $LIBRPM_STRING);
++      return 0;
++      }
++    else
++      {
++      char *h2_name;
++      void *h2;
++      int major, minor;
 +
-+static void
-+missing_rpm_change (void)
-+{
-+  debug_flush_missing ();
++      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
 +
-+  gdb_assert (missing_rpm_list == NULL);
-+  if (missing_rpm_hash != NULL)
-+    {
-+      htab_delete (missing_rpm_hash);
-+      missing_rpm_hash = NULL;
-+    }
-+}
++  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, rpmTag rpmtag,
++                                          const void * keyp, size_t keylen);
++    ]]), [
++      LIBRPM_COMPAT=true
++      AC_MSG_RESULT(yes)
++    ], [
++      LIBRPM_COMPAT=false
++      AC_MSG_RESULT(no)
++    ])
++    CFLAGS="$save_CFLAGS"
++  ])
 +
-+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;
++  if $HAVE_DLOPEN_LIBRPM; then
++    CHECK_LIBRPM_COMPAT
++    if ! $LIBRPM_COMPAT; then
++      HAVE_DLOPEN_LIBRPM=false
++    fi
++  fi
 +
-+#endif        /* HAVE_LIBRPM */
++  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])
 +
-+void
-+debug_flush_missing (void)
-+{
-+#ifdef HAVE_LIBRPM
-+  missing_rpm_list_print ();
-+#endif
-+}
++    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
 +
- /* This MISSING_FILEPAIR_HASH tracker is used only for the duplicite messages
--     Try to install the hash file ...
-+     yum --enablerepo='*debug*' install ...
-    avoidance.  */
++    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)
  
- struct missing_filepair
-@@ -720,11 +1076,17 @@ missing_filepair_change (void)
-       /* All their memory came just from missing_filepair_OBSTACK.  */
-       missing_filepair_hash = NULL;
+ # Check whether to support alternative target configurations
+diff --git a/gdb/corelow.c b/gdb/corelow.c
+--- a/gdb/corelow.c
++++ b/gdb/corelow.c
+@@ -365,7 +365,7 @@ build_id_locate_exec (int from_tty)
+         symfile_objfile->flags |= OBJF_BUILD_ID_CORE_LOADED;
      }
-+#ifdef HAVE_LIBRPM
-+  missing_exec = MISSING_EXEC_NOT_TRIED;
-+#endif
- }
+   else
+-    debug_print_missing (_("the main executable file"), build_id_filename);
++    debug_print_missing (BUILD_ID_MAIN_EXECUTABLE_FILENAME, build_id_filename);
  
- static void
- debug_print_executable_changed (void)
- {
-+#ifdef HAVE_LIBRPM
-+  missing_rpm_change ();
-+#endif
-   missing_filepair_change ();
- }
+   do_cleanups (back_to);
  
-@@ -791,14 +1153,39 @@ debug_print_missing (const char *binary,
+diff --git a/gdb/event-top.c b/gdb/event-top.c
+--- a/gdb/event-top.c
++++ b/gdb/event-top.c
+@@ -40,6 +40,7 @@
+ #include "common/buffer.h"
+ #include "ser-event.h"
+ #include "gdb_select.h"
++#include "symfile.h"
  
-   *slot = missing_filepair;
+ /* readline include files.  */
+ #include "readline/readline.h"
+@@ -359,6 +360,8 @@ display_gdb_prompt (const char *new_prompt)
+   /* Reset the nesting depth used when trace-commands is set.  */
+   reset_command_nest_depth ();
  
--  /* We do not collect and flush these messages as each such message
--     already requires its own separate lines.  */
-+#ifdef HAVE_LIBRPM
-+  if (missing_exec == MISSING_EXEC_NOT_TRIED)
-+    {
-+      char *execfilename;
++  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.  */
+@@ -770,7 +773,10 @@ command_line_handler (gdb::unique_xmalloc_ptr<char> &&rl)
+       command_handler (cmd);
  
--  fprintf_unfiltered (gdb_stdlog,
--                    _("Missing separate debuginfo for %s\n"), binary);
--  if (debug != NULL)
--    fprintf_unfiltered (gdb_stdlog, _("Try to install the hash file %s\n"),
--                      debug);
-+      execfilename = get_exec_file (0);
-+      if (execfilename != NULL)
+       if (ui->prompt_state != PROMPTED)
+-      display_gdb_prompt (0);
 +      {
-+        if (missing_rpm_enlist (execfilename) == 0)
-+          missing_exec = MISSING_EXEC_NOT_FOUND;
-+        else
-+          missing_exec = MISSING_EXEC_ENLISTED;
++        debug_flush_missing ();
++        display_gdb_prompt (0);
 +      }
-+    }
-+  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.  */
-+
-+      fprintf_unfiltered (gdb_stdlog,
-+                          _("Missing separate debuginfo for %s\n"), binary);
-+        if (debug != NULL)
-+        fprintf_unfiltered (gdb_stdlog, _("Try: %s %s\n"),
-+#ifdef DNF_DEBUGINFO_INSTALL
-+                            "dnf"
-+#else
-+                            "yum"
-+#endif
-+                            " --enablerepo='*debug*' install", debug);
-+      }
+     }
  }
  
- /* See build-id.h.  */
+diff --git a/gdb/symfile.h b/gdb/symfile.h
+--- a/gdb/symfile.h
++++ b/gdb/symfile.h
+@@ -534,6 +534,8 @@ void map_symbol_filenames (symbol_filename_ftype *fun, void *data,
+ /* 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 dwarf2read.c */
This page took 0.133024 seconds and 4 git commands to generate.