[binutils-gdb] BFD_INIT_MAGIC

Alan Modra amodra@sourceware.org
Mon Oct 15 13:01:00 GMT 2018


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=bf2dd8d7cf4114b8a60dbb83b340f76b9b2474d1

commit bf2dd8d7cf4114b8a60dbb83b340f76b9b2474d1
Author: Alan Modra <amodra@gmail.com>
Date:   Mon Oct 15 16:10:27 2018 +1030

    BFD_INIT_MAGIC
    
    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.

Diff:
---
 bfd/ChangeLog        |  7 +++++++
 bfd/bfd-in2.h        |  6 +++++-
 bfd/init.c           | 11 +++++++++--
 binutils/ChangeLog   | 15 +++++++++++++++
 binutils/addr2line.c |  3 ++-
 binutils/ar.c        |  3 ++-
 binutils/dlltool.c   |  3 ++-
 binutils/nm.c        |  3 ++-
 binutils/objcopy.c   |  3 ++-
 binutils/objdump.c   |  3 ++-
 binutils/size.c      |  3 ++-
 binutils/strings.c   |  3 ++-
 binutils/windmc.c    |  3 ++-
 binutils/windres.c   |  3 ++-
 gas/ChangeLog        |  6 ++++++
 gas/as.c             |  3 ++-
 ld/ChangeLog         |  6 ++++++
 ld/ldmain.c          |  3 ++-
 18 files changed, 72 insertions(+), 15 deletions(-)

diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index e9696ee..9e0f124 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -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
diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h
index 662ef41..beb695a 100644
--- a/bfd/bfd-in2.h
+++ b/bfd/bfd-in2.h
@@ -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;
diff --git a/bfd/init.c b/bfd/init.c
index ec6354e..ad10981 100644
--- a/bfd/init.c
+++ b/bfd/init.c
@@ -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;
 }
diff --git a/binutils/ChangeLog b/binutils/ChangeLog
index 8b84df5..d41894f 100644
--- a/binutils/ChangeLog
+++ b/binutils/ChangeLog
@@ -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>
 
diff --git a/binutils/addr2line.c b/binutils/addr2line.c
index 64454f5..008e620 100644
--- a/binutils/addr2line.c
+++ b/binutils/addr2line.c
@@ -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;
diff --git a/binutils/ar.c b/binutils/ar.c
index 28a6789..b09efa0 100644
--- a/binutils/ar.c
+++ b/binutils/ar.c
@@ -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);
diff --git a/binutils/dlltool.c b/binutils/dlltool.c
index 21c95ef..2c75124 100644
--- a/binutils/dlltool.c
+++ b/binutils/dlltool.c
@@ -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)
diff --git a/binutils/nm.c b/binutils/nm.c
index e46fffc..bc4fccb 100644
--- a/binutils/nm.c
+++ b/binutils/nm.c
@@ -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:",
diff --git a/binutils/objcopy.c b/binutils/objcopy.c
index d8ae1f9..1d29059 100644
--- a/binutils/objcopy.c
+++ b/binutils/objcopy.c
@@ -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)
diff --git a/binutils/objdump.c b/binutils/objdump.c
index 4368fc0..9c3bce8 100644
--- a/binutils/objdump.c
+++ b/binutils/objdump.c
@@ -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,
diff --git a/binutils/size.c b/binutils/size.c
index 47f14fc..3c72e48 100644
--- a/binutils/size.c
+++ b/binutils/size.c
@@ -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,
diff --git a/binutils/strings.c b/binutils/strings.c
index 7655ab6..74545db 100644
--- a/binutils/strings.c
+++ b/binutils/strings.c
@@ -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)
diff --git a/binutils/windmc.c b/binutils/windmc.c
index f6171e4..c8771cd 100644
--- a/binutils/windmc.c
+++ b/binutils/windmc.c
@@ -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;
diff --git a/binutils/windres.c b/binutils/windres.c
index 7655848..9f4555b 100644
--- a/binutils/windres.c
+++ b/binutils/windres.c
@@ -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 ();
diff --git a/gas/ChangeLog b/gas/ChangeLog
index 2538da2..69187bb 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -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.
diff --git a/gas/as.c b/gas/as.c
index 3105d06..c4de060 100644
--- 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
diff --git a/ld/ChangeLog b/ld/ChangeLog
index 0f28a2e..3043096 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -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),
diff --git a/ld/ldmain.c b/ld/ldmain.c
index aca9b1b..4641920 100644
--- a/ld/ldmain.c
+++ b/ld/ldmain.c
@@ -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);



More information about the Binutils-cvs mailing list