This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
[PATCH] [gold] Resolve forwarding symbols when computing symbol resolution info for plugins.
- From: Peter Collingbourne <pcc at google dot com>
- To: binutils at sourceware dot org
- Cc: Peter Collingbourne <pcc at google dot com>
- Date: Mon, 2 Feb 2015 15:56:37 -0800
- Subject: [PATCH] [gold] Resolve forwarding symbols when computing symbol resolution info for plugins.
- Authentication-results: sourceware.org; auth=none
If we observe a symbol defined by a plugin, followed by a versioned symbol
reference in a DSO, followed by a default-versioned definition of the symbol
in another DSO, the plugin-defined symbol will become a forwarding symbol
pointing to the DSO-defined symbol. We must resolve the forwarding symbol
in order to compute the correct resolution for the symbol, which in this
case should be LDPR_PREVAILING_DEF.
2015-02-02 Peter Collingbourne <pcc@google.com>
* plugin.cc (Pluginobj::get_symbol_resolution_info): Resolve
forwarding symbols when computing symbol resolution info for plugins.
---
gold/ChangeLog | 5 +++++
gold/plugin.cc | 17 ++++++++++++-----
gold/plugin.h | 7 ++++++-
3 files changed, 23 insertions(+), 6 deletions(-)
diff --git a/gold/ChangeLog b/gold/ChangeLog
index c3ea98d..92511e4 100644
--- a/gold/ChangeLog
+++ b/gold/ChangeLog
@@ -1,3 +1,8 @@
+2015-02-02 Peter Collingbourne <pcc@google.com>
+
+ * plugin.cc (Pluginobj::get_symbol_resolution_info): Resolve
+ forwarding symbols when computing symbol resolution info for plugins.
+
2015-01-27 Peter Collingbourne <pcc@google.com>
* archive.cc (Archive::get_elf_object_for_member): Unlock external
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;
--
2.2.0.rc0.207.ga3a616c