From 3c537f7fdb11f02f7082749f3f21dfdd2c2025e8 Mon Sep 17 00:00:00 2001 From: Peter Collingbourne Date: Wed, 4 Feb 2015 09:47:28 -0800 Subject: [PATCH] Resolve forwarding symbols in plugins. 2015-02-04 Peter Collingbourne * plugin.cc (Pluginobj::get_symbol_resolution_info): Resolve forwarding symbols when computing symbol resolution info for plugins. --- gold/plugin.cc | 17 ++++++++++++----- gold/plugin.h | 7 ++++++- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/gold/plugin.cc b/gold/plugin.cc index bde8c78d3dd..68da8e3606c 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(reinterpret_cast(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(reinterpret_cast(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 ef78b848ccd..f926879897a 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; -- 2.30.2