gdb/
[deliverable/binutils-gdb.git] / gdb / elfread.c
index dd844fc8dbf07c66862e76809d813746ae3d94af..200b82fac1c6cdeebdd586d9c341a39bca9bb57b 100644 (file)
@@ -1,7 +1,7 @@
 /* Read ELF (Executable and Linking Format) object files for GDB.
 
    Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
-   2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
+   2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
    Free Software Foundation, Inc.
 
    Written by Fred Fish at Cygnus Support.
 #include "gdb-stabs.h"
 #include "complaints.h"
 #include "demangle.h"
+#include "psympriv.h"
+#include "filenames.h"
 
 extern void _initialize_elfread (void);
 
+/* Forward declarations.  */
+static const struct sym_fns elf_sym_fns_gdb_index;
+static const struct sym_fns elf_sym_fns_lazy_psyms;
+
 /* The struct elfinfo is available only during ELF symbol table and
    psymtab reading.  It is destroyed at the completion of psymtab-reading.
    It's local to elf_symfile_read.  */
@@ -148,7 +154,7 @@ elf_symfile_segments (bfd *abfd)
 
    FIXME: The section names should not be hardwired strings (what
    should they be?  I don't think most object file formats have enough
-   section flags to specify what kind of debug section it is
+   section flags to specify what kind of debug section it is.
    -kingdon).  */
 
 static void
@@ -179,7 +185,8 @@ record_minimal_symbol (const char *name, int name_len, int copy_name,
 {
   struct gdbarch *gdbarch = get_objfile_arch (objfile);
 
-  if (ms_type == mst_text || ms_type == mst_file_text)
+  if (ms_type == mst_text || ms_type == mst_file_text
+      || ms_type == mst_text_gnu_ifunc)
     address = gdbarch_smash_text_address (gdbarch, address);
 
   return prim_record_minimal_symbol_full (name, name_len, copy_name, address,
@@ -222,7 +229,6 @@ elf_symtab_read (struct objfile *objfile, int type,
                 int copy_names)
 {
   struct gdbarch *gdbarch = get_objfile_arch (objfile);
-  long storage_needed;
   asymbol *sym;
   long i;
   CORE_ADDR symaddr;
@@ -239,6 +245,7 @@ elf_symtab_read (struct objfile *objfile, int type,
   char *filesymname = "";
   struct dbx_symfile_info *dbx = objfile->deprecated_sym_stab_info;
   int stripped = (bfd_get_symcount (objfile->obfd) == 0);
+  struct cleanup *back_to = make_cleanup (null_cleanup, NULL);
 
   for (i = 0; i < number_of_symbols; i++)
     {
@@ -246,7 +253,7 @@ elf_symtab_read (struct objfile *objfile, int type,
       if (sym->name == NULL || *sym->name == '\0')
        {
          /* Skip names that don't exist (shouldn't happen), or names
-            that are null strings (may happen). */
+            that are null strings (may happen).  */
          continue;
        }
 
@@ -275,7 +282,7 @@ elf_symtab_read (struct objfile *objfile, int type,
             of the corresponding entry in the procedure linkage table,
             plus the desired section offset.
             If its value is zero then the dynamic linker has to resolve
-            the symbol. We are unable to find any meaningful address
+            the symbol.  We are unable to find any meaningful address
             for this symbol in the executable file, so we skip it.  */
          symaddr = sym->value;
          if (symaddr == 0)
@@ -336,8 +343,8 @@ elf_symtab_read (struct objfile *objfile, int type,
 
          /* Select global/local/weak symbols.  Note that bfd puts abs
             symbols in their own section, so all symbols we are
-            interested in will have a section. */
-         /* Bfd symbols are section relative. */
+            interested in will have a section.  */
+         /* Bfd symbols are section relative.  */
          symaddr = sym->value + sym->section->vma;
          /* Relocate all non-absolute and non-TLS symbols by the
             section offset.  */
@@ -348,7 +355,7 @@ elf_symtab_read (struct objfile *objfile, int type,
            }
          /* For non-absolute symbols, use the type of the section
             they are relative to, to intuit text/data.  Bfd provides
-            no way of figuring this out for absolute symbols. */
+            no way of figuring this out for absolute symbols.  */
          if (sym->section == &bfd_abs_section)
            {
              /* This is a hack to get the minimal symbol type
@@ -376,7 +383,7 @@ elf_symtab_read (struct objfile *objfile, int type,
                }
 
              /* If it is an Irix dynamic symbol, skip section name
-                symbols, relocate all others by section offset. */
+                symbols, relocate all others by section offset.  */
              if (ms_type != mst_abs)
                {
                  if (sym->name[0] == '.')
@@ -388,7 +395,10 @@ elf_symtab_read (struct objfile *objfile, int type,
            {
              if (sym->flags & (BSF_GLOBAL | BSF_WEAK))
                {
-                 ms_type = mst_text;
+                 if (sym->flags & BSF_GNU_INDIRECT_FUNCTION)
+                   ms_type = mst_text_gnu_ifunc;
+                 else
+                   ms_type = mst_text;
                }
              else if ((sym->name[0] == '.' && sym->name[1] == 'L')
                       || ((sym->flags & BSF_LOCAL)
@@ -425,6 +435,7 @@ elf_symtab_read (struct objfile *objfile, int type,
                  /* Named Local variable in a Data section.
                     Check its name for stabs-in-elf.  */
                  int special_local_sect;
+
                  if (strcmp ("Bbss.bss", sym->name) == 0)
                    special_local_sect = SECT_OFF_BSS (objfile);
                  else if (strcmp ("Ddata.data", sym->name) == 0)
@@ -456,16 +467,17 @@ elf_symtab_read (struct objfile *objfile, int type,
                             need to allocate max_index aadditional
                             elements.  */
                          size = (sizeof (struct stab_section_info) 
-                                 + (sizeof (CORE_ADDR)
-                                    * max_index));
+                                 + (sizeof (CORE_ADDR) * max_index));
                          sectinfo = (struct stab_section_info *)
                            xmalloc (size);
+                         make_cleanup (xfree, sectinfo);
                          memset (sectinfo, 0, size);
                          sectinfo->num_sections = max_index;
                          if (filesym == NULL)
                            {
                              complaint (&symfile_complaints,
-                                        _("elf/stab section information %s without a preceding file symbol"),
+                                        _("elf/stab section information %s "
+                                          "without a preceding file symbol"),
                                         sym->name);
                            }
                          else
@@ -476,7 +488,8 @@ elf_symtab_read (struct objfile *objfile, int type,
                        }
                      if (sectinfo->sections[special_local_sect] != 0)
                        complaint (&symfile_complaints,
-                                  _("duplicated elf/stab section information for %s"),
+                                  _("duplicated elf/stab section "
+                                    "information for %s"),
                                   sectinfo->filename);
                      /* BFD symbols are section relative.  */
                      symaddr = sym->value + sym->section->vma;
@@ -512,7 +525,7 @@ elf_symtab_read (struct objfile *objfile, int type,
                 hob with actions like finding what function the PC
                 is in.  Ignore them if they aren't text, data, or bss.  */
              /* ms_type = mst_unknown; */
-             continue; /* Skip this symbol. */
+             continue; /* Skip this symbol.  */
            }
          msym = record_minimal_symbol
            (sym->name, strlen (sym->name), copy_names, symaddr,
@@ -566,6 +579,150 @@ elf_symtab_read (struct objfile *objfile, int type,
            }
        }
     }
+  do_cleanups (back_to);
+}
+
+struct build_id
+  {
+    size_t size;
+    gdb_byte data[1];
+  };
+
+/* Locate NT_GNU_BUILD_ID from ABFD and return its content.  */
+
+static struct build_id *
+build_id_bfd_get (bfd *abfd)
+{
+  struct build_id *retval;
+
+  if (!bfd_check_format (abfd, bfd_object)
+      || bfd_get_flavour (abfd) != bfd_target_elf_flavour
+      || elf_tdata (abfd)->build_id == NULL)
+    return NULL;
+
+  retval = xmalloc (sizeof *retval - 1 + elf_tdata (abfd)->build_id_size);
+  retval->size = elf_tdata (abfd)->build_id_size;
+  memcpy (retval->data, elf_tdata (abfd)->build_id, retval->size);
+
+  return retval;
+}
+
+/* Return if FILENAME has NT_GNU_BUILD_ID matching the CHECK value.  */
+
+static int
+build_id_verify (const char *filename, struct build_id *check)
+{
+  bfd *abfd;
+  struct build_id *found = NULL;
+  int retval = 0;
+
+  /* We expect to be silent on the non-existing files.  */
+  abfd = bfd_open_maybe_remote (filename);
+  if (abfd == NULL)
+    return 0;
+
+  found = build_id_bfd_get (abfd);
+
+  if (found == NULL)
+    warning (_("File \"%s\" has no build-id, file skipped"), filename);
+  else if (found->size != check->size
+           || memcmp (found->data, check->data, found->size) != 0)
+    warning (_("File \"%s\" has a different build-id, file skipped"),
+            filename);
+  else
+    retval = 1;
+
+  gdb_bfd_close_or_warn (abfd);
+
+  xfree (found);
+
+  return retval;
+}
+
+static char *
+build_id_to_debug_filename (struct build_id *build_id)
+{
+  char *link, *debugdir, *retval = NULL;
+
+  /* DEBUG_FILE_DIRECTORY/.build-id/ab/cdef */
+  link = alloca (strlen (debug_file_directory) + (sizeof "/.build-id/" - 1) + 1
+                + 2 * build_id->size + (sizeof ".debug" - 1) + 1);
+
+  /* Keep backward compatibility so that DEBUG_FILE_DIRECTORY being "" will
+     cause "/.build-id/..." lookups.  */
+
+  debugdir = debug_file_directory;
+  do
+    {
+      char *s, *debugdir_end;
+      gdb_byte *data = build_id->data;
+      size_t size = build_id->size;
+
+      while (*debugdir == DIRNAME_SEPARATOR)
+       debugdir++;
+
+      debugdir_end = strchr (debugdir, DIRNAME_SEPARATOR);
+      if (debugdir_end == NULL)
+       debugdir_end = &debugdir[strlen (debugdir)];
+
+      memcpy (link, debugdir, debugdir_end - debugdir);
+      s = &link[debugdir_end - debugdir];
+      s += sprintf (s, "/.build-id/");
+      if (size > 0)
+       {
+         size--;
+         s += sprintf (s, "%02x", (unsigned) *data++);
+       }
+      if (size > 0)
+       *s++ = '/';
+      while (size-- > 0)
+       s += sprintf (s, "%02x", (unsigned) *data++);
+      strcpy (s, ".debug");
+
+      /* lrealpath() is expensive even for the usually non-existent files.  */
+      if (access (link, F_OK) == 0)
+       retval = lrealpath (link);
+
+      if (retval != NULL && !build_id_verify (retval, build_id))
+       {
+         xfree (retval);
+         retval = NULL;
+       }
+
+      if (retval != NULL)
+       break;
+
+      debugdir = debugdir_end;
+    }
+  while (*debugdir != 0);
+
+  return retval;
+}
+
+static char *
+find_separate_debug_file_by_buildid (struct objfile *objfile)
+{
+  struct build_id *build_id;
+
+  build_id = build_id_bfd_get (objfile->obfd);
+  if (build_id != NULL)
+    {
+      char *build_id_name;
+
+      build_id_name = build_id_to_debug_filename (build_id);
+      xfree (build_id);
+      /* Prevent looping on a stripped .debug file.  */
+      if (build_id_name != NULL
+         && filename_cmp (build_id_name, objfile->name) == 0)
+        {
+         warning (_("\"%s\": separate debug info file has no debug info"),
+                  build_id_name);
+         xfree (build_id_name);
+       }
+      else if (build_id_name != NULL)
+        return build_id_name;
+    }
+  return NULL;
 }
 
 /* Scan and build partial symbols for a symbol file.
@@ -602,7 +759,6 @@ elf_symfile_read (struct objfile *objfile, int symfile_flags)
   bfd *abfd = objfile->obfd;
   struct elfinfo ei;
   struct cleanup *back_to;
-  CORE_ADDR offset;
   long symcount = 0, dynsymcount = 0, synthcount, storage_needed;
   asymbol **symbol_table = NULL, **dyn_symbol_table = NULL;
   asymbol *synthsyms;
@@ -612,19 +768,22 @@ elf_symfile_read (struct objfile *objfile, int symfile_flags)
 
   memset ((char *) &ei, 0, sizeof (ei));
 
-  /* Allocate struct to keep track of the symfile */
+  /* Allocate struct to keep track of the symfile */
   objfile->deprecated_sym_stab_info = (struct dbx_symfile_info *)
     xmalloc (sizeof (struct dbx_symfile_info));
-  memset ((char *) objfile->deprecated_sym_stab_info, 0, sizeof (struct dbx_symfile_info));
+  memset ((char *) objfile->deprecated_sym_stab_info,
+         0, sizeof (struct dbx_symfile_info));
   make_cleanup (free_elfinfo, (void *) objfile);
 
-  /* Process the normal ELF symbol table first.  This may write some 
-     chain of info into the dbx_symfile_info in objfile->deprecated_sym_stab_info,
-     which can later be used by elfstab_offset_sections.  */
+  /* Process the normal ELF symbol table first.  This may write some
+     chain of info into the dbx_symfile_info in
+     objfile->deprecated_sym_stab_info, which can later be used by
+     elfstab_offset_sections.  */
 
   storage_needed = bfd_get_symtab_upper_bound (objfile->obfd);
   if (storage_needed < 0)
-    error (_("Can't read symbols from %s: %s"), bfd_get_filename (objfile->obfd),
+    error (_("Can't read symbols from %s: %s"),
+          bfd_get_filename (objfile->obfd),
           bfd_errmsg (bfd_get_error ()));
 
   if (storage_needed > 0)
@@ -634,7 +793,8 @@ elf_symfile_read (struct objfile *objfile, int symfile_flags)
       symcount = bfd_canonicalize_symtab (objfile->obfd, symbol_table);
 
       if (symcount < 0)
-       error (_("Can't read symbols from %s: %s"), bfd_get_filename (objfile->obfd),
+       error (_("Can't read symbols from %s: %s"),
+              bfd_get_filename (objfile->obfd),
               bfd_errmsg (bfd_get_error ()));
 
       elf_symtab_read (objfile, ST_REGULAR, symcount, symbol_table, 0);
@@ -646,13 +806,20 @@ elf_symfile_read (struct objfile *objfile, int symfile_flags)
 
   if (storage_needed > 0)
     {
-      dyn_symbol_table = (asymbol **) xmalloc (storage_needed);
-      make_cleanup (xfree, dyn_symbol_table);
+      /* Memory gets permanently referenced from ABFD after
+        bfd_get_synthetic_symtab so it must not get freed before ABFD gets.
+        It happens only in the case when elf_slurp_reloc_table sees
+        asection->relocation NULL.  Determining which section is asection is
+        done by _bfd_elf_get_synthetic_symtab which is all a bfd
+        implementation detail, though.  */
+
+      dyn_symbol_table = bfd_alloc (abfd, storage_needed);
       dynsymcount = bfd_canonicalize_dynamic_symtab (objfile->obfd,
                                                     dyn_symbol_table);
 
       if (dynsymcount < 0)
-       error (_("Can't read symbols from %s: %s"), bfd_get_filename (objfile->obfd),
+       error (_("Can't read symbols from %s: %s"),
+              bfd_get_filename (objfile->obfd),
               bfd_errmsg (bfd_get_error ()));
 
       elf_symtab_read (objfile, ST_DYNAMIC, dynsymcount, dyn_symbol_table, 0);
@@ -673,7 +840,8 @@ elf_symfile_read (struct objfile *objfile, int symfile_flags)
       for (i = 0; i < synthcount; i++)
        synth_symbol_table[i] = synthsyms + i;
       make_cleanup (xfree, synth_symbol_table);
-      elf_symtab_read (objfile, ST_SYNTHETIC, synthcount, synth_symbol_table, 1);
+      elf_symtab_read (objfile, ST_SYNTHETIC, synthcount,
+                      synth_symbol_table, 1);
     }
 
   /* Install any minimal symbols that have been collected as the current
@@ -686,9 +854,9 @@ elf_symfile_read (struct objfile *objfile, int symfile_flags)
   do_cleanups (back_to);
 
   /* Now process debugging information, which is contained in
-     special ELF sections. */
+     special ELF sections.  */
 
-  /* We first have to find them... */
+  /* We first have to find them...  */
   bfd_map_over_sections (abfd, elf_locate_sections, (void *) & ei);
 
   /* ELF debugging information is inserted into the psymtab in the
@@ -701,7 +869,7 @@ elf_symfile_read (struct objfile *objfile, int symfile_flags)
      and .debug_info (DWARF2) sections then .mdebug is inserted first
      (searched last) and DWARF2 is inserted last (searched first).  If
      we don't do this then the XCOFF info is found first - for code in
-     an included file XCOFF info is useless. */
+     an included file XCOFF info is useless.  */
 
   if (ei.mdebugsect)
     {
@@ -728,15 +896,50 @@ elf_symfile_read (struct objfile *objfile, int symfile_flags)
                                str_sect->filepos,
                                bfd_section_size (abfd, str_sect));
     }
+
   if (dwarf2_has_info (objfile))
     {
-      /* DWARF 2 sections */
-      dwarf2_build_psymtabs (objfile);
+      if (dwarf2_initialize_objfile (objfile))
+       objfile->sf = &elf_sym_fns_gdb_index;
+      else
+       {
+         /* It is ok to do this even if the stabs reader made some
+            partial symbols, because OBJF_PSYMTABS_READ has not been
+            set, and so our lazy reader function will still be called
+            when needed.  */
+         objfile->sf = &elf_sym_fns_lazy_psyms;
+       }
     }
+  /* If the file has its own symbol tables it has no separate debug
+     info.  `.dynsym'/`.symtab' go to MSYMBOLS, `.debug_info' goes to
+     SYMTABS/PSYMTABS.  `.gnu_debuglink' may no longer be present with
+     `.note.gnu.build-id'.  */
+  else if (!objfile_has_partial_symbols (objfile))
+    {
+      char *debugfile;
+
+      debugfile = find_separate_debug_file_by_buildid (objfile);
+
+      if (debugfile == NULL)
+       debugfile = find_separate_debug_file_by_debuglink (objfile);
 
-  /* FIXME: kettenis/20030504: This still needs to be integrated with
-     dwarf2read.c in a better way.  */
-  dwarf2_build_frame_info (objfile);
+      if (debugfile)
+       {
+         bfd *abfd = symfile_bfd_open (debugfile);
+
+         symbol_file_add_separate (abfd, symfile_flags, objfile);
+         xfree (debugfile);
+       }
+    }
+}
+
+/* Callback to lazily read psymtabs.  */
+
+static void
+read_psyms (struct objfile *objfile)
+{
+  if (dwarf2_has_info (objfile))
+    dwarf2_build_psymtabs (objfile);
 }
 
 /* This cleans up the objfile's deprecated_sym_stab_info pointer, and
@@ -766,7 +969,8 @@ free_elfinfo (void *objp)
    file is specified (not just adding some symbols from another file, e.g. a
    shared library).
 
-   We reinitialize buildsym, since we may be reading stabs from an ELF file.  */
+   We reinitialize buildsym, since we may be reading stabs from an ELF
+   file.  */
 
 static void
 elf_new_init (struct objfile *ignore)
@@ -778,7 +982,7 @@ elf_new_init (struct objfile *ignore)
 /* Perform any local cleanups required when we are done with a particular
    objfile.  I.E, we are in the process of discarding all symbol information
    for an objfile, freeing up all memory held for it, and unlinking the
-   objfile struct from the global list of known objfiles. */
+   objfile struct from the global list of known objfiles.  */
 
 static void
 elf_symfile_finish (struct objfile *objfile)
@@ -798,7 +1002,7 @@ elf_symfile_finish (struct objfile *objfile)
    a pointer to "private data" which we can fill with goodies.
 
    For now at least, we have nothing in particular to do, so this function is
-   just a stub. */
+   just a stub.  */
 
 static void
 elf_symfile_init (struct objfile *objfile)
@@ -820,25 +1024,23 @@ elf_symfile_init (struct objfile *objfile)
 void
 elfstab_offset_sections (struct objfile *objfile, struct partial_symtab *pst)
 {
-  char *filename = pst->filename;
+  const char *filename = pst->filename;
   struct dbx_symfile_info *dbx = objfile->deprecated_sym_stab_info;
   struct stab_section_info *maybe = dbx->stab_section_info;
   struct stab_section_info *questionable = 0;
   int i;
-  char *p;
 
   /* The ELF symbol info doesn't include path names, so strip the path
      (if any) from the psymtab filename.  */
-  while (0 != (p = strchr (filename, '/')))
-    filename = p + 1;
+  filename = lbasename (filename);
 
   /* FIXME:  This linear search could speed up significantly
      if it was chained in the right order to match how we search it,
-     and if we unchained when we found a match. */
+     and if we unchained when we found a match.  */
   for (; maybe; maybe = maybe->next)
     {
       if (filename[0] == maybe->filename[0]
-         && strcmp (filename, maybe->filename) == 0)
+         && filename_cmp (filename, maybe->filename) == 0)
        {
          /* We found a match.  But there might be several source files
             (from different directories) with the same name.  */
@@ -851,7 +1053,8 @@ elfstab_offset_sections (struct objfile *objfile, struct partial_symtab *pst)
   if (maybe == 0 && questionable != 0)
     {
       complaint (&symfile_complaints,
-                _("elf/stab section information questionable for %s"), filename);
+                _("elf/stab section information questionable for %s"),
+                filename);
       maybe = questionable;
     }
 
@@ -875,18 +1078,54 @@ elfstab_offset_sections (struct objfile *objfile, struct partial_symtab *pst)
 \f
 /* Register that we are able to handle ELF object file formats.  */
 
-static struct sym_fns elf_sym_fns =
+static const struct sym_fns elf_sym_fns =
+{
+  bfd_target_elf_flavour,
+  elf_new_init,                        /* init anything gbl to entire symtab */
+  elf_symfile_init,            /* read initial info, setup for sym_read() */
+  elf_symfile_read,            /* read a symbol file into symtab */
+  NULL,                                /* sym_read_psymbols */
+  elf_symfile_finish,          /* finished with file, cleanup */
+  default_symfile_offsets,     /* Translate ext. to int. relocation */
+  elf_symfile_segments,                /* Get segment information from a file.  */
+  NULL,
+  default_symfile_relocate,    /* Relocate a debug section.  */
+  &psym_functions
+};
+
+/* The same as elf_sym_fns, but not registered and lazily reads
+   psymbols.  */
+
+static const struct sym_fns elf_sym_fns_lazy_psyms =
+{
+  bfd_target_elf_flavour,
+  elf_new_init,                        /* init anything gbl to entire symtab */
+  elf_symfile_init,            /* read initial info, setup for sym_read() */
+  elf_symfile_read,            /* read a symbol file into symtab */
+  read_psyms,                  /* sym_read_psymbols */
+  elf_symfile_finish,          /* finished with file, cleanup */
+  default_symfile_offsets,     /* Translate ext. to int. relocation */
+  elf_symfile_segments,                /* Get segment information from a file.  */
+  NULL,
+  default_symfile_relocate,    /* Relocate a debug section.  */
+  &psym_functions
+};
+
+/* The same as elf_sym_fns, but not registered and uses the
+   DWARF-specific GNU index rather than psymtab.  */
+static const struct sym_fns elf_sym_fns_gdb_index =
 {
   bfd_target_elf_flavour,
-  elf_new_init,                        /* sym_new_init: init anything gbl to entire symtab */
-  elf_symfile_init,            /* sym_init: read initial info, setup for sym_read() */
-  elf_symfile_read,            /* sym_read: read a symbol file into symtab */
-  elf_symfile_finish,          /* sym_finish: finished with file, cleanup */
-  default_symfile_offsets,     /* sym_offsets:  Translate ext. to int. relocation */
-  elf_symfile_segments,                /* sym_segments: Get segment information from
-                                  a file.  */
-  NULL,                         /* sym_read_linetable */
-  NULL                         /* next: pointer to next struct sym_fns */
+  elf_new_init,                        /* init anything gbl to entire symab */
+  elf_symfile_init,            /* read initial info, setup for sym_red() */
+  elf_symfile_read,            /* read a symbol file into symtab */
+  NULL,                                /* sym_read_psymbols */
+  elf_symfile_finish,          /* finished with file, cleanup */
+  default_symfile_offsets,     /* Translate ext. to int. relocatin */
+  elf_symfile_segments,                /* Get segment information from a file.  */
+  NULL,
+  default_symfile_relocate,    /* Relocate a debug section.  */
+  &dwarf2_gdb_index_functions
 };
 
 void
This page took 0.031017 seconds and 4 git commands to generate.