| 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; |
| |