diff options
author | Ian Lance Taylor <ian@airs.com> | 2009-12-30 20:23:29 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@airs.com> | 2009-12-30 20:23:29 +0000 |
commit | ebcc83046fa1227ac895ae9a2d715b547d62ad08 (patch) | |
tree | 954725e482503e8a0f81d1963e57408fe353fe63 /gold/object.cc | |
parent | 7b838ca220ab177d288bca2629d73b50ebbe7abc (diff) | |
download | gdb-ebcc83046fa1227ac895ae9a2d715b547d62ad08.zip gdb-ebcc83046fa1227ac895ae9a2d715b547d62ad08.tar.gz gdb-ebcc83046fa1227ac895ae9a2d715b547d62ad08.tar.bz2 |
PR 10670
* options.h (class General_options): Add -x/--discard-all.
* object.cc (Sized_relobj::do_count_local_symbols): Handle
--discard-all. If the local symbol needs a dynamic entry, check
that before handling --discard-locals.
Diffstat (limited to 'gold/object.cc')
-rw-r--r-- | gold/object.cc | 26 |
1 files changed, 17 insertions, 9 deletions
diff --git a/gold/object.cc b/gold/object.cc index efcb26b..34b59b5 100644 --- a/gold/object.cc +++ b/gold/object.cc @@ -1527,6 +1527,7 @@ Sized_relobj<size, big_endian>::do_count_local_symbols(Stringpool* pool, unsigned int dyncount = 0; // Skip the first, dummy, symbol. psyms += sym_size; + bool discard_all = parameters->options().discard_all(); bool discard_locals = parameters->options().discard_locals(); for (unsigned int i = 1; i < loccount; ++i, psyms += sym_size) { @@ -1550,7 +1551,7 @@ Sized_relobj<size, big_endian>::do_count_local_symbols(Stringpool* pool, // Decide whether this symbol should go into the output file. if ((shndx < shnum && out_sections[shndx] == NULL) - || (shndx == this->discarded_eh_frame_shndx_)) + || shndx == this->discarded_eh_frame_shndx_) { lv.set_no_output_symtab_entry(); gold_assert(!lv.needs_output_dynsym_entry()); @@ -1573,6 +1574,21 @@ Sized_relobj<size, big_endian>::do_count_local_symbols(Stringpool* pool, continue; } + const char* name = pnames + sym.get_st_name(); + + // If needed, add the symbol to the dynamic symbol table string pool. + if (lv.needs_output_dynsym_entry()) + { + dynpool->add(name, true, NULL); + ++dyncount; + } + + if (discard_all) + { + lv.set_no_output_symtab_entry(); + continue; + } + // If --discard-locals option is used, discard all temporary local // symbols. These symbols start with system-specific local label // prefixes, typically .L for ELF system. We want to be compatible @@ -1585,7 +1601,6 @@ Sized_relobj<size, big_endian>::do_count_local_symbols(Stringpool* pool, // - the symbol has a name. // // We do not discard a symbol if it needs a dynamic symbol entry. - const char* name = pnames + sym.get_st_name(); if (discard_locals && sym.get_st_type() != elfcpp::STT_FILE && !lv.needs_output_dynsym_entry() @@ -1606,13 +1621,6 @@ Sized_relobj<size, big_endian>::do_count_local_symbols(Stringpool* pool, // Add the symbol to the symbol table string pool. pool->add(name, true, NULL); ++count; - - // If needed, add the symbol to the dynamic symbol table string pool. - if (lv.needs_output_dynsym_entry()) - { - dynpool->add(name, true, NULL); - ++dyncount; - } } this->output_local_symbol_count_ = count; |