Strip .debug_gnu_pubnames and .debug_gnu_pubtypes when building .gdb_index.
authorCary Coutant <ccoutant@google.com>
Fri, 6 Jun 2014 23:23:21 +0000 (16:23 -0700)
committerCary Coutant <ccoutant@google.com>
Fri, 6 Jun 2014 23:24:30 +0000 (16:24 -0700)
When not stripping those sections, there was a bug where gold was incorrectly
adjusting section-relative offsets by the offset of the input section within
the output section. That adjustment was both unnecessary and wrong, causing
gold to miss a number of debug entries that should have been added to
.gdb_index.  (With stripping, the adjustment was always 0, so the bug in
dwarf_reader.cc would have been hidden by the change to layout.cc.)

gold/
* dwarf_reader.h (Dwarf_pubnames_table): Remove output_section_offset_.
* dwarf_reader.cc (Dwarf_pubnames_table::read_section): Likewise.
(Dwarf_pubnames_table::read_header): Likewise.
* layout.cc (gdb_fast_lookup_sections): Add .debug_gnu_pubnames and
.debug_gnu_pubtypes.

gold/ChangeLog
gold/dwarf_reader.cc
gold/dwarf_reader.h
gold/layout.cc

index 316e72ed54d6483c6a91fe745e412852ec3f6136..2fb28c56194e3d47b7c3c725da2cfb1d9933fe9f 100644 (file)
@@ -1,3 +1,11 @@
+2014-06-06  Cary Coutant  <ccoutant@google.com>
+
+       * dwarf_reader.h (Dwarf_pubnames_table): Remove output_section_offset_.
+       * dwarf_reader.cc (Dwarf_pubnames_table::read_section): Likewise.
+       (Dwarf_pubnames_table::read_header): Likewise.
+       * layout.cc (gdb_fast_lookup_sections): Add .debug_gnu_pubnames and
+       .debug_gnu_pubtypes.
+
 2014-06-05  Joel Brobecker  <brobecker@adacore.com>
 
        * Makefile.am (CONFIG_STATUS_DEPENDENCIES): New.
index bc9e85f99a06cceb2370729f30f572fb8193ea5a..df14bd5ad3e53107a5bf725ec7ab11a8312eb58b 100644 (file)
@@ -505,13 +505,11 @@ Dwarf_pubnames_table::read_section(Relobj* object, const unsigned char* symtab,
       if (strcmp(section_name_suffix, name) == 0)
         {
           shndx = i;
-          this->output_section_offset_ = object->output_section_offset(i);
           break;
         }
       else if (strcmp(section_name_suffix, gnu_name) == 0)
         {
           shndx = i;
-          this->output_section_offset_ = object->output_section_offset(i);
           this->is_gnu_style_ = true;
           break;
         }
@@ -560,11 +558,6 @@ Dwarf_pubnames_table::read_header(off_t offset)
   // Make sure we have actually read the section.
   gold_assert(this->buffer_ != NULL);
 
-  // Correct the offset.  For incremental update links, we have a
-  // relocated offset that is relative to the output section, but
-  // here we need an offset relative to the input section.
-  offset -= this->output_section_offset_;
-
   if (offset < 0 || offset + 14 >= this->buffer_end_ - this->buffer_)
     return false;
 
index 8dd62ad450dc4332bb892d80b4a0cb3424a6aa27..cac413b63ad84abe4b0b7075b433f01bb463723d 100644 (file)
@@ -401,7 +401,7 @@ class Dwarf_pubnames_table
     : dwinfo_(dwinfo), buffer_(NULL), buffer_end_(NULL), owns_buffer_(false),
       offset_size_(0), pinfo_(NULL), end_of_table_(NULL),
       is_pubtypes_(is_pubtypes), is_gnu_style_(false),
-      output_section_offset_(0), unit_length_(0), cu_offset_(0)
+      unit_length_(0), cu_offset_(0)
   { }
 
   ~Dwarf_pubnames_table()
@@ -455,11 +455,6 @@ class Dwarf_pubnames_table
   // Gnu-style pubnames table. This style has an extra flag byte between the
   // offset and the name, and is used for generating version 7 of gdb-index.
   bool is_gnu_style_;
-  // For incremental update links, this will hold the offset of the
-  // input section within the output section.  Offsets read from
-  // relocated data will be relative to the output section, and need
-  // to be corrected before reading data from the input section.
-  uint64_t output_section_offset_;
   // Fields read from the header.
   uint64_t unit_length_;
   off_t cu_offset_;
index 147f74081850fccc9b181ba6f8f9533f7d1f02d7..c5c3b578a5ad1164d34b809059a390a69ce46167 100644 (file)
@@ -563,7 +563,9 @@ static const char* gdb_fast_lookup_sections[] =
 {
   "aranges",
   "pubnames",
+  "gnu_pubnames",
   "pubtypes",
+  "gnu_pubtypes",
 };
 
 // Returns whether the given debug section is in the list of