diff options
Diffstat (limited to 'bfd')
-rw-r--r-- | bfd/ChangeLog | 9 | ||||
-rw-r--r-- | bfd/bfd-in.h | 4 | ||||
-rw-r--r-- | bfd/bfd-in2.h | 4 | ||||
-rw-r--r-- | bfd/elfnn-aarch64.c | 8 |
4 files changed, 20 insertions, 5 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 394e83c..432ec91 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,12 @@ +2016-05-03 Jiong Wang <jiong.wang@arm.com> + + * bfd-in.h (bfd_elf64_aarch64_set_options): Update prototype. + * bfd-in2.h (bfd_elf64_aarch64_set_options): Likewise. + * elfnn-aarch64.c (bfd_elfNN_aarch64_set_options): Initialize + no_apply_dynamic_relocs. + (elfNN_aarch64_final_link_relocate): Apply absolute relocations even though + dynamic relocations generated. + 2016-04-29 H.J. Lu <hongjiu.lu@intel.com> * elf32-i386.c (elf_i386_size_dynamic_sections): Move interp diff --git a/bfd/bfd-in.h b/bfd/bfd-in.h index 5df2bab..4641405 100644 --- a/bfd/bfd-in.h +++ b/bfd/bfd-in.h @@ -961,10 +961,10 @@ extern void bfd_elf32_aarch64_init_maps (bfd *); extern void bfd_elf64_aarch64_set_options - (bfd *, struct bfd_link_info *, int, int, int, int, int); + (bfd *, struct bfd_link_info *, int, int, int, int, int, int); extern void bfd_elf32_aarch64_set_options - (bfd *, struct bfd_link_info *, int, int, int, int, int); + (bfd *, struct bfd_link_info *, int, int, int, int, int, int); /* ELF AArch64 mapping symbol support. */ #define BFD_AARCH64_SPECIAL_SYM_TYPE_MAP (1 << 0) diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h index a19a651..f68c1076 100644 --- a/bfd/bfd-in2.h +++ b/bfd/bfd-in2.h @@ -968,10 +968,10 @@ extern void bfd_elf32_aarch64_init_maps (bfd *); extern void bfd_elf64_aarch64_set_options - (bfd *, struct bfd_link_info *, int, int, int, int, int); + (bfd *, struct bfd_link_info *, int, int, int, int, int, int); extern void bfd_elf32_aarch64_set_options - (bfd *, struct bfd_link_info *, int, int, int, int, int); + (bfd *, struct bfd_link_info *, int, int, int, int, int, int); /* ELF AArch64 mapping symbol support. */ #define BFD_AARCH64_SPECIAL_SYM_TYPE_MAP (1 << 0) diff --git a/bfd/elfnn-aarch64.c b/bfd/elfnn-aarch64.c index 5b9878e..eecbf87 100644 --- a/bfd/elfnn-aarch64.c +++ b/bfd/elfnn-aarch64.c @@ -2289,6 +2289,9 @@ struct elf_aarch64_link_hash_table /* Enable ADRP->ADR rewrite for erratum 843419 workaround. */ int fix_erratum_843419_adr; + /* Don't apply link-time values for dynamic relocations. */ + int no_apply_dynamic_relocs; + /* The number of bytes in the initial entry in the PLT. */ bfd_size_type plt_header_size; @@ -4334,7 +4337,8 @@ bfd_elfNN_aarch64_set_options (struct bfd *output_bfd, int no_enum_warn, int no_wchar_warn, int pic_veneer, int fix_erratum_835769, - int fix_erratum_843419) + int fix_erratum_843419, + int no_apply_dynamic_relocs) { struct elf_aarch64_link_hash_table *globals; @@ -4343,6 +4347,7 @@ bfd_elfNN_aarch64_set_options (struct bfd *output_bfd, globals->fix_erratum_835769 = fix_erratum_835769; globals->fix_erratum_843419 = fix_erratum_843419; globals->fix_erratum_843419_adr = TRUE; + globals->no_apply_dynamic_relocs = no_apply_dynamic_relocs; BFD_ASSERT (is_aarch64_elf (output_bfd)); elf_aarch64_tdata (output_bfd)->no_enum_size_warning = no_enum_warn; @@ -5208,6 +5213,7 @@ elfNN_aarch64_final_link_relocate (reloc_howto_type *howto, relocate the text and data segments independently, so the symbol does not matter. */ symbol = 0; + relocate = globals->no_apply_dynamic_relocs ? FALSE : TRUE; outrel.r_info = ELFNN_R_INFO (symbol, AARCH64_R (RELATIVE)); outrel.r_addend += value; } |