summaryrefslogtreecommitdiffstats
path: root/binutils-2.22/gold/plugin.cc
diff options
context:
space:
mode:
Diffstat (limited to 'binutils-2.22/gold/plugin.cc')
-rw-r--r--binutils-2.22/gold/plugin.cc51
1 files changed, 30 insertions, 21 deletions
diff --git a/binutils-2.22/gold/plugin.cc b/binutils-2.22/gold/plugin.cc
index 3ccd8d0..5aadc55 100644
--- a/binutils-2.22/gold/plugin.cc
+++ b/binutils-2.22/gold/plugin.cc
@@ -184,6 +184,8 @@ Plugin::load()
tv[i].tv_u.tv_val = LDPO_REL;
else if (parameters->options().shared())
tv[i].tv_u.tv_val = LDPO_DYN;
+ else if (parameters->options().pie())
+ tv[i].tv_u.tv_val = LDPO_PIE;
else
tv[i].tv_u.tv_val = LDPO_EXEC;
@@ -818,7 +820,9 @@ Pluginobj::Pluginobj(const std::string& name, Input_file* input_file,
}
// Return TRUE if a defined symbol is referenced from outside the
-// universe of claimed objects.
+// universe of claimed objects. Only references from relocatable,
+// non-IR (unclaimed) objects count as a reference. References from
+// dynamic objects count only as "visible".
static inline bool
is_referenced_from_outside(Symbol* lsym)
@@ -838,6 +842,8 @@ is_referenced_from_outside(Symbol* lsym)
static inline bool
is_visible_from_outside(Symbol* lsym)
{
+ if (lsym->in_dyn())
+ return true;
if (parameters->options().export_dynamic() || parameters->options().shared())
return lsym->is_externally_visible();
return false;
@@ -1155,13 +1161,14 @@ Sized_pluginobj<size, big_endian>::do_section_name(unsigned int)
// Return a view of the contents of a section. Not used for plugin objects.
template<int size, bool big_endian>
-Object::Location
-Sized_pluginobj<size, big_endian>::do_section_contents(unsigned int)
+const unsigned char*
+Sized_pluginobj<size, big_endian>::do_section_contents(
+ unsigned int,
+ section_size_type*,
+ bool)
{
- Location loc(0, 0);
-
gold_unreachable();
- return loc;
+ return NULL;
}
// Return section flags. Not used for plugin objects.
@@ -1244,14 +1251,18 @@ Sized_pluginobj<size, big_endian>::do_initialize_xindex()
return NULL;
}
-// Get symbol counts. Not used for plugin objects.
+// Get symbol counts. Don't count plugin objects; the replacement
+// files will provide the counts.
template<int size, bool big_endian>
void
-Sized_pluginobj<size, big_endian>::do_get_global_symbol_counts(const Symbol_table*,
- size_t*, size_t*) const
+Sized_pluginobj<size, big_endian>::do_get_global_symbol_counts(
+ const Symbol_table*,
+ size_t* defined,
+ size_t* used) const
{
- gold_unreachable();
+ *defined = 0;
+ *used = 0;
}
// Get symbols. Not used for plugin objects.
@@ -1630,7 +1641,7 @@ get_input_section_contents(const struct ld_plugin_section section,
// which they should appear in the final layout.
static enum ld_plugin_status
-update_section_order(const struct ld_plugin_section *section_list,
+update_section_order(const struct ld_plugin_section* section_list,
unsigned int num_sections)
{
gold_assert(parameters->options().has_plugins());
@@ -1641,8 +1652,14 @@ update_section_order(const struct ld_plugin_section *section_list,
if (section_list == NULL)
return LDPS_ERR;
- std::map<Section_id, unsigned int> order_map;
+ Layout* layout = parameters->options().plugins()->layout();
+ gold_assert (layout != NULL);
+ std::map<Section_id, unsigned int>* order_map
+ = layout->get_section_order_map();
+
+ /* Store the mapping from Section_id to section position in layout's
+ order_map to consult after output sections are added. */
for (unsigned int i = 0; i < num_sections; ++i)
{
Object* obj = parameters->options().plugins()->get_elf_object(
@@ -1651,17 +1668,9 @@ update_section_order(const struct ld_plugin_section *section_list,
return LDPS_BAD_HANDLE;
unsigned int shndx = section_list[i].shndx;
Section_id secn_id(obj, shndx);
- order_map[secn_id] = i + 1;
+ (*order_map)[secn_id] = i + 1;
}
- Layout* layout = parameters->options().plugins()->layout();
- gold_assert (layout != NULL);
-
- for (Layout::Section_list::const_iterator p = layout->section_list().begin();
- p != layout->section_list().end();
- ++p)
- (*p)->update_section_layout(order_map);
-
return LDPS_OK;
}