diff options
Diffstat (limited to 'bfd/bfd.c')
-rw-r--r-- | bfd/bfd.c | 92 |
1 files changed, 90 insertions, 2 deletions
diff --git a/bfd/bfd.c b/bfd/bfd.c index 7c14c7a00a6..227e26bb5eb 100644 --- a/bfd/bfd.c +++ b/bfd/bfd.c @@ -797,6 +797,88 @@ bfd_get_error_handler (void) { return _bfd_error_handler; } + +/* +SUBSECTION + BFD assert handler + + If BFD finds an internal inconsistency, the bfd assert + handler is called with information on the BFD version, BFD + source file and line. If this happens, most programs linked + against BFD are expected to want to exit with an error, or mark + the current BFD operation as failed, so it is recommended to + override the default handler, which just calls + _bfd_error_handler and continues. + +CODE_FRAGMENT +. +.typedef void (*bfd_assert_handler_type) (const char *bfd_formatmsg, +. const char *bfd_version, +. const char *bfd_file, +. int bfd_line); +. +*/ + +/* Note the use of bfd_ prefix on the parameter names above: we want to + show which one is the message and which is the version by naming the + parameters, but avoid polluting the program-using-bfd namespace as + the typedef is visible in the exported headers that the program + includes. Below, it's just for consistency. */ + +static void +_bfd_default_assert_handler (const char *bfd_formatmsg, + const char *bfd_version, + const char *bfd_file, + int bfd_line) + +{ + (*_bfd_error_handler) (bfd_formatmsg, bfd_version, bfd_file, bfd_line); +} + +/* Similar to _bfd_error_handler, a program can decide to exit on an + internal BFD error. We use a non-variadic type to simplify passing + on parameters to other functions, e.g. _bfd_error_handler. */ + +bfd_assert_handler_type _bfd_assert_handler = _bfd_default_assert_handler; + +/* +FUNCTION + bfd_set_assert_handler + +SYNOPSIS + bfd_assert_handler_type bfd_set_assert_handler (bfd_assert_handler_type); + +DESCRIPTION + Set the BFD assert handler function. Returns the previous + function. +*/ + +bfd_assert_handler_type +bfd_set_assert_handler (bfd_assert_handler_type pnew) +{ + bfd_assert_handler_type pold; + + pold = _bfd_assert_handler; + _bfd_assert_handler = pnew; + return pold; +} + +/* +FUNCTION + bfd_get_assert_handler + +SYNOPSIS + bfd_assert_handler_type bfd_get_assert_handler (void); + +DESCRIPTION + Return the BFD assert handler function. +*/ + +bfd_assert_handler_type +bfd_get_assert_handler (void) +{ + return _bfd_assert_handler; +} /* SECTION @@ -942,8 +1024,14 @@ bfd_set_file_flags (bfd *abfd, flagword flags) void bfd_assert (const char *file, int line) { - (*_bfd_error_handler) (_("BFD %s assertion fail %s:%d"), - BFD_VERSION_STRING, file, line); + (*_bfd_assert_handler) (_("BFD %s assertion fail %s:%d"), + BFD_VERSION_STRING, file, line); + + /* We used to just return from bfd_assert, but that caused more + grief than relief. The different code paths for bfd_assert and + _bfd_abort could be united but keeping them separate can + simplify debugging. */ + _exit (EXIT_FAILURE); } /* A more or less friendly abort message. In libbfd.h abort is |