From bf2dd8d7cf4114b8a60dbb83b340f76b9b2474d1 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Mon, 15 Oct 2018 16:10:27 +1030 Subject: [PATCH] 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. --- 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 e9696ee3143..9e0f1242651 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,10 @@ +2018-10-15 Alan Modra + + PR 23534 + * init.c (BFD_INIT_MAGIC): Define. + (bfd_init): Return BFD_INIT_MAGIC. + bfd-in2.h: Regenerate. + 2018-10-13 Alan Modra PR 23770 diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h index 662ef41a471..beb695a18bc 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 ec6354e8c9e..ad109819314 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 8b84df5d572..d41894fa210 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,18 @@ +2018-10-15 Alan Modra + + 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 Nick Clifton diff --git a/binutils/addr2line.c b/binutils/addr2line.c index 64454f54b9c..008e62026e8 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 28a67891753..b09efa02510 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 21c95ef2e70..2c751241f14 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 e46fffc796f..bc4fccb5fcb 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 d8ae1f98a10..1d29059b8df 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 4368fc06664..9c3bce8b753 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 47f14fce333..3c72e484752 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 7655ab6152b..74545dbbdcb 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 f6171e47579..c8771cd9203 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 76558484b8c..9f4555bfaf6 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 2538da246cd..69187bb2fe3 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,9 @@ +2018-10-15 Alan Modra + + PR 23534 + * as.c (main): Exit with fatal error if bfd_init returns an + unexpected value. + 2018-10-11 Jan Beulich * testsuite/gas/i386/xmmword.s: Add MOVQ / VMOVQ cases. diff --git a/gas/as.c b/gas/as.c index 3105d068c48..c4de060c9df 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 0f28a2eeef2..3043096e36a 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,9 @@ +2018-10-15 Alan Modra + + PR 23534 + * ldmain.c (main): Exit with fatal error if bfd_init returns + an unexpected value. + 2018-10-13 Alan Modra * Makefile.am (eelf32btsmip_fbsd.c, eelf32btsmipn32_fbsd.c), diff --git a/ld/ldmain.c b/ld/ldmain.c index aca9b1bb5d0..464192049ab 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);