aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ld/ChangeLog9
-rw-r--r--ld/ldmain.c17
-rw-r--r--ld/plugin.c7
-rw-r--r--ld/plugin.h5
4 files changed, 22 insertions, 16 deletions
diff --git a/ld/ChangeLog b/ld/ChangeLog
index 147db32..a57210e 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,3 +1,12 @@
+2011-02-14 Alan Modra <amodra@gmail.com>
+
+ * ldmain.c (remove_output): Rename to..
+ (ld_cleanup): ..this. Call bfd_cache_close_all and plugin_call_cleanup.
+ (main): Adjust.
+ * plugin.c (plugin_call_cleanup): Make global.
+ (plugin_load_plugins): Don't register plugin_call_cleanup with xatexit.
+ * plugin.h (plugin_call_cleanup): Declare.
+
2011-02-13 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
* configure: Regenerate.
diff --git a/ld/ldmain.c b/ld/ldmain.c
index 19c42d9..6e86c3d 100644
--- a/ld/ldmain.c
+++ b/ld/ldmain.c
@@ -174,15 +174,14 @@ static struct bfd_link_callbacks link_callbacks =
struct bfd_link_info link_info;
static void
-remove_output (void)
+ld_cleanup (void)
{
- if (output_filename)
- {
- if (link_info.output_bfd)
- bfd_cache_close (link_info.output_bfd);
- if (delete_output_file_on_failure)
- unlink_if_ordinary (output_filename);
- }
+ bfd_cache_close_all ();
+#ifdef ENABLE_PLUGINS
+ plugin_call_cleanup ();
+#endif
+ if (output_filename && delete_output_file_on_failure)
+ unlink_if_ordinary (output_filename);
}
int
@@ -211,7 +210,7 @@ main (int argc, char **argv)
bfd_set_error_program_name (program_name);
- xatexit (remove_output);
+ xatexit (ld_cleanup);
/* Set up the sysroot directory. */
ld_sysroot = get_sysroot (argc, argv);
diff --git a/ld/plugin.c b/ld/plugin.c
index b285787..86d80ca 100644
--- a/ld/plugin.c
+++ b/ld/plugin.c
@@ -108,9 +108,6 @@ static bfd_boolean no_more_claiming = FALSE;
TRUE is returned from the hook. */
static bfd_boolean plugin_cached_allow_multiple_defs = FALSE;
-/* Call 'cleanup' hook for all plugins at exit. */
-static void plugin_call_cleanup (void);
-
/* List of tags to set in the constant leading part of the tv array. */
static const enum ld_plugin_tag tv_header_tags[] =
{
@@ -721,8 +718,6 @@ plugin_load_plugins (void)
if (!curplug)
return 0;
- xatexit (plugin_call_cleanup);
-
/* First pass over plugins to find max # args needed so that we
can size and allocate the tv array. */
while (curplug)
@@ -820,7 +815,7 @@ plugin_call_all_symbols_read (void)
}
/* Call 'cleanup' hook for all plugins at exit. */
-static void
+void
plugin_call_cleanup (void)
{
plugin_t *curplug = plugins_list;
diff --git a/ld/plugin.h b/ld/plugin.h
index fc5f37f..5b340be 100644
--- a/ld/plugin.h
+++ b/ld/plugin.h
@@ -1,5 +1,5 @@
/* Plugin control for the GNU linker.
- Copyright 2010 Free Software Foundation, Inc.
+ Copyright 2010, 2011 Free Software Foundation, Inc.
This file is part of the GNU Binutils.
@@ -50,6 +50,9 @@ extern int plugin_call_claim_file (const struct ld_plugin_input_file *file,
/* Call 'all symbols read' hook for all plugins. */
extern int plugin_call_all_symbols_read (void);
+/* Call 'cleanup' hook for all plugins at exit. */
+extern void plugin_call_cleanup (void);
+
/* Generate a dummy BFD to represent an IR file, for any callers of
plugin_call_claim_file to use as the handle in the ld_plugin_input_file
struct that they build to pass in. The BFD is initially writable, so