ppc/svp64: reuse md_parse_name in md_operand
[binutils-gdb.git] / bfd / elf32-m68k.c
index 177be5d1d39bbfa78036f5d694fe134dfb0c752d..150b638154b006a01badb4a6a81929ea85891f95 100644 (file)
@@ -1,5 +1,5 @@
 /* Motorola 68k series support for 32-bit ELF
-   Copyright (C) 1993-2019 Free Software Foundation, Inc.
+   Copyright (C) 1993-2022 Free Software Foundation, Inc.
 
    This file is part of BFD, the Binary File Descriptor library.
 
 #include "elf-bfd.h"
 #include "elf/m68k.h"
 #include "opcode/m68k.h"
+#include "cpu-m68k.h"
+#include "elf32-m68k.h"
 
-static bfd_boolean
+static bool
 elf_m68k_discard_copies (struct elf_link_hash_entry *, void *);
 
 static reloc_howto_type howto_table[] =
 {
-  HOWTO(R_68K_NONE,      0, 3, 0, FALSE,0, complain_overflow_dont,     bfd_elf_generic_reloc, "R_68K_NONE",      FALSE, 0, 0x00000000,FALSE),
-  HOWTO(R_68K_32,        0, 2,32, FALSE,0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_68K_32",        FALSE, 0, 0xffffffff,FALSE),
-  HOWTO(R_68K_16,        0, 1,16, FALSE,0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_68K_16",        FALSE, 0, 0x0000ffff,FALSE),
-  HOWTO(R_68K_8,         0, 0, 8, FALSE,0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_68K_8",         FALSE, 0, 0x000000ff,FALSE),
-  HOWTO(R_68K_PC32,      0, 2,32, TRUE, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_68K_PC32",      FALSE, 0, 0xffffffff,TRUE),
-  HOWTO(R_68K_PC16,      0, 1,16, TRUE, 0, complain_overflow_signed,   bfd_elf_generic_reloc, "R_68K_PC16",      FALSE, 0, 0x0000ffff,TRUE),
-  HOWTO(R_68K_PC8,       0, 0, 8, TRUE, 0, complain_overflow_signed,   bfd_elf_generic_reloc, "R_68K_PC8",       FALSE, 0, 0x000000ff,TRUE),
-  HOWTO(R_68K_GOT32,     0, 2,32, TRUE, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_68K_GOT32",     FALSE, 0, 0xffffffff,TRUE),
-  HOWTO(R_68K_GOT16,     0, 1,16, TRUE, 0, complain_overflow_signed,   bfd_elf_generic_reloc, "R_68K_GOT16",     FALSE, 0, 0x0000ffff,TRUE),
-  HOWTO(R_68K_GOT8,      0, 0, 8, TRUE, 0, complain_overflow_signed,   bfd_elf_generic_reloc, "R_68K_GOT8",      FALSE, 0, 0x000000ff,TRUE),
-  HOWTO(R_68K_GOT32O,    0, 2,32, FALSE,0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_68K_GOT32O",    FALSE, 0, 0xffffffff,FALSE),
-  HOWTO(R_68K_GOT16O,    0, 1,16, FALSE,0, complain_overflow_signed,   bfd_elf_generic_reloc, "R_68K_GOT16O",    FALSE, 0, 0x0000ffff,FALSE),
-  HOWTO(R_68K_GOT8O,     0, 0, 8, FALSE,0, complain_overflow_signed,   bfd_elf_generic_reloc, "R_68K_GOT8O",     FALSE, 0, 0x000000ff,FALSE),
-  HOWTO(R_68K_PLT32,     0, 2,32, TRUE, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_68K_PLT32",     FALSE, 0, 0xffffffff,TRUE),
-  HOWTO(R_68K_PLT16,     0, 1,16, TRUE, 0, complain_overflow_signed,   bfd_elf_generic_reloc, "R_68K_PLT16",     FALSE, 0, 0x0000ffff,TRUE),
-  HOWTO(R_68K_PLT8,      0, 0, 8, TRUE, 0, complain_overflow_signed,   bfd_elf_generic_reloc, "R_68K_PLT8",      FALSE, 0, 0x000000ff,TRUE),
-  HOWTO(R_68K_PLT32O,    0, 2,32, FALSE,0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_68K_PLT32O",    FALSE, 0, 0xffffffff,FALSE),
-  HOWTO(R_68K_PLT16O,    0, 1,16, FALSE,0, complain_overflow_signed,   bfd_elf_generic_reloc, "R_68K_PLT16O",    FALSE, 0, 0x0000ffff,FALSE),
-  HOWTO(R_68K_PLT8O,     0, 0, 8, FALSE,0, complain_overflow_signed,   bfd_elf_generic_reloc, "R_68K_PLT8O",     FALSE, 0, 0x000000ff,FALSE),
-  HOWTO(R_68K_COPY,      0, 0, 0, FALSE,0, complain_overflow_dont,     bfd_elf_generic_reloc, "R_68K_COPY",      FALSE, 0, 0xffffffff,FALSE),
-  HOWTO(R_68K_GLOB_DAT,          0, 2,32, FALSE,0, complain_overflow_dont,     bfd_elf_generic_reloc, "R_68K_GLOB_DAT",  FALSE, 0, 0xffffffff,FALSE),
-  HOWTO(R_68K_JMP_SLOT,          0, 2,32, FALSE,0, complain_overflow_dont,     bfd_elf_generic_reloc, "R_68K_JMP_SLOT",  FALSE, 0, 0xffffffff,FALSE),
-  HOWTO(R_68K_RELATIVE,          0, 2,32, FALSE,0, complain_overflow_dont,     bfd_elf_generic_reloc, "R_68K_RELATIVE",  FALSE, 0, 0xffffffff,FALSE),
+  HOWTO(R_68K_NONE,      0, 0, 0, false,0, complain_overflow_dont,     bfd_elf_generic_reloc, "R_68K_NONE",      false, 0, 0x00000000,false),
+  HOWTO(R_68K_32,        0, 4,32, false,0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_68K_32",        false, 0, 0xffffffff,false),
+  HOWTO(R_68K_16,        0, 2,16, false,0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_68K_16",        false, 0, 0x0000ffff,false),
+  HOWTO(R_68K_8,         0, 1, 8, false,0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_68K_8",         false, 0, 0x000000ff,false),
+  HOWTO(R_68K_PC32,      0, 4,32, true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_68K_PC32",      false, 0, 0xffffffff,true),
+  HOWTO(R_68K_PC16,      0, 2,16, true, 0, complain_overflow_signed,   bfd_elf_generic_reloc, "R_68K_PC16",      false, 0, 0x0000ffff,true),
+  HOWTO(R_68K_PC8,       0, 1, 8, true, 0, complain_overflow_signed,   bfd_elf_generic_reloc, "R_68K_PC8",       false, 0, 0x000000ff,true),
+  HOWTO(R_68K_GOT32,     0, 4,32, true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_68K_GOT32",     false, 0, 0xffffffff,true),
+  HOWTO(R_68K_GOT16,     0, 2,16, true, 0, complain_overflow_signed,   bfd_elf_generic_reloc, "R_68K_GOT16",     false, 0, 0x0000ffff,true),
+  HOWTO(R_68K_GOT8,      0, 1, 8, true, 0, complain_overflow_signed,   bfd_elf_generic_reloc, "R_68K_GOT8",      false, 0, 0x000000ff,true),
+  HOWTO(R_68K_GOT32O,    0, 4,32, false,0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_68K_GOT32O",    false, 0, 0xffffffff,false),
+  HOWTO(R_68K_GOT16O,    0, 2,16, false,0, complain_overflow_signed,   bfd_elf_generic_reloc, "R_68K_GOT16O",    false, 0, 0x0000ffff,false),
+  HOWTO(R_68K_GOT8O,     0, 1, 8, false,0, complain_overflow_signed,   bfd_elf_generic_reloc, "R_68K_GOT8O",     false, 0, 0x000000ff,false),
+  HOWTO(R_68K_PLT32,     0, 4,32, true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_68K_PLT32",     false, 0, 0xffffffff,true),
+  HOWTO(R_68K_PLT16,     0, 2,16, true, 0, complain_overflow_signed,   bfd_elf_generic_reloc, "R_68K_PLT16",     false, 0, 0x0000ffff,true),
+  HOWTO(R_68K_PLT8,      0, 1, 8, true, 0, complain_overflow_signed,   bfd_elf_generic_reloc, "R_68K_PLT8",      false, 0, 0x000000ff,true),
+  HOWTO(R_68K_PLT32O,    0, 4,32, false,0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_68K_PLT32O",    false, 0, 0xffffffff,false),
+  HOWTO(R_68K_PLT16O,    0, 2,16, false,0, complain_overflow_signed,   bfd_elf_generic_reloc, "R_68K_PLT16O",    false, 0, 0x0000ffff,false),
+  HOWTO(R_68K_PLT8O,     0, 1, 8, false,0, complain_overflow_signed,   bfd_elf_generic_reloc, "R_68K_PLT8O",     false, 0, 0x000000ff,false),
+  HOWTO(R_68K_COPY,      0, 0, 0, false,0, complain_overflow_dont,     bfd_elf_generic_reloc, "R_68K_COPY",      false, 0, 0xffffffff,false),
+  HOWTO(R_68K_GLOB_DAT,          0, 4,32, false,0, complain_overflow_dont,     bfd_elf_generic_reloc, "R_68K_GLOB_DAT",  false, 0, 0xffffffff,false),
+  HOWTO(R_68K_JMP_SLOT,          0, 4,32, false,0, complain_overflow_dont,     bfd_elf_generic_reloc, "R_68K_JMP_SLOT",  false, 0, 0xffffffff,false),
+  HOWTO(R_68K_RELATIVE,          0, 4,32, false,0, complain_overflow_dont,     bfd_elf_generic_reloc, "R_68K_RELATIVE",  false, 0, 0xffffffff,false),
   /* GNU extension to record C++ vtable hierarchy.  */
   HOWTO (R_68K_GNU_VTINHERIT,  /* type */
         0,                     /* rightshift */
-        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        4,                     /* size */
         0,                     /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         NULL,                  /* special_function */
         "R_68K_GNU_VTINHERIT", /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0,                     /* src_mask */
         0,                     /* dst_mask */
-        FALSE),
+        false),
   /* GNU extension to record C++ vtable member usage.  */
   HOWTO (R_68K_GNU_VTENTRY,    /* type */
         0,                     /* rightshift */
-        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        4,                     /* size */
         0,                     /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         _bfd_elf_rel_vtable_reloc_fn, /* special_function */
         "R_68K_GNU_VTENTRY",   /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0,                     /* src_mask */
         0,                     /* dst_mask */
-        FALSE),
+        false),
 
   /* TLS general dynamic variable reference.  */
   HOWTO (R_68K_TLS_GD32,       /* type */
         0,                     /* rightshift */
-        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        4,                     /* size */
         32,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_68K_TLS_GD32",      /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0,                     /* src_mask */
         0xffffffff,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   HOWTO (R_68K_TLS_GD16,       /* type */
         0,                     /* rightshift */
-        1,                     /* size (0 = byte, 1 = short, 2 = long) */
+        2,                     /* size */
         16,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_signed, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_68K_TLS_GD16",      /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0,                     /* src_mask */
         0x0000ffff,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   HOWTO (R_68K_TLS_GD8,                /* type */
         0,                     /* rightshift */
-        0,                     /* size (0 = byte, 1 = short, 2 = long) */
+        1,                     /* size */
         8,                     /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_signed, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_68K_TLS_GD8",       /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0,                     /* src_mask */
         0x000000ff,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   /* TLS local dynamic variable reference.  */
   HOWTO (R_68K_TLS_LDM32,      /* type */
         0,                     /* rightshift */
-        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        4,                     /* size */
         32,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_68K_TLS_LDM32",     /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0,                     /* src_mask */
         0xffffffff,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   HOWTO (R_68K_TLS_LDM16,      /* type */
         0,                     /* rightshift */
-        1,                     /* size (0 = byte, 1 = short, 2 = long) */
+        2,                     /* size */
         16,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_signed, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_68K_TLS_LDM16",     /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0,                     /* src_mask */
         0x0000ffff,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   HOWTO (R_68K_TLS_LDM8,               /* type */
         0,                     /* rightshift */
-        0,                     /* size (0 = byte, 1 = short, 2 = long) */
+        1,                     /* size */
         8,                     /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_signed, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_68K_TLS_LDM8",      /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0,                     /* src_mask */
         0x000000ff,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   HOWTO (R_68K_TLS_LDO32,      /* type */
         0,                     /* rightshift */
-        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        4,                     /* size */
         32,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_68K_TLS_LDO32",     /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0,                     /* src_mask */
         0xffffffff,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   HOWTO (R_68K_TLS_LDO16,      /* type */
         0,                     /* rightshift */
-        1,                     /* size (0 = byte, 1 = short, 2 = long) */
+        2,                     /* size */
         16,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_signed, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_68K_TLS_LDO16",     /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0,                     /* src_mask */
         0x0000ffff,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   HOWTO (R_68K_TLS_LDO8,               /* type */
         0,                     /* rightshift */
-        0,                     /* size (0 = byte, 1 = short, 2 = long) */
+        1,                     /* size */
         8,                     /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_signed, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_68K_TLS_LDO8",      /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0,                     /* src_mask */
         0x000000ff,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   /* TLS initial execution variable reference.  */
   HOWTO (R_68K_TLS_IE32,       /* type */
         0,                     /* rightshift */
-        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        4,                     /* size */
         32,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_68K_TLS_IE32",      /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0,                     /* src_mask */
         0xffffffff,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   HOWTO (R_68K_TLS_IE16,       /* type */
         0,                     /* rightshift */
-        1,                     /* size (0 = byte, 1 = short, 2 = long) */
+        2,                     /* size */
         16,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_signed, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_68K_TLS_IE16",      /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0,                     /* src_mask */
         0x0000ffff,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   HOWTO (R_68K_TLS_IE8,                /* type */
         0,                     /* rightshift */
-        0,                     /* size (0 = byte, 1 = short, 2 = long) */
+        1,                     /* size */
         8,                     /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_signed, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_68K_TLS_IE8",       /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0,                     /* src_mask */
         0x000000ff,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   /* TLS local execution variable reference.  */
   HOWTO (R_68K_TLS_LE32,       /* type */
         0,                     /* rightshift */
-        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        4,                     /* size */
         32,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_bitfield, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_68K_TLS_LE32",      /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0,                     /* src_mask */
         0xffffffff,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   HOWTO (R_68K_TLS_LE16,       /* type */
         0,                     /* rightshift */
-        1,                     /* size (0 = byte, 1 = short, 2 = long) */
+        2,                     /* size */
         16,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_signed, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_68K_TLS_LE16",      /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0,                     /* src_mask */
         0x0000ffff,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   HOWTO (R_68K_TLS_LE8,                /* type */
         0,                     /* rightshift */
-        0,                     /* size (0 = byte, 1 = short, 2 = long) */
+        1,                     /* size */
         8,                     /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_signed, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_68K_TLS_LE8",       /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0,                     /* src_mask */
         0x000000ff,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   /* TLS GD/LD dynamic relocations.  */
   HOWTO (R_68K_TLS_DTPMOD32,   /* type */
         0,                     /* rightshift */
-        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        4,                     /* size */
         32,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_68K_TLS_DTPMOD32",  /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0,                     /* src_mask */
         0xffffffff,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   HOWTO (R_68K_TLS_DTPREL32,   /* type */
         0,                     /* rightshift */
-        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        4,                     /* size */
         32,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_68K_TLS_DTPREL32",  /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0,                     /* src_mask */
         0xffffffff,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 
   HOWTO (R_68K_TLS_TPREL32,    /* type */
         0,                     /* rightshift */
-        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        4,                     /* size */
         32,                    /* bitsize */
-        FALSE,                 /* pc_relative */
+        false,                 /* pc_relative */
         0,                     /* bitpos */
         complain_overflow_dont, /* complain_on_overflow */
         bfd_elf_generic_reloc, /* special_function */
         "R_68K_TLS_TPREL32",   /* name */
-        FALSE,                 /* partial_inplace */
+        false,                 /* partial_inplace */
         0,                     /* src_mask */
         0xffffffff,            /* dst_mask */
-        FALSE),                /* pcrel_offset */
+        false),                /* pcrel_offset */
 };
 
-static bfd_boolean
+static bool
 rtype_to_howto (bfd *abfd, arelent *cache_ptr, Elf_Internal_Rela *dst)
 {
   unsigned int indx = ELF32_R_TYPE (dst->r_info);
@@ -352,10 +354,10 @@ rtype_to_howto (bfd *abfd, arelent *cache_ptr, Elf_Internal_Rela *dst)
       _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
                          abfd, indx);
       bfd_set_error (bfd_error_bad_value);
-      return FALSE;
+      return false;
     }
   cache_ptr->howto = &howto_table[indx];
-  return TRUE;
+  return true;
 }
 
 #define elf_info_to_howto rtype_to_howto
@@ -754,7 +756,7 @@ elf_m68k_reloc_got_type (enum elf_m68k_reloc_type r_type)
       return R_68K_TLS_IE32;
 
     default:
-      BFD_ASSERT (FALSE);
+      BFD_ASSERT (false);
       return 0;
     }
 }
@@ -780,7 +782,7 @@ elf_m68k_reloc_got_offset_size (enum elf_m68k_reloc_type r_type)
       return R_8;
 
     default:
-      BFD_ASSERT (FALSE);
+      BFD_ASSERT (false);
       return 0;
     }
 }
@@ -802,14 +804,14 @@ elf_m68k_reloc_got_n_slots (enum elf_m68k_reloc_type r_type)
       return 2;
 
     default:
-      BFD_ASSERT (FALSE);
+      BFD_ASSERT (false);
       return 0;
     }
 }
 
 /* Return TRUE if relocation R_TYPE is a TLS one.  */
 
-static bfd_boolean
+static bool
 elf_m68k_reloc_tls_p (enum elf_m68k_reloc_type r_type)
 {
   switch (r_type)
@@ -820,10 +822,10 @@ elf_m68k_reloc_tls_p (enum elf_m68k_reloc_type r_type)
     case R_68K_TLS_IE32: case R_68K_TLS_IE16: case R_68K_TLS_IE8:
     case R_68K_TLS_LE32: case R_68K_TLS_LE16: case R_68K_TLS_LE8:
     case R_68K_TLS_DTPMOD32: case R_68K_TLS_DTPREL32: case R_68K_TLS_TPREL32:
-      return TRUE;
+      return true;
 
     default:
-      return FALSE;
+      return false;
     }
 }
 
@@ -887,22 +889,19 @@ struct elf_m68k_link_hash_table
 {
   struct elf_link_hash_table root;
 
-  /* Small local sym cache.  */
-  struct sym_cache sym_cache;
-
   /* The PLT format used by this link, or NULL if the format has not
      yet been chosen.  */
   const struct elf_m68k_plt_info *plt_info;
 
   /* True, if GP is loaded within each function which uses it.
      Set to TRUE when GOT negative offsets or multi-GOT is enabled.  */
-  bfd_boolean local_gp_p;
+  bool local_gp_p;
 
   /* Switch controlling use of negative offsets to double the size of GOTs.  */
-  bfd_boolean use_neg_got_offsets_p;
+  bool use_neg_got_offsets_p;
 
   /* Switch controlling generation of multiple GOTs.  */
-  bfd_boolean allow_multigot_p;
+  bool allow_multigot_p;
 
   /* Multi-GOT data structure.  */
   struct elf_m68k_multi_got multi_got_;
@@ -911,8 +910,9 @@ struct elf_m68k_link_hash_table
 /* Get the m68k ELF linker hash table from a link_info structure.  */
 
 #define elf_m68k_hash_table(p) \
-  (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \
-  == M68K_ELF_DATA ? ((struct elf_m68k_link_hash_table *) ((p)->hash)) : NULL)
+  ((is_elf_hash_table ((p)->hash)                                      \
+    && elf_hash_table_id (elf_hash_table (p)) == M68K_ELF_DATA)                \
+   ? (struct elf_m68k_link_hash_table *) (p)->hash : NULL)
 
 /* Shortcut to multi-GOT data.  */
 #define elf_m68k_multi_got(INFO) (&elf_m68k_hash_table (INFO)->multi_got_)
@@ -969,7 +969,7 @@ static struct bfd_link_hash_table *
 elf_m68k_link_hash_table_create (bfd *abfd)
 {
   struct elf_m68k_link_hash_table *ret;
-  bfd_size_type amt = sizeof (struct elf_m68k_link_hash_table);
+  size_t amt = sizeof (struct elf_m68k_link_hash_table);
 
   ret = (struct elf_m68k_link_hash_table *) bfd_zmalloc (amt);
   if (ret == (struct elf_m68k_link_hash_table *) NULL)
@@ -992,7 +992,7 @@ elf_m68k_link_hash_table_create (bfd *abfd)
 
 /* Set the right machine number.  */
 
-static bfd_boolean
+static bool
 elf32_m68k_object_p (bfd *abfd)
 {
   unsigned int mach = 0;
@@ -1047,13 +1047,13 @@ elf32_m68k_object_p (bfd *abfd)
   mach = bfd_m68k_features_to_mach (features);
   bfd_default_set_arch_mach (abfd, bfd_arch_m68k, mach);
 
-  return TRUE;
+  return true;
 }
 
 /* Somewhat reverse of elf32_m68k_object_p, this sets the e_flag
    field based on the machine number.  */
 
-static bfd_boolean
+static bool
 elf_m68k_final_write_processing (bfd *abfd)
 {
   int mach = bfd_get_mach (abfd);
@@ -1112,17 +1112,76 @@ elf_m68k_final_write_processing (bfd *abfd)
 
 /* Keep m68k-specific flags in the ELF header.  */
 
-static bfd_boolean
+static bool
 elf32_m68k_set_private_flags (bfd *abfd, flagword flags)
 {
   elf_elfheader (abfd)->e_flags = flags;
-  elf_flags_init (abfd) = TRUE;
-  return TRUE;
+  elf_flags_init (abfd) = true;
+  return true;
+}
+
+/* Merge object attributes from IBFD into OBFD.  Warn if
+   there are conflicting attributes. */
+static bool
+m68k_elf_merge_obj_attributes (bfd *ibfd, struct bfd_link_info *info)
+{
+  bfd *obfd = info->output_bfd;
+  obj_attribute *in_attr, *in_attrs;
+  obj_attribute *out_attr, *out_attrs;
+  bool ret = true;
+
+  in_attrs = elf_known_obj_attributes (ibfd)[OBJ_ATTR_GNU];
+  out_attrs = elf_known_obj_attributes (obfd)[OBJ_ATTR_GNU];
+
+  in_attr = &in_attrs[Tag_GNU_M68K_ABI_FP];
+  out_attr = &out_attrs[Tag_GNU_M68K_ABI_FP];
+
+  if (in_attr->i != out_attr->i)
+    {
+      int in_fp = in_attr->i & 3;
+      int out_fp = out_attr->i & 3;
+      static bfd *last_fp;
+
+      if (in_fp == 0)
+       ;
+      else if (out_fp == 0)
+       {
+         out_attr->type = ATTR_TYPE_FLAG_INT_VAL;
+         out_attr->i ^= in_fp;
+         last_fp = ibfd;
+       }
+      else if (out_fp == 1 && in_fp == 2)
+       {
+         _bfd_error_handler
+           /* xgettext:c-format */
+           (_("%pB uses hard float, %pB uses soft float"),
+            last_fp, ibfd);
+         ret = false;
+       }
+      else if (out_fp == 2 && in_fp == 1)
+       {
+         _bfd_error_handler
+           /* xgettext:c-format */
+           (_("%pB uses hard float, %pB uses soft float"),
+            ibfd, last_fp);
+         ret = false;
+       }
+    }
+
+  if (!ret)
+    {
+      out_attr->type = ATTR_TYPE_FLAG_INT_VAL | ATTR_TYPE_FLAG_ERROR;
+      bfd_set_error (bfd_error_bad_value);
+      return false;
+    }
+
+  /* Merge Tag_compatibility attributes and any common GNU ones.  */
+  return _bfd_elf_merge_object_attributes (ibfd, info);
 }
 
 /* Merge backend specific data from an object file to the output
    object file when linking.  */
-static bfd_boolean
+static bool
 elf32_m68k_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
 {
   bfd *obfd = info->output_bfd;
@@ -1136,21 +1195,24 @@ elf32_m68k_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
       || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
     /* PR 24523: For non-ELF files do not try to merge any private
        data, but also do not prevent the link from succeeding.  */
-    return TRUE;
+    return true;
 
   /* Get the merged machine.  This checks for incompatibility between
      Coldfire & non-Coldfire flags, incompability between different
      Coldfire ISAs, and incompability between different MAC types.  */
-  arch_info = bfd_arch_get_compatible (ibfd, obfd, FALSE);
+  arch_info = bfd_arch_get_compatible (ibfd, obfd, false);
   if (!arch_info)
-    return FALSE;
+    return false;
 
   bfd_set_arch_mach (obfd, bfd_arch_m68k, arch_info->mach);
 
+  if (!m68k_elf_merge_obj_attributes (ibfd, info))
+    return false;
+
   in_flags = elf_elfheader (ibfd)->e_flags;
   if (!elf_flags_init (obfd))
     {
-      elf_flags_init (obfd) = TRUE;
+      elf_flags_init (obfd) = true;
       out_flags = in_flags;
     }
   else
@@ -1181,12 +1243,12 @@ elf32_m68k_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
     }
   elf_elfheader (obfd)->e_flags = out_flags;
 
-  return TRUE;
+  return true;
 }
 
 /* Display the flags field.  */
 
-static bfd_boolean
+static bool
 elf32_m68k_print_private_bfd_data (bfd *abfd, void * ptr)
 {
   FILE *file = (FILE *) ptr;
@@ -1273,7 +1335,7 @@ elf32_m68k_print_private_bfd_data (bfd *abfd, void * ptr)
 
   fputc ('\n', file);
 
-  return TRUE;
+  return true;
 }
 
 /* Multi-GOT support implementation design:
@@ -1819,7 +1881,7 @@ struct elf_m68k_can_merge_gots_arg
   struct bfd_link_info *info;
 
   /* Error flag.  */
-  bfd_boolean error_p;
+  bool error_p;
 };
 
 /* Process a single entry from the small GOT to see if it should be added
@@ -1872,7 +1934,7 @@ elf_m68k_can_merge_gots_1 (void **_entry_ptr, void *_arg)
                                      arg->info);
       if (entry == NULL)
        {
-         arg->error_p = TRUE;
+         arg->error_p = true;
          return 0;
        }
 
@@ -1887,7 +1949,7 @@ elf_m68k_can_merge_gots_1 (void **_entry_ptr, void *_arg)
    in BIG GOT to accumulate information from SMALL.
    INFO is the context where memory should be allocated.  */
 
-static bfd_boolean
+static bool
 elf_m68k_can_merge_gots (struct elf_m68k_got *big,
                         const struct elf_m68k_got *small,
                         struct bfd_link_info *info,
@@ -1900,12 +1962,12 @@ elf_m68k_can_merge_gots (struct elf_m68k_got *big,
   arg_.big = big;
   arg_.diff = diff;
   arg_.info = info;
-  arg_.error_p = FALSE;
+  arg_.error_p = false;
   htab_traverse_noresize (small->entries, elf_m68k_can_merge_gots_1, &arg_);
   if (arg_.error_p)
     {
       diff->offset = 0;
-      return FALSE;
+      return false;
     }
 
   /* Check for overflow.  */
@@ -1913,9 +1975,9 @@ elf_m68k_can_merge_gots (struct elf_m68k_got *big,
        > ELF_M68K_R_8_MAX_N_SLOTS_IN_GOT (info))
       || (big->n_slots[R_16] + arg_.diff->n_slots[R_16]
          > ELF_M68K_R_8_16_MAX_N_SLOTS_IN_GOT (info)))
-    return FALSE;
+    return false;
 
-  return TRUE;
+  return true;
 }
 
 struct elf_m68k_merge_gots_arg
@@ -1927,7 +1989,7 @@ struct elf_m68k_merge_gots_arg
   struct bfd_link_info *info;
 
   /* Error flag.  */
-  bfd_boolean error_p;
+  bool error_p;
 };
 
 /* Process a single entry from DIFF got.  Add or update corresponding
@@ -1947,7 +2009,7 @@ elf_m68k_merge_gots_1 (void **entry_ptr, void *_arg)
                               arg->info);
   if (to == NULL)
     {
-      arg->error_p = TRUE;
+      arg->error_p = true;
       return 0;
     }
 
@@ -1961,7 +2023,7 @@ elf_m68k_merge_gots_1 (void **entry_ptr, void *_arg)
 /* Merge data from DIFF to BIG.  INFO is context where memory should be
    allocated.  */
 
-static bfd_boolean
+static bool
 elf_m68k_merge_gots (struct elf_m68k_got *big,
                     struct elf_m68k_got *diff,
                     struct bfd_link_info *info)
@@ -1974,10 +2036,10 @@ elf_m68k_merge_gots (struct elf_m68k_got *big,
       /* Merge entries.  */
       arg_.big = big;
       arg_.info = info;
-      arg_.error_p = FALSE;
+      arg_.error_p = false;
       htab_traverse_noresize (diff->entries, elf_m68k_merge_gots_1, &arg_);
       if (arg_.error_p)
-       return FALSE;
+       return false;
 
       /* Merge counters.  */
       big->n_slots[R_8] += diff->n_slots[R_8];
@@ -2000,7 +2062,7 @@ elf_m68k_merge_gots (struct elf_m68k_got *big,
                  && (big->n_slots[R_16]
                      <= ELF_M68K_R_8_16_MAX_N_SLOTS_IN_GOT (info))));
 
-  return TRUE;
+  return true;
 }
 
 struct elf_m68k_finalize_got_offsets_arg
@@ -2103,7 +2165,7 @@ elf_m68k_finalize_got_offsets_1 (void **entry_ptr, void *_arg)
 
 static void
 elf_m68k_finalize_got_offsets (struct elf_m68k_got *got,
-                              bfd_boolean use_neg_got_offsets_p,
+                              bool use_neg_got_offsets_p,
                               struct elf_m68k_link_hash_entry **symndx2h,
                               bfd_vma *final_offset, bfd_vma *n_ldm_entries)
 {
@@ -2216,7 +2278,7 @@ struct elf_m68k_partition_multi_got_arg
   bfd_vma slots_relas_diff;
 
   /* Error flag.  */
-  bfd_boolean error_p;
+  bool error_p;
 
   /* Mapping from global symndx to global symbols.
      This is used to build lists of got entries for global symbols.  */
@@ -2283,7 +2345,7 @@ elf_m68k_partition_multi_got_1 (void **_entry, void *_arg)
          if (diff->offset == 0)
            /* Offset set to 0 in the diff_ indicates an error.  */
            {
-             arg->error_p = TRUE;
+             arg->error_p = true;
              goto final_return;
            }
 
@@ -2307,7 +2369,7 @@ elf_m68k_partition_multi_got_1 (void **_entry, void *_arg)
       arg->current_got = elf_m68k_create_empty_got (arg->info);
       if (arg->current_got == NULL)
        {
-         arg->error_p = TRUE;
+         arg->error_p = true;
          goto final_return;
        }
 
@@ -2320,7 +2382,7 @@ elf_m68k_partition_multi_got_1 (void **_entry, void *_arg)
     {
       if (!elf_m68k_merge_gots (arg->current_got, diff, arg->info))
        {
-         arg->error_p = TRUE;
+         arg->error_p = true;
          goto final_return;
        }
 
@@ -2354,7 +2416,7 @@ elf_m68k_partition_multi_got_1 (void **_entry, void *_arg)
 
 /* Helper function to build symndx2h mapping.  */
 
-static bfd_boolean
+static bool
 elf_m68k_init_symndx2h_1 (struct elf_link_hash_entry *_h,
                          void *_arg)
 {
@@ -2373,14 +2435,14 @@ elf_m68k_init_symndx2h_1 (struct elf_link_hash_entry *_h,
       arg->symndx2h[h->got_entry_key] = h;
     }
 
-  return TRUE;
+  return true;
 }
 
 /* Merge GOTs of some BFDs, assign offsets to GOT entries and build
    lists of GOT entries for global symbols.
    Calculate sizes of .got and .rela.got sections.  */
 
-static bfd_boolean
+static bool
 elf_m68k_partition_multi_got (struct bfd_link_info *info)
 {
   struct elf_m68k_multi_got *multi_got;
@@ -2393,7 +2455,7 @@ elf_m68k_partition_multi_got (struct bfd_link_info *info)
   arg_.info = info;
   arg_.n_slots = 0;
   arg_.slots_relas_diff = 0;
-  arg_.error_p = FALSE;
+  arg_.error_p = false;
 
   if (multi_got->bfd2got != NULL)
     {
@@ -2402,7 +2464,7 @@ elf_m68k_partition_multi_got (struct bfd_link_info *info)
        arg_.symndx2h = bfd_zmalloc (multi_got->global_symndx
                                     * sizeof (*arg_.symndx2h));
        if (arg_.symndx2h == NULL)
-         return FALSE;
+         return false;
 
        elf_link_hash_traverse (elf_hash_table (info),
                                elf_m68k_init_symndx2h_1, &arg_);
@@ -2416,7 +2478,7 @@ elf_m68k_partition_multi_got (struct bfd_link_info *info)
          free (arg_.symndx2h);
          arg_.symndx2h = NULL;
 
-         return FALSE;
+         return false;
        }
 
       /* Finish up last current_got.  */
@@ -2448,7 +2510,7 @@ elf_m68k_partition_multi_got (struct bfd_link_info *info)
   else
     BFD_ASSERT (multi_got->bfd2got == NULL);
 
-  return TRUE;
+  return true;
 }
 
 /* Copy any information related to dynamic linking from a pre-existing
@@ -2496,7 +2558,7 @@ elf_m68k_copy_indirect_symbol (struct bfd_link_info *info,
    allocate space in the global offset table or procedure linkage
    table.  */
 
-static bfd_boolean
+static bool
 elf_m68k_check_relocs (bfd *abfd,
                       struct bfd_link_info *info,
                       asection *sec,
@@ -2511,7 +2573,7 @@ elf_m68k_check_relocs (bfd *abfd,
   struct elf_m68k_got *got;
 
   if (bfd_link_relocatable (info))
-    return TRUE;
+    return true;
 
   dynobj = elf_hash_table (info)->dynobj;
   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
@@ -2581,7 +2643,7 @@ elf_m68k_check_relocs (bfd *abfd,
              /* Create the .got section.  */
              elf_hash_table (info)->dynobj = dynobj = abfd;
              if (!_bfd_elf_create_got_section (dynobj, info))
-               return FALSE;
+               return false;
            }
 
          if (got == NULL)
@@ -2592,7 +2654,7 @@ elf_m68k_check_relocs (bfd *abfd,
                = elf_m68k_get_bfd2got_entry (elf_m68k_multi_got (info),
                                              abfd, FIND_OR_CREATE, info);
              if (bfd2got_entry == NULL)
-               return FALSE;
+               return false;
 
              got = bfd2got_entry->got;
              BFD_ASSERT (got != NULL);
@@ -2606,7 +2668,7 @@ elf_m68k_check_relocs (bfd *abfd,
                                                   ELF32_R_TYPE (rel->r_info),
                                                   r_symndx, info);
            if (got_entry == NULL)
-             return FALSE;
+             return false;
 
            if (got_entry->u.s1.refcount == 1)
              {
@@ -2616,7 +2678,7 @@ elf_m68k_check_relocs (bfd *abfd,
                    && !h->forced_local)
                  {
                    if (!bfd_elf_link_record_dynamic_symbol (info, h))
-                     return FALSE;
+                     return false;
                  }
              }
          }
@@ -2653,7 +2715,7 @@ elf_m68k_check_relocs (bfd *abfd,
                 local symbol.  FIXME: does it?  How to handle it if
                 it does make sense?  */
              bfd_set_error (bfd_error_bad_value);
-             return FALSE;
+             return false;
            }
 
          /* Make sure this symbol is output as a dynamic symbol.  */
@@ -2661,7 +2723,7 @@ elf_m68k_check_relocs (bfd *abfd,
              && !h->forced_local)
            {
              if (!bfd_elf_link_record_dynamic_symbol (info, h))
-               return FALSE;
+               return false;
            }
 
          h->needs_plt = 1;
@@ -2729,10 +2791,10 @@ elf_m68k_check_relocs (bfd *abfd,
              if (sreloc == NULL)
                {
                  sreloc = _bfd_elf_make_dynamic_reloc_section
-                   (sec, dynobj, 2, abfd, /*rela?*/ TRUE);
+                   (sec, dynobj, 2, abfd, /*rela?*/ true);
 
                  if (sreloc == NULL)
-                   return FALSE;
+                   return false;
                }
 
              if (sec->flags & SEC_READONLY
@@ -2772,10 +2834,10 @@ elf_m68k_check_relocs (bfd *abfd,
                      void *vpp;
                      Elf_Internal_Sym *isym;
 
-                     isym = bfd_sym_from_r_symndx (&elf_m68k_hash_table (info)->sym_cache,
+                     isym = bfd_sym_from_r_symndx (&elf_m68k_hash_table (info)->root.sym_cache,
                                                    abfd, r_symndx);
                      if (isym == NULL)
-                       return FALSE;
+                       return false;
 
                      s = bfd_section_from_elf_index (abfd, isym->st_shndx);
                      if (s == NULL)
@@ -2794,7 +2856,7 @@ elf_m68k_check_relocs (bfd *abfd,
                      p = ((struct elf_m68k_pcrel_relocs_copied *)
                           bfd_alloc (dynobj, (bfd_size_type) sizeof *p));
                      if (p == NULL)
-                       return FALSE;
+                       return false;
                      p->next = *head;
                      *head = p;
                      p->section = sreloc;
@@ -2811,14 +2873,14 @@ elf_m68k_check_relocs (bfd *abfd,
             Reconstruct it for later use during GC.  */
        case R_68K_GNU_VTINHERIT:
          if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
-           return FALSE;
+           return false;
          break;
 
          /* This relocation describes which C++ vtable entries are actually
             used.  Record for later use during GC.  */
        case R_68K_GNU_VTENTRY:
          if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
-           return FALSE;
+           return false;
          break;
 
        default:
@@ -2826,7 +2888,7 @@ elf_m68k_check_relocs (bfd *abfd,
        }
     }
 
-  return TRUE;
+  return true;
 }
 
 /* Return the section that should be marked against GC for a given
@@ -2871,16 +2933,16 @@ elf_m68k_get_plt_info (bfd *output_bfd)
    and the input sections have been assigned to output sections.
    It's a convenient place to determine the PLT style.  */
 
-static bfd_boolean
+static bool
 elf_m68k_always_size_sections (bfd *output_bfd, struct bfd_link_info *info)
 {
   /* Bind input BFDs to GOTs and calculate sizes of .got and .rela.got
      sections.  */
   if (!elf_m68k_partition_multi_got (info))
-    return FALSE;
+    return false;
 
   elf_m68k_hash_table (info)->plt_info = elf_m68k_get_plt_info (output_bfd);
-  return TRUE;
+  return true;
 }
 
 /* Adjust a symbol defined by a dynamic object and referenced by a
@@ -2889,7 +2951,7 @@ elf_m68k_always_size_sections (bfd *output_bfd, struct bfd_link_info *info)
    change the definition to something the rest of the link can
    understand.  */
 
-static bfd_boolean
+static bool
 elf_m68k_adjust_dynamic_symbol (struct bfd_link_info *info,
                                struct elf_link_hash_entry *h)
 {
@@ -2931,7 +2993,7 @@ elf_m68k_adjust_dynamic_symbol (struct bfd_link_info *info,
             linkage table, and we can just do a PCxx reloc instead.  */
          h->plt.offset = (bfd_vma) -1;
          h->needs_plt = 0;
-         return TRUE;
+         return true;
        }
 
       /* Make sure this symbol is output as a dynamic symbol.  */
@@ -2939,7 +3001,7 @@ elf_m68k_adjust_dynamic_symbol (struct bfd_link_info *info,
          && !h->forced_local)
        {
          if (! bfd_elf_link_record_dynamic_symbol (info, h))
-           return FALSE;
+           return false;
        }
 
       s = htab->root.splt;
@@ -2978,7 +3040,7 @@ elf_m68k_adjust_dynamic_symbol (struct bfd_link_info *info,
       BFD_ASSERT (s != NULL);
       s->size += sizeof (Elf32_External_Rela);
 
-      return TRUE;
+      return true;
     }
 
   /* Reinitialize the plt offset now that it is not used as a reference
@@ -2994,7 +3056,7 @@ elf_m68k_adjust_dynamic_symbol (struct bfd_link_info *info,
       BFD_ASSERT (def->root.type == bfd_link_hash_defined);
       h->root.u.def.section = def->root.u.def.section;
       h->root.u.def.value = def->root.u.def.value;
-      return TRUE;
+      return true;
     }
 
   /* This is a reference to a symbol defined by a dynamic object which
@@ -3005,12 +3067,12 @@ elf_m68k_adjust_dynamic_symbol (struct bfd_link_info *info,
      For such cases we need not do anything here; the relocations will
      be handled correctly by relocate_section.  */
   if (bfd_link_pic (info))
-    return TRUE;
+    return true;
 
   /* If there are no references to this symbol that do not use the
      GOT, we don't need to generate a copy reloc.  */
   if (!h->non_got_ref)
-    return TRUE;
+    return true;
 
   /* We must allocate the symbol in our .dynbss section, which will
      become part of the .bss section of the executable.  There will be
@@ -3044,14 +3106,13 @@ elf_m68k_adjust_dynamic_symbol (struct bfd_link_info *info,
 
 /* Set the sizes of the dynamic sections.  */
 
-static bfd_boolean
+static bool
 elf_m68k_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
                                struct bfd_link_info *info)
 {
   bfd *dynobj;
   asection *s;
-  bfd_boolean plt;
-  bfd_boolean relocs;
+  bool relocs;
 
   dynobj = elf_hash_table (info)->dynobj;
   BFD_ASSERT (dynobj != NULL);
@@ -3093,8 +3154,7 @@ elf_m68k_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
   /* The check_relocs and adjust_dynamic_symbol entry points have
      determined the sizes of the various dynamic sections.  Allocate
      memory for them.  */
-  plt = FALSE;
-  relocs = FALSE;
+  relocs = false;
   for (s = dynobj->sections; s != NULL; s = s->next)
     {
       const char *name;
@@ -3104,25 +3164,25 @@ elf_m68k_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
 
       /* It's OK to base decisions on the section name, because none
         of the dynobj section names depend upon the input files.  */
-      name = bfd_get_section_name (dynobj, s);
+      name = bfd_section_name (s);
 
       if (strcmp (name, ".plt") == 0)
        {
          /* Remember whether there is a PLT.  */
-         plt = s->size != 0;
+         ;
        }
-      else if (CONST_STRNEQ (name, ".rela"))
+      else if (startswith (name, ".rela"))
        {
          if (s->size != 0)
            {
-             relocs = TRUE;
+             relocs = true;
 
              /* We use the reloc_count field as a counter if we need
                 to copy relocs into the output file.  */
              s->reloc_count = 0;
            }
        }
-      else if (! CONST_STRNEQ (name, ".got")
+      else if (! startswith (name, ".got")
               && strcmp (name, ".dynbss") != 0)
        {
          /* It's not one of our sections, so don't allocate space.  */
@@ -3155,51 +3215,10 @@ elf_m68k_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
         contents to zero.  */
       s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size);
       if (s->contents == NULL)
-       return FALSE;
+       return false;
     }
 
-  if (elf_hash_table (info)->dynamic_sections_created)
-    {
-      /* Add some entries to the .dynamic section.  We fill in the
-        values later, in elf_m68k_finish_dynamic_sections, but we
-        must add the entries now so that we get the correct size for
-        the .dynamic section.  The DT_DEBUG entry is filled in by the
-        dynamic linker and used by the debugger.  */
-#define add_dynamic_entry(TAG, VAL) \
-  _bfd_elf_add_dynamic_entry (info, TAG, VAL)
-
-      if (bfd_link_executable (info))
-       {
-         if (!add_dynamic_entry (DT_DEBUG, 0))
-           return FALSE;
-       }
-
-      if (plt)
-       {
-         if (!add_dynamic_entry (DT_PLTGOT, 0)
-             || !add_dynamic_entry (DT_PLTRELSZ, 0)
-             || !add_dynamic_entry (DT_PLTREL, DT_RELA)
-             || !add_dynamic_entry (DT_JMPREL, 0))
-           return FALSE;
-       }
-
-      if (relocs)
-       {
-         if (!add_dynamic_entry (DT_RELA, 0)
-             || !add_dynamic_entry (DT_RELASZ, 0)
-             || !add_dynamic_entry (DT_RELAENT, sizeof (Elf32_External_Rela)))
-           return FALSE;
-       }
-
-      if ((info->flags & DF_TEXTREL) != 0)
-       {
-         if (!add_dynamic_entry (DT_TEXTREL, 0))
-           return FALSE;
-       }
-    }
-#undef add_dynamic_entry
-
-  return TRUE;
+  return _bfd_elf_add_dynamic_tags (output_bfd, info, relocs);
 }
 
 /* This function is called via elf_link_hash_traverse if we are
@@ -3215,7 +3234,7 @@ elf_m68k_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
    against a readonly section, and set the DF_TEXTREL flag in this
    case.  */
 
-static bfd_boolean
+static bool
 elf_m68k_discard_copies (struct elf_link_hash_entry *h,
                         void * inf)
 {
@@ -3246,10 +3265,10 @@ elf_m68k_discard_copies (struct elf_link_hash_entry *h,
          && !h->forced_local)
        {
          if (! bfd_elf_link_record_dynamic_symbol (info, h))
-           return FALSE;
+           return false;
        }
 
-      return TRUE;
+      return true;
     }
 
   for (s = elf_m68k_hash_entry (h)->pcrel_relocs_copied;
@@ -3257,7 +3276,7 @@ elf_m68k_discard_copies (struct elf_link_hash_entry *h,
        s = s->next)
     s->section->size -= s->count * sizeof (Elf32_External_Rela);
 
-  return TRUE;
+  return true;
 }
 
 
@@ -3334,7 +3353,7 @@ elf_m68k_init_got_entry_static (struct bfd_link_info *info,
       break;
 
     default:
-      BFD_ASSERT (FALSE);
+      BFD_ASSERT (false);
     }
 }
 
@@ -3385,7 +3404,7 @@ elf_m68k_init_got_entry_local_shared (struct bfd_link_info *info,
       break;
 
     default:
-      BFD_ASSERT (FALSE);
+      BFD_ASSERT (false);
     }
 
   /* Offset of the GOT entry.  */
@@ -3401,7 +3420,7 @@ elf_m68k_init_got_entry_local_shared (struct bfd_link_info *info,
 
 /* Relocate an M68K ELF section.  */
 
-static bfd_boolean
+static int
 elf_m68k_relocate_section (bfd *output_bfd,
                           struct bfd_link_info *info,
                           bfd *input_bfd,
@@ -3442,15 +3461,15 @@ elf_m68k_relocate_section (bfd *output_bfd,
       Elf_Internal_Sym *sym;
       asection *sec;
       bfd_vma relocation;
-      bfd_boolean unresolved_reloc;
+      bool unresolved_reloc;
       bfd_reloc_status_type r;
-      bfd_boolean resolved_to_zero;
+      bool resolved_to_zero;
 
       r_type = ELF32_R_TYPE (rel->r_info);
       if (r_type < 0 || r_type >= (int) R_68K_max)
        {
          bfd_set_error (bfd_error_bad_value);
-         return FALSE;
+         return false;
        }
       howto = howto_table + r_type;
 
@@ -3459,7 +3478,7 @@ elf_m68k_relocate_section (bfd *output_bfd,
       h = NULL;
       sym = NULL;
       sec = NULL;
-      unresolved_reloc = FALSE;
+      unresolved_reloc = false;
 
       if (r_symndx < symtab_hdr->sh_info)
        {
@@ -3469,7 +3488,7 @@ elf_m68k_relocate_section (bfd *output_bfd,
        }
       else
        {
-         bfd_boolean warned, ignored;
+         bool warned, ignored;
 
          RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
                                   r_symndx, symtab_hdr, sym_hashes,
@@ -3600,7 +3619,7 @@ elf_m68k_relocate_section (bfd *output_bfd,
                       itself.  */
                    && elf_m68k_reloc_got_type (r_type) != R_68K_TLS_LDM32)
                  {
-                   bfd_boolean dyn;
+                   bool dyn;
 
                    dyn = elf_hash_table (info)->dynamic_sections_created;
                    if (!WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn,
@@ -3635,7 +3654,7 @@ elf_m68k_relocate_section (bfd *output_bfd,
                        *off_ptr |= 1;
                      }
                    else
-                     unresolved_reloc = FALSE;
+                     unresolved_reloc = false;
                  }
                else if (bfd_link_pic (info)) /* && h == NULL */
                  /* Process local symbol during dynamic link.  */
@@ -3716,7 +3735,7 @@ elf_m68k_relocate_section (bfd *output_bfd,
                 input_bfd, input_section, (uint64_t) rel->r_offset,
                 howto->name);
 
-             return FALSE;
+             return false;
            }
          else
            relocation -= tpoff_base (info);
@@ -3749,7 +3768,7 @@ elf_m68k_relocate_section (bfd *output_bfd,
          relocation = (splt->output_section->vma
                        + splt->output_offset
                        + h->plt.offset);
-         unresolved_reloc = FALSE;
+         unresolved_reloc = false;
          break;
 
        case R_68K_PLT8O:
@@ -3763,7 +3782,7 @@ elf_m68k_relocate_section (bfd *output_bfd,
          BFD_ASSERT (splt != NULL);
 
          relocation = h->plt.offset;
-         unresolved_reloc = FALSE;
+         unresolved_reloc = false;
 
          /* This relocation does not use the addend.  */
          rel->r_addend = 0;
@@ -3790,22 +3809,22 @@ elf_m68k_relocate_section (bfd *output_bfd,
            {
              Elf_Internal_Rela outrel;
              bfd_byte *loc;
-             bfd_boolean skip, relocate;
+             bool skip, relocate;
 
              /* When generating a shared object, these relocations
                 are copied into the output file to be resolved at run
                 time.  */
 
-             skip = FALSE;
-             relocate = FALSE;
+             skip = false;
+             relocate = false;
 
              outrel.r_offset =
                _bfd_elf_section_offset (output_bfd, info, input_section,
                                         rel->r_offset);
              if (outrel.r_offset == (bfd_vma) -1)
-               skip = TRUE;
+               skip = true;
              else if (outrel.r_offset == (bfd_vma) -2)
-               skip = TRUE, relocate = TRUE;
+               skip = true, relocate = true;
              outrel.r_offset += (input_section->output_section->vma
                                  + input_section->output_offset);
 
@@ -3830,7 +3849,7 @@ elf_m68k_relocate_section (bfd *output_bfd,
 
                  if (r_type == R_68K_32)
                    {
-                     relocate = TRUE;
+                     relocate = true;
                      outrel.r_info = ELF32_R_INFO (0, R_68K_RELATIVE);
                    }
                  else
@@ -3842,7 +3861,7 @@ elf_m68k_relocate_section (bfd *output_bfd,
                      else if (sec == NULL || sec->owner == NULL)
                        {
                          bfd_set_error (bfd_error_bad_value);
-                         return FALSE;
+                         return false;
                        }
                      else
                        {
@@ -3914,7 +3933,7 @@ elf_m68k_relocate_section (bfd *output_bfd,
             (uint64_t) rel->r_offset,
             howto->name,
             h->root.root.string);
-         return FALSE;
+         return false;
        }
 
       if (r_symndx != STN_UNDEF
@@ -3938,7 +3957,7 @@ elf_m68k_relocate_section (bfd *output_bfd,
                  name = (bfd_elf_string_from_elf_section
                          (input_bfd, symtab_hdr->sh_link, sym->st_name));
                  if (name == NULL || *name == '\0')
-                   name = bfd_section_name (input_bfd, sec);
+                   name = bfd_section_name (sec);
                }
 
              _bfd_error_handler
@@ -3971,9 +3990,9 @@ elf_m68k_relocate_section (bfd *output_bfd,
                                                      symtab_hdr->sh_link,
                                                      sym->st_name);
              if (name == NULL)
-               return FALSE;
+               return false;
              if (*name == '\0')
-               name = bfd_section_name (input_bfd, sec);
+               name = bfd_section_name (sec);
            }
 
          if (r == bfd_reloc_overflow)
@@ -3987,12 +4006,12 @@ elf_m68k_relocate_section (bfd *output_bfd,
                (_("%pB(%pA+%#" PRIx64 "): reloc against `%s': error %d"),
                 input_bfd, input_section,
                 (uint64_t) rel->r_offset, name, (int) r);
-             return FALSE;
+             return false;
            }
        }
     }
 
-  return TRUE;
+  return true;
 }
 
 /* Install an M_68K_PC32 relocation against VALUE at offset OFFSET
@@ -4013,7 +4032,7 @@ elf_m68k_install_pc32 (asection *sec, bfd_vma offset, bfd_vma value)
 /* Finish up dynamic symbol handling.  We set the contents of various
    dynamic sections here.  */
 
-static bfd_boolean
+static bool
 elf_m68k_finish_dynamic_symbol (bfd *output_bfd,
                                struct bfd_link_info *info,
                                struct elf_link_hash_entry *h,
@@ -4156,7 +4175,7 @@ elf_m68k_finish_dynamic_symbol (bfd *output_bfd,
                  break;
 
                default:
-                 BFD_ASSERT (FALSE);
+                 BFD_ASSERT (false);
                }
 
              elf_m68k_init_got_entry_local_shared (info,
@@ -4210,7 +4229,7 @@ elf_m68k_finish_dynamic_symbol (bfd *output_bfd,
                  break;
 
                default:
-                 BFD_ASSERT (FALSE);
+                 BFD_ASSERT (false);
                  break;
                }
            }
@@ -4243,12 +4262,12 @@ elf_m68k_finish_dynamic_symbol (bfd *output_bfd,
       bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
     }
 
-  return TRUE;
+  return true;
 }
 
 /* Finish up the dynamic sections.  */
 
-static bfd_boolean
+static bool
 elf_m68k_finish_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
 {
   bfd *dynobj;
@@ -4339,7 +4358,7 @@ elf_m68k_finish_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
 
   elf_section_data (sgot->output_section)->this_hdr.sh_entsize = 4;
 
-  return TRUE;
+  return true;
 }
 
 /* Given a .data section and a .emreloc in-memory section, store
@@ -4349,7 +4368,7 @@ elf_m68k_finish_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
    after the add_symbols entry point has been called for all the
    objects, and before the final_link entry point is called.  */
 
-bfd_boolean
+bool
 bfd_m68k_elf32_create_embedded_relocs (bfd *abfd, struct bfd_link_info *info,
                                       asection *datasec, asection *relsec,
                                       char **errmsg)
@@ -4366,7 +4385,7 @@ bfd_m68k_elf32_create_embedded_relocs (bfd *abfd, struct bfd_link_info *info,
   *errmsg = NULL;
 
   if (datasec->reloc_count == 0)
-    return TRUE;
+    return true;
 
   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
 
@@ -4446,20 +4465,18 @@ bfd_m68k_elf32_create_embedded_relocs (bfd *abfd, struct bfd_link_info *info,
        strncpy ((char *) p + 4, targetsec->output_section->name, 8);
     }
 
-  if (isymbuf != NULL && symtab_hdr->contents != (unsigned char *) isymbuf)
+  if (symtab_hdr->contents != (unsigned char *) isymbuf)
     free (isymbuf);
-  if (internal_relocs != NULL
-      && elf_section_data (datasec)->relocs != internal_relocs)
+  if (elf_section_data (datasec)->relocs != internal_relocs)
     free (internal_relocs);
-  return TRUE;
+  return true;
 
-error_return:
-  if (isymbuf != NULL && symtab_hdr->contents != (unsigned char *) isymbuf)
+ error_return:
+  if (symtab_hdr->contents != (unsigned char *) isymbuf)
     free (isymbuf);
-  if (internal_relocs != NULL
-      && elf_section_data (datasec)->relocs != internal_relocs)
+  if (elf_section_data (datasec)->relocs != internal_relocs)
     free (internal_relocs);
-  return FALSE;
+  return false;
 }
 
 /* Set target options.  */
@@ -4468,35 +4485,35 @@ void
 bfd_elf_m68k_set_target_options (struct bfd_link_info *info, int got_handling)
 {
   struct elf_m68k_link_hash_table *htab;
-  bfd_boolean use_neg_got_offsets_p;
-  bfd_boolean allow_multigot_p;
-  bfd_boolean local_gp_p;
+  bool use_neg_got_offsets_p;
+  bool allow_multigot_p;
+  bool local_gp_p;
 
   switch (got_handling)
     {
     case 0:
       /* --got=single.  */
-      local_gp_p = FALSE;
-      use_neg_got_offsets_p = FALSE;
-      allow_multigot_p = FALSE;
+      local_gp_p = false;
+      use_neg_got_offsets_p = false;
+      allow_multigot_p = false;
       break;
 
     case 1:
       /* --got=negative.  */
-      local_gp_p = TRUE;
-      use_neg_got_offsets_p = TRUE;
-      allow_multigot_p = FALSE;
+      local_gp_p = true;
+      use_neg_got_offsets_p = true;
+      allow_multigot_p = false;
       break;
 
     case 2:
       /* --got=multigot.  */
-      local_gp_p = TRUE;
-      use_neg_got_offsets_p = TRUE;
-      allow_multigot_p = TRUE;
+      local_gp_p = true;
+      use_neg_got_offsets_p = true;
+      allow_multigot_p = true;
       break;
 
     default:
-      BFD_ASSERT (FALSE);
+      BFD_ASSERT (false);
       return;
     }
 
@@ -4539,7 +4556,7 @@ elf_m68k_plt_sym_val (bfd_vma i, const asection *plt,
 
 /* Support for core dump NOTE sections.  */
 
-static bfd_boolean
+static bool
 elf_m68k_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
 {
   int offset;
@@ -4548,7 +4565,7 @@ elf_m68k_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
   switch (note->descsz)
     {
     default:
-      return FALSE;
+      return false;
 
     case 154:          /* Linux/m68k */
       /* pr_cursig */
@@ -4569,13 +4586,13 @@ elf_m68k_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
                                          size, note->descpos + offset);
 }
 
-static bfd_boolean
+static bool
 elf_m68k_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
 {
   switch (note->descsz)
     {
     default:
-      return FALSE;
+      return false;
 
     case 124:          /* Linux/m68k elf_prpsinfo.  */
       elf_tdata (abfd)->core->pid
@@ -4597,7 +4614,7 @@ elf_m68k_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
       command[n - 1] = '\0';
   }
 
-  return TRUE;
+  return true;
 }
 
 #define TARGET_BIG_SYM                 m68k_elf32_vec
@@ -4647,6 +4664,6 @@ elf_m68k_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
 #define elf_backend_rela_normal                1
 #define elf_backend_dtrel_excludes_plt 1
 
-#define elf_backend_linux_prpsinfo32_ugid16    TRUE
+#define elf_backend_linux_prpsinfo32_ugid16    true
 
 #include "elf32-target.h"