mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-27 14:39:09 +08:00
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:
@ -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>
|
2014-06-05 Joel Brobecker <brobecker@adacore.com>
|
||||||
|
|
||||||
* Makefile.am (CONFIG_STATUS_DEPENDENCIES): New.
|
* 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)
|
if (strcmp(section_name_suffix, name) == 0)
|
||||||
{
|
{
|
||||||
shndx = i;
|
shndx = i;
|
||||||
this->output_section_offset_ = object->output_section_offset(i);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else if (strcmp(section_name_suffix, gnu_name) == 0)
|
else if (strcmp(section_name_suffix, gnu_name) == 0)
|
||||||
{
|
{
|
||||||
shndx = i;
|
shndx = i;
|
||||||
this->output_section_offset_ = object->output_section_offset(i);
|
|
||||||
this->is_gnu_style_ = true;
|
this->is_gnu_style_ = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -560,11 +558,6 @@ Dwarf_pubnames_table::read_header(off_t offset)
|
|||||||
// Make sure we have actually read the section.
|
// Make sure we have actually read the section.
|
||||||
gold_assert(this->buffer_ != NULL);
|
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_)
|
if (offset < 0 || offset + 14 >= this->buffer_end_ - this->buffer_)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
@ -401,7 +401,7 @@ class Dwarf_pubnames_table
|
|||||||
: dwinfo_(dwinfo), buffer_(NULL), buffer_end_(NULL), owns_buffer_(false),
|
: dwinfo_(dwinfo), buffer_(NULL), buffer_end_(NULL), owns_buffer_(false),
|
||||||
offset_size_(0), pinfo_(NULL), end_of_table_(NULL),
|
offset_size_(0), pinfo_(NULL), end_of_table_(NULL),
|
||||||
is_pubtypes_(is_pubtypes), is_gnu_style_(false),
|
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()
|
~Dwarf_pubnames_table()
|
||||||
@ -455,11 +455,6 @@ class Dwarf_pubnames_table
|
|||||||
// Gnu-style pubnames table. This style has an extra flag byte between the
|
// 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.
|
// offset and the name, and is used for generating version 7 of gdb-index.
|
||||||
bool is_gnu_style_;
|
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.
|
// Fields read from the header.
|
||||||
uint64_t unit_length_;
|
uint64_t unit_length_;
|
||||||
off_t cu_offset_;
|
off_t cu_offset_;
|
||||||
|
@ -563,7 +563,9 @@ static const char* gdb_fast_lookup_sections[] =
|
|||||||
{
|
{
|
||||||
"aranges",
|
"aranges",
|
||||||
"pubnames",
|
"pubnames",
|
||||||
|
"gnu_pubnames",
|
||||||
"pubtypes",
|
"pubtypes",
|
||||||
|
"gnu_pubtypes",
|
||||||
};
|
};
|
||||||
|
|
||||||
// Returns whether the given debug section is in the list of
|
// Returns whether the given debug section is in the list of
|
||||||
|
Reference in New Issue
Block a user