diff options
author | Nick Clifton <nickc@redhat.com> | 2020-10-16 11:37:26 +0100 |
---|---|---|
committer | Nick Clifton <nickc@redhat.com> | 2020-10-16 11:37:26 +0100 |
commit | 23ae20f5e3afeeab9aa616c63ab3b357668476d5 (patch) | |
tree | 77fe952d842fc8b8f4a0efccbc006686a3b05e77 /ld/ldfile.c | |
parent | 472d09c18a750f483ad974991f4f35ede3dfb10b (diff) | |
download | gdb-23ae20f5e3afeeab9aa616c63ab3b357668476d5.zip gdb-23ae20f5e3afeeab9aa616c63ab3b357668476d5.tar.gz gdb-23ae20f5e3afeeab9aa616c63ab3b357668476d5.tar.bz2 |
Add a new option to the linker: --error-handling-script=<NAME>. Run the script <NAME> if an undefined symbol or unfound library error is encountered.
PR 26626
* ldmain.c (undefined_symbol): If an error handlign script is
available, call it.
* ldfile.c (error_handling_script): Declare.
(ldfile_open_file): If a library cannot be found and an error
handling script is available, call it.
* ldmain.h (error_handling_script): Prototype.
* ldlex.h (OPTION_ERROR_HANDLING_SCRIPT): Define.
* lexsup.c (ld_options): Add --error-handling-script.
(parse_args): Add support for --errror-handling-script.
* ld.texi: Document the new feature.
* configure.ac: Add --error-handling-script option to disable
support for the new feature.
* NEWS: Mention the new feature.
* config.in: Regenerate.
* configure: Regenerate.
Diffstat (limited to 'ld/ldfile.c')
-rw-r--r-- | ld/ldfile.c | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/ld/ldfile.c b/ld/ldfile.c index e39170b..51f878d 100644 --- a/ld/ldfile.c +++ b/ld/ldfile.c @@ -461,6 +461,39 @@ ldfile_open_file (lang_input_statement_type *entry) && IS_ABSOLUTE_PATH (entry->local_sym_name)) einfo (_("%P: cannot find %s inside %s\n"), entry->local_sym_name, ld_sysroot); +#if SUPPORT_ERROR_HANDLING_SCRIPT + else if (error_handling_script != NULL) + { + char * argv[4]; + const char * res; + int status, err; + + argv[0] = error_handling_script; + argv[1] = "missing-lib"; + argv[2] = (char *) entry->local_sym_name; + argv[3] = NULL; + + if (verbose) + einfo (_("%P: About to run error handling script '%s' with arguments: '%s' '%s'\n"), + argv[0], argv[1], argv[2]); + + res = pex_one (PEX_SEARCH, error_handling_script, argv, + N_("error handling script"), + NULL /* Send stdout to random, temp file. */, + NULL /* Write to stderr. */, + &status, &err); + if (res != NULL) + { + einfo (_("%P: Failed to run error handling script '%s', reason: "), + error_handling_script); + /* FIXME: We assume here that errrno == err. */ + perror (res); + } + else /* We ignore the return status of the script + and always print the error message. */ + einfo (_("%P: cannot find %s\n"), entry->local_sym_name); + } +#endif else einfo (_("%P: cannot find %s\n"), entry->local_sym_name); @@ -479,6 +512,7 @@ ldfile_open_file (lang_input_statement_type *entry) break; } } + entry->flags.missing_file = TRUE; input_flags.missing_file = TRUE; } |