summaryrefslogtreecommitdiff
path: root/ld
diff options
context:
space:
mode:
Diffstat (limited to 'ld')
-rw-r--r--ld/ChangeLog11
-rw-r--r--ld/ldfile.c10
-rw-r--r--ld/ldmain.c5
-rw-r--r--ld/plugin.c24
-rw-r--r--ld/plugin.h7
5 files changed, 42 insertions, 15 deletions
diff --git a/ld/ChangeLog b/ld/ChangeLog
index e3620b93ef..873da69c49 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,3 +1,14 @@
+2010-11-05 Dave Korn <dave.korn.cygwin@gmail.com>
+
+ * plugin.h (plugin_active_plugins_p): New prototype.
+ (is_ir_dummy_bfd): Delete prototype.
+ * plugin.c: Fix formatting issues.
+ (is_ir_dummy_bfd): Make static.
+ (plugin_active_plugins_p): New function.
+ * ldfile.c (ldfile_try_open_bfd): Use it to save work if no plugins
+ are loaded. Always close file descriptor after claim handler returns.
+ * ldmain.c (add_archive_element): Likewise.
+
2010-11-05 Alan Modra <amodra@gmail.com>
* ldlang.c (lang_add_section): Distinguish ELF treatment of NOLOAD.
diff --git a/ld/ldfile.c b/ld/ldfile.c
index 701b3803ca..6364469071 100644
--- a/ld/ldfile.c
+++ b/ld/ldfile.c
@@ -312,7 +312,8 @@ success:
bfd_object that it sets the bfd's arch and mach, which
will be needed when and if we want to bfd_create a new
one using this one as a template. */
- if (bfd_check_format (entry->the_bfd, bfd_object))
+ if (bfd_check_format (entry->the_bfd, bfd_object)
+ && plugin_active_plugins_p ())
{
int fd = open (attempt, O_RDONLY | O_BINARY);
if (fd >= 0)
@@ -330,6 +331,8 @@ success:
if (plugin_call_claim_file (&file, &claimed))
einfo (_("%P%F: %s: plugin reported error claiming file\n"),
plugin_error_plugin ());
+ /* fd belongs to us, not the plugin; but we don't need it. */
+ close (fd);
if (claimed)
{
/* Discard the real file's BFD and substitute the dummy one. */
@@ -340,10 +343,9 @@ success:
}
else
{
- /* If plugin didn't claim the file, we don't need the fd or the
- dummy bfd. Can't avoid speculatively creating it, alas. */
+ /* 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);
- close (fd);
entry->claimed = FALSE;
}
}
diff --git a/ld/ldmain.c b/ld/ldmain.c
index 04b56335e8..e9b804a9e6 100644
--- a/ld/ldmain.c
+++ b/ld/ldmain.c
@@ -809,7 +809,7 @@ 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)
+ if (bfd_my_archive (abfd) != NULL && plugin_active_plugins_p ())
{
/* We must offer this archive member to the plugins to claim. */
int fd = open (bfd_my_archive (abfd)->filename, O_RDONLY | O_BINARY);
@@ -831,6 +831,8 @@ add_archive_element (struct bfd_link_info *info,
if (plugin_call_claim_file (&file, &claimed))
einfo (_("%P%F: %s: plugin reported error claiming file\n"),
plugin_error_plugin ());
+ /* fd belongs to us, not the plugin; but we don't need it. */
+ close (fd);
if (claimed)
{
/* Substitute the dummy BFD. */
@@ -843,7 +845,6 @@ add_archive_element (struct bfd_link_info *info,
{
/* Abandon the dummy BFD. */
bfd_close_all_done (file.handle);
- close (fd);
input->claimed = FALSE;
}
}
diff --git a/ld/plugin.c b/ld/plugin.c
index 1e280e4cd2..ea647886fc 100644
--- a/ld/plugin.c
+++ b/ld/plugin.c
@@ -172,13 +172,15 @@ plugin_error_p (void)
}
/* Return name of plugin which caused an error if any. */
-const char *plugin_error_plugin (void)
+const char *
+plugin_error_plugin (void)
{
return error_plugin ? error_plugin : _("<no plugin>");
}
/* Handle -plugin arg: find and load plugin, or return error. */
-int plugin_opt_plugin (const char *plugin)
+int
+plugin_opt_plugin (const char *plugin)
{
plugin_t *newplug;
@@ -201,7 +203,8 @@ int plugin_opt_plugin (const char *plugin)
/* Accumulate option arguments for last-loaded plugin, or return
error if none. */
-int plugin_opt_plugin_arg (const char *arg)
+int
+plugin_opt_plugin_arg (const char *arg)
{
plugin_arg_t *newarg;
@@ -241,8 +244,8 @@ plugin_get_ir_dummy_bfd (const char *name, bfd *srctemplate)
return abfd;
}
-/* Check if the BFD is an IR dummy. */
-bfd_boolean
+/* Check if the BFD passed in is an IR dummy object file. */
+static bfd_boolean
is_ir_dummy_bfd (const bfd *abfd)
{
size_t namlen;
@@ -615,8 +618,17 @@ set_tv_plugin_args (plugin_t *plugin, struct ld_plugin_tv *tv)
tv->tv_u.tv_val = 0;
}
+/* Return true if any plugins are active this run. Only valid
+ after options have been processed. */
+bfd_boolean
+plugin_active_plugins_p (void)
+{
+ return plugins_list != NULL;
+}
+
/* Load up and initialise all plugins after argument parsing. */
-int plugin_load_plugins (void)
+int
+plugin_load_plugins (void)
{
struct ld_plugin_tv *my_tv;
unsigned int max_args = 0;
diff --git a/ld/plugin.h b/ld/plugin.h
index 5bd083f060..b79e739223 100644
--- a/ld/plugin.h
+++ b/ld/plugin.h
@@ -33,6 +33,10 @@ extern int plugin_opt_plugin (const char *plugin);
error if none. */
extern int plugin_opt_plugin_arg (const char *arg);
+/* Return true if any plugins are active this run. Only valid
+ after options have been processed. */
+extern bfd_boolean plugin_active_plugins_p (void);
+
/* Load up and initialise all plugins after argument parsing. */
extern int plugin_load_plugins (void);
@@ -56,9 +60,6 @@ extern int plugin_call_cleanup (void);
add_symbols hook has been called so that it can be read when linking. */
extern bfd *plugin_get_ir_dummy_bfd (const char *name, bfd *template);
-/* Check if the BFD passed in is an IR dummy object file. */
-extern bfd_boolean is_ir_dummy_bfd (const bfd *abfd);
-
/* Notice-symbol bfd linker callback hook. */
extern bfd_boolean plugin_notice (struct bfd_link_info *info,
const char *name, bfd *abfd, asection *section,