diff options
Diffstat (limited to 'bfd/plugin.c')
-rw-r--r-- | bfd/plugin.c | 26 |
1 files changed, 14 insertions, 12 deletions
diff --git a/bfd/plugin.c b/bfd/plugin.c index d57ae59..ebdf250 100644 --- a/bfd/plugin.c +++ b/bfd/plugin.c @@ -73,8 +73,6 @@ dlerror (void) #define bfd_plugin_bfd_free_cached_info _bfd_generic_bfd_free_cached_info #define bfd_plugin_new_section_hook _bfd_generic_new_section_hook #define bfd_plugin_get_section_contents _bfd_generic_get_section_contents -#define bfd_plugin_init_private_section_data _bfd_generic_init_private_section_data -#define bfd_plugin_bfd_copy_private_header_data _bfd_generic_bfd_copy_private_header_data #define bfd_plugin_bfd_merge_private_bfd_data _bfd_generic_bfd_merge_private_bfd_data #define bfd_plugin_bfd_copy_private_header_data _bfd_generic_bfd_copy_private_header_data #define bfd_plugin_bfd_set_private_flags _bfd_generic_bfd_set_private_flags @@ -198,7 +196,10 @@ bfd_plugin_get_symbols_in_object_only (bfd *abfd) abfd->filename, bfd_errmsg (bfd_get_error ())); return; } - else if (!bfd_check_format (nbfd, bfd_object)) + /* Prevent this recursive call into bfd_check_format from + attempting to load the plugin again while it is running. */ + nbfd->plugin_format = bfd_plugin_no; + if (!bfd_check_format (nbfd, bfd_object)) { /* There is no object only section if it isn't a bfd_object file. */ @@ -208,6 +209,7 @@ bfd_plugin_get_symbols_in_object_only (bfd *abfd) } else { + BFD_ASSERT (abfd->plugin_format == bfd_plugin_no); if (!bfd_check_format (abfd, bfd_object)) { (*_bfd_error_handler) @@ -241,6 +243,9 @@ bfd_plugin_get_symbols_in_object_only (bfd *abfd) /* Open the file containing object only section. */ nbfd = bfd_openr (object_only_file, NULL); + /* Prevent this recursive call into bfd_check_format from + attempting to load the plugin again while it is running. */ + nbfd->plugin_format = bfd_plugin_no; if (!bfd_check_format (nbfd, bfd_object)) { (*_bfd_error_handler) @@ -600,6 +605,10 @@ try_load_plugin (const char *pname, if (status != LDPS_OK) goto short_circuit; + /* Setting bfd_plugin_no here prevents recursive calls into + bfd_check_format from within the plugin (unless the plugin opens + another bfd.) Attempting to load the plugin again while it is + running is *not* a good idea. */ abfd->plugin_format = bfd_plugin_no; if (!current_plugin->claim_file) @@ -629,14 +638,6 @@ bfd_plugin_set_plugin (const char *p) plugin_name = p; } -/* Return TRUE if a plugin library is used. */ - -bool -bfd_plugin_specified_p (void) -{ - return plugin_list != NULL; -} - /* Return TRUE if ABFD can be claimed by linker LTO plugin. */ bool @@ -782,7 +783,8 @@ static bool bfd_plugin_bfd_copy_private_section_data (bfd *ibfd ATTRIBUTE_UNUSED, asection *isection ATTRIBUTE_UNUSED, bfd *obfd ATTRIBUTE_UNUSED, - asection *osection ATTRIBUTE_UNUSED) + asection *osection ATTRIBUTE_UNUSED, + struct bfd_link_info *link_info ATTRIBUTE_UNUSED) { BFD_ASSERT (0); return true; |