Improve plugin error handling
ld/ PR ld/14904 * ldmain.c (main): Don't check plugin_load_plugins return. * lexsup.c (parse_args): Don't check plugin_opt_plugin return. * plugin.c (dlerror): New. Defined if HAVE_DLFCN_H isn't defined. (plugin_opt_plugin): Change return type to void. Stop on dlopen error and report error with dlerror (). (plugin_load_plugins): Change return type to void. Stop on dlsym error and report error with dlerror (). Don't use set_plugin_error. (plugin_call_cleanup): Issue an error for each plugin. * plugin.h (plugin_opt_plugin): Change return type to void. (plugin_load_plugins): Likewise. ld/testsuite/ PR ld/14904 * ld-plugin/plugin-2.d: Update expected error message. * ld-plugin/plugin-4.d: Likewise.
This commit is contained in:
parent
dc9589e975
commit
d82184d782
8 changed files with 49 additions and 23 deletions
19
ld/ChangeLog
19
ld/ChangeLog
|
@ -1,3 +1,22 @@
|
|||
2012-12-03 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
PR ld/14904
|
||||
* ldmain.c (main): Don't check plugin_load_plugins return.
|
||||
|
||||
* lexsup.c (parse_args): Don't check plugin_opt_plugin return.
|
||||
|
||||
* plugin.c (dlerror): New. Defined if HAVE_DLFCN_H isn't
|
||||
defined.
|
||||
(plugin_opt_plugin): Change return type to void. Stop on
|
||||
dlopen error and report error with dlerror ().
|
||||
(plugin_load_plugins): Change return type to void. Stop on
|
||||
dlsym error and report error with dlerror (). Don't use
|
||||
set_plugin_error.
|
||||
(plugin_call_cleanup): Issue an error for each plugin.
|
||||
|
||||
* plugin.h (plugin_opt_plugin): Change return type to void.
|
||||
(plugin_load_plugins): Likewise.
|
||||
|
||||
2012-11-30 Joern Rennecke <joern.rennecke@embecosm.com>
|
||||
|
||||
* scripttempl/epiphany_4x4.sc, emulparams/elf32epiphany_4x4.sh: Add.
|
||||
|
|
|
@ -308,8 +308,7 @@ main (int argc, char **argv)
|
|||
|
||||
#ifdef ENABLE_PLUGINS
|
||||
/* Now all the plugin arguments have been gathered, we can load them. */
|
||||
if (plugin_load_plugins ())
|
||||
einfo (_("%P%F: %s: error loading plugin\n"), plugin_error_plugin ());
|
||||
plugin_load_plugins ();
|
||||
#endif /* ENABLE_PLUGINS */
|
||||
|
||||
ldemul_set_symbols ();
|
||||
|
|
|
@ -954,9 +954,7 @@ parse_args (unsigned argc, char **argv)
|
|||
break;
|
||||
#ifdef ENABLE_PLUGINS
|
||||
case OPTION_PLUGIN:
|
||||
if (plugin_opt_plugin (optarg))
|
||||
einfo (_("%P%F: %s: error loading plugin\n"),
|
||||
plugin_error_plugin ());
|
||||
plugin_opt_plugin (optarg);
|
||||
break;
|
||||
case OPTION_PLUGIN_OPT:
|
||||
if (plugin_opt_plugin_arg (optarg))
|
||||
|
|
30
ld/plugin.c
30
ld/plugin.c
|
@ -155,6 +155,14 @@ dlclose (void *handle)
|
|||
|
||||
#endif /* !defined (HAVE_DLFCN_H) && defined (HAVE_WINDOWS_H) */
|
||||
|
||||
#ifndef HAVE_DLFCN_H
|
||||
static const char *
|
||||
dlerror (void)
|
||||
{
|
||||
return "";
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Helper function for exiting with error status. */
|
||||
static int
|
||||
set_plugin_error (const char *plugin)
|
||||
|
@ -178,7 +186,7 @@ plugin_error_plugin (void)
|
|||
}
|
||||
|
||||
/* Handle -plugin arg: find and load plugin, or return error. */
|
||||
int
|
||||
void
|
||||
plugin_opt_plugin (const char *plugin)
|
||||
{
|
||||
plugin_t *newplug;
|
||||
|
@ -188,7 +196,7 @@ plugin_opt_plugin (const char *plugin)
|
|||
newplug->name = plugin;
|
||||
newplug->dlhandle = dlopen (plugin, RTLD_NOW);
|
||||
if (!newplug->dlhandle)
|
||||
return set_plugin_error (plugin);
|
||||
einfo (_("%P%F: %s: error loading plugin: %s\n"), plugin, dlerror ());
|
||||
|
||||
/* Chain on end, so when we run list it is in command-line order. */
|
||||
*plugins_tail_chain_ptr = newplug;
|
||||
|
@ -197,7 +205,6 @@ plugin_opt_plugin (const char *plugin)
|
|||
/* Record it as current plugin for receiving args. */
|
||||
last_plugin = newplug;
|
||||
last_plugin_args_tail_chain_ptr = &newplug->args;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Accumulate option arguments for last-loaded plugin, or return
|
||||
|
@ -771,7 +778,7 @@ plugin_active_plugins_p (void)
|
|||
}
|
||||
|
||||
/* Load up and initialise all plugins after argument parsing. */
|
||||
int
|
||||
void
|
||||
plugin_load_plugins (void)
|
||||
{
|
||||
struct ld_plugin_tv *my_tv;
|
||||
|
@ -780,7 +787,7 @@ plugin_load_plugins (void)
|
|||
|
||||
/* If there are no plugins, we need do nothing this run. */
|
||||
if (!curplug)
|
||||
return 0;
|
||||
return;
|
||||
|
||||
/* First pass over plugins to find max # args needed so that we
|
||||
can size and allocate the tv array. */
|
||||
|
@ -806,13 +813,14 @@ plugin_load_plugins (void)
|
|||
if (!onloadfn)
|
||||
onloadfn = (ld_plugin_onload) dlsym (curplug->dlhandle, "_onload");
|
||||
if (!onloadfn)
|
||||
return set_plugin_error (curplug->name);
|
||||
einfo (_("%P%F: %s: error loading plugin: %s\n"),
|
||||
curplug->name, dlerror ());
|
||||
set_tv_plugin_args (curplug, &my_tv[tv_header_size]);
|
||||
called_plugin = curplug;
|
||||
rv = (*onloadfn) (my_tv);
|
||||
called_plugin = NULL;
|
||||
if (rv != LDPS_OK)
|
||||
return set_plugin_error (curplug->name);
|
||||
einfo (_("%P%F: %s: plugin error: %d\n"), curplug->name, rv);
|
||||
curplug = curplug->next;
|
||||
}
|
||||
|
||||
|
@ -825,8 +833,6 @@ plugin_load_plugins (void)
|
|||
plugin_callbacks.notice = &plugin_notice;
|
||||
link_info.notice_all = TRUE;
|
||||
link_info.callbacks = &plugin_callbacks;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Call 'claim file' hook for all plugins. */
|
||||
|
@ -929,14 +935,12 @@ plugin_call_cleanup (void)
|
|||
rv = (*curplug->cleanup_handler) ();
|
||||
called_plugin = NULL;
|
||||
if (rv != LDPS_OK)
|
||||
set_plugin_error (curplug->name);
|
||||
info_msg (_("%P: %s: error in plugin cleanup: %d (ignored)\n"),
|
||||
curplug->name, rv);
|
||||
dlclose (curplug->dlhandle);
|
||||
}
|
||||
curplug = curplug->next;
|
||||
}
|
||||
if (plugin_error_p ())
|
||||
info_msg (_("%P: %s: error in plugin cleanup (ignored)\n"),
|
||||
plugin_error_plugin ());
|
||||
}
|
||||
|
||||
/* To determine which symbols should be resolved LDPR_PREVAILING_DEF
|
||||
|
|
|
@ -32,8 +32,8 @@ extern bfd_boolean no_more_claiming;
|
|||
to include the plugin-api.h header in order to use this file. */
|
||||
struct ld_plugin_input_file;
|
||||
|
||||
/* Handle -plugin arg: find and load plugin, or return error. */
|
||||
extern int plugin_opt_plugin (const char *plugin);
|
||||
/* Handle -plugin arg: find and load plugin. */
|
||||
extern void plugin_opt_plugin (const char *plugin);
|
||||
|
||||
/* Accumulate option arguments for last-loaded plugin, or return
|
||||
error if none. */
|
||||
|
@ -44,7 +44,7 @@ extern int plugin_opt_plugin_arg (const char *arg);
|
|||
extern bfd_boolean plugin_active_plugins_p (void);
|
||||
|
||||
/* Load up and initialise all plugins after argument parsing. */
|
||||
extern int plugin_load_plugins (void);
|
||||
extern void plugin_load_plugins (void);
|
||||
|
||||
/* Return name of plugin which caused an error in any of the above. */
|
||||
extern const char *plugin_error_plugin (void);
|
||||
|
|
|
@ -1,3 +1,9 @@
|
|||
2012-12-03 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
PR ld/14904
|
||||
* ld-plugin/plugin-2.d: Update expected error message.
|
||||
* ld-plugin/plugin-4.d: Likewise.
|
||||
|
||||
2012-11-30 Roland McGrath <mcgrathr@google.com>
|
||||
|
||||
* ld-elf/ehdr_start.s: Put reference in .rodata section, not .data.
|
||||
|
|
|
@ -18,5 +18,5 @@ Hello from testplugin.
|
|||
.*: LDPT_OPTION 'failonload'
|
||||
.*: LDPT_NULL value 0x0 \(0\)
|
||||
#...
|
||||
.*ld.*:.*ldtestplug.*: error loading plugin
|
||||
.*ld.*:.*ldtestplug.*: plugin error: 3
|
||||
#...
|
||||
|
|
|
@ -20,5 +20,5 @@ Hello from testplugin.
|
|||
.*: LDPT_NULL value 0x0 \(0\)
|
||||
#...
|
||||
hook called: cleanup.
|
||||
.*ld.*:.*ldtestplug.*: error in plugin cleanup \(ignored\)
|
||||
.*ld.*:.*ldtestplug.*: error in plugin cleanup: 3 \(ignored\)
|
||||
#...
|
||||
|
|
Loading…
Reference in a new issue