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>
|
||||
|
||||
* 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;
|
||||
}
|
||||
|
||||
// Returns whether the given section is in the list of
|
||||
// debug-sections-used-by-some-version-of-gdb. Currently,
|
||||
// we've checked versions of gdb up to and including 7.4.
|
||||
// These are the debug sections that are actually used by gdb.
|
||||
// Currently, 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[] =
|
||||
{ ".debug_abbrev",
|
||||
".debug_addr", // Fission extension
|
||||
// ".debug_aranges", // not used by gdb as of 7.4
|
||||
".debug_frame",
|
||||
".debug_info",
|
||||
".debug_types",
|
||||
".debug_line",
|
||||
".debug_loc",
|
||||
".debug_macinfo",
|
||||
// ".debug_pubnames", // not used by gdb as of 7.4
|
||||
// ".debug_pubtypes", // not used by gdb as of 7.4
|
||||
".debug_ranges",
|
||||
".debug_str",
|
||||
{
|
||||
"abbrev",
|
||||
"addr", // Fission extension
|
||||
// "aranges", // not used by gdb as of 7.4
|
||||
"frame",
|
||||
"info",
|
||||
"types",
|
||||
"line",
|
||||
"loc",
|
||||
"macinfo",
|
||||
"macro",
|
||||
// "pubnames", // not used by gdb as of 7.4
|
||||
// "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[] =
|
||||
{ ".debug_abbrev",
|
||||
// ".debug_addr", // Fission extension
|
||||
// ".debug_aranges", // not used by gdb as of 7.4
|
||||
// ".debug_frame",
|
||||
".debug_info",
|
||||
// ".debug_types",
|
||||
".debug_line",
|
||||
// ".debug_loc",
|
||||
// ".debug_macinfo",
|
||||
// ".debug_pubnames", // not used by gdb as of 7.4
|
||||
// ".debug_pubtypes", // not used by gdb as of 7.4
|
||||
// ".debug_ranges",
|
||||
".debug_str",
|
||||
{
|
||||
"abbrev",
|
||||
// "addr", // Fission extension
|
||||
// "aranges", // not used by gdb as of 7.4
|
||||
// "frame",
|
||||
"info",
|
||||
// "types",
|
||||
"line",
|
||||
// "loc",
|
||||
// "macinfo",
|
||||
// "macro",
|
||||
// "pubnames", // not used by gdb as of 7.4
|
||||
// "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
|
||||
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?
|
||||
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 false;
|
||||
}
|
||||
|
||||
// Returns whether the given section is needed for lines-only debugging.
|
||||
|
||||
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?
|
||||
for (size_t i = 0;
|
||||
i < sizeof(lines_only_debug_sections)/sizeof(*lines_only_debug_sections);
|
||||
++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 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)
|
||||
{
|
||||
// Debugging sections can only be recognized by name.
|
||||
if (is_prefix_of(".debug", name)
|
||||
&& !is_lines_only_debug_section(name))
|
||||
if (is_prefix_of(".debug_", 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;
|
||||
}
|
||||
if (parameters->options().strip_debug_gdb()
|
||||
&& (shdr.get_sh_flags() & elfcpp::SHF_ALLOC) == 0)
|
||||
{
|
||||
// Debugging sections can only be recognized by name.
|
||||
if (is_prefix_of(".debug", name)
|
||||
&& !is_gdb_debug_section(name))
|
||||
if (is_prefix_of(".debug_", 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;
|
||||
}
|
||||
if (parameters->options().strip_lto_sections()
|
||||
|
@ -1011,7 +1011,7 @@ class General_options
|
||||
N_("Emit only debug line number information"), NULL);
|
||||
DEFINE_bool(strip_debug_gdb, options::TWO_DASHES, '\0', false,
|
||||
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,
|
||||
N_("Strip LTO intermediate code sections"), NULL);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user