*** empty log message ***
[binutils-gdb.git] / gdb / elfread.c
index 68bbf1266e5fcca137d4657187647522044580ea..ae92ff65b19dd19f9580bc2e03190e4e6c91ac1a 100644 (file)
@@ -40,6 +40,9 @@
 
 extern void _initialize_elfread (void);
 
+/* Forward declaration.  */
+static struct sym_fns elf_sym_fns_gdb_index;
+
 /* 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.  */
@@ -425,6 +428,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)
@@ -868,11 +872,9 @@ 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_has_info (objfile) && dwarf2_initialize_objfile (objfile))
+    objfile->sf = &elf_sym_fns_gdb_index;
 
   /* 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.
@@ -889,6 +891,7 @@ elf_symfile_read (struct objfile *objfile, int symfile_flags)
       if (debugfile)
        {
          bfd *abfd = symfile_bfd_open (debugfile);
+
          symbol_file_add_separate (abfd, symfile_flags, objfile);
          xfree (debugfile);
        }
@@ -1047,6 +1050,24 @@ static struct sym_fns elf_sym_fns =
   NULL                         /* next: pointer to next struct sym_fns */
 };
 
+/* The same as elf_sym_fns, but not registered and uses the
+   DWARF-specific GNU index rather than psymtab.  */
+static struct sym_fns elf_sym_fns_gdb_index =
+{
+  bfd_target_elf_flavour,
+  elf_new_init,                        /* sym_new_init: init anything gbl to entire symab */
+  elf_symfile_init,            /* sym_init: read initial info, setup for sym_red() */
+  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. relocatin */
+  elf_symfile_segments,                /* sym_segments: Get segment information from
+                                  a file.  */
+  NULL,                         /* sym_read_linetable */
+  default_symfile_relocate,    /* sym_relocate: Relocate a debug section.  */
+  &dwarf2_gdb_index_functions,
+  NULL                         /* next: pointer to next struct sym_fns */
+};
+
 void
 _initialize_elfread (void)
 {