diff options
Diffstat (limited to 'bfd/elfnn-aarch64.c')
-rw-r--r-- | bfd/elfnn-aarch64.c | 28 |
1 files changed, 21 insertions, 7 deletions
diff --git a/bfd/elfnn-aarch64.c b/bfd/elfnn-aarch64.c index 8a55596..0103b01 100644 --- a/bfd/elfnn-aarch64.c +++ b/bfd/elfnn-aarch64.c @@ -6833,7 +6833,7 @@ elfNN_aarch64_adjust_dynamic_symbol (struct bfd_link_info *info, struct elf_link_hash_entry *h) { struct elf_aarch64_link_hash_table *htab; - asection *s; + asection *s, *srel; /* If this is a function, put it in the procedure linkage table. We will fill in the contents of the procedure linkage table later, @@ -6910,14 +6910,22 @@ elfNN_aarch64_adjust_dynamic_symbol (struct bfd_link_info *info, /* We must generate a R_AARCH64_COPY reloc to tell the dynamic linker to copy the initial value out of the dynamic object and into the runtime process image. */ + if ((h->root.u.def.section->flags & SEC_READONLY) != 0) + { + s = htab->root.sdynrelro; + srel = htab->root.sreldynrelro; + } + else + { + s = htab->root.sdynbss; + srel = htab->root.srelbss; + } if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0) { - htab->root.srelbss->size += RELOC_SIZE (htab); + srel->size += RELOC_SIZE (htab); h->needs_copy = 1; } - s = htab->root.sdynbss; - return _bfd_elf_adjust_dynamic_copy (info, h, s); } @@ -8517,7 +8525,8 @@ elfNN_aarch64_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED, || s == htab->root.sgotplt || s == htab->root.iplt || s == htab->root.igotplt - || s == htab->root.sdynbss) + || s == htab->root.sdynbss + || s == htab->root.sdynrelro) { /* Strip this section if we don't need it; see the comment below. */ @@ -8921,6 +8930,7 @@ do_glob_dat: if (h->needs_copy) { Elf_Internal_Rela rela; + asection *s; bfd_byte *loc; /* This symbol needs a copy reloc. Set it up. */ @@ -8936,8 +8946,11 @@ do_glob_dat: + h->root.u.def.section->output_offset); rela.r_info = ELFNN_R_INFO (h->dynindx, AARCH64_R (COPY)); rela.r_addend = 0; - loc = htab->root.srelbss->contents; - loc += htab->root.srelbss->reloc_count++ * RELOC_SIZE (htab); + if ((h->root.u.def.section->flags & SEC_READONLY) != 0) + s = htab->root.sreldynrelro; + else + s = htab->root.srelbss; + loc = s->contents + s->reloc_count++ * RELOC_SIZE (htab); bfd_elfNN_swap_reloca_out (output_bfd, &rela, loc); } @@ -9390,6 +9403,7 @@ const struct elf_size_info elfNN_aarch64_size_info = #define elf_backend_plt_readonly 1 #define elf_backend_want_got_plt 1 #define elf_backend_want_plt_sym 0 +#define elf_backend_want_dynrelro 1 #define elf_backend_may_use_rel_p 0 #define elf_backend_may_use_rela_p 1 #define elf_backend_default_use_rela_p 1 |