mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-11-26 03:24:41 +08:00
gold/
* layout.cc (gdb_sections): Remove ".debug_" prefixes, add .debug_macro. (lines_only_debug_sections): Likewise. (gdb_fast_lookup_sections): New static array. (is_gdb_debug_section): Rename formal parameter. (is_lines_only_debug_section): Likewise. (is_gdb_fast_lookup_section): New function. (Layout::include_section): Check for ".zdebug_" prefix; pass section name suffix to is_gdb_debug_section, et al.; check for fast-lookup sections when building .gdb_index. * options.h (--strip-debug-gdb): Update GDB version number.
This commit is contained in:
parent
8f68367581
commit
fb1b895daa
@ -1,3 +1,17 @@
|
|||||||
|
2012-06-06 Cary Coutant <ccoutant@google.com>
|
||||||
|
|
||||||
|
* layout.cc (gdb_sections): Remove ".debug_" prefixes,
|
||||||
|
add .debug_macro.
|
||||||
|
(lines_only_debug_sections): Likewise.
|
||||||
|
(gdb_fast_lookup_sections): New static array.
|
||||||
|
(is_gdb_debug_section): Rename formal parameter.
|
||||||
|
(is_lines_only_debug_section): Likewise.
|
||||||
|
(is_gdb_fast_lookup_section): New function.
|
||||||
|
(Layout::include_section): Check for ".zdebug_" prefix; pass
|
||||||
|
section name suffix to is_gdb_debug_section, et al.; check for
|
||||||
|
fast-lookup sections when building .gdb_index.
|
||||||
|
* options.h (--strip-debug-gdb): Update GDB version number.
|
||||||
|
|
||||||
2012-06-06 Cary Coutant <ccoutant@google.com>
|
2012-06-06 Cary Coutant <ccoutant@google.com>
|
||||||
|
|
||||||
* configure.ac: Add check for fallocate.
|
* configure.ac: Add check for fallocate.
|
||||||
|
130
gold/layout.cc
130
gold/layout.cc
@ -453,60 +453,98 @@ Layout::Hash_key::operator()(const Layout::Key& k) const
|
|||||||
return k.first + k.second.first + k.second.second;
|
return k.first + k.second.first + k.second.second;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Returns whether the given section is in the list of
|
// These are the debug sections that are actually used by gdb.
|
||||||
// debug-sections-used-by-some-version-of-gdb. Currently,
|
// Currently, we've checked versions of gdb up to and including 7.4.
|
||||||
// we've checked versions of gdb up to and including 7.4.
|
// We only check the part of the name that follows ".debug_" or
|
||||||
|
// ".zdebug_".
|
||||||
|
|
||||||
static const char* gdb_sections[] =
|
static const char* gdb_sections[] =
|
||||||
{ ".debug_abbrev",
|
{
|
||||||
".debug_addr", // Fission extension
|
"abbrev",
|
||||||
// ".debug_aranges", // not used by gdb as of 7.4
|
"addr", // Fission extension
|
||||||
".debug_frame",
|
// "aranges", // not used by gdb as of 7.4
|
||||||
".debug_info",
|
"frame",
|
||||||
".debug_types",
|
"info",
|
||||||
".debug_line",
|
"types",
|
||||||
".debug_loc",
|
"line",
|
||||||
".debug_macinfo",
|
"loc",
|
||||||
// ".debug_pubnames", // not used by gdb as of 7.4
|
"macinfo",
|
||||||
// ".debug_pubtypes", // not used by gdb as of 7.4
|
"macro",
|
||||||
".debug_ranges",
|
// "pubnames", // not used by gdb as of 7.4
|
||||||
".debug_str",
|
// "pubtypes", // not used by gdb as of 7.4
|
||||||
|
"ranges",
|
||||||
|
"str",
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// This is the minimum set of sections needed for line numbers.
|
||||||
|
|
||||||
static const char* lines_only_debug_sections[] =
|
static const char* lines_only_debug_sections[] =
|
||||||
{ ".debug_abbrev",
|
{
|
||||||
// ".debug_addr", // Fission extension
|
"abbrev",
|
||||||
// ".debug_aranges", // not used by gdb as of 7.4
|
// "addr", // Fission extension
|
||||||
// ".debug_frame",
|
// "aranges", // not used by gdb as of 7.4
|
||||||
".debug_info",
|
// "frame",
|
||||||
// ".debug_types",
|
"info",
|
||||||
".debug_line",
|
// "types",
|
||||||
// ".debug_loc",
|
"line",
|
||||||
// ".debug_macinfo",
|
// "loc",
|
||||||
// ".debug_pubnames", // not used by gdb as of 7.4
|
// "macinfo",
|
||||||
// ".debug_pubtypes", // not used by gdb as of 7.4
|
// "macro",
|
||||||
// ".debug_ranges",
|
// "pubnames", // not used by gdb as of 7.4
|
||||||
".debug_str",
|
// "pubtypes", // not used by gdb as of 7.4
|
||||||
|
// "ranges",
|
||||||
|
"str",
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// These sections are the DWARF fast-lookup tables, and are not needed
|
||||||
|
// when building a .gdb_index section.
|
||||||
|
|
||||||
|
static const char* gdb_fast_lookup_sections[] =
|
||||||
|
{
|
||||||
|
"aranges",
|
||||||
|
"pubnames",
|
||||||
|
"pubtypes",
|
||||||
|
};
|
||||||
|
|
||||||
|
// Returns whether the given debug section is in the list of
|
||||||
|
// debug-sections-used-by-some-version-of-gdb. SUFFIX is the
|
||||||
|
// portion of the name following ".debug_" or ".zdebug_".
|
||||||
|
|
||||||
static inline bool
|
static inline bool
|
||||||
is_gdb_debug_section(const char* str)
|
is_gdb_debug_section(const char* suffix)
|
||||||
{
|
{
|
||||||
// We can do this faster: binary search or a hashtable. But why bother?
|
// We can do this faster: binary search or a hashtable. But why bother?
|
||||||
for (size_t i = 0; i < sizeof(gdb_sections)/sizeof(*gdb_sections); ++i)
|
for (size_t i = 0; i < sizeof(gdb_sections)/sizeof(*gdb_sections); ++i)
|
||||||
if (strcmp(str, gdb_sections[i]) == 0)
|
if (strcmp(suffix, gdb_sections[i]) == 0)
|
||||||
return true;
|
return true;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Returns whether the given section is needed for lines-only debugging.
|
||||||
|
|
||||||
static inline bool
|
static inline bool
|
||||||
is_lines_only_debug_section(const char* str)
|
is_lines_only_debug_section(const char* suffix)
|
||||||
{
|
{
|
||||||
// We can do this faster: binary search or a hashtable. But why bother?
|
// We can do this faster: binary search or a hashtable. But why bother?
|
||||||
for (size_t i = 0;
|
for (size_t i = 0;
|
||||||
i < sizeof(lines_only_debug_sections)/sizeof(*lines_only_debug_sections);
|
i < sizeof(lines_only_debug_sections)/sizeof(*lines_only_debug_sections);
|
||||||
++i)
|
++i)
|
||||||
if (strcmp(str, lines_only_debug_sections[i]) == 0)
|
if (strcmp(suffix, lines_only_debug_sections[i]) == 0)
|
||||||
|
return true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Returns whether the given section is a fast-lookup section that
|
||||||
|
// will not be needed when building a .gdb_index section.
|
||||||
|
|
||||||
|
static inline bool
|
||||||
|
is_gdb_fast_lookup_section(const char* suffix)
|
||||||
|
{
|
||||||
|
// We can do this faster: binary search or a hashtable. But why bother?
|
||||||
|
for (size_t i = 0;
|
||||||
|
i < sizeof(gdb_fast_lookup_sections)/sizeof(*gdb_fast_lookup_sections);
|
||||||
|
++i)
|
||||||
|
if (strcmp(suffix, gdb_fast_lookup_sections[i]) == 0)
|
||||||
return true;
|
return true;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -583,16 +621,34 @@ Layout::include_section(Sized_relobj_file<size, big_endian>*, const char* name,
|
|||||||
&& (shdr.get_sh_flags() & elfcpp::SHF_ALLOC) == 0)
|
&& (shdr.get_sh_flags() & elfcpp::SHF_ALLOC) == 0)
|
||||||
{
|
{
|
||||||
// Debugging sections can only be recognized by name.
|
// Debugging sections can only be recognized by name.
|
||||||
if (is_prefix_of(".debug", name)
|
if (is_prefix_of(".debug_", name)
|
||||||
&& !is_lines_only_debug_section(name))
|
&& !is_lines_only_debug_section(name + 7))
|
||||||
|
return false;
|
||||||
|
if (is_prefix_of(".zdebug_", name)
|
||||||
|
&& !is_lines_only_debug_section(name + 8))
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (parameters->options().strip_debug_gdb()
|
if (parameters->options().strip_debug_gdb()
|
||||||
&& (shdr.get_sh_flags() & elfcpp::SHF_ALLOC) == 0)
|
&& (shdr.get_sh_flags() & elfcpp::SHF_ALLOC) == 0)
|
||||||
{
|
{
|
||||||
// Debugging sections can only be recognized by name.
|
// Debugging sections can only be recognized by name.
|
||||||
if (is_prefix_of(".debug", name)
|
if (is_prefix_of(".debug_", name)
|
||||||
&& !is_gdb_debug_section(name))
|
&& !is_gdb_debug_section(name + 7))
|
||||||
|
return false;
|
||||||
|
if (is_prefix_of(".zdebug_", name)
|
||||||
|
&& !is_gdb_debug_section(name + 8))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (parameters->options().gdb_index()
|
||||||
|
&& (shdr.get_sh_flags() & elfcpp::SHF_ALLOC) == 0)
|
||||||
|
{
|
||||||
|
// When building .gdb_index, we can strip .debug_pubnames,
|
||||||
|
// .debug_pubtypes, and .debug_aranges sections.
|
||||||
|
if (is_prefix_of(".debug_", name)
|
||||||
|
&& is_gdb_fast_lookup_section(name + 7))
|
||||||
|
return false;
|
||||||
|
if (is_prefix_of(".zdebug_", name)
|
||||||
|
&& is_gdb_fast_lookup_section(name + 8))
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (parameters->options().strip_lto_sections()
|
if (parameters->options().strip_lto_sections()
|
||||||
|
@ -1011,7 +1011,7 @@ class General_options
|
|||||||
N_("Emit only debug line number information"), NULL);
|
N_("Emit only debug line number information"), NULL);
|
||||||
DEFINE_bool(strip_debug_gdb, options::TWO_DASHES, '\0', false,
|
DEFINE_bool(strip_debug_gdb, options::TWO_DASHES, '\0', false,
|
||||||
N_("Strip debug symbols that are unused by gdb "
|
N_("Strip debug symbols that are unused by gdb "
|
||||||
"(at least versions <= 6.7)"), NULL);
|
"(at least versions <= 7.4)"), NULL);
|
||||||
DEFINE_bool(strip_lto_sections, options::TWO_DASHES, '\0', true,
|
DEFINE_bool(strip_lto_sections, options::TWO_DASHES, '\0', true,
|
||||||
N_("Strip LTO intermediate code sections"), NULL);
|
N_("Strip LTO intermediate code sections"), NULL);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user