* archive.cc (Library_base::should_include_member): Check for
--export-dynamic-symbol. * options.h (class General_options): Add --export-dynamic-symbol. * symtab.cc (Symbol::should_add_dynsym_entry): Check for --export-dynamic-symbol. (Symbol_table::gc_mark_undef_symbols): Likewise. (Symbol_table::do_add_undefined_symbols_from_command_line): Likewise.
This commit is contained in:
parent
f3e8aed339
commit
31821be097
|
@ -1,3 +1,13 @@
|
|||
2012-04-16 Cary Coutant <ccoutant@google.com>
|
||||
|
||||
* archive.cc (Library_base::should_include_member): Check for
|
||||
--export-dynamic-symbol.
|
||||
* options.h (class General_options): Add --export-dynamic-symbol.
|
||||
* symtab.cc (Symbol::should_add_dynsym_entry): Check for
|
||||
--export-dynamic-symbol.
|
||||
(Symbol_table::gc_mark_undef_symbols): Likewise.
|
||||
(Symbol_table::do_add_undefined_symbols_from_command_line): Likewise.
|
||||
|
||||
2012-04-12 David S. Miller <davem@davemloft.net>
|
||||
|
||||
* sparc.cc (Reloc::wdisp10): New relocation method.
|
||||
|
|
|
@ -104,6 +104,11 @@ Library_base::should_include_member(Symbol_table* symtab, Layout* layout,
|
|||
*why = "-u ";
|
||||
*why += sym_name;
|
||||
}
|
||||
else if (parameters->options().is_export_dynamic_symbol(sym_name))
|
||||
{
|
||||
*why = "--export-dynamic-symbol ";
|
||||
*why += sym_name;
|
||||
}
|
||||
else if (layout->script_options()->is_referenced(sym_name))
|
||||
{
|
||||
size_t alc = 100 + strlen(sym_name);
|
||||
|
|
|
@ -739,6 +739,9 @@ class General_options
|
|||
N_("Export all dynamic symbols"),
|
||||
N_("Do not export all dynamic symbols (default)"));
|
||||
|
||||
DEFINE_set(export_dynamic_symbol, options::TWO_DASHES, '\0',
|
||||
N_("Export SYMBOL to dynamic symbol table"), N_("SYMBOL"));
|
||||
|
||||
DEFINE_special(EB, options::ONE_DASH, '\0',
|
||||
N_("Link big-endian objects."), NULL);
|
||||
|
||||
|
|
|
@ -363,14 +363,22 @@ Symbol::should_add_dynsym_entry(Symbol_table* symtab) const
|
|||
return false;
|
||||
}
|
||||
|
||||
// If the symbol was forced dynamic in a --dynamic-list file
|
||||
// or an --export-dynamic-symbol option, add it.
|
||||
if (parameters->options().in_dynamic_list(this->name())
|
||||
|| parameters->options().is_export_dynamic_symbol(this->name()))
|
||||
{
|
||||
if (!this->is_forced_local())
|
||||
return true;
|
||||
gold_warning(_("Cannot export local symbol '%s'"),
|
||||
this->demangled_name().c_str());
|
||||
return false;
|
||||
}
|
||||
|
||||
// If the symbol was forced local in a version script, do not add it.
|
||||
if (this->is_forced_local())
|
||||
return false;
|
||||
|
||||
// If the symbol was forced dynamic in a --dynamic-list file, add it.
|
||||
if (parameters->options().in_dynamic_list(this->name()))
|
||||
return true;
|
||||
|
||||
// If dynamic-list-data was specified, add any STT_OBJECT.
|
||||
if (parameters->options().dynamic_list_data()
|
||||
&& !this->is_from_dynobj()
|
||||
|
@ -551,8 +559,8 @@ Symbol_table::is_section_folded(Object* obj, unsigned int shndx) const
|
|||
&& this->icf_->is_section_folded(obj, shndx));
|
||||
}
|
||||
|
||||
// For symbols that have been listed with -u option, add them to the
|
||||
// work list to avoid gc'ing them.
|
||||
// For symbols that have been listed with a -u or --export-dynamic-symbol
|
||||
// option, add them to the work list to avoid gc'ing them.
|
||||
|
||||
void
|
||||
Symbol_table::gc_mark_undef_symbols(Layout* layout)
|
||||
|
@ -579,6 +587,28 @@ Symbol_table::gc_mark_undef_symbols(Layout* layout)
|
|||
}
|
||||
}
|
||||
|
||||
for (options::String_set::const_iterator p =
|
||||
parameters->options().export_dynamic_symbol_begin();
|
||||
p != parameters->options().export_dynamic_symbol_end();
|
||||
++p)
|
||||
{
|
||||
const char* name = p->c_str();
|
||||
Symbol* sym = this->lookup(name);
|
||||
gold_assert(sym != NULL);
|
||||
if (sym->source() == Symbol::FROM_OBJECT
|
||||
&& !sym->object()->is_dynamic())
|
||||
{
|
||||
Relobj* obj = static_cast<Relobj*>(sym->object());
|
||||
bool is_ordinary;
|
||||
unsigned int shndx = sym->shndx(&is_ordinary);
|
||||
if (is_ordinary)
|
||||
{
|
||||
gold_assert(this->gc_ != NULL);
|
||||
this->gc_->worklist().push(Section_id(obj, shndx));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (Script_options::referenced_const_iterator p =
|
||||
layout->script_options()->referenced_begin();
|
||||
p != layout->script_options()->referenced_end();
|
||||
|
@ -2291,6 +2321,12 @@ Symbol_table::do_add_undefined_symbols_from_command_line(Layout* layout)
|
|||
++p)
|
||||
this->add_undefined_symbol_from_command_line<size>(p->c_str());
|
||||
|
||||
for (options::String_set::const_iterator p =
|
||||
parameters->options().export_dynamic_symbol_begin();
|
||||
p != parameters->options().export_dynamic_symbol_end();
|
||||
++p)
|
||||
this->add_undefined_symbol_from_command_line<size>(p->c_str());
|
||||
|
||||
for (Script_options::referenced_const_iterator p =
|
||||
layout->script_options()->referenced_begin();
|
||||
p != layout->script_options()->referenced_end();
|
||||
|
|
Loading…
Reference in New Issue