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.
This commit is contained in:
Alan Modra 2018-10-15 16:10:27 +10:30
parent dc86962bf1
commit bf2dd8d7cf
18 changed files with 72 additions and 15 deletions

View 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> 2018-10-13 Alan Modra <amodra@gmail.com>
PR 23770 PR 23770

View file

@ -1080,8 +1080,12 @@ extern void elf32_csky_next_input_section
extern int elf32_csky_setup_section_lists extern int elf32_csky_setup_section_lists
(bfd *, struct bfd_link_info *); (bfd *, struct bfd_link_info *);
/* Extracted from init.c. */ /* 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. */ /* Extracted from opncls.c. */
/* Set to N to open the next N BFDs using an alternate id space. */ /* Set to N to open the next N BFDs using an alternate id space. */
extern unsigned int bfd_use_reserved_id; extern unsigned int bfd_use_reserved_id;

View file

@ -38,17 +38,24 @@ FUNCTION
bfd_init bfd_init
SYNOPSIS SYNOPSIS
void bfd_init (void); size_t bfd_init (void);
DESCRIPTION DESCRIPTION
This routine must be called before any other BFD function to This routine must be called before any other BFD function to
initialize magical internal data structures. 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. /* Actually, there is currently nothing for this function to do.
However, someday it may be needed, so keep it around. */ However, someday it may be needed, so keep it around. */
void size_t
bfd_init (void) bfd_init (void)
{ {
return BFD_INIT_MAGIC;
} }

View 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> 2018-10-11 Jordan Rupprecht <rupprecht@google.com>
Nick Clifton <nickc@redhat.com> Nick Clifton <nickc@redhat.com>

View file

@ -435,7 +435,8 @@ main (int argc, char **argv)
expandargv (&argc, &argv); expandargv (&argc, &argv);
bfd_init (); if (bfd_init () != BFD_INIT_MAGIC)
fatal (_("fatal error: libbfd ABI mismatch"));
set_default_bfd_target (); set_default_bfd_target ();
file_name = NULL; file_name = NULL;

View file

@ -718,7 +718,8 @@ main (int argc, char **argv)
START_PROGRESS (program_name, 0); START_PROGRESS (program_name, 0);
bfd_init (); if (bfd_init () != BFD_INIT_MAGIC)
fatal (_("fatal error: libbfd ABI mismatch"));
set_default_bfd_target (); set_default_bfd_target ();
xatexit (remove_output); xatexit (remove_output);

View file

@ -3504,7 +3504,8 @@ identify_dll_for_implib (void)
search_data.symname = "__NULL_IMPORT_DESCRIPTOR"; search_data.symname = "__NULL_IMPORT_DESCRIPTOR";
search_data.found = FALSE; 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); abfd = bfd_openr (identify_imp_name, 0);
if (abfd == NULL) if (abfd == NULL)

View file

@ -1654,7 +1654,8 @@ main (int argc, char **argv)
expandargv (&argc, &argv); expandargv (&argc, &argv);
bfd_init (); if (bfd_init () != BFD_INIT_MAGIC)
fatal (_("fatal error: libbfd ABI mismatch"));
set_default_bfd_target (); set_default_bfd_target ();
while ((c = getopt_long (argc, argv, "aABCDef:gHhlnopPrSst:uvVvX:", while ((c = getopt_long (argc, argv, "aABCDef:gHhlnopPrSst:uvVvX:",

View file

@ -5659,7 +5659,8 @@ main (int argc, char *argv[])
strip_symbols = STRIP_UNDEF; strip_symbols = STRIP_UNDEF;
discard_locals = LOCALS_UNDEF; discard_locals = LOCALS_UNDEF;
bfd_init (); if (bfd_init () != BFD_INIT_MAGIC)
fatal (_("fatal error: libbfd ABI mismatch"));
set_default_bfd_target (); set_default_bfd_target ();
if (is_strip < 0) if (is_strip < 0)

View file

@ -3842,7 +3842,8 @@ main (int argc, char **argv)
expandargv (&argc, &argv); expandargv (&argc, &argv);
bfd_init (); if (bfd_init () != BFD_INIT_MAGIC)
fatal (_("fatal error: libbfd ABI mismatch"));
set_default_bfd_target (); set_default_bfd_target ();
while ((c = getopt_long (argc, argv, while ((c = getopt_long (argc, argv,

View file

@ -137,7 +137,8 @@ main (int argc, char **argv)
expandargv (&argc, &argv); expandargv (&argc, &argv);
bfd_init (); if (bfd_init () != BFD_INIT_MAGIC)
fatal (_("fatal error: libbfd ABI mismatch"));
set_default_bfd_target (); set_default_bfd_target ();
while ((c = getopt_long (argc, argv, "ABHhVvdfotx", long_options, while ((c = getopt_long (argc, argv, "ABHhVvdfotx", long_options,

View file

@ -287,7 +287,8 @@ main (int argc, char **argv)
usage (stderr, 1); usage (stderr, 1);
} }
bfd_init (); if (bfd_init () != BFD_INIT_MAGIC)
fatal (_("fatal error: libbfd ABI mismatch"));
set_default_bfd_target (); set_default_bfd_target ();
if (optind >= argc) if (optind >= argc)

View file

@ -956,7 +956,8 @@ main (int argc, char **argv)
expandargv (&argc, &argv); expandargv (&argc, &argv);
bfd_init (); if (bfd_init () != BFD_INIT_MAGIC)
fatal (_("fatal error: libbfd ABI mismatch"));
set_default_bfd_target (); set_default_bfd_target ();
target = NULL; target = NULL;

View file

@ -812,7 +812,8 @@ main (int argc, char **argv)
expandargv (&argc, &argv); expandargv (&argc, &argv);
bfd_init (); if (bfd_init () != BFD_INIT_MAGIC)
fatal (_("fatal error: libbfd ABI mismatch"));
set_default_bfd_target (); set_default_bfd_target ();
res_init (); res_init ();

View 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> 2018-10-11 Jan Beulich <jbeulich@suse.com>
* testsuite/gas/i386/xmmword.s: Add MOVQ / VMOVQ cases. * testsuite/gas/i386/xmmword.s: Add MOVQ / VMOVQ cases.

View file

@ -1239,7 +1239,8 @@ main (int argc, char ** argv)
out_file_name = OBJ_DEFAULT_OUTPUT_FILE_NAME; out_file_name = OBJ_DEFAULT_OUTPUT_FILE_NAME;
hex_init (); hex_init ();
bfd_init (); if (bfd_init () != BFD_INIT_MAGIC)
as_fatal (_("libbfd ABI mismatch"));
bfd_set_error_program_name (myname); bfd_set_error_program_name (myname);
#ifdef USE_EMULATIONS #ifdef USE_EMULATIONS

View 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> 2018-10-13 Alan Modra <amodra@gmail.com>
* Makefile.am (eelf32btsmip_fbsd.c, eelf32btsmipn32_fbsd.c), * Makefile.am (eelf32btsmip_fbsd.c, eelf32btsmipn32_fbsd.c),

View file

@ -209,7 +209,8 @@ main (int argc, char **argv)
expandargv (&argc, &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); bfd_set_error_program_name (program_name);