BFD_INIT_MAGIC
authorAlan Modra <amodra@gmail.com>
Mon, 15 Oct 2018 05:40:27 +0000 (16:10 +1030)
committerAlan Modra <amodra@gmail.com>
Mon, 15 Oct 2018 11:41:58 +0000 (22:11 +1030)
This patch performs a run-time test that a shared libbfd.so has been
compiled with the same size bfd_vma as that of apps using the library.
On a 32-bit host it is easily possible to have one libbfd.so compiled
to support 64-bit targets (or configured with --enable-64-bit-bfd)
while another only supports 32-bit targets.  The two libraries will
have differently sized bfd_vma types, and if the wrong one is loaded
all sorts of weird behaviour might be seen.

bfd/
PR 23534
* init.c (BFD_INIT_MAGIC): Define.
(bfd_init): Return BFD_INIT_MAGIC.
bfd-in2.h: Regenerate.
binutils/
PR 23534
* addr2line.c (main): Exit with fatal error if bfd_init
returns an unexpected value.
* ar.c (main): Likewise.
* dlltool.c (identify_dll_for_implib): Likewise.
* nm.c (main): Likewise.
* objcopy.c (main): Likewise.
* objdump.c (main): Likewise.
* size.c (main): Likewise.
* strings.c (main): Likewise.
* windmc.c (main): Likewise.
* windres.c (main): Likewise.
gas/
PR 23534
* as.c (main): Exit with fatal error if bfd_init returns an
unexpected value.
ld/
PR 23534
* ldmain.c (main): Exit with fatal error if bfd_init returns
an unexpected value.

18 files changed:
bfd/ChangeLog
bfd/bfd-in2.h
bfd/init.c
binutils/ChangeLog
binutils/addr2line.c
binutils/ar.c
binutils/dlltool.c
binutils/nm.c
binutils/objcopy.c
binutils/objdump.c
binutils/size.c
binutils/strings.c
binutils/windmc.c
binutils/windres.c
gas/ChangeLog
gas/as.c
ld/ChangeLog
ld/ldmain.c

index e9696ee..9e0f124 100644 (file)
@@ -1,3 +1,10 @@
+2018-10-15  Alan Modra  <amodra@gmail.com>
+
+       PR 23534
+       * init.c (BFD_INIT_MAGIC): Define.
+       (bfd_init): Return BFD_INIT_MAGIC.
+       bfd-in2.h: Regenerate.
+
 2018-10-13  Alan Modra  <amodra@gmail.com>
 
        PR 23770
index 662ef41..beb695a 100644 (file)
@@ -1080,8 +1080,12 @@ extern void elf32_csky_next_input_section
 extern int elf32_csky_setup_section_lists
   (bfd *, struct bfd_link_info *);
 /* Extracted from init.c.  */
-void bfd_init (void);
+size_t bfd_init (void);
 
+
+/* Value returned by bfd_init.  */
+
+#define BFD_INIT_MAGIC (sizeof (struct bfd_section))
 /* Extracted from opncls.c.  */
 /* Set to N to open the next N BFDs using an alternate id space.  */
 extern unsigned int bfd_use_reserved_id;
index ec6354e..ad10981 100644 (file)
@@ -38,17 +38,24 @@ FUNCTION
        bfd_init
 
 SYNOPSIS
-       void bfd_init (void);
+       size_t bfd_init (void);
 
 DESCRIPTION
        This routine must be called before any other BFD function to
        initialize magical internal data structures.
+       Returns a magic number, which may be used to check
+       that the bfd library is configured as expected by users.
+.
+.{* Value returned by bfd_init.  *}
+.
+.#define BFD_INIT_MAGIC (sizeof (struct bfd_section))
 */
 
 /* Actually, there is currently nothing for this function to do.
    However, someday it may be needed, so keep it around.  */
 
-void
+size_t
 bfd_init (void)
 {
+  return BFD_INIT_MAGIC;
 }
index 8b84df5..d41894f 100644 (file)
@@ -1,3 +1,18 @@
+2018-10-15  Alan Modra  <amodra@gmail.com>
+
+       PR 23534
+       * addr2line.c (main): Exit with fatal error if bfd_init
+       returns an unexpected value.
+       * ar.c (main): Likewise.
+       * dlltool.c (identify_dll_for_implib): Likewise.
+       * nm.c (main): Likewise.
+       * objcopy.c (main): Likewise.
+       * objdump.c (main): Likewise.
+       * size.c (main): Likewise.
+       * strings.c (main): Likewise.
+       * windmc.c (main): Likewise.
+       * windres.c (main): Likewise.
+
 2018-10-11  Jordan Rupprecht  <rupprecht@google.com>
            Nick Clifton  <nickc@redhat.com>
 
index 64454f5..008e620 100644 (file)
@@ -435,7 +435,8 @@ main (int argc, char **argv)
 
   expandargv (&argc, &argv);
 
-  bfd_init ();
+  if (bfd_init () != BFD_INIT_MAGIC)
+    fatal (_("fatal error: libbfd ABI mismatch"));
   set_default_bfd_target ();
 
   file_name = NULL;
index 28a6789..b09efa0 100644 (file)
@@ -718,7 +718,8 @@ main (int argc, char **argv)
 
   START_PROGRESS (program_name, 0);
 
-  bfd_init ();
+  if (bfd_init () != BFD_INIT_MAGIC)
+    fatal (_("fatal error: libbfd ABI mismatch"));
   set_default_bfd_target ();
 
   xatexit (remove_output);
index 21c95ef..2c75124 100644 (file)
@@ -3504,7 +3504,8 @@ identify_dll_for_implib (void)
   search_data.symname = "__NULL_IMPORT_DESCRIPTOR";
   search_data.found = FALSE;
 
-  bfd_init ();
+  if (bfd_init () != BFD_INIT_MAGIC)
+    fatal (_("fatal error: libbfd ABI mismatch"));
 
   abfd = bfd_openr (identify_imp_name, 0);
   if (abfd == NULL)
index e46fffc..bc4fccb 100644 (file)
@@ -1654,7 +1654,8 @@ main (int argc, char **argv)
 
   expandargv (&argc, &argv);
 
-  bfd_init ();
+  if (bfd_init () != BFD_INIT_MAGIC)
+    fatal (_("fatal error: libbfd ABI mismatch"));
   set_default_bfd_target ();
 
   while ((c = getopt_long (argc, argv, "aABCDef:gHhlnopPrSst:uvVvX:",
index d8ae1f9..1d29059 100644 (file)
@@ -5659,7 +5659,8 @@ main (int argc, char *argv[])
   strip_symbols = STRIP_UNDEF;
   discard_locals = LOCALS_UNDEF;
 
-  bfd_init ();
+  if (bfd_init () != BFD_INIT_MAGIC)
+    fatal (_("fatal error: libbfd ABI mismatch"));
   set_default_bfd_target ();
 
   if (is_strip < 0)
index 4368fc0..9c3bce8 100644 (file)
@@ -3842,7 +3842,8 @@ main (int argc, char **argv)
 
   expandargv (&argc, &argv);
 
-  bfd_init ();
+  if (bfd_init () != BFD_INIT_MAGIC)
+    fatal (_("fatal error: libbfd ABI mismatch"));
   set_default_bfd_target ();
 
   while ((c = getopt_long (argc, argv,
index 47f14fc..3c72e48 100644 (file)
@@ -137,7 +137,8 @@ main (int argc, char **argv)
 
   expandargv (&argc, &argv);
 
-  bfd_init ();
+  if (bfd_init () != BFD_INIT_MAGIC)
+    fatal (_("fatal error: libbfd ABI mismatch"));
   set_default_bfd_target ();
 
   while ((c = getopt_long (argc, argv, "ABHhVvdfotx", long_options,
index 7655ab6..74545db 100644 (file)
@@ -287,7 +287,8 @@ main (int argc, char **argv)
       usage (stderr, 1);
     }
 
-  bfd_init ();
+  if (bfd_init () != BFD_INIT_MAGIC)
+    fatal (_("fatal error: libbfd ABI mismatch"));
   set_default_bfd_target ();
 
   if (optind >= argc)
index f6171e4..c8771cd 100644 (file)
@@ -956,7 +956,8 @@ main (int argc, char **argv)
 
   expandargv (&argc, &argv);
 
-  bfd_init ();
+  if (bfd_init () != BFD_INIT_MAGIC)
+    fatal (_("fatal error: libbfd ABI mismatch"));
   set_default_bfd_target ();
 
   target = NULL;
index 7655848..9f4555b 100644 (file)
@@ -812,7 +812,8 @@ main (int argc, char **argv)
 
   expandargv (&argc, &argv);
 
-  bfd_init ();
+  if (bfd_init () != BFD_INIT_MAGIC)
+    fatal (_("fatal error: libbfd ABI mismatch"));
   set_default_bfd_target ();
 
   res_init ();
index 2538da2..69187bb 100644 (file)
@@ -1,3 +1,9 @@
+2018-10-15  Alan Modra  <amodra@gmail.com>
+
+       PR 23534
+       * as.c (main): Exit with fatal error if bfd_init returns an
+       unexpected value.
+
 2018-10-11  Jan Beulich  <jbeulich@suse.com>
 
        * testsuite/gas/i386/xmmword.s: Add MOVQ / VMOVQ cases.
index 3105d06..c4de060 100644 (file)
--- a/gas/as.c
+++ b/gas/as.c
@@ -1239,7 +1239,8 @@ main (int argc, char ** argv)
   out_file_name = OBJ_DEFAULT_OUTPUT_FILE_NAME;
 
   hex_init ();
-  bfd_init ();
+  if (bfd_init () != BFD_INIT_MAGIC)
+    as_fatal (_("libbfd ABI mismatch"));
   bfd_set_error_program_name (myname);
 
 #ifdef USE_EMULATIONS
index 0f28a2e..3043096 100644 (file)
@@ -1,3 +1,9 @@
+2018-10-15  Alan Modra  <amodra@gmail.com>
+
+       PR 23534
+       * ldmain.c (main): Exit with fatal error if bfd_init returns
+       an unexpected value.
+
 2018-10-13  Alan Modra  <amodra@gmail.com>
 
        * Makefile.am (eelf32btsmip_fbsd.c, eelf32btsmipn32_fbsd.c),
index aca9b1b..4641920 100644 (file)
@@ -209,7 +209,8 @@ main (int argc, char **argv)
 
   expandargv (&argc, &argv);
 
-  bfd_init ();
+  if (bfd_init () != BFD_INIT_MAGIC)
+    einfo (_("%F%P: fatal error: libbfd ABI mismatch\n"));
 
   bfd_set_error_program_name (program_name);