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.
This commit is contained in:
parent
25326a285b
commit
4320c69198
4 changed files with 11 additions and 13 deletions
|
@ -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.
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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_;
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Reference in a new issue