aboutsummaryrefslogtreecommitdiff
path: root/gold
diff options
context:
space:
mode:
authorCary Coutant <ccoutant@google.com>2014-06-06 16:23:21 -0700
committerCary Coutant <ccoutant@google.com>2014-06-06 16:24:30 -0700
commit4320c6919860634baf2207d9a642a9fbd9efc3d5 (patch)
tree54f6adffda34dbb3a69c3d51bf2c7c70a9c9119b /gold
parent25326a285b3aea10ea9acd63b6187ae78b59b09e (diff)
downloadgdb-4320c6919860634baf2207d9a642a9fbd9efc3d5.zip
gdb-4320c6919860634baf2207d9a642a9fbd9efc3d5.tar.gz
gdb-4320c6919860634baf2207d9a642a9fbd9efc3d5.tar.bz2
Strip .debug_gnu_pubnames and .debug_gnu_pubtypes when building .gdb_index.
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.
Diffstat (limited to 'gold')
-rw-r--r--gold/ChangeLog8
-rw-r--r--gold/dwarf_reader.cc7
-rw-r--r--gold/dwarf_reader.h7
-rw-r--r--gold/layout.cc2
4 files changed, 11 insertions, 13 deletions
diff --git a/gold/ChangeLog b/gold/ChangeLog
index 316e72e..2fb28c5 100644
--- a/gold/ChangeLog
+++ b/gold/ChangeLog
@@ -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.
diff --git a/gold/dwarf_reader.cc b/gold/dwarf_reader.cc
index bc9e85f..df14bd5 100644
--- a/gold/dwarf_reader.cc
+++ b/gold/dwarf_reader.cc
@@ -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;
diff --git a/gold/dwarf_reader.h b/gold/dwarf_reader.h
index 8dd62ad..cac413b 100644
--- a/gold/dwarf_reader.h
+++ b/gold/dwarf_reader.h
@@ -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_;
diff --git a/gold/layout.cc b/gold/layout.cc
index 147f740..c5c3b57 100644
--- a/gold/layout.cc
+++ b/gold/layout.cc
@@ -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