From fb1b895daad773efd7dc023f913678e9c80d8c3a Mon Sep 17 00:00:00 2001 From: Cary Coutant Date: Thu, 7 Jun 2012 05:14:44 +0000 Subject: [PATCH] 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. --- gold/ChangeLog | 14 ++++++ gold/layout.cc | 130 +++++++++++++++++++++++++++++++++++-------------- gold/options.h | 2 +- 3 files changed, 108 insertions(+), 38 deletions(-) diff --git a/gold/ChangeLog b/gold/ChangeLog index 3d93e223226..bc21207ce17 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,3 +1,17 @@ +2012-06-06 Cary Coutant + + * 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 * configure.ac: Add check for fallocate. diff --git a/gold/layout.cc b/gold/layout.cc index c7ca322fd58..154be8836bd 100644 --- a/gold/layout.cc +++ b/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*, 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() diff --git a/gold/options.h b/gold/options.h index 6463b809dde..50762a5446d 100644 --- a/gold/options.h +++ b/gold/options.h @@ -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); -- 2.30.2