From 31821be097c4154d3d7d201d9f4939a47af97ac6 Mon Sep 17 00:00:00 2001 From: Cary Coutant Date: Tue, 17 Apr 2012 00:28:41 +0000 Subject: [PATCH] * 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. --- gold/ChangeLog | 10 ++++++++++ gold/archive.cc | 5 +++++ gold/options.h | 3 +++ gold/symtab.cc | 48 ++++++++++++++++++++++++++++++++++++++++++------ 4 files changed, 60 insertions(+), 6 deletions(-) diff --git a/gold/ChangeLog b/gold/ChangeLog index 83d9105593..471db35160 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,3 +1,13 @@ +2012-04-16 Cary Coutant + + * 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 * sparc.cc (Reloc::wdisp10): New relocation method. diff --git a/gold/archive.cc b/gold/archive.cc index c2e6ff63db..4db813d6df 100644 --- a/gold/archive.cc +++ b/gold/archive.cc @@ -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); diff --git a/gold/options.h b/gold/options.h index b5df3ebf2a..b244bd54b3 100644 --- a/gold/options.h +++ b/gold/options.h @@ -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); diff --git a/gold/symtab.cc b/gold/symtab.cc index f0ba1d560f..1edb88da4d 100644 --- a/gold/symtab.cc +++ b/gold/symtab.cc @@ -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(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(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(p->c_str()); + for (Script_options::referenced_const_iterator p = layout->script_options()->referenced_begin(); p != layout->script_options()->referenced_end(); -- 2.34.1