This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
[gold][patch] Don't put symbols dropped by the plugin in the symbol tables
- From: Rafael Avila de Espindola <rafael dot espindola at gmail dot com>
- To: binutils at sourceware dot org
- Cc: iant at google dot com
- Date: Thu, 17 Feb 2011 15:13:07 -0500
- Subject: [gold][patch] Don't put symbols dropped by the plugin in the symbol tables
The attached patch avoids putting symbols in the symbol tables if there
are only found in IL files. This is important for when LTO manages to
drop some symbols completely.
When linking libxul it reduces the final .so from 39339456 bytes to
34450128 bytes. And yes, firefox still works :-)
2010-02-17 Rafael Ávila de Espíndola <respindola@mozilla.com>
* symtab.cc (Symbol::should_add_dynsym_entry) Return false for
plugin only symbols.
(Symbol_table::sized_finalize_symbol) Mark symbol only present
in plugin files as not needed in the symbol table.
Cheers,
Rafael
diff --git a/gold/symtab.cc b/gold/symtab.cc
index cb650fb..d4ac297 100644
--- a/gold/symtab.cc
+++ b/gold/symtab.cc
@@ -310,6 +310,11 @@ Sized_symbol<size>::allocate_common(Output_data* od, Value_type value)
inline bool
Symbol::should_add_dynsym_entry(Symbol_table* symtab) const
{
+ // If the symbol is only present on plugin files, the plugin decided we
+ // don't need it.
+ if (!this->in_real_elf())
+ return false;
+
// If the symbol is used by a dynamic relocation, we need to add it.
if (this->needs_dynsym_entry())
return true;
@@ -2593,6 +2598,15 @@ Symbol_table::sized_finalize_symbol(Symbol* unsized_sym)
return false;
}
+ // If the symbol is only present on plugin files, the plugin decided we
+ // don't need it.
+ if (!sym->in_real_elf())
+ {
+ gold_assert(!sym->has_symtab_index());
+ sym->set_symtab_index(-1U);
+ return false;
+ }
+
// Compute final symbol value.
Compute_final_value_status status;
Value_type value = this->compute_final_value(sym, &status);