Better ld --fatal-warnings support

* ldmain.c (default_bfd_error_handler): New function pointer.
	(ld_bfd_error_handler): New function.
	(main): Arrange to call it on bfd errors/warnings.
	(ld_bfd_assert_handler): Enable tail call.
This commit is contained in:
Alan Modra 2016-09-30 11:33:13 +09:30
parent 52d45da3f2
commit 4519d07138
2 changed files with 23 additions and 3 deletions

View File

@ -1,3 +1,10 @@
2016-09-30 Alan Modra <amodra@gmail.com>
* ldmain.c (default_bfd_error_handler): New function pointer.
(ld_bfd_error_handler): New function.
(main): Arrange to call it on bfd errors/warnings.
(ld_bfd_assert_handler): Enable tail call.
2016-09-30 Alan Modra <amodra@gmail.com> 2016-09-30 Alan Modra <amodra@gmail.com>
* ldlang.c (ignore_bfd_errors): Update params. * ldlang.c (ignore_bfd_errors): Update params.

View File

@ -158,6 +158,7 @@ static struct bfd_link_callbacks link_callbacks =
}; };
static bfd_assert_handler_type default_bfd_assert_handler; static bfd_assert_handler_type default_bfd_assert_handler;
static bfd_error_handler_type default_bfd_error_handler;
struct bfd_link_info link_info; struct bfd_link_info link_info;
@ -172,15 +173,24 @@ ld_cleanup (void)
unlink_if_ordinary (output_filename); unlink_if_ordinary (output_filename);
} }
/* If there's a BFD assertion, we'll notice and exit with an error /* Hook to notice BFD assertions. */
unless otherwise instructed. */
static void static void
ld_bfd_assert_handler (const char *fmt, const char *bfdver, ld_bfd_assert_handler (const char *fmt, const char *bfdver,
const char *file, int line) const char *file, int line)
{ {
(*default_bfd_assert_handler) (fmt, bfdver, file, line);
config.make_executable = FALSE; config.make_executable = FALSE;
(*default_bfd_assert_handler) (fmt, bfdver, file, line);
}
/* Hook the bfd error/warning handler for --fatal-warnings. */
static void
ld_bfd_error_handler (const char *fmt, va_list ap)
{
if (config.fatal_warnings)
config.make_executable = FALSE;
(*default_bfd_error_handler) (fmt, ap);
} }
int int
@ -217,6 +227,9 @@ main (int argc, char **argv)
leave no trace. */ leave no trace. */
default_bfd_assert_handler = bfd_set_assert_handler (ld_bfd_assert_handler); default_bfd_assert_handler = bfd_set_assert_handler (ld_bfd_assert_handler);
/* Also hook the bfd error/warning handler for --fatal-warnings. */
default_bfd_error_handler = bfd_set_error_handler (ld_bfd_error_handler);
xatexit (ld_cleanup); xatexit (ld_cleanup);
/* Set up the sysroot directory. */ /* Set up the sysroot directory. */