aboutsummaryrefslogtreecommitdiff
path: root/ld/ldfile.c
diff options
context:
space:
mode:
authorNick Clifton <nickc@redhat.com>2020-10-16 11:37:26 +0100
committerNick Clifton <nickc@redhat.com>2020-10-16 11:37:26 +0100
commit23ae20f5e3afeeab9aa616c63ab3b357668476d5 (patch)
tree77fe952d842fc8b8f4a0efccbc006686a3b05e77 /ld/ldfile.c
parent472d09c18a750f483ad974991f4f35ede3dfb10b (diff)
downloadgdb-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.c34
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;
}