I have been looking at a Fedora bug report[1] from a user who was
receiving warning messages from the BFD library about incompatible
plugins. It turns out that they had both 32-bit and 64-bit versions
of the same plugin installed, and the BFD library was attempting to
load all of them.
After thinking about it for a while, it seemed to me that the simplest
solution was to not warn about incompatible plugins whilst attempting
to create a list of viable plugins.
[1]: https://bugzilla.redhat.com/show_bug.cgi?id=
1836618
* plugin.c (try_load_plugin): Suppress the error message about
being unable to open a plugin if creating a list of viable
plugins.
+2020-06-19 Nick Clifton <nickc@redhat.com>
+
+ * plugin.c (try_load_plugin): Suppress the error message about
+ being unable to open a plugin if creating a list of viable
+ plugins.
+
2020-06-16 Alan Modra <amodra@gmail.com>
* aout-tic30.c: Delete file.
2020-06-16 Alan Modra <amodra@gmail.com>
* aout-tic30.c: Delete file.
-static int
-try_load_plugin (const char *pname,
- struct plugin_list_entry *plugin_list_iter,
- bfd *abfd, bfd_boolean build_list_p)
+static bfd_boolean
+try_load_plugin (const char * pname,
+ struct plugin_list_entry * plugin_list_iter,
+ bfd * abfd,
+ bfd_boolean build_list_p)
{
void *plugin_handle;
struct ld_plugin_tv tv[5];
int i;
ld_plugin_onload onload;
enum ld_plugin_status status;
{
void *plugin_handle;
struct ld_plugin_tv tv[5];
int i;
ld_plugin_onload onload;
enum ld_plugin_status status;
+ bfd_boolean result = FALSE;
/* NB: Each object is independent. Reuse the previous plugin from
the last run will lead to wrong result. */
/* NB: Each object is independent. Reuse the previous plugin from
the last run will lead to wrong result. */
plugin_handle = dlopen (pname, RTLD_NOW);
if (!plugin_handle)
{
plugin_handle = dlopen (pname, RTLD_NOW);
if (!plugin_handle)
{
- _bfd_error_handler ("Failed to load plugin '%s', reason: %s\n",
- pname, dlerror ());
- return 0;
+ /* If we are building a list of viable plugins, then
+ we do not bother the user with the details of any
+ plugins that cannot be loaded. */
+ if (! build_list_p)
+ _bfd_error_handler ("Failed to load plugin '%s', reason: %s\n",
+ pname, dlerror ());
+ return FALSE;
}
if (plugin_list_iter == NULL)
{
size_t length_plugin_name = strlen (pname) + 1;
char *plugin_name = bfd_malloc (length_plugin_name);
}
if (plugin_list_iter == NULL)
{
size_t length_plugin_name = strlen (pname) + 1;
char *plugin_name = bfd_malloc (length_plugin_name);
if (plugin_name == NULL)
goto short_circuit;
plugin_list_iter = bfd_malloc (sizeof *plugin_list_iter);
if (plugin_name == NULL)
goto short_circuit;
plugin_list_iter = bfd_malloc (sizeof *plugin_list_iter);
goto short_circuit;
abfd->plugin_format = bfd_plugin_yes;
goto short_circuit;
abfd->plugin_format = bfd_plugin_yes;
short_circuit:
dlclose (plugin_handle);
short_circuit:
dlclose (plugin_handle);
full_name = concat (plugin_dir, "/", ent->d_name, NULL);
if (stat (full_name, &st) == 0 && S_ISREG (st.st_mode))
full_name = concat (plugin_dir, "/", ent->d_name, NULL);
if (stat (full_name, &st) == 0 && S_ISREG (st.st_mode))
- try_load_plugin (full_name, NULL, abfd, TRUE);
+ (void) try_load_plugin (full_name, NULL, abfd, TRUE);
free (full_name);
}
closedir (d);
free (full_name);
}
closedir (d);
has_plugin_list = plugin_list != NULL;
}
has_plugin_list = plugin_list != NULL;
}
load_plugin (bfd *abfd)
{
struct plugin_list_entry *plugin_list_iter;
load_plugin (bfd *abfd)
{
struct plugin_list_entry *plugin_list_iter;
return try_load_plugin (plugin_name, plugin_list, abfd, FALSE);
if (plugin_program_name == NULL)
return try_load_plugin (plugin_name, plugin_list, abfd, FALSE);
if (plugin_program_name == NULL)
build_plugin_list (abfd);
for (plugin_list_iter = plugin_list;
plugin_list_iter;
plugin_list_iter = plugin_list_iter->next)
build_plugin_list (abfd);
for (plugin_list_iter = plugin_list;
plugin_list_iter;
plugin_list_iter = plugin_list_iter->next)
- if (try_load_plugin (NULL, plugin_list_iter, abfd, FALSE))
- return 1;
+ if (try_load_plugin (NULL, plugin_list_iter, abfd,FALSE))
+ return TRUE;