* 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:
Cary Coutant 2012-06-07 05:14:44 +00:00
parent 8f68367581
commit fb1b895daa
3 changed files with 108 additions and 38 deletions

View File

@ -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.

View File

@ -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()

View File

@ -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);