diff -ur a/bfd/elf32-arm.c b/bfd/elf32-arm.c
--- a/bfd/elf32-arm.c	2020-04-15 17:46:10.564727832 -0500
+++ b/bfd/elf32-arm.c	2020-04-16 15:26:30.908073105 -0500
@@ -3607,6 +3607,18 @@
 /* Ensure that we have allocated bookkeeping structures for ABFD's local
    symbols.  */
 
+static char *
+elf32_arm_bfd_align (char *base, char *x, bfd_size_type align)
+{
+  bfd_size_type offset = x - base;
+  bfd_size_type mod = offset % align;
+  if (mod > 0)
+    {
+      offset += align - mod;
+    }
+  return base + offset;
+}
+
 static bfd_boolean
 elf32_arm_allocate_local_sym_info (bfd *abfd)
 {
@@ -3615,9 +3627,10 @@
       bfd_size_type num_syms;
       bfd_size_type size;
       char *data;
+      char *data_start;
 
       num_syms = elf_tdata (abfd)->symtab_hdr.sh_info;
-      size = num_syms * (sizeof (bfd_signed_vma)
+      size = (num_syms + 1) * (sizeof (bfd_signed_vma)
 			 + sizeof (struct arm_local_iplt_info *)
 			 + sizeof (bfd_vma)
 			 + sizeof (char)
@@ -3625,19 +3638,24 @@
       data = bfd_zalloc (abfd, size);
       if (data == NULL)
 	return FALSE;
+      data_start = data;
 
       elf32_arm_local_fdpic_cnts (abfd) = (struct fdpic_local *) data;
       data += num_syms * sizeof (struct fdpic_local);
 
+      data = elf32_arm_bfd_align(data_start, data, sizeof (bfd_signed_vma));
       elf_local_got_refcounts (abfd) = (bfd_signed_vma *) data;
       data += num_syms * sizeof (bfd_signed_vma);
 
+      data = elf32_arm_bfd_align(data_start, data, sizeof (struct arm_local_iplt_info *));
       elf32_arm_local_iplt (abfd) = (struct arm_local_iplt_info **) data;
       data += num_syms * sizeof (struct arm_local_iplt_info *);
 
+      data = elf32_arm_bfd_align(data_start, data, sizeof (bfd_vma));
       elf32_arm_local_tlsdesc_gotent (abfd) = (bfd_vma *) data;
       data += num_syms * sizeof (bfd_vma);
 
+      data = elf32_arm_bfd_align(data_start, data, sizeof (char));
       elf32_arm_local_got_tls_type (abfd) = data;
     }
   return TRUE;