|  | commit 3c537f7fdb11f02f7082749f3f21dfdd2c2025e8 | 
|  | Author: Peter Collingbourne <pcc@google.com> | 
|  | Date:   Wed Feb 4 09:47:28 2015 -0800 | 
|  |  | 
|  | Resolve forwarding symbols in plugins. | 
|  |  | 
|  | 2015-02-04  Peter Collingbourne  <pcc@google.com> | 
|  |  | 
|  | * plugin.cc (Pluginobj::get_symbol_resolution_info): Resolve | 
|  | forwarding symbols when computing symbol resolution info for plugins. | 
|  |  | 
|  | diff --git a/gold/plugin.cc b/gold/plugin.cc | 
|  | index bde8c78..68da8e3 100644 | 
|  | --- a/gold/plugin.cc | 
|  | +++ b/gold/plugin.cc | 
|  | @@ -914,7 +914,8 @@ is_visible_from_outside(Symbol* lsym) | 
|  | // Get symbol resolution info. | 
|  |  | 
|  | ld_plugin_status | 
|  | -Pluginobj::get_symbol_resolution_info(int nsyms, | 
|  | +Pluginobj::get_symbol_resolution_info(Symbol_table* symtab, | 
|  | +				      int nsyms, | 
|  | ld_plugin_symbol* syms, | 
|  | int version) const | 
|  | { | 
|  | @@ -943,6 +944,8 @@ Pluginobj::get_symbol_resolution_info(int nsyms, | 
|  | { | 
|  | ld_plugin_symbol* isym = &syms[i]; | 
|  | Symbol* lsym = this->symbols_[i]; | 
|  | +      if (lsym->is_forwarder()) | 
|  | +        lsym = symtab->resolve_forwards(lsym); | 
|  | ld_plugin_symbol_resolution res = LDPR_UNKNOWN; | 
|  |  | 
|  | if (lsym->is_undefined()) | 
|  | @@ -1511,14 +1514,16 @@ static enum ld_plugin_status | 
|  | get_symbols(const void* handle, int nsyms, ld_plugin_symbol* syms) | 
|  | { | 
|  | gold_assert(parameters->options().has_plugins()); | 
|  | -  Object* obj = parameters->options().plugins()->object( | 
|  | +  Plugin_manager* plugins = parameters->options().plugins(); | 
|  | +  Object* obj = plugins->object( | 
|  | static_cast<unsigned int>(reinterpret_cast<intptr_t>(handle))); | 
|  | if (obj == NULL) | 
|  | return LDPS_ERR; | 
|  | Pluginobj* plugin_obj = obj->pluginobj(); | 
|  | if (plugin_obj == NULL) | 
|  | return LDPS_ERR; | 
|  | -  return plugin_obj->get_symbol_resolution_info(nsyms, syms, 1); | 
|  | +  Symbol_table* symtab = plugins->symtab(); | 
|  | +  return plugin_obj->get_symbol_resolution_info(symtab, nsyms, syms, 1); | 
|  | } | 
|  |  | 
|  | // Version 2 of the above.  The only difference is that this version | 
|  | @@ -1528,14 +1533,16 @@ static enum ld_plugin_status | 
|  | get_symbols_v2(const void* handle, int nsyms, ld_plugin_symbol* syms) | 
|  | { | 
|  | gold_assert(parameters->options().has_plugins()); | 
|  | -  Object* obj = parameters->options().plugins()->object( | 
|  | +  Plugin_manager* plugins = parameters->options().plugins(); | 
|  | +  Object* obj = plugins->object( | 
|  | static_cast<unsigned int>(reinterpret_cast<intptr_t>(handle))); | 
|  | if (obj == NULL) | 
|  | return LDPS_ERR; | 
|  | Pluginobj* plugin_obj = obj->pluginobj(); | 
|  | if (plugin_obj == NULL) | 
|  | return LDPS_ERR; | 
|  | -  return plugin_obj->get_symbol_resolution_info(nsyms, syms, 2); | 
|  | +  Symbol_table* symtab = plugins->symtab(); | 
|  | +  return plugin_obj->get_symbol_resolution_info(symtab, nsyms, syms, 2); | 
|  | } | 
|  |  | 
|  | // Add a new (real) input file generated by a plugin. | 
|  | diff --git a/gold/plugin.h b/gold/plugin.h | 
|  | index ef78b84..f926879 100644 | 
|  | --- a/gold/plugin.h | 
|  | +++ b/gold/plugin.h | 
|  | @@ -282,6 +282,10 @@ class Plugin_manager | 
|  | input_objects() const | 
|  | { return this->input_objects_; } | 
|  |  | 
|  | +  Symbol_table* | 
|  | +  symtab() | 
|  | +  { return this->symtab_; } | 
|  | + | 
|  | Layout* | 
|  | layout() | 
|  | { return this->layout_; } | 
|  | @@ -396,7 +400,8 @@ class Pluginobj : public Object | 
|  |  | 
|  | // Fill in the symbol resolution status for the given plugin symbols. | 
|  | ld_plugin_status | 
|  | -  get_symbol_resolution_info(int nsyms, | 
|  | +  get_symbol_resolution_info(Symbol_table* symtab, | 
|  | +			     int nsyms, | 
|  | ld_plugin_symbol* syms, | 
|  | int version) const; | 
|  |  |