/* Plugin control for the GNU linker.
- Copyright 2010, 2011 Free Software Foundation, Inc.
+ Copyright 2010, 2011, 2012 Free Software Foundation, Inc.
This file is part of the GNU Binutils.
when processing DT_NEEDED dependencies. */
return (abfd
&& abfd->usrdata
- && ((lang_input_statement_type *)(abfd->usrdata))->claimed);
+ && ((lang_input_statement_type *)(abfd->usrdata))->flags.claimed);
}
/* Helpers to convert between BFD and GOLD symbol formats. */
/* Return TRUE if a defined symbol might be reachable from outside the
universe of claimed objects. */
static inline bfd_boolean
-is_visible_from_outside (struct ld_plugin_symbol *lsym, asection *section,
+is_visible_from_outside (struct ld_plugin_symbol *lsym,
struct bfd_link_hash_entry *blhe)
{
struct bfd_sym_chain *sym;
- /* Section's owner may be NULL if it is the absolute
- section, fortunately is_ir_dummy_bfd handles that. */
- if (!is_ir_dummy_bfd (section->owner))
- return TRUE;
if (link_info.relocatable)
return TRUE;
- if (link_info.export_dynamic || link_info.shared)
+ if (link_info.export_dynamic || !link_info.executable)
{
/* Check if symbol is hidden by version script. */
if (bfd_hide_sym_by_version (link_info.version_info,
symbol is externally visible. */
if (blhe->non_ir_ref)
res = LDPR_PREVAILING_DEF;
- else if (is_visible_from_outside (&syms[n], owner_sec, blhe))
+ else if (is_visible_from_outside (&syms[n], blhe))
res = def_ironly_exp;
}
case LDPT_LINKER_OUTPUT:
TVU(val) = (link_info.relocatable
? LDPO_REL
- : (link_info.shared ? LDPO_DYN : LDPO_EXEC));
+ : (link_info.executable
+ ? (link_info.pie ? LDPO_PIE : LDPO_EXEC)
+ : LDPO_DYN));
break;
case LDPT_OUTPUT_NAME:
TVU(string) = output_filename;
while (curplug)
{
enum ld_plugin_status rv;
- ld_plugin_onload onloadfn = dlsym (curplug->dlhandle, "onload");
+ ld_plugin_onload onloadfn;
+
+ onloadfn = (ld_plugin_onload) dlsym (curplug->dlhandle, "onload");
if (!onloadfn)
- onloadfn = dlsym (curplug->dlhandle, "_onload");
+ onloadfn = (ld_plugin_onload) dlsym (curplug->dlhandle, "_onload");
if (!onloadfn)
return set_plugin_error (curplug->name);
set_tv_plugin_args (curplug, &my_tv[tv_header_size]);
if (entry->the_bfd->my_archive == NULL)
bfd_close (entry->the_bfd);
entry->the_bfd = file->handle;
- entry->claimed = TRUE;
+ entry->flags.claimed = TRUE;
bfd_make_readable (entry->the_bfd);
}
else
/* If plugin didn't claim the file, we don't need the dummy bfd.
Can't avoid speculatively creating it, alas. */
bfd_close_all_done (file->handle);
- entry->claimed = FALSE;
+ entry->flags.claimed = FALSE;
}
}
abfd, section, value, flags, string);
return TRUE;
}
+
+/* Return true if bfd is a dynamic library that should be reloaded. */
+
+bfd_boolean
+plugin_should_reload (bfd *abfd)
+{
+ return ((abfd->flags & DYNAMIC) != 0
+ && bfd_get_flavour (abfd) == bfd_target_elf_flavour
+ && bfd_get_format (abfd) == bfd_object
+ && (elf_dyn_lib_class (abfd) & DYN_AS_NEEDED) != 0);
+}