Make bfd asserts cause linker errors.
authorHans-Peter Nilsson <hp@axis.com>
Thu, 26 Apr 2012 13:51:14 +0000 (13:51 +0000)
committerHans-Peter Nilsson <hp@axis.com>
Thu, 26 Apr 2012 13:51:14 +0000 (13:51 +0000)
* ldmain.c (default_bfd_assert_handler): New variable.
(ld_bfd_assert_handler): New function.
(main): Call bfd_set_assert_handler.

ld/ChangeLog
ld/ldmain.c

index d1b7e7ac8ef51edac054867cfe4859cb60a23330..94aa546fa887f91656af5a1eedc49536e78ba43d 100644 (file)
@@ -1,3 +1,10 @@
+2012-04-26  Hans-Peter Nilsson  <hp@axis.com>
+
+       Make bfd asserts cause linker errors.
+       * ldmain.c (default_bfd_assert_handler): New variable.
+       (ld_bfd_assert_handler): New function.
+       (main): Call bfd_set_assert_handler.
+
 2012-04-24  Alan Modra  <amodra@gmail.com>
 
        * ld/ldlang.c (size_input_section): Use sec_info_type rather than
index b2810a725d970b908852e80fe3e45c5bb1a4608a..3bdaf4df2088d29271673d11d55b5eb4fac830ea 100644 (file)
@@ -160,6 +160,8 @@ static struct bfd_link_callbacks link_callbacks =
   ldlang_override_segment_assignment
 };
 
+static bfd_assert_handler_type default_bfd_assert_handler;
+
 struct bfd_link_info link_info;
 \f
 static void
@@ -173,6 +175,17 @@ ld_cleanup (void)
     unlink_if_ordinary (output_filename);
 }
 
+/* If there's a BFD assertion, we'll notice and exit with an error
+   unless otherwise instructed.  */
+
+static void
+ld_bfd_assert_handler (const char *fmt, const char *bfdver,
+                      const char *file, int line)
+{
+  (*default_bfd_assert_handler) (fmt, bfdver, file, line);
+  config.make_executable = FALSE;
+}
+
 int
 main (int argc, char **argv)
 {
@@ -199,6 +212,11 @@ main (int argc, char **argv)
 
   bfd_set_error_program_name (program_name);
 
+  /* We want to notice and fail on those nasty BFD assertions which are
+     likely to signal incorrect output being generated but otherwise may
+     leave no trace.  */
+  default_bfd_assert_handler = bfd_set_assert_handler (ld_bfd_assert_handler);
+
   xatexit (ld_cleanup);
 
   /* Set up the sysroot directory.  */