Change default to discard temporary local symbols in merge sections.
Add --discard-none to keep all local symbols. gold/ PR gold/17498 * object.cc (Sized_relobj_file::do_count_local_symbols): Discard temporary locals in merge sections. * options.cc (General_options::parse_discard_all): New method. (General_options::parse_discard_locals): New method. (General_options::parse_discard_none): New method. (General_options::General_options): Initialize discard_locals_. * options.h (--discard-all): Convert to special option. (--discard-locals): Likewise. (--discard-none): New option. (General_options::discard_all): New method. (General_options::discard_locals): New method. (General_options::discard_sec_merge): New method. (General_options::Discard_locals): New enum. (General_options::discard_locals_): New data member.
This commit is contained in:
parent
dc302c0061
commit
cd3c333f43
4 changed files with 81 additions and 6 deletions
|
@ -1,3 +1,21 @@
|
||||||
|
2015-06-04 Cary Coutant <ccoutant@gmail.com>
|
||||||
|
|
||||||
|
PR gold/17498
|
||||||
|
* object.cc (Sized_relobj_file::do_count_local_symbols): Discard
|
||||||
|
temporary locals in merge sections.
|
||||||
|
* options.cc (General_options::parse_discard_all): New method.
|
||||||
|
(General_options::parse_discard_locals): New method.
|
||||||
|
(General_options::parse_discard_none): New method.
|
||||||
|
(General_options::General_options): Initialize discard_locals_.
|
||||||
|
* options.h (--discard-all): Convert to special option.
|
||||||
|
(--discard-locals): Likewise.
|
||||||
|
(--discard-none): New option.
|
||||||
|
(General_options::discard_all): New method.
|
||||||
|
(General_options::discard_locals): New method.
|
||||||
|
(General_options::discard_sec_merge): New method.
|
||||||
|
(General_options::Discard_locals): New enum.
|
||||||
|
(General_options::discard_locals_): New data member.
|
||||||
|
|
||||||
2015-06-03 Cary Coutant <cary@google.com>
|
2015-06-03 Cary Coutant <cary@google.com>
|
||||||
|
|
||||||
* script-sections.cc (Script_sections::Script_sections): Initialize
|
* script-sections.cc (Script_sections::Script_sections): Initialize
|
||||||
|
|
|
@ -2174,6 +2174,7 @@ Sized_relobj_file<size, big_endian>::do_count_local_symbols(Stringpool* pool,
|
||||||
// Loop over the local symbols.
|
// Loop over the local symbols.
|
||||||
|
|
||||||
const Output_sections& out_sections(this->output_sections());
|
const Output_sections& out_sections(this->output_sections());
|
||||||
|
std::vector<Address>& out_section_offsets(this->section_offsets());
|
||||||
unsigned int shnum = this->shnum();
|
unsigned int shnum = this->shnum();
|
||||||
unsigned int count = 0;
|
unsigned int count = 0;
|
||||||
unsigned int dyncount = 0;
|
unsigned int dyncount = 0;
|
||||||
|
@ -2182,6 +2183,7 @@ Sized_relobj_file<size, big_endian>::do_count_local_symbols(Stringpool* pool,
|
||||||
bool strip_all = parameters->options().strip_all();
|
bool strip_all = parameters->options().strip_all();
|
||||||
bool discard_all = parameters->options().discard_all();
|
bool discard_all = parameters->options().discard_all();
|
||||||
bool discard_locals = parameters->options().discard_locals();
|
bool discard_locals = parameters->options().discard_locals();
|
||||||
|
bool discard_sec_merge = parameters->options().discard_sec_merge();
|
||||||
for (unsigned int i = 1; i < loccount; ++i, psyms += sym_size)
|
for (unsigned int i = 1; i < loccount; ++i, psyms += sym_size)
|
||||||
{
|
{
|
||||||
elfcpp::Sym<size, big_endian> sym(psyms);
|
elfcpp::Sym<size, big_endian> sym(psyms);
|
||||||
|
@ -2246,6 +2248,7 @@ Sized_relobj_file<size, big_endian>::do_count_local_symbols(Stringpool* pool,
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// By default, discard temporary local symbols in merge sections.
|
||||||
// If --discard-locals option is used, discard all temporary local
|
// If --discard-locals option is used, discard all temporary local
|
||||||
// symbols. These symbols start with system-specific local label
|
// symbols. These symbols start with system-specific local label
|
||||||
// prefixes, typically .L for ELF system. We want to be compatible
|
// prefixes, typically .L for ELF system. We want to be compatible
|
||||||
|
@ -2258,7 +2261,10 @@ Sized_relobj_file<size, big_endian>::do_count_local_symbols(Stringpool* pool,
|
||||||
// - the symbol has a name.
|
// - the symbol has a name.
|
||||||
//
|
//
|
||||||
// We do not discard a symbol if it needs a dynamic symbol entry.
|
// We do not discard a symbol if it needs a dynamic symbol entry.
|
||||||
if (discard_locals
|
if ((discard_locals
|
||||||
|
|| (discard_sec_merge
|
||||||
|
&& is_ordinary
|
||||||
|
&& out_section_offsets[shndx] == invalid_address))
|
||||||
&& sym.get_st_type() != elfcpp::STT_FILE
|
&& sym.get_st_type() != elfcpp::STT_FILE
|
||||||
&& !lv.needs_output_dynsym_entry()
|
&& !lv.needs_output_dynsym_entry()
|
||||||
&& lv.may_be_discarded_from_output_symtab()
|
&& lv.may_be_discarded_from_output_symtab()
|
||||||
|
|
|
@ -345,6 +345,27 @@ General_options::parse_defsym(const char*, const char* arg,
|
||||||
cmdline->script_options().define_symbol(arg);
|
cmdline->script_options().define_symbol(arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
General_options::parse_discard_all(const char*, const char*,
|
||||||
|
Command_line*)
|
||||||
|
{
|
||||||
|
this->discard_locals_ = DISCARD_ALL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
General_options::parse_discard_locals(const char*, const char*,
|
||||||
|
Command_line*)
|
||||||
|
{
|
||||||
|
this->discard_locals_ = DISCARD_LOCALS;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
General_options::parse_discard_none(const char*, const char*,
|
||||||
|
Command_line*)
|
||||||
|
{
|
||||||
|
this->discard_locals_ = DISCARD_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
General_options::parse_incremental(const char*, const char*,
|
General_options::parse_incremental(const char*, const char*,
|
||||||
Command_line*)
|
Command_line*)
|
||||||
|
@ -927,7 +948,8 @@ General_options::General_options()
|
||||||
symbols_to_retain_(),
|
symbols_to_retain_(),
|
||||||
section_starts_(),
|
section_starts_(),
|
||||||
fix_v4bx_(FIX_V4BX_NONE),
|
fix_v4bx_(FIX_V4BX_NONE),
|
||||||
endianness_(ENDIANNESS_NOT_SET)
|
endianness_(ENDIANNESS_NOT_SET),
|
||||||
|
discard_locals_(DISCARD_SEC_MERGE)
|
||||||
{
|
{
|
||||||
// Turn off option registration once construction is complete.
|
// Turn off option registration once construction is complete.
|
||||||
gold::options::ready_to_register = false;
|
gold::options::ready_to_register = false;
|
||||||
|
|
|
@ -739,10 +739,12 @@ class General_options
|
||||||
N_("Look for violations of the C++ One Definition Rule"),
|
N_("Look for violations of the C++ One Definition Rule"),
|
||||||
N_("Do not look for violations of the C++ One Definition Rule"));
|
N_("Do not look for violations of the C++ One Definition Rule"));
|
||||||
|
|
||||||
DEFINE_bool(discard_all, options::TWO_DASHES, 'x', false,
|
DEFINE_special(discard_all, options::TWO_DASHES, 'x',
|
||||||
N_("Delete all local symbols"), NULL);
|
N_("Delete all local symbols"), NULL);
|
||||||
DEFINE_bool(discard_locals, options::TWO_DASHES, 'X', false,
|
DEFINE_special(discard_locals, options::TWO_DASHES, 'X',
|
||||||
N_("Delete all temporary local symbols"), NULL);
|
N_("Delete all temporary local symbols"), NULL);
|
||||||
|
DEFINE_special(discard_none, options::TWO_DASHES, '\0',
|
||||||
|
N_("Keep all local symbols"), NULL);
|
||||||
|
|
||||||
DEFINE_bool(dynamic_list_data, options::TWO_DASHES, '\0', false,
|
DEFINE_bool(dynamic_list_data, options::TWO_DASHES, '\0', false,
|
||||||
N_("Add data symbols to dynamic symbols"), NULL);
|
N_("Add data symbols to dynamic symbols"), NULL);
|
||||||
|
@ -1526,11 +1528,36 @@ class General_options
|
||||||
endianness() const
|
endianness() const
|
||||||
{ return this->endianness_; }
|
{ return this->endianness_; }
|
||||||
|
|
||||||
|
bool
|
||||||
|
discard_all() const
|
||||||
|
{ return this->discard_locals_ == DISCARD_ALL; }
|
||||||
|
|
||||||
|
bool
|
||||||
|
discard_locals() const
|
||||||
|
{ return this->discard_locals_ == DISCARD_LOCALS; }
|
||||||
|
|
||||||
|
bool
|
||||||
|
discard_sec_merge() const
|
||||||
|
{ return this->discard_locals_ == DISCARD_SEC_MERGE; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// Don't copy this structure.
|
// Don't copy this structure.
|
||||||
General_options(const General_options&);
|
General_options(const General_options&);
|
||||||
General_options& operator=(const General_options&);
|
General_options& operator=(const General_options&);
|
||||||
|
|
||||||
|
// What local symbols to discard.
|
||||||
|
enum Discard_locals
|
||||||
|
{
|
||||||
|
// Locals in merge sections (default).
|
||||||
|
DISCARD_SEC_MERGE,
|
||||||
|
// None (--discard-none).
|
||||||
|
DISCARD_NONE,
|
||||||
|
// Temporary locals (--discard-locals/-X).
|
||||||
|
DISCARD_LOCALS,
|
||||||
|
// All locals (--discard-all/-x).
|
||||||
|
DISCARD_ALL
|
||||||
|
};
|
||||||
|
|
||||||
// Whether to mark the stack as executable.
|
// Whether to mark the stack as executable.
|
||||||
enum Execstack
|
enum Execstack
|
||||||
{
|
{
|
||||||
|
@ -1626,6 +1653,8 @@ class General_options
|
||||||
Fix_v4bx fix_v4bx_;
|
Fix_v4bx fix_v4bx_;
|
||||||
// Endianness.
|
// Endianness.
|
||||||
Endianness endianness_;
|
Endianness endianness_;
|
||||||
|
// What local symbols to discard.
|
||||||
|
Discard_locals discard_locals_;
|
||||||
};
|
};
|
||||||
|
|
||||||
// The position-dependent options. We use this to store the state of
|
// The position-dependent options. We use this to store the state of
|
||||||
|
|
Loading…
Reference in a new issue