musl-cross-make/patches/binutils-2.35.1/0000-elf32-arm-bfd-allog-alignment.diff
2024-01-11 14:09:22 +08:00

60 lines
1.9 KiB
Diff

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;