Go to:
Gentoo Home
Documentation
Forums
Lists
Bugs
Planet
Store
Wiki
Get Gentoo!
Gentoo's Bugzilla – Attachment 326522 Details for
Bug 433669
sys-devel/binutils: on 32bit hosts with arm targets: collect2: ld terminated with signal 11 [Segmentation fault]
Home
|
New
–
[Ex]
|
Browse
|
Search
|
Privacy Policy
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
fix memory alignment problems in binutils
binutils-2.22-alignment.patch (text/plain), 5.15 KB, created by
Ambroz Bizjak
on 2012-10-14 13:02:16 UTC
(
hide
)
Description:
fix memory alignment problems in binutils
Filename:
MIME Type:
Creator:
Ambroz Bizjak
Created:
2012-10-14 13:02:16 UTC
Size:
5.15 KB
patch
obsolete
>diff -urN binutils-2.22/bfd/elf32-arm.c binutils-2.22.new/bfd/elf32-arm.c >--- binutils-2.22/bfd/elf32-arm.c 2011-11-21 10:29:13.000000000 +0100 >+++ binutils-2.22.new/bfd/elf32-arm.c 2012-10-14 03:59:52.518670462 +0200 >@@ -61,6 +61,9 @@ > #define ARM_ELF_ABI_VERSION 0 > #define ARM_ELF_OS_ABI_VERSION ELFOSABI_ARM > >+typedef struct { bfd_vma v; } __attribute__((packed)) unaligned_bfd_vma; >+typedef struct { bfd_signed_vma v; } __attribute__((packed)) unaligned_bfd_signed_vma; >+ > static bfd_boolean elf32_arm_write_section (bfd *output_bfd, > struct bfd_link_info *link_info, > asection *sec, >@@ -7851,8 +7854,8 @@ > unsigned long r_type = howto->type; > unsigned long r_symndx; > bfd_byte * hit_data = contents + rel->r_offset; >- bfd_vma * local_got_offsets; >- bfd_vma * local_tlsdesc_gotents; >+ unaligned_bfd_vma * local_got_offsets; >+ unaligned_bfd_vma * local_tlsdesc_gotents; > asection * sgot; > asection * splt; > asection * sreloc = NULL; >@@ -7900,8 +7903,8 @@ > > eh = (struct elf32_arm_link_hash_entry *) h; > sgot = globals->root.sgot; >- local_got_offsets = elf_local_got_offsets (input_bfd); >- local_tlsdesc_gotents = elf32_arm_local_tlsdesc_gotent (input_bfd); >+ local_got_offsets = (void *)elf_local_got_offsets (input_bfd); >+ local_tlsdesc_gotents = (void *)elf32_arm_local_tlsdesc_gotent (input_bfd); > > if (globals->root.dynamic_sections_created) > srelgot = globals->root.srelgot; >@@ -9041,9 +9044,9 @@ > bfd_vma off; > > BFD_ASSERT (local_got_offsets != NULL && >- local_got_offsets[r_symndx] != (bfd_vma) -1); >+ local_got_offsets[r_symndx].v != (bfd_vma) -1); > >- off = local_got_offsets[r_symndx]; >+ off = local_got_offsets[r_symndx].v; > > /* The offset must always be a multiple of 4. We use the > least significant bit to record whether we have already >@@ -9070,7 +9073,7 @@ > elf32_arm_add_dynreloc (output_bfd, info, srelgot, &outrel); > } > >- local_got_offsets[r_symndx] |= 1; >+ local_got_offsets[r_symndx].v |= 1; > } > > value = sgot->output_offset + off; >@@ -9168,8 +9171,8 @@ > else > { > BFD_ASSERT (local_got_offsets != NULL); >- off = local_got_offsets[r_symndx]; >- offplt = local_tlsdesc_gotents[r_symndx]; >+ off = local_got_offsets[r_symndx].v; >+ offplt = local_tlsdesc_gotents[r_symndx].v; > tls_type = elf32_arm_local_got_tls_type (input_bfd)[r_symndx]; > } > >@@ -9321,7 +9324,7 @@ > if (h != NULL) > h->got.offset |= 1; > else >- local_got_offsets[r_symndx] |= 1; >+ local_got_offsets[r_symndx].v |= 1; > } > > if ((tls_type & GOT_TLS_GD) && r_type != R_ARM_TLS_GD32) >@@ -13248,11 +13251,11 @@ > relocs. */ > for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next) > { >- bfd_signed_vma *local_got; >- bfd_signed_vma *end_local_got; >+ unaligned_bfd_signed_vma *local_got; >+ unaligned_bfd_signed_vma *end_local_got; > struct arm_local_iplt_info **local_iplt_ptr, *local_iplt; > char *local_tls_type; >- bfd_vma *local_tlsdesc_gotent; >+ unaligned_bfd_vma *local_tlsdesc_gotent; > bfd_size_type locsymcount; > Elf_Internal_Shdr *symtab_hdr; > asection *srel; >@@ -13294,7 +13297,7 @@ > } > } > >- local_got = elf_local_got_refcounts (ibfd); >+ local_got = (void *)elf_local_got_refcounts (ibfd); > if (!local_got) > continue; > >@@ -13311,7 +13314,7 @@ > ++local_got, ++local_iplt_ptr, ++local_tls_type, > ++local_tlsdesc_gotent, ++symndx) > { >- *local_tlsdesc_gotent = (bfd_vma) -1; >+ local_tlsdesc_gotent->v = (bfd_vma) -1; > local_iplt = *local_iplt_ptr; > if (local_iplt != NULL) > { >@@ -13328,7 +13331,7 @@ > run-time target. This means that the .got entry > would be the same as the .igot.plt entry, so there's > no point creating both. */ >- *local_got = 0; >+ local_got->v = 0; > } > else > { >@@ -13347,20 +13350,20 @@ > elf32_arm_allocate_dynrelocs (info, psrel, p->count); > } > } >- if (*local_got > 0) >+ if (local_got->v > 0) > { > Elf_Internal_Sym *isym; > >- *local_got = s->size; >+ local_got->v = s->size; > if (*local_tls_type & GOT_TLS_GD) > /* TLS_GD relocs need an 8-byte structure in the GOT. */ > s->size += 8; > if (*local_tls_type & GOT_TLS_GDESC) > { >- *local_tlsdesc_gotent = htab->root.sgotplt->size >+ local_tlsdesc_gotent->v = htab->root.sgotplt->size > - elf32_arm_compute_jump_table_size (htab); > htab->root.sgotplt->size += 8; >- *local_got = (bfd_vma) -2; >+ local_got->v = (bfd_vma) -2; > /* plt.got_offset needs to know there's a TLS_DESC > reloc in the middle of .got.plt. */ > htab->num_tls_desc++; >@@ -13372,7 +13375,7 @@ > { > /* If the symbol is both GD and GDESC, *local_got > may have been overwritten. */ >- *local_got = s->size; >+ local_got->v = s->size; > s->size += 4; > } > >@@ -13398,7 +13401,7 @@ > } > } > else >- *local_got = (bfd_vma) -1; >+ local_got->v = (bfd_vma) -1; > } > } >
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 433669
: 326522