From 9e2278f567e4ddeb7180ef4e0b3b24e4b087d703 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Sun, 17 Apr 2011 23:15:13 +0000 Subject: PR ld/12365 PR ld/12672 bfd/ * bfd.c (BFD_PLUGIN): Define. (BFD_FLAGS_SAVED, BFD_FLAGS_FOR_BFD_USE_MASK): Add BFD_PLUGIN. * bfd-in2.h: Regenerate. * elflink.c (elf_link_output_extsym): Strip undefined plugin syms. * opncls.c (bfd_make_readable): Don't lose original bfd flags. ld/ * ldfile.c (ldfile_try_open_bfd): Don't attempt any plugin action when no_more_claiming. * ldmain.c (add_archive_element): Likewise. (multiple_definition): Remove plugin_multiple_definition call. (notice): Remove plugin_notice call. * ldlang.c (lang_list_insert_after, void lang_list_remove_tail): Move. Delete prototype. (plugin_insert): New static var. (open_input_bfds): Only rescan libs after plugin insert point. (lang_gc_sections): Omit plugin claimed files. (lang_process): Set plugin_insert. Only rescan when plugin adds objects. * plugin.h (no_more_claiming): Declare. (plugin_notice, plugin_multiple_definition): Don't declare. * plugin.c: Formatting. (orig_notice_all, orig_allow_multiple_defs, orig_callbacks, plugin_callbacks): New static vars. (no_more_claiming): Make global. (plugin_cached_allow_multiple_defs): Delete. (plugin_get_ir_dummy_bfd): Set SEC_EXCLUDE on dummy .text section, use newer bfd_make_section variant. Make COMMON section too. Error handling. Correct setting of gp size. (asymbol_from_plugin_symbol): Properly cast last arg of concat. (message): Likewise for ACONCAT. (asymbol_from_plugin_symbol): Use our COMMON section. (get_symbols): When report_plugin_symbols, show visibility too. (init_non_ironly_hash): Move. Don't test non_ironly_hash. (plugin_load_plugins): Save state of linker callbacks, set up to call plugin_notice instead. Call init_non_ironly_hash here. (plugin_call_all_symbols_read): Set plugin_multiple_definition in plugin callbacks. (plugin_notice): Rewrite. (plugin_multiple_definition): Make static, call original callback. ld/testsuite/ * ld-plugin/plugin-7.d: Adjust for plugin changes. * ld-plugin/plugin-8.d: Likewise. * ld-plugin/plugin.exp: Pass --verbose=2 for visibility test, and compare ld output to.. * ld-plugin/plugin-12.d: New. --- ld/ldmain.c | 30 ++++++------------------------ 1 file changed, 6 insertions(+), 24 deletions(-) (limited to 'ld/ldmain.c') diff --git a/ld/ldmain.c b/ld/ldmain.c index 005a894..52a4b04 100644 --- a/ld/ldmain.c +++ b/ld/ldmain.c @@ -804,7 +804,9 @@ add_archive_element (struct bfd_link_info *info, BFD, but we still want to output the original BFD filename. */ orig_input = *input; #ifdef ENABLE_PLUGINS - if (bfd_my_archive (abfd) != NULL && plugin_active_plugins_p ()) + if (bfd_my_archive (abfd) != NULL + && plugin_active_plugins_p () + && !no_more_claiming) { /* We must offer this archive member to the plugins to claim. */ int fd = open (bfd_my_archive (abfd)->filename, O_RDONLY | O_BINARY); @@ -944,22 +946,11 @@ multiple_definition (struct bfd_link_info *info ATTRIBUTE_UNUSED, asection *nsec, bfd_vma nval) { -#ifdef ENABLE_PLUGINS - /* We may get called back even when --allow-multiple-definition is in - effect, as the plugin infrastructure needs to use this hook in - order to swap out IR-only symbols for real ones. In that case, - it will let us know not to continue by returning TRUE even if this - is not an IR-only vs. non-IR symbol conflict. */ - if (plugin_multiple_definition (info, name, obfd, osec, oval, nbfd, - nsec, nval)) - return TRUE; -#endif /* ENABLE_PLUGINS */ - /* If either section has the output_section field set to bfd_abs_section_ptr, it means that the section is being discarded, and this is not really a multiple definition at all. -FIXME: It would be cleaner to somehow ignore symbols defined in -sections which are being discarded. */ + FIXME: It would be cleaner to somehow ignore symbols defined in + sections which are being discarded. */ if ((osec->output_section != NULL && ! bfd_is_abs_section (osec) && bfd_is_abs_section (osec->output_section)) @@ -1456,17 +1447,8 @@ notice (struct bfd_link_info *info, return TRUE; } -#ifdef ENABLE_PLUGINS - /* We should hide symbols in the dummy IR BFDs from the nocrossrefs list - and let the real object files that are generated and added later trip - the error instead. Similarly would be better to trace the real symbol - from the real file than the temporary dummy. */ - if (!plugin_notice (info, name, abfd, section, value)) - return TRUE; -#endif /* ENABLE_PLUGINS */ - if (info->notice_hash != NULL - && bfd_hash_lookup (info->notice_hash, name, FALSE, FALSE) != NULL) + && bfd_hash_lookup (info->notice_hash, name, FALSE, FALSE) != NULL) { if (bfd_is_und_section (section)) einfo ("%B: reference to %s\n", abfd, name); -- cgit v1.1