From a6bb11b2df1b69d79828a52a44eaf29ebc4d4955 Mon Sep 17 00:00:00 2001 From: Yufeng Zhang Date: Wed, 26 Jun 2013 10:47:06 +0000 Subject: [PATCH] [AArch64, ILP32] 3/6 Support for ELF32 relocs and refactor reloc handling bfd/ * bfd-in2.h: Re-generated. * elfnn-aarch64.c (HOWTO64, HOWTO32): New define. (IS_AARCH64_TLS_RELOC): Change to be based on the bfd reloc enumerators. (IS_AARCH64_TLSDESC_RELOC): Likewise. (PG, PG_OFFSET): Cast literal to bfd_vma. (elf64_aarch64_howto_table): Removed. (elf64_aarch64_howto_dynrelocs): Removed. (elf64_aarch64_tls_howto_table): Removed. (elf64_aarch64_tlsdesc_howto_table): Removed. (elfNN_aarch64_howto_table): New table to host all howto entires.. (R_AARCH64_*): Replaced by AARCH64_R (*) and AARCH64_R_STR (*). (elfNN_aarch64_bfd_reloc_from_howto): New function. (elfNN_aarch64_bfd_reloc_from_type): Ditto. (struct elf_aarch64_reloc_map): New. (elf_aarch64_reloc_map): New table. (elfNN_aarch64_howto_from_bfd_reloc): New function. (elfNN_aarch64_howto_from_type): Update to look up the new table elfNN_aarch64_howto_table. (struct elf64_aarch64_reloc_map): Remove. (elf64_aarch64_reloc_map): Remove. (elfNN_aarch64_reloc_type_lookup): Change to call elfNN_aarch64_howto_from_bfd_reloc. (elfNN_aarch64_reloc_name_lookup): Change to look up the new table elfNN_aarch64_howto_table. (aarch64_resolve_relocation): Refactor to switch on the bfd reloc enumerators. (bfd_elf_aarch64_put_addend): Likewise. (elfNN_aarch64_final_link_relocate): Likewise. (aarch64_tls_transition_without_check): Likewise. (aarch64_reloc_got_type): Likewise. (aarch64_can_relax_tls): Likewise. (aarch64_tls_transition): Likewise. (elfNN_aarch64_tls_relax): Likewise. (elfNN_aarch64_final_link_relocate): Likewise. (elfNN_aarch64_relocate_section): Likewise. (elfNN_aarch64_gc_sweep_hook): Likewise. (elfNN_aarch64_check_relocs): Likewise. (aarch64_tls_transition): Change to return a bfd reloc enumerator. * libbfd.h: Re-generated. * reloc.c: Re-order the AArch64 bfd reloc enumerators. (BFD_RELOC_AARCH64_RELOC_START) (BFD_RELOC_AARCH64_RELOC_END) (BFD_RELOC_AARCH64_LD_GOT_LO12_NC) (BFD_RELOC_AARCH64_LD32_GOT_LO12_NC) (BFD_RELOC_AARCH64_TLSDESC_LD_LO12_NC) (BFD_RELOC_AARCH64_TLSDESC_LD32_LO12_NC) (BFD_RELOC_AARCH64_TLSIE_LD_GOTTPREL_LO12_NC) (BFD_RELOC_AARCH64_TLSIE_LD32_GOTTPREL_LO12_NC) (BFD_RELOC_AARCH64_IRELATIVE): New relocs. gas/ * config/tc-aarch64.c (reloc_table): Replace BFD_RELOC_AARCH64_LD64_GOT_LO12_NC with BFD_RELOC_AARCH64_LD_GOT_LO12_NC; likewise to BFD_RELOC_AARCH64_TLSDESC_LD64_LO12_NC and BFD_RELOC_AARCH64_TLSIE_LD_GOTTPREL_LO12_NC. (md_apply_fix): Handle BFD_RELOC_AARCH64_LD_GOT_LO12_NC, BFD_RELOC_AARCH64_LD32_GOT_LO12_NC, BFD_RELOC_AARCH64_TLSDESC_LD_LO12_NC, BFD_RELOC_AARCH64_TLSDESC_LD32_LO12_NC, BFD_RELOC_AARCH64_TLSIE_LD_GOTTPREL_LO12_NC and BFD_RELOC_AARCH64_TLSIE_LD32_GOTTPREL_LO12_NC. (aarch64_force_relocation): Likewise. gas/testsuite/ * gas/aarch64/ilp32-basic.d: New file. * gas/aarch64/ilp32-basic.s: New file. include/elf/ * aarch64.h: Add ELF32 reloc codes and remove fake ELF64 ones. (R_AARCH64_IRELATIVE): New reloc. --- bfd/ChangeLog | 53 + bfd/bfd-in2.h | 331 +++-- bfd/elfnn-aarch64.c | 1647 ++++++++++++----------- bfd/libbfd.h | 108 +- bfd/reloc.c | 359 +++-- gas/ChangeLog | 15 + gas/config/tc-aarch64.c | 51 +- gas/testsuite/ChangeLog | 5 + gas/testsuite/gas/aarch64/ilp32-basic.d | 23 + gas/testsuite/gas/aarch64/ilp32-basic.s | 17 + include/elf/ChangeLog | 4 + include/elf/aarch64.h | 136 +- 12 files changed, 1625 insertions(+), 1124 deletions(-) create mode 100644 gas/testsuite/gas/aarch64/ilp32-basic.d create mode 100644 gas/testsuite/gas/aarch64/ilp32-basic.s diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 68f306fccf..a91efeabaf 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,56 @@ +2013-06-26 Yufeng Zhang + + * bfd-in2.h: Re-generated. + * elfnn-aarch64.c (HOWTO64, HOWTO32): New define. + (IS_AARCH64_TLS_RELOC): Change to be based on the + bfd reloc enumerators. + (IS_AARCH64_TLSDESC_RELOC): Likewise. + (PG, PG_OFFSET): Cast literal to bfd_vma. + (elf64_aarch64_howto_table): Removed. + (elf64_aarch64_howto_dynrelocs): Removed. + (elf64_aarch64_tls_howto_table): Removed. + (elf64_aarch64_tlsdesc_howto_table): Removed. + (elfNN_aarch64_howto_table): New table to host all howto entires.. + (R_AARCH64_*): Replaced by AARCH64_R (*) and AARCH64_R_STR (*). + (elfNN_aarch64_bfd_reloc_from_howto): New function. + (elfNN_aarch64_bfd_reloc_from_type): Ditto. + (struct elf_aarch64_reloc_map): New. + (elf_aarch64_reloc_map): New table. + (elfNN_aarch64_howto_from_bfd_reloc): New function. + (elfNN_aarch64_howto_from_type): Update to look up the new table + elfNN_aarch64_howto_table. + (struct elf64_aarch64_reloc_map): Remove. + (elf64_aarch64_reloc_map): Remove. + (elfNN_aarch64_reloc_type_lookup): Change to call + elfNN_aarch64_howto_from_bfd_reloc. + (elfNN_aarch64_reloc_name_lookup): Change to look up the new table + elfNN_aarch64_howto_table. + (aarch64_resolve_relocation): Refactor to switch on the bfd + reloc enumerators. + (bfd_elf_aarch64_put_addend): Likewise. + (elfNN_aarch64_final_link_relocate): Likewise. + (aarch64_tls_transition_without_check): Likewise. + (aarch64_reloc_got_type): Likewise. + (aarch64_can_relax_tls): Likewise. + (aarch64_tls_transition): Likewise. + (elfNN_aarch64_tls_relax): Likewise. + (elfNN_aarch64_final_link_relocate): Likewise. + (elfNN_aarch64_relocate_section): Likewise. + (elfNN_aarch64_gc_sweep_hook): Likewise. + (elfNN_aarch64_check_relocs): Likewise. + (aarch64_tls_transition): Change to return a bfd reloc enumerator. + * libbfd.h: Re-generated. + * reloc.c: Re-order the AArch64 bfd reloc enumerators. + (BFD_RELOC_AARCH64_RELOC_START) + (BFD_RELOC_AARCH64_RELOC_END) + (BFD_RELOC_AARCH64_LD_GOT_LO12_NC) + (BFD_RELOC_AARCH64_LD32_GOT_LO12_NC) + (BFD_RELOC_AARCH64_TLSDESC_LD_LO12_NC) + (BFD_RELOC_AARCH64_TLSDESC_LD32_LO12_NC) + (BFD_RELOC_AARCH64_TLSIE_LD_GOTTPREL_LO12_NC) + (BFD_RELOC_AARCH64_TLSIE_LD32_GOTTPREL_LO12_NC) + (BFD_RELOC_AARCH64_IRELATIVE): New relocs. + 2013-06-26 Yufeng Zhang * Makefile.am (BFD64_BACKENDS): Add elf32-aarch64.lo. diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h index e4a5dccf8e..9cbd82060d 100644 --- a/bfd/bfd-in2.h +++ b/bfd/bfd-in2.h @@ -5240,21 +5240,78 @@ to two words (uses imm instruction). */ to two words (uses imm instruction). */ BFD_RELOC_MICROBLAZE_64_TLSTPREL, -/* AArch64 ADD immediate instruction, holding bits 0 to 11 of the address. -Used in conjunction with BFD_RELOC_AARCH64_ADR_HI21_PCREL. */ - BFD_RELOC_AARCH64_ADD_LO12, +/* AArch64 pseudo relocation code to mark the start of the AArch64 +relocation enumerators. N.B. the order of the enumerators is +important as several tables in the AArch64 bfd backend are indexed +by these enumerators; make sure they are all synced. */ + BFD_RELOC_AARCH64_RELOC_START, + +/* AArch64 null relocation code. */ + BFD_RELOC_AARCH64_NONE, + +/* Basic absolute relocations of N bits. These are equivalent to +BFD_RELOC_N and they were added to assist the indexing of the howto +table. */ + BFD_RELOC_AARCH64_64, + BFD_RELOC_AARCH64_32, + BFD_RELOC_AARCH64_16, + +/* PC-relative relocations. These are equivalent to BFD_RELOC_N_PCREL +and they were added to assist the indexing of the howto table. */ + BFD_RELOC_AARCH64_64_PCREL, + BFD_RELOC_AARCH64_32_PCREL, + BFD_RELOC_AARCH64_16_PCREL, -/* AArch64 Load Literal instruction, holding a 19 bit PC relative word -offset of the global offset table entry for a symbol. The lowest two -bits must be zero and are not stored in the instruction, giving a 21 -bit signed byte offset. This relocation type requires signed overflow -checking. */ - BFD_RELOC_AARCH64_GOT_LD_PREL19, +/* AArch64 MOV[NZK] instruction with most significant bits 0 to 15 +of an unsigned address/value. */ + BFD_RELOC_AARCH64_MOVW_G0, -/* Get to the page base of the global offset table entry for a symbol as -part of an ADRP instruction using a 21 bit PC relative value.Used in -conjunction with BFD_RELOC_AARCH64_LD64_GOT_LO12_NC. */ - BFD_RELOC_AARCH64_ADR_GOT_PAGE, +/* AArch64 MOV[NZK] instruction with less significant bits 0 to 15 of +an address/value. No overflow checking. */ + BFD_RELOC_AARCH64_MOVW_G0_NC, + +/* AArch64 MOV[NZK] instruction with most significant bits 16 to 31 +of an unsigned address/value. */ + BFD_RELOC_AARCH64_MOVW_G1, + +/* AArch64 MOV[NZK] instruction with less significant bits 16 to 31 +of an address/value. No overflow checking. */ + BFD_RELOC_AARCH64_MOVW_G1_NC, + +/* AArch64 MOV[NZK] instruction with most significant bits 32 to 47 +of an unsigned address/value. */ + BFD_RELOC_AARCH64_MOVW_G2, + +/* AArch64 MOV[NZK] instruction with less significant bits 32 to 47 +of an address/value. No overflow checking. */ + BFD_RELOC_AARCH64_MOVW_G2_NC, + +/* AArch64 MOV[NZK] instruction with most signficant bits 48 to 64 +of a signed or unsigned address/value. */ + BFD_RELOC_AARCH64_MOVW_G3, + +/* AArch64 MOV[NZ] instruction with most significant bits 0 to 15 +of a signed value. Changes instruction to MOVZ or MOVN depending on the +value's sign. */ + BFD_RELOC_AARCH64_MOVW_G0_S, + +/* AArch64 MOV[NZ] instruction with most significant bits 16 to 31 +of a signed value. Changes instruction to MOVZ or MOVN depending on the +value's sign. */ + BFD_RELOC_AARCH64_MOVW_G1_S, + +/* AArch64 MOV[NZ] instruction with most significant bits 32 to 47 +of a signed value. Changes instruction to MOVZ or MOVN depending on the +value's sign. */ + BFD_RELOC_AARCH64_MOVW_G2_S, + +/* AArch64 Load Literal instruction, holding a 19 bit pc-relative word +offset. The lowest two bits must be zero and are not stored in the +instruction, giving a 21 bit signed byte offset. */ + BFD_RELOC_AARCH64_LD_LO19_PCREL, + +/* AArch64 ADR instruction, holding a simple 21 bit pc-relative byte offset. */ + BFD_RELOC_AARCH64_ADR_LO21_PCREL, /* AArch64 ADRP instruction, with bits 12 to 32 of a pc-relative page offset, giving a 4KB aligned page base address. */ @@ -5265,45 +5322,33 @@ offset, giving a 4KB aligned page base address, but with no overflow checking. */ BFD_RELOC_AARCH64_ADR_HI21_NC_PCREL, -/* AArch64 ADR instruction, holding a simple 21 bit pc-relative byte offset. */ - BFD_RELOC_AARCH64_ADR_LO21_PCREL, +/* AArch64 ADD immediate instruction, holding bits 0 to 11 of the address. +Used in conjunction with BFD_RELOC_AARCH64_ADR_HI21_PCREL. */ + BFD_RELOC_AARCH64_ADD_LO12, + +/* AArch64 8-bit load/store instruction, holding bits 0 to 11 of the +address. Used in conjunction with BFD_RELOC_AARCH64_ADR_HI21_PCREL. */ + BFD_RELOC_AARCH64_LDST8_LO12, + +/* AArch64 14 bit pc-relative test bit and branch. +The lowest two bits must be zero and are not stored in the instruction, +giving a 16 bit signed byte offset. */ + BFD_RELOC_AARCH64_TSTBR14, /* AArch64 19 bit pc-relative conditional branch and compare & branch. The lowest two bits must be zero and are not stored in the instruction, giving a 21 bit signed byte offset. */ BFD_RELOC_AARCH64_BRANCH19, -/* AArch64 26 bit pc-relative unconditional branch and link. -The lowest two bits must be zero and are not stored in the instruction, -giving a 28 bit signed byte offset. */ - BFD_RELOC_AARCH64_CALL26, - -/* AArch64 pseudo relocation code to be used internally by the AArch64 -assembler and not (currently) written to any object files. */ - BFD_RELOC_AARCH64_GAS_INTERNAL_FIXUP, - /* AArch64 26 bit pc-relative unconditional branch. The lowest two bits must be zero and are not stored in the instruction, giving a 28 bit signed byte offset. */ BFD_RELOC_AARCH64_JUMP26, -/* AArch64 Load Literal instruction, holding a 19 bit pc-relative word -offset. The lowest two bits must be zero and are not stored in the -instruction, giving a 21 bit signed byte offset. */ - BFD_RELOC_AARCH64_LD_LO19_PCREL, - -/* Unsigned 12 bit byte offset for 64 bit load/store from the page of -the GOT entry for this symbol. Used in conjunction with -BFD_RELOC_AARCH64_ADR_GOTPAGE. */ - BFD_RELOC_AARCH64_LD64_GOT_LO12_NC, - -/* AArch64 unspecified load/store instruction, holding bits 0 to 11 of the -address. Used in conjunction with BFD_RELOC_AARCH64_ADR_HI21_PCREL. */ - BFD_RELOC_AARCH64_LDST_LO12, - -/* AArch64 8-bit load/store instruction, holding bits 0 to 11 of the -address. Used in conjunction with BFD_RELOC_AARCH64_ADR_HI21_PCREL. */ - BFD_RELOC_AARCH64_LDST8_LO12, +/* AArch64 26 bit pc-relative unconditional branch and link. +The lowest two bits must be zero and are not stored in the instruction, +giving a 28 bit signed byte offset. */ + BFD_RELOC_AARCH64_CALL26, /* AArch64 16-bit load/store instruction, holding bits 0 to 11 of the address. Used in conjunction with BFD_RELOC_AARCH64_ADR_HI21_PCREL. */ @@ -5321,145 +5366,167 @@ address. Used in conjunction with BFD_RELOC_AARCH64_ADR_HI21_PCREL. */ address. Used in conjunction with BFD_RELOC_AARCH64_ADR_HI21_PCREL. */ BFD_RELOC_AARCH64_LDST128_LO12, -/* AArch64 MOV[NZK] instruction with most significant bits 0 to 15 -of an unsigned address/value. */ - BFD_RELOC_AARCH64_MOVW_G0, +/* AArch64 Load Literal instruction, holding a 19 bit PC relative word +offset of the global offset table entry for a symbol. The lowest two +bits must be zero and are not stored in the instruction, giving a 21 +bit signed byte offset. This relocation type requires signed overflow +checking. */ + BFD_RELOC_AARCH64_GOT_LD_PREL19, -/* AArch64 MOV[NZ] instruction with most significant bits 0 to 15 -of a signed value. Changes instruction to MOVZ or MOVN depending on the -value's sign. */ - BFD_RELOC_AARCH64_MOVW_G0_S, +/* Get to the page base of the global offset table entry for a symbol as +part of an ADRP instruction using a 21 bit PC relative value.Used in +conjunction with BFD_RELOC_AARCH64_LD64_GOT_LO12_NC. */ + BFD_RELOC_AARCH64_ADR_GOT_PAGE, -/* AArch64 MOV[NZK] instruction with less significant bits 0 to 15 of -an address/value. No overflow checking. */ - BFD_RELOC_AARCH64_MOVW_G0_NC, +/* Unsigned 12 bit byte offset for 64 bit load/store from the page of +the GOT entry for this symbol. Used in conjunction with +BFD_RELOC_AARCH64_ADR_GOTPAGE. Valid in LP64 ABI only. */ + BFD_RELOC_AARCH64_LD64_GOT_LO12_NC, -/* AArch64 MOV[NZK] instruction with most significant bits 16 to 31 -of an unsigned address/value. */ - BFD_RELOC_AARCH64_MOVW_G1, +/* Unsigned 12 bit byte offset for 32 bit load/store from the page of +the GOT entry for this symbol. Used in conjunction with +BFD_RELOC_AARCH64_ADR_GOTPAGE. Valid in ILP32 ABI only. */ + BFD_RELOC_AARCH64_LD32_GOT_LO12_NC, -/* AArch64 MOV[NZK] instruction with less significant bits 16 to 31 -of an address/value. No overflow checking. */ - BFD_RELOC_AARCH64_MOVW_G1_NC, +/* Get to the page base of the global offset table entry for a symbols +tls_index structure as part of an adrp instruction using a 21 bit PC +relative value. Used in conjunction with +BFD_RELOC_AARCH64_TLSGD_ADD_LO12_NC. */ + BFD_RELOC_AARCH64_TLSGD_ADR_PAGE21, -/* AArch64 MOV[NZ] instruction with most significant bits 16 to 31 -of a signed value. Changes instruction to MOVZ or MOVN depending on the -value's sign. */ - BFD_RELOC_AARCH64_MOVW_G1_S, +/* Unsigned 12 bit byte offset to global offset table entry for a symbols +tls_index structure. Used in conjunction with +BFD_RELOC_AARCH64_TLSGD_ADR_PAGE21. */ + BFD_RELOC_AARCH64_TLSGD_ADD_LO12_NC, -/* AArch64 MOV[NZK] instruction with most significant bits 32 to 47 -of an unsigned address/value. */ - BFD_RELOC_AARCH64_MOVW_G2, +/* AArch64 TLS INITIAL EXEC relocation. */ + BFD_RELOC_AARCH64_TLSIE_MOVW_GOTTPREL_G1, -/* AArch64 MOV[NZK] instruction with less significant bits 32 to 47 -of an address/value. No overflow checking. */ - BFD_RELOC_AARCH64_MOVW_G2_NC, +/* AArch64 TLS INITIAL EXEC relocation. */ + BFD_RELOC_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC, -/* AArch64 MOV[NZ] instruction with most significant bits 32 to 47 -of a signed value. Changes instruction to MOVZ or MOVN depending on the -value's sign. */ - BFD_RELOC_AARCH64_MOVW_G2_S, +/* AArch64 TLS INITIAL EXEC relocation. */ + BFD_RELOC_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21, -/* AArch64 MOV[NZK] instruction with most signficant bits 48 to 64 -of a signed or unsigned address/value. */ - BFD_RELOC_AARCH64_MOVW_G3, +/* AArch64 TLS INITIAL EXEC relocation. */ + BFD_RELOC_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC, -/* AArch64 TLS relocation. */ - BFD_RELOC_AARCH64_TLSDESC, +/* AArch64 TLS INITIAL EXEC relocation. */ + BFD_RELOC_AARCH64_TLSIE_LD32_GOTTPREL_LO12_NC, -/* AArch64 TLS DESC relocation. */ - BFD_RELOC_AARCH64_TLSDESC_ADD, +/* AArch64 TLS INITIAL EXEC relocation. */ + BFD_RELOC_AARCH64_TLSIE_LD_GOTTPREL_PREL19, -/* AArch64 TLS DESC relocation. */ - BFD_RELOC_AARCH64_TLSDESC_ADD_LO12_NC, +/* AArch64 TLS LOCAL EXEC relocation. */ + BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G2, + +/* AArch64 TLS LOCAL EXEC relocation. */ + BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1, + +/* AArch64 TLS LOCAL EXEC relocation. */ + BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1_NC, + +/* AArch64 TLS LOCAL EXEC relocation. */ + BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0, + +/* AArch64 TLS LOCAL EXEC relocation. */ + BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0_NC, + +/* AArch64 TLS LOCAL EXEC relocation. */ + BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_HI12, + +/* AArch64 TLS LOCAL EXEC relocation. */ + BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12, + +/* AArch64 TLS LOCAL EXEC relocation. */ + BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12_NC, /* AArch64 TLS DESC relocation. */ - BFD_RELOC_AARCH64_TLSDESC_ADR_PAGE21, + BFD_RELOC_AARCH64_TLSDESC_LD_PREL19, /* AArch64 TLS DESC relocation. */ BFD_RELOC_AARCH64_TLSDESC_ADR_PREL21, /* AArch64 TLS DESC relocation. */ - BFD_RELOC_AARCH64_TLSDESC_CALL, + BFD_RELOC_AARCH64_TLSDESC_ADR_PAGE21, /* AArch64 TLS DESC relocation. */ BFD_RELOC_AARCH64_TLSDESC_LD64_LO12_NC, /* AArch64 TLS DESC relocation. */ - BFD_RELOC_AARCH64_TLSDESC_LD_PREL19, - -/* AArch64 TLS DESC relocation. */ - BFD_RELOC_AARCH64_TLSDESC_LDR, + BFD_RELOC_AARCH64_TLSDESC_LD32_LO12_NC, /* AArch64 TLS DESC relocation. */ - BFD_RELOC_AARCH64_TLSDESC_OFF_G0_NC, + BFD_RELOC_AARCH64_TLSDESC_ADD_LO12_NC, /* AArch64 TLS DESC relocation. */ BFD_RELOC_AARCH64_TLSDESC_OFF_G1, -/* Unsigned 12 bit byte offset to global offset table entry for a symbols -tls_index structure. Used in conjunction with -BFD_RELOC_AARCH64_TLSGD_ADR_PAGE21. */ - BFD_RELOC_AARCH64_TLSGD_ADD_LO12_NC, +/* AArch64 TLS DESC relocation. */ + BFD_RELOC_AARCH64_TLSDESC_OFF_G0_NC, -/* Get to the page base of the global offset table entry for a symbols -tls_index structure as part of an adrp instruction using a 21 bit PC -relative value. Used in conjunction with -BFD_RELOC_AARCH64_TLSGD_ADD_LO12_NC. */ - BFD_RELOC_AARCH64_TLSGD_ADR_PAGE21, +/* AArch64 TLS DESC relocation. */ + BFD_RELOC_AARCH64_TLSDESC_LDR, -/* AArch64 TLS INITIAL EXEC relocation. */ - BFD_RELOC_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21, +/* AArch64 TLS DESC relocation. */ + BFD_RELOC_AARCH64_TLSDESC_ADD, -/* AArch64 TLS INITIAL EXEC relocation. */ - BFD_RELOC_AARCH64_TLSIE_LD_GOTTPREL_PREL19, +/* AArch64 TLS DESC relocation. */ + BFD_RELOC_AARCH64_TLSDESC_CALL, -/* AArch64 TLS INITIAL EXEC relocation. */ - BFD_RELOC_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC, +/* AArch64 TLS relocation. */ + BFD_RELOC_AARCH64_COPY, -/* AArch64 TLS INITIAL EXEC relocation. */ - BFD_RELOC_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC, +/* AArch64 TLS relocation. */ + BFD_RELOC_AARCH64_GLOB_DAT, -/* AArch64 TLS INITIAL EXEC relocation. */ - BFD_RELOC_AARCH64_TLSIE_MOVW_GOTTPREL_G1, +/* AArch64 TLS relocation. */ + BFD_RELOC_AARCH64_JUMP_SLOT, -/* AArch64 TLS LOCAL EXEC relocation. */ - BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_HI12, +/* AArch64 TLS relocation. */ + BFD_RELOC_AARCH64_RELATIVE, -/* AArch64 TLS LOCAL EXEC relocation. */ - BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12, +/* AArch64 TLS relocation. */ + BFD_RELOC_AARCH64_TLS_DTPMOD, -/* AArch64 TLS LOCAL EXEC relocation. */ - BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12_NC, +/* AArch64 TLS relocation. */ + BFD_RELOC_AARCH64_TLS_DTPREL, -/* AArch64 TLS LOCAL EXEC relocation. */ - BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0, +/* AArch64 TLS relocation. */ + BFD_RELOC_AARCH64_TLS_TPREL, -/* AArch64 TLS LOCAL EXEC relocation. */ - BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0_NC, +/* AArch64 TLS relocation. */ + BFD_RELOC_AARCH64_TLSDESC, -/* AArch64 TLS LOCAL EXEC relocation. */ - BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1, +/* AArch64 support for STT_GNU_IFUNC. */ + BFD_RELOC_AARCH64_IRELATIVE, -/* AArch64 TLS LOCAL EXEC relocation. */ - BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1_NC, +/* AArch64 pseudo relocation code to mark the end of the AArch64 +relocation enumerators that have direct mapping to ELF reloc codes. +There are a few more enumerators after this one; those are mainly +used by the AArch64 assembler for the internal fixup or to select +one of the above enumerators. */ + BFD_RELOC_AARCH64_RELOC_END, -/* AArch64 TLS LOCAL EXEC relocation. */ - BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G2, +/* AArch64 pseudo relocation code to be used internally by the AArch64 +assembler and not (currently) written to any object files. */ + BFD_RELOC_AARCH64_GAS_INTERNAL_FIXUP, -/* AArch64 TLS relocation. */ - BFD_RELOC_AARCH64_TLS_DTPMOD64, +/* AArch64 unspecified load/store instruction, holding bits 0 to 11 of the +address. Used in conjunction with BFD_RELOC_AARCH64_ADR_HI21_PCREL. */ + BFD_RELOC_AARCH64_LDST_LO12, -/* AArch64 TLS relocation. */ - BFD_RELOC_AARCH64_TLS_DTPREL64, +/* AArch64 pseudo relocation code to be used internally by the AArch64 +assembler and not (currently) written to any object files. */ + BFD_RELOC_AARCH64_LD_GOT_LO12_NC, -/* AArch64 TLS relocation. */ - BFD_RELOC_AARCH64_TLS_TPREL64, +/* AArch64 pseudo relocation code to be used internally by the AArch64 +assembler and not (currently) written to any object files. */ + BFD_RELOC_AARCH64_TLSIE_LD_GOTTPREL_LO12_NC, -/* AArch64 14 bit pc-relative test bit and branch. -The lowest two bits must be zero and are not stored in the instruction, -giving a 16 bit signed byte offset. */ - BFD_RELOC_AARCH64_TSTBR14, +/* AArch64 pseudo relocation code to be used internally by the AArch64 +assembler and not (currently) written to any object files. */ + BFD_RELOC_AARCH64_TLSDESC_LD_LO12_NC, /* Tilera TILEPro Relocations. */ BFD_RELOC_TILEPRO_COPY, diff --git a/bfd/elfnn-aarch64.c b/bfd/elfnn-aarch64.c index 60a8558e7e..27b67859cf 100644 --- a/bfd/elfnn-aarch64.c +++ b/bfd/elfnn-aarch64.c @@ -50,7 +50,7 @@ indicate that foo is thread local and should be accessed via the traditional TLS mechanims. - The relocations R_AARCH64_TLSDESC_{ADR_PAGE,LD64_LO12_NC,ADD_LO12_NC} + The relocations R_AARCH64_TLSDESC_{ADR_PAGE21,LD64_LO12_NC,ADD_LO12_NC} against foo indicate that 'foo' is thread local and should be accessed via a TLS descriptor mechanism. @@ -64,12 +64,12 @@ In the traditional TLS mechanism, the double GOT entry is used to provide the tls_index structure, containing module and offset - entries. The static linker places the relocation R_AARCH64_TLS_DTPMOD64 + entries. The static linker places the relocation R_AARCH64_TLS_DTPMOD on the module entry. The loader will subsequently fixup this relocation with the module identity. For global traditional TLS symbols the static linker places an - R_AARCH64_TLS_DTPREL64 relocation on the offset entry. The loader + R_AARCH64_TLS_DTPREL relocation on the offset entry. The loader will subsequently fixup the offset. For local TLS symbols the static linker fixes up offset. @@ -97,7 +97,7 @@ This function is invoked for each relocation. The TLS relocations R_AARCH64_TLSGD_{ADR_PREL21,ADD_LO12_NC} and - R_AARCH64_TLSDESC_{ADR_PAGE,LD64_LO12_NC,ADD_LO12_NC} are + R_AARCH64_TLSDESC_{ADR_PAGE21,LD64_LO12_NC,ADD_LO12_NC} are spotted. One time creation of local symbol data structures are created when the first local symbol is seen. @@ -149,12 +149,16 @@ #if ARCH_SIZE == 64 #define AARCH64_R(NAME) R_AARCH64_ ## NAME #define AARCH64_R_STR(NAME) "R_AARCH64_" #NAME +#define HOWTO64(...) HOWTO (__VA_ARGS__) +#define HOWTO32(...) EMPTY_HOWTO (0) #define LOG_FILE_ALIGN 3 #endif #if ARCH_SIZE == 32 #define AARCH64_R(NAME) R_AARCH64_P32_ ## NAME #define AARCH64_R_STR(NAME) "R_AARCH64_P32_" #NAME +#define HOWTO64(...) EMPTY_HOWTO (0) +#define HOWTO32(...) HOWTO (__VA_ARGS__) #define LOG_FILE_ALIGN 2 #endif @@ -163,39 +167,41 @@ bfd_elf_aarch64_put_addend (bfd *abfd, bfd_byte *address, reloc_howto_type *howto, bfd_signed_vma addend); -#define IS_AARCH64_TLS_RELOC(R_TYPE) \ - ((R_TYPE) == R_AARCH64_TLSGD_ADR_PAGE21 \ - || (R_TYPE) == R_AARCH64_TLSGD_ADD_LO12_NC \ - || (R_TYPE) == R_AARCH64_TLSIE_MOVW_GOTTPREL_G1 \ - || (R_TYPE) == R_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC \ - || (R_TYPE) == R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21 \ - || (R_TYPE) == R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC \ - || (R_TYPE) == R_AARCH64_TLSIE_LD_GOTTPREL_PREL19 \ - || (R_TYPE) == R_AARCH64_TLSLE_ADD_TPREL_LO12 \ - || (R_TYPE) == R_AARCH64_TLSLE_ADD_TPREL_HI12 \ - || (R_TYPE) == R_AARCH64_TLSLE_ADD_TPREL_LO12_NC \ - || (R_TYPE) == R_AARCH64_TLSLE_MOVW_TPREL_G2 \ - || (R_TYPE) == R_AARCH64_TLSLE_MOVW_TPREL_G1 \ - || (R_TYPE) == R_AARCH64_TLSLE_MOVW_TPREL_G1_NC \ - || (R_TYPE) == R_AARCH64_TLSLE_MOVW_TPREL_G0 \ - || (R_TYPE) == R_AARCH64_TLSLE_MOVW_TPREL_G0_NC \ - || (R_TYPE) == R_AARCH64_TLS_DTPMOD64 \ - || (R_TYPE) == R_AARCH64_TLS_DTPREL64 \ - || (R_TYPE) == R_AARCH64_TLS_TPREL64 \ +#define IS_AARCH64_TLS_RELOC(R_TYPE) \ + ((R_TYPE) == BFD_RELOC_AARCH64_TLSGD_ADR_PAGE21 \ + || (R_TYPE) == BFD_RELOC_AARCH64_TLSGD_ADD_LO12_NC \ + || (R_TYPE) == BFD_RELOC_AARCH64_TLSIE_MOVW_GOTTPREL_G1 \ + || (R_TYPE) == BFD_RELOC_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC \ + || (R_TYPE) == BFD_RELOC_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21 \ + || (R_TYPE) == BFD_RELOC_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC \ + || (R_TYPE) == BFD_RELOC_AARCH64_TLSIE_LD32_GOTTPREL_LO12_NC \ + || (R_TYPE) == BFD_RELOC_AARCH64_TLSIE_LD_GOTTPREL_PREL19 \ + || (R_TYPE) == BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12 \ + || (R_TYPE) == BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_HI12 \ + || (R_TYPE) == BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12_NC \ + || (R_TYPE) == BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G2 \ + || (R_TYPE) == BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1 \ + || (R_TYPE) == BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1_NC \ + || (R_TYPE) == BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0 \ + || (R_TYPE) == BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0_NC \ + || (R_TYPE) == BFD_RELOC_AARCH64_TLS_DTPMOD \ + || (R_TYPE) == BFD_RELOC_AARCH64_TLS_DTPREL \ + || (R_TYPE) == BFD_RELOC_AARCH64_TLS_TPREL \ || IS_AARCH64_TLSDESC_RELOC ((R_TYPE))) -#define IS_AARCH64_TLSDESC_RELOC(R_TYPE) \ - ((R_TYPE) == R_AARCH64_TLSDESC_LD_PREL19 \ - || (R_TYPE) == R_AARCH64_TLSDESC_ADR_PREL21 \ - || (R_TYPE) == R_AARCH64_TLSDESC_ADR_PAGE21 \ - || (R_TYPE) == R_AARCH64_TLSDESC_ADD_LO12_NC \ - || (R_TYPE) == R_AARCH64_TLSDESC_LD64_LO12_NC \ - || (R_TYPE) == R_AARCH64_TLSDESC_OFF_G1 \ - || (R_TYPE) == R_AARCH64_TLSDESC_OFF_G0_NC \ - || (R_TYPE) == R_AARCH64_TLSDESC_LDR \ - || (R_TYPE) == R_AARCH64_TLSDESC_ADD \ - || (R_TYPE) == R_AARCH64_TLSDESC_CALL \ - || (R_TYPE) == R_AARCH64_TLSDESC) +#define IS_AARCH64_TLSDESC_RELOC(R_TYPE) \ + ((R_TYPE) == BFD_RELOC_AARCH64_TLSDESC_LD_PREL19 \ + || (R_TYPE) == BFD_RELOC_AARCH64_TLSDESC_ADR_PREL21 \ + || (R_TYPE) == BFD_RELOC_AARCH64_TLSDESC_ADR_PAGE21 \ + || (R_TYPE) == BFD_RELOC_AARCH64_TLSDESC_ADD_LO12_NC \ + || (R_TYPE) == BFD_RELOC_AARCH64_TLSDESC_LD64_LO12_NC \ + || (R_TYPE) == BFD_RELOC_AARCH64_TLSDESC_LD32_LO12_NC \ + || (R_TYPE) == BFD_RELOC_AARCH64_TLSDESC_OFF_G1 \ + || (R_TYPE) == BFD_RELOC_AARCH64_TLSDESC_OFF_G0_NC \ + || (R_TYPE) == BFD_RELOC_AARCH64_TLSDESC_LDR \ + || (R_TYPE) == BFD_RELOC_AARCH64_TLSDESC_ADD \ + || (R_TYPE) == BFD_RELOC_AARCH64_TLSDESC_CALL \ + || (R_TYPE) == BFD_RELOC_AARCH64_TLSDESC) #define ELIMINATE_COPY_RELOCS 0 @@ -210,8 +216,8 @@ bfd_elf_aarch64_put_addend (bfd *abfd, #define PLT_TLSDESC_ENTRY_SIZE (32) /* Take the PAGE component of an address or offset. */ -#define PG(x) ((x) & ~ 0xfff) -#define PG_OFFSET(x) ((x) & 0xfff) +#define PG(x) ((x) & ~ (bfd_vma) 0xfff) +#define PG_OFFSET(x) ((x) & (bfd_vma) 0xfff) /* Encoding of the nop instruction */ #define INSN_NOP 0xd503201f @@ -269,146 +275,32 @@ elfNN_aarch64_tlsdesc_small_plt_entry[PLT_TLSDESC_ENTRY_SIZE] = /* In case we're on a 32-bit machine, construct a 64-bit "-1" value. */ #define ALL_ONES (~ (bfd_vma) 0) -static reloc_howto_type elf64_aarch64_howto_none = - HOWTO (R_AARCH64_NONE, /* type */ - 0, /* rightshift */ - 0, /* size (0 = byte, 1 = short, 2 = long) */ - 0, /* bitsize */ - FALSE, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont,/* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_AARCH64_NONE", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0, /* dst_mask */ - FALSE); /* pcrel_offset */ +/* Indexed by the bfd interal reloc enumerators. + Therefore, the table needs to be synced with BFD_RELOC_AARCH64_* + in reloc.c. */ -static reloc_howto_type elf64_aarch64_howto_dynrelocs[] = +static reloc_howto_type elfNN_aarch64_howto_table[] = { - HOWTO (R_AARCH64_COPY, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 64, /* bitsize */ - FALSE, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_AARCH64_COPY", /* name */ - TRUE, /* partial_inplace */ - 0xffffffff, /* src_mask */ - 0xffffffff, /* dst_mask */ - FALSE), /* pcrel_offset */ - - HOWTO (R_AARCH64_GLOB_DAT, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 64, /* bitsize */ - FALSE, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_AARCH64_GLOB_DAT", /* name */ - TRUE, /* partial_inplace */ - 0xffffffff, /* src_mask */ - 0xffffffff, /* dst_mask */ - FALSE), /* pcrel_offset */ - - HOWTO (R_AARCH64_JUMP_SLOT, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 64, /* bitsize */ - FALSE, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_AARCH64_JUMP_SLOT", /* name */ - TRUE, /* partial_inplace */ - 0xffffffff, /* src_mask */ - 0xffffffff, /* dst_mask */ - FALSE), /* pcrel_offset */ - - HOWTO (R_AARCH64_RELATIVE, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 64, /* bitsize */ - FALSE, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_AARCH64_RELATIVE", /* name */ - TRUE, /* partial_inplace */ - ALL_ONES, /* src_mask */ - ALL_ONES, /* dst_mask */ - FALSE), /* pcrel_offset */ + EMPTY_HOWTO (0), - HOWTO (R_AARCH64_TLS_DTPMOD64, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 64, /* bitsize */ - FALSE, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_AARCH64_TLS_DTPMOD64", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - ALL_ONES, /* dst_mask */ - FALSE), /* pc_reloffset */ - - HOWTO (R_AARCH64_TLS_DTPREL64, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 64, /* bitsize */ - FALSE, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_AARCH64_TLS_DTPREL64", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - ALL_ONES, /* dst_mask */ - FALSE), /* pcrel_offset */ - - HOWTO (R_AARCH64_TLS_TPREL64, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 64, /* bitsize */ - FALSE, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_AARCH64_TLS_TPREL64", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - ALL_ONES, /* dst_mask */ - FALSE), /* pcrel_offset */ + /* Basic data relocations. */ - HOWTO (R_AARCH64_TLSDESC, /* type */ +#if ARCH_SIZE == 64 + HOWTO (R_AARCH64_NULL, /* type */ 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 64, /* bitsize */ + 0, /* size (0 = byte, 1 = short, 2 = long) */ + 0, /* bitsize */ FALSE, /* pc_relative */ 0, /* bitpos */ complain_overflow_dont, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ - "R_AARCH64_TLSDESC", /* name */ + "R_AARCH64_NULL", /* name */ FALSE, /* partial_inplace */ 0, /* src_mask */ - ALL_ONES, /* dst_mask */ + 0, /* dst_mask */ FALSE), /* pcrel_offset */ - -}; - -/* Note: code such as elf64_aarch64_reloc_type_lookup expect to use e.g. - R_AARCH64_PREL64 as an index into this, and find the R_AARCH64_PREL64 HOWTO - in that slot. */ - -static reloc_howto_type elf64_aarch64_howto_table[] = -{ - /* Basic data relocations. */ - - HOWTO (R_AARCH64_NULL, /* type */ +#else + HOWTO (R_AARCH64_NONE, /* type */ 0, /* rightshift */ 0, /* size (0 = byte, 1 = short, 2 = long) */ 0, /* bitsize */ @@ -416,14 +308,15 @@ static reloc_howto_type elf64_aarch64_howto_table[] = 0, /* bitpos */ complain_overflow_dont, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ - "R_AARCH64_NULL", /* name */ + "R_AARCH64_NONE", /* name */ FALSE, /* partial_inplace */ 0, /* src_mask */ 0, /* dst_mask */ FALSE), /* pcrel_offset */ +#endif /* .xword: (S+A) */ - HOWTO (R_AARCH64_ABS64, /* type */ + HOWTO64 (AARCH64_R (ABS64), /* type */ 0, /* rightshift */ 4, /* size (4 = long long) */ 64, /* bitsize */ @@ -431,14 +324,14 @@ static reloc_howto_type elf64_aarch64_howto_table[] = 0, /* bitpos */ complain_overflow_unsigned, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ - "R_AARCH64_ABS64", /* name */ + AARCH64_R_STR (ABS64), /* name */ FALSE, /* partial_inplace */ ALL_ONES, /* src_mask */ ALL_ONES, /* dst_mask */ FALSE), /* pcrel_offset */ /* .word: (S+A) */ - HOWTO (R_AARCH64_ABS32, /* type */ + HOWTO (AARCH64_R (ABS32), /* type */ 0, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 32, /* bitsize */ @@ -446,14 +339,14 @@ static reloc_howto_type elf64_aarch64_howto_table[] = 0, /* bitpos */ complain_overflow_unsigned, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ - "R_AARCH64_ABS32", /* name */ + AARCH64_R_STR (ABS32), /* name */ FALSE, /* partial_inplace */ 0xffffffff, /* src_mask */ 0xffffffff, /* dst_mask */ FALSE), /* pcrel_offset */ /* .half: (S+A) */ - HOWTO (R_AARCH64_ABS16, /* type */ + HOWTO (AARCH64_R (ABS16), /* type */ 0, /* rightshift */ 1, /* size (0 = byte, 1 = short, 2 = long) */ 16, /* bitsize */ @@ -461,14 +354,14 @@ static reloc_howto_type elf64_aarch64_howto_table[] = 0, /* bitpos */ complain_overflow_unsigned, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ - "R_AARCH64_ABS16", /* name */ + AARCH64_R_STR (ABS16), /* name */ FALSE, /* partial_inplace */ 0xffff, /* src_mask */ 0xffff, /* dst_mask */ FALSE), /* pcrel_offset */ /* .xword: (S+A-P) */ - HOWTO (R_AARCH64_PREL64, /* type */ + HOWTO64 (AARCH64_R (PREL64), /* type */ 0, /* rightshift */ 4, /* size (4 = long long) */ 64, /* bitsize */ @@ -476,14 +369,14 @@ static reloc_howto_type elf64_aarch64_howto_table[] = 0, /* bitpos */ complain_overflow_signed, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ - "R_AARCH64_PREL64", /* name */ + AARCH64_R_STR (PREL64), /* name */ FALSE, /* partial_inplace */ ALL_ONES, /* src_mask */ ALL_ONES, /* dst_mask */ TRUE), /* pcrel_offset */ /* .word: (S+A-P) */ - HOWTO (R_AARCH64_PREL32, /* type */ + HOWTO (AARCH64_R (PREL32), /* type */ 0, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 32, /* bitsize */ @@ -491,14 +384,14 @@ static reloc_howto_type elf64_aarch64_howto_table[] = 0, /* bitpos */ complain_overflow_signed, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ - "R_AARCH64_PREL32", /* name */ + AARCH64_R_STR (PREL32), /* name */ FALSE, /* partial_inplace */ 0xffffffff, /* src_mask */ 0xffffffff, /* dst_mask */ TRUE), /* pcrel_offset */ /* .half: (S+A-P) */ - HOWTO (R_AARCH64_PREL16, /* type */ + HOWTO (AARCH64_R (PREL16), /* type */ 0, /* rightshift */ 1, /* size (0 = byte, 1 = short, 2 = long) */ 16, /* bitsize */ @@ -506,7 +399,7 @@ static reloc_howto_type elf64_aarch64_howto_table[] = 0, /* bitpos */ complain_overflow_signed, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ - "R_AARCH64_PREL16", /* name */ + AARCH64_R_STR (PREL16), /* name */ FALSE, /* partial_inplace */ 0xffff, /* src_mask */ 0xffff, /* dst_mask */ @@ -516,7 +409,7 @@ static reloc_howto_type elf64_aarch64_howto_table[] = unsigned data or abs address inline. */ /* MOVZ: ((S+A) >> 0) & 0xffff */ - HOWTO (R_AARCH64_MOVW_UABS_G0, /* type */ + HOWTO (AARCH64_R (MOVW_UABS_G0), /* type */ 0, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 16, /* bitsize */ @@ -524,14 +417,14 @@ static reloc_howto_type elf64_aarch64_howto_table[] = 0, /* bitpos */ complain_overflow_unsigned, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ - "R_AARCH64_MOVW_UABS_G0", /* name */ + AARCH64_R_STR (MOVW_UABS_G0), /* name */ FALSE, /* partial_inplace */ 0xffff, /* src_mask */ 0xffff, /* dst_mask */ FALSE), /* pcrel_offset */ /* MOVK: ((S+A) >> 0) & 0xffff [no overflow check] */ - HOWTO (R_AARCH64_MOVW_UABS_G0_NC, /* type */ + HOWTO (AARCH64_R (MOVW_UABS_G0_NC), /* type */ 0, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 16, /* bitsize */ @@ -539,14 +432,14 @@ static reloc_howto_type elf64_aarch64_howto_table[] = 0, /* bitpos */ complain_overflow_dont, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ - "R_AARCH64_MOVW_UABS_G0_NC", /* name */ + AARCH64_R_STR (MOVW_UABS_G0_NC), /* name */ FALSE, /* partial_inplace */ 0xffff, /* src_mask */ 0xffff, /* dst_mask */ FALSE), /* pcrel_offset */ /* MOVZ: ((S+A) >> 16) & 0xffff */ - HOWTO (R_AARCH64_MOVW_UABS_G1, /* type */ + HOWTO (AARCH64_R (MOVW_UABS_G1), /* type */ 16, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 16, /* bitsize */ @@ -554,14 +447,14 @@ static reloc_howto_type elf64_aarch64_howto_table[] = 0, /* bitpos */ complain_overflow_unsigned, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ - "R_AARCH64_MOVW_UABS_G1", /* name */ + AARCH64_R_STR (MOVW_UABS_G1), /* name */ FALSE, /* partial_inplace */ 0xffff, /* src_mask */ 0xffff, /* dst_mask */ FALSE), /* pcrel_offset */ /* MOVK: ((S+A) >> 16) & 0xffff [no overflow check] */ - HOWTO (R_AARCH64_MOVW_UABS_G1_NC, /* type */ + HOWTO64 (AARCH64_R (MOVW_UABS_G1_NC), /* type */ 16, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 16, /* bitsize */ @@ -569,14 +462,14 @@ static reloc_howto_type elf64_aarch64_howto_table[] = 0, /* bitpos */ complain_overflow_dont, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ - "R_AARCH64_MOVW_UABS_G1_NC", /* name */ + AARCH64_R_STR (MOVW_UABS_G1_NC), /* name */ FALSE, /* partial_inplace */ 0xffff, /* src_mask */ 0xffff, /* dst_mask */ FALSE), /* pcrel_offset */ /* MOVZ: ((S+A) >> 32) & 0xffff */ - HOWTO (R_AARCH64_MOVW_UABS_G2, /* type */ + HOWTO64 (AARCH64_R (MOVW_UABS_G2), /* type */ 32, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 16, /* bitsize */ @@ -584,14 +477,14 @@ static reloc_howto_type elf64_aarch64_howto_table[] = 0, /* bitpos */ complain_overflow_unsigned, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ - "R_AARCH64_MOVW_UABS_G2", /* name */ + AARCH64_R_STR (MOVW_UABS_G2), /* name */ FALSE, /* partial_inplace */ 0xffff, /* src_mask */ 0xffff, /* dst_mask */ FALSE), /* pcrel_offset */ /* MOVK: ((S+A) >> 32) & 0xffff [no overflow check] */ - HOWTO (R_AARCH64_MOVW_UABS_G2_NC, /* type */ + HOWTO64 (AARCH64_R (MOVW_UABS_G2_NC), /* type */ 32, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 16, /* bitsize */ @@ -599,14 +492,14 @@ static reloc_howto_type elf64_aarch64_howto_table[] = 0, /* bitpos */ complain_overflow_dont, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ - "R_AARCH64_MOVW_UABS_G2_NC", /* name */ + AARCH64_R_STR (MOVW_UABS_G2_NC), /* name */ FALSE, /* partial_inplace */ 0xffff, /* src_mask */ 0xffff, /* dst_mask */ FALSE), /* pcrel_offset */ /* MOVZ: ((S+A) >> 48) & 0xffff */ - HOWTO (R_AARCH64_MOVW_UABS_G3, /* type */ + HOWTO64 (AARCH64_R (MOVW_UABS_G3), /* type */ 48, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 16, /* bitsize */ @@ -614,7 +507,7 @@ static reloc_howto_type elf64_aarch64_howto_table[] = 0, /* bitpos */ complain_overflow_unsigned, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ - "R_AARCH64_MOVW_UABS_G3", /* name */ + AARCH64_R_STR (MOVW_UABS_G3), /* name */ FALSE, /* partial_inplace */ 0xffff, /* src_mask */ 0xffff, /* dst_mask */ @@ -625,7 +518,7 @@ static reloc_howto_type elf64_aarch64_howto_table[] = to MOVN or MOVZ depending on sign of calculated value. */ /* MOV[ZN]: ((S+A) >> 0) & 0xffff */ - HOWTO (R_AARCH64_MOVW_SABS_G0, /* type */ + HOWTO (AARCH64_R (MOVW_SABS_G0), /* type */ 0, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 16, /* bitsize */ @@ -633,14 +526,14 @@ static reloc_howto_type elf64_aarch64_howto_table[] = 0, /* bitpos */ complain_overflow_signed, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ - "R_AARCH64_MOVW_SABS_G0", /* name */ + AARCH64_R_STR (MOVW_SABS_G0), /* name */ FALSE, /* partial_inplace */ 0xffff, /* src_mask */ 0xffff, /* dst_mask */ FALSE), /* pcrel_offset */ /* MOV[ZN]: ((S+A) >> 16) & 0xffff */ - HOWTO (R_AARCH64_MOVW_SABS_G1, /* type */ + HOWTO64 (AARCH64_R (MOVW_SABS_G1), /* type */ 16, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 16, /* bitsize */ @@ -648,14 +541,14 @@ static reloc_howto_type elf64_aarch64_howto_table[] = 0, /* bitpos */ complain_overflow_signed, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ - "R_AARCH64_MOVW_SABS_G1", /* name */ + AARCH64_R_STR (MOVW_SABS_G1), /* name */ FALSE, /* partial_inplace */ 0xffff, /* src_mask */ 0xffff, /* dst_mask */ FALSE), /* pcrel_offset */ /* MOV[ZN]: ((S+A) >> 32) & 0xffff */ - HOWTO (R_AARCH64_MOVW_SABS_G2, /* type */ + HOWTO64 (AARCH64_R (MOVW_SABS_G2), /* type */ 32, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 16, /* bitsize */ @@ -663,7 +556,7 @@ static reloc_howto_type elf64_aarch64_howto_table[] = 0, /* bitpos */ complain_overflow_signed, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ - "R_AARCH64_MOVW_SABS_G2", /* name */ + AARCH64_R_STR (MOVW_SABS_G2), /* name */ FALSE, /* partial_inplace */ 0xffff, /* src_mask */ 0xffff, /* dst_mask */ @@ -673,7 +566,7 @@ static reloc_howto_type elf64_aarch64_howto_table[] = addresses: PG(x) is (x & ~0xfff). */ /* LD-lit: ((S+A-P) >> 2) & 0x7ffff */ - HOWTO (R_AARCH64_LD_PREL_LO19, /* type */ + HOWTO (AARCH64_R (LD_PREL_LO19), /* type */ 2, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 19, /* bitsize */ @@ -681,14 +574,14 @@ static reloc_howto_type elf64_aarch64_howto_table[] = 0, /* bitpos */ complain_overflow_signed, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ - "R_AARCH64_LD_PREL_LO19", /* name */ + AARCH64_R_STR (LD_PREL_LO19), /* name */ FALSE, /* partial_inplace */ 0x7ffff, /* src_mask */ 0x7ffff, /* dst_mask */ TRUE), /* pcrel_offset */ /* ADR: (S+A-P) & 0x1fffff */ - HOWTO (R_AARCH64_ADR_PREL_LO21, /* type */ + HOWTO (AARCH64_R (ADR_PREL_LO21), /* type */ 0, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 21, /* bitsize */ @@ -696,14 +589,14 @@ static reloc_howto_type elf64_aarch64_howto_table[] = 0, /* bitpos */ complain_overflow_signed, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ - "R_AARCH64_ADR_PREL_LO21", /* name */ + AARCH64_R_STR (ADR_PREL_LO21), /* name */ FALSE, /* partial_inplace */ 0x1fffff, /* src_mask */ 0x1fffff, /* dst_mask */ TRUE), /* pcrel_offset */ /* ADRP: ((PG(S+A)-PG(P)) >> 12) & 0x1fffff */ - HOWTO (R_AARCH64_ADR_PREL_PG_HI21, /* type */ + HOWTO (AARCH64_R (ADR_PREL_PG_HI21), /* type */ 12, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 21, /* bitsize */ @@ -711,14 +604,14 @@ static reloc_howto_type elf64_aarch64_howto_table[] = 0, /* bitpos */ complain_overflow_signed, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ - "R_AARCH64_ADR_PREL_PG_HI21", /* name */ + AARCH64_R_STR (ADR_PREL_PG_HI21), /* name */ FALSE, /* partial_inplace */ 0x1fffff, /* src_mask */ 0x1fffff, /* dst_mask */ TRUE), /* pcrel_offset */ /* ADRP: ((PG(S+A)-PG(P)) >> 12) & 0x1fffff [no overflow check] */ - HOWTO (R_AARCH64_ADR_PREL_PG_HI21_NC, /* type */ + HOWTO64 (AARCH64_R (ADR_PREL_PG_HI21_NC), /* type */ 12, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 21, /* bitsize */ @@ -726,14 +619,14 @@ static reloc_howto_type elf64_aarch64_howto_table[] = 0, /* bitpos */ complain_overflow_dont, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ - "R_AARCH64_ADR_PREL_PG_HI21_NC", /* name */ + AARCH64_R_STR (ADR_PREL_PG_HI21_NC), /* name */ FALSE, /* partial_inplace */ 0x1fffff, /* src_mask */ 0x1fffff, /* dst_mask */ TRUE), /* pcrel_offset */ /* ADD: (S+A) & 0xfff [no overflow check] */ - HOWTO (R_AARCH64_ADD_ABS_LO12_NC, /* type */ + HOWTO (AARCH64_R (ADD_ABS_LO12_NC), /* type */ 0, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 12, /* bitsize */ @@ -741,14 +634,14 @@ static reloc_howto_type elf64_aarch64_howto_table[] = 10, /* bitpos */ complain_overflow_dont, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ - "R_AARCH64_ADD_ABS_LO12_NC", /* name */ + AARCH64_R_STR (ADD_ABS_LO12_NC), /* name */ FALSE, /* partial_inplace */ 0x3ffc00, /* src_mask */ 0x3ffc00, /* dst_mask */ FALSE), /* pcrel_offset */ /* LD/ST8: (S+A) & 0xfff */ - HOWTO (R_AARCH64_LDST8_ABS_LO12_NC, /* type */ + HOWTO (AARCH64_R (LDST8_ABS_LO12_NC), /* type */ 0, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 12, /* bitsize */ @@ -756,7 +649,7 @@ static reloc_howto_type elf64_aarch64_howto_table[] = 0, /* bitpos */ complain_overflow_dont, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ - "R_AARCH64_LDST8_ABS_LO12_NC", /* name */ + AARCH64_R_STR (LDST8_ABS_LO12_NC), /* name */ FALSE, /* partial_inplace */ 0xfff, /* src_mask */ 0xfff, /* dst_mask */ @@ -765,7 +658,7 @@ static reloc_howto_type elf64_aarch64_howto_table[] = /* Relocations for control-flow instructions. */ /* TBZ/NZ: ((S+A-P) >> 2) & 0x3fff */ - HOWTO (R_AARCH64_TSTBR14, /* type */ + HOWTO (AARCH64_R (TSTBR14), /* type */ 2, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 14, /* bitsize */ @@ -773,14 +666,14 @@ static reloc_howto_type elf64_aarch64_howto_table[] = 0, /* bitpos */ complain_overflow_signed, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ - "R_AARCH64_TSTBR14", /* name */ + AARCH64_R_STR (TSTBR14), /* name */ FALSE, /* partial_inplace */ 0x3fff, /* src_mask */ 0x3fff, /* dst_mask */ TRUE), /* pcrel_offset */ /* B.cond: ((S+A-P) >> 2) & 0x7ffff */ - HOWTO (R_AARCH64_CONDBR19, /* type */ + HOWTO (AARCH64_R (CONDBR19), /* type */ 2, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 19, /* bitsize */ @@ -788,16 +681,14 @@ static reloc_howto_type elf64_aarch64_howto_table[] = 0, /* bitpos */ complain_overflow_signed, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ - "R_AARCH64_CONDBR19", /* name */ + AARCH64_R_STR (CONDBR19), /* name */ FALSE, /* partial_inplace */ 0x7ffff, /* src_mask */ 0x7ffff, /* dst_mask */ TRUE), /* pcrel_offset */ - EMPTY_HOWTO (281), - /* B: ((S+A-P) >> 2) & 0x3ffffff */ - HOWTO (R_AARCH64_JUMP26, /* type */ + HOWTO (AARCH64_R (JUMP26), /* type */ 2, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 26, /* bitsize */ @@ -805,14 +696,14 @@ static reloc_howto_type elf64_aarch64_howto_table[] = 0, /* bitpos */ complain_overflow_signed, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ - "R_AARCH64_JUMP26", /* name */ + AARCH64_R_STR (JUMP26), /* name */ FALSE, /* partial_inplace */ 0x3ffffff, /* src_mask */ 0x3ffffff, /* dst_mask */ TRUE), /* pcrel_offset */ /* BL: ((S+A-P) >> 2) & 0x3ffffff */ - HOWTO (R_AARCH64_CALL26, /* type */ + HOWTO (AARCH64_R (CALL26), /* type */ 2, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 26, /* bitsize */ @@ -820,14 +711,14 @@ static reloc_howto_type elf64_aarch64_howto_table[] = 0, /* bitpos */ complain_overflow_signed, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ - "R_AARCH64_CALL26", /* name */ + AARCH64_R_STR (CALL26), /* name */ FALSE, /* partial_inplace */ 0x3ffffff, /* src_mask */ 0x3ffffff, /* dst_mask */ TRUE), /* pcrel_offset */ /* LD/ST16: (S+A) & 0xffe */ - HOWTO (R_AARCH64_LDST16_ABS_LO12_NC, /* type */ + HOWTO (AARCH64_R (LDST16_ABS_LO12_NC), /* type */ 1, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 12, /* bitsize */ @@ -835,14 +726,14 @@ static reloc_howto_type elf64_aarch64_howto_table[] = 0, /* bitpos */ complain_overflow_dont, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ - "R_AARCH64_LDST16_ABS_LO12_NC", /* name */ + AARCH64_R_STR (LDST16_ABS_LO12_NC), /* name */ FALSE, /* partial_inplace */ 0xffe, /* src_mask */ 0xffe, /* dst_mask */ FALSE), /* pcrel_offset */ /* LD/ST32: (S+A) & 0xffc */ - HOWTO (R_AARCH64_LDST32_ABS_LO12_NC, /* type */ + HOWTO (AARCH64_R (LDST32_ABS_LO12_NC), /* type */ 2, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 12, /* bitsize */ @@ -850,14 +741,14 @@ static reloc_howto_type elf64_aarch64_howto_table[] = 0, /* bitpos */ complain_overflow_dont, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ - "R_AARCH64_LDST32_ABS_LO12_NC", /* name */ + AARCH64_R_STR (LDST32_ABS_LO12_NC), /* name */ FALSE, /* partial_inplace */ 0xffc, /* src_mask */ 0xffc, /* dst_mask */ FALSE), /* pcrel_offset */ /* LD/ST64: (S+A) & 0xff8 */ - HOWTO (R_AARCH64_LDST64_ABS_LO12_NC, /* type */ + HOWTO (AARCH64_R (LDST64_ABS_LO12_NC), /* type */ 3, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 12, /* bitsize */ @@ -865,27 +756,14 @@ static reloc_howto_type elf64_aarch64_howto_table[] = 0, /* bitpos */ complain_overflow_dont, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ - "R_AARCH64_LDST64_ABS_LO12_NC", /* name */ + AARCH64_R_STR (LDST64_ABS_LO12_NC), /* name */ FALSE, /* partial_inplace */ 0xff8, /* src_mask */ 0xff8, /* dst_mask */ FALSE), /* pcrel_offset */ - EMPTY_HOWTO (287), - EMPTY_HOWTO (288), - EMPTY_HOWTO (289), - EMPTY_HOWTO (290), - EMPTY_HOWTO (291), - EMPTY_HOWTO (292), - EMPTY_HOWTO (293), - EMPTY_HOWTO (294), - EMPTY_HOWTO (295), - EMPTY_HOWTO (296), - EMPTY_HOWTO (297), - EMPTY_HOWTO (298), - /* LD/ST128: (S+A) & 0xff0 */ - HOWTO (R_AARCH64_LDST128_ABS_LO12_NC, /* type */ + HOWTO (AARCH64_R (LDST128_ABS_LO12_NC), /* type */ 4, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 12, /* bitsize */ @@ -893,25 +771,15 @@ static reloc_howto_type elf64_aarch64_howto_table[] = 0, /* bitpos */ complain_overflow_dont, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ - "R_AARCH64_LDST128_ABS_LO12_NC", /* name */ + AARCH64_R_STR (LDST128_ABS_LO12_NC), /* name */ FALSE, /* partial_inplace */ 0xff0, /* src_mask */ 0xff0, /* dst_mask */ FALSE), /* pcrel_offset */ - EMPTY_HOWTO (300), - EMPTY_HOWTO (301), - EMPTY_HOWTO (302), - EMPTY_HOWTO (303), - EMPTY_HOWTO (304), - EMPTY_HOWTO (305), - EMPTY_HOWTO (306), - EMPTY_HOWTO (307), - EMPTY_HOWTO (308), - /* Set a load-literal immediate field to bits 0x1FFFFC of G(S)-P */ - HOWTO (R_AARCH64_GOT_LD_PREL19, /* type */ + HOWTO (AARCH64_R (GOT_LD_PREL19), /* type */ 2, /* rightshift */ 2, /* size (0 = byte,1 = short,2 = long) */ 19, /* bitsize */ @@ -919,17 +787,15 @@ static reloc_howto_type elf64_aarch64_howto_table[] = 0, /* bitpos */ complain_overflow_signed, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ - "R_AARCH64_GOT_LD_PREL19", /* name */ + AARCH64_R_STR (GOT_LD_PREL19), /* name */ FALSE, /* partial_inplace */ 0xffffe0, /* src_mask */ 0xffffe0, /* dst_mask */ TRUE), /* pcrel_offset */ - EMPTY_HOWTO (310), - /* Get to the page for the GOT entry for the symbol (G(S) - P) using an ADRP instruction. */ - HOWTO (R_AARCH64_ADR_GOT_PAGE, /* type */ + HOWTO (AARCH64_R (ADR_GOT_PAGE), /* type */ 12, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 21, /* bitsize */ @@ -937,14 +803,14 @@ static reloc_howto_type elf64_aarch64_howto_table[] = 0, /* bitpos */ complain_overflow_dont, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ - "R_AARCH64_ADR_GOT_PAGE", /* name */ + AARCH64_R_STR (ADR_GOT_PAGE), /* name */ FALSE, /* partial_inplace */ 0x1fffff, /* src_mask */ 0x1fffff, /* dst_mask */ TRUE), /* pcrel_offset */ - /* LDNN: GOT offset G(S) & 0xff8 */ - HOWTO (R_AARCH64_LDNN_GOT_LO12_NC, /* type */ + /* LD64: GOT offset G(S) & 0xff8 */ + HOWTO64 (AARCH64_R (LD64_GOT_LO12_NC), /* type */ 3, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 12, /* bitsize */ @@ -952,20 +818,30 @@ static reloc_howto_type elf64_aarch64_howto_table[] = 0, /* bitpos */ complain_overflow_dont, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ - "R_AARCH64_LDNN_GOT_LO12_NC", /* name */ + AARCH64_R_STR (LD64_GOT_LO12_NC), /* name */ FALSE, /* partial_inplace */ 0xff8, /* src_mask */ 0xff8, /* dst_mask */ - FALSE) /* pcrel_offset */ -}; + FALSE), /* pcrel_offset */ -static reloc_howto_type elf64_aarch64_tls_howto_table[] = -{ - EMPTY_HOWTO (512), + /* LD32: GOT offset G(S) & 0xffc */ + HOWTO32 (AARCH64_R (LD32_GOT_LO12_NC), /* type */ + 2, /* rightshift */ + 2, /* size (0 = byte, 1 = short, 2 = long) */ + 12, /* bitsize */ + FALSE, /* pc_relative */ + 0, /* bitpos */ + complain_overflow_dont, /* complain_on_overflow */ + bfd_elf_generic_reloc, /* special_function */ + AARCH64_R_STR (LD32_GOT_LO12_NC), /* name */ + FALSE, /* partial_inplace */ + 0xffc, /* src_mask */ + 0xffc, /* dst_mask */ + FALSE), /* pcrel_offset */ /* Get to the page for the GOT entry for the symbol (G(S) - P) using an ADRP instruction. */ - HOWTO (R_AARCH64_TLSGD_ADR_PAGE21, /* type */ + HOWTO (AARCH64_R (TLSGD_ADR_PAGE21), /* type */ 12, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 21, /* bitsize */ @@ -973,14 +849,14 @@ static reloc_howto_type elf64_aarch64_tls_howto_table[] = 0, /* bitpos */ complain_overflow_dont, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ - "R_AARCH64_TLSGD_ADR_PAGE21", /* name */ + AARCH64_R_STR (TLSGD_ADR_PAGE21), /* name */ FALSE, /* partial_inplace */ 0x1fffff, /* src_mask */ 0x1fffff, /* dst_mask */ TRUE), /* pcrel_offset */ /* ADD: GOT offset G(S) & 0xff8 [no overflow check] */ - HOWTO (R_AARCH64_TLSGD_ADD_LO12_NC, /* type */ + HOWTO (AARCH64_R (TLSGD_ADD_LO12_NC), /* type */ 0, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 12, /* bitsize */ @@ -988,38 +864,13 @@ static reloc_howto_type elf64_aarch64_tls_howto_table[] = 0, /* bitpos */ complain_overflow_dont, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ - "R_AARCH64_TLSGD_ADD_LO12_NC", /* name */ + AARCH64_R_STR (TLSGD_ADD_LO12_NC), /* name */ FALSE, /* partial_inplace */ 0xfff, /* src_mask */ 0xfff, /* dst_mask */ FALSE), /* pcrel_offset */ - EMPTY_HOWTO (515), - EMPTY_HOWTO (516), - EMPTY_HOWTO (517), - EMPTY_HOWTO (518), - EMPTY_HOWTO (519), - EMPTY_HOWTO (520), - EMPTY_HOWTO (521), - EMPTY_HOWTO (522), - EMPTY_HOWTO (523), - EMPTY_HOWTO (524), - EMPTY_HOWTO (525), - EMPTY_HOWTO (526), - EMPTY_HOWTO (527), - EMPTY_HOWTO (528), - EMPTY_HOWTO (529), - EMPTY_HOWTO (530), - EMPTY_HOWTO (531), - EMPTY_HOWTO (532), - EMPTY_HOWTO (533), - EMPTY_HOWTO (534), - EMPTY_HOWTO (535), - EMPTY_HOWTO (536), - EMPTY_HOWTO (537), - EMPTY_HOWTO (538), - - HOWTO (R_AARCH64_TLSIE_MOVW_GOTTPREL_G1, /* type */ + HOWTO64 (AARCH64_R (TLSIE_MOVW_GOTTPREL_G1), /* type */ 16, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 16, /* bitsize */ @@ -1027,13 +878,13 @@ static reloc_howto_type elf64_aarch64_tls_howto_table[] = 0, /* bitpos */ complain_overflow_dont, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ - "R_AARCH64_TLSIE_MOVW_GOTTPREL_G1", /* name */ + AARCH64_R_STR (TLSIE_MOVW_GOTTPREL_G1), /* name */ FALSE, /* partial_inplace */ 0xffff, /* src_mask */ 0xffff, /* dst_mask */ FALSE), /* pcrel_offset */ - HOWTO (R_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC, /* type */ + HOWTO64 (AARCH64_R (TLSIE_MOVW_GOTTPREL_G0_NC), /* type */ 0, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 32, /* bitsize */ @@ -1041,13 +892,13 @@ static reloc_howto_type elf64_aarch64_tls_howto_table[] = 0, /* bitpos */ complain_overflow_dont, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ - "R_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC", /* name */ + AARCH64_R_STR (TLSIE_MOVW_GOTTPREL_G0_NC), /* name */ FALSE, /* partial_inplace */ 0xffff, /* src_mask */ 0xffff, /* dst_mask */ FALSE), /* pcrel_offset */ - HOWTO (R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21, /* type */ + HOWTO (AARCH64_R (TLSIE_ADR_GOTTPREL_PAGE21), /* type */ 12, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 21, /* bitsize */ @@ -1055,13 +906,13 @@ static reloc_howto_type elf64_aarch64_tls_howto_table[] = 0, /* bitpos */ complain_overflow_dont, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ - "R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21", /* name */ + AARCH64_R_STR (TLSIE_ADR_GOTTPREL_PAGE21), /* name */ FALSE, /* partial_inplace */ 0x1fffff, /* src_mask */ 0x1fffff, /* dst_mask */ FALSE), /* pcrel_offset */ - HOWTO (R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC, /* type */ + HOWTO64 (AARCH64_R (TLSIE_LD64_GOTTPREL_LO12_NC), /* type */ 3, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 12, /* bitsize */ @@ -1069,13 +920,27 @@ static reloc_howto_type elf64_aarch64_tls_howto_table[] = 0, /* bitpos */ complain_overflow_dont, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ - "R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC", /* name */ + AARCH64_R_STR (TLSIE_LD64_GOTTPREL_LO12_NC), /* name */ FALSE, /* partial_inplace */ 0xff8, /* src_mask */ 0xff8, /* dst_mask */ FALSE), /* pcrel_offset */ - HOWTO (R_AARCH64_TLSIE_LD_GOTTPREL_PREL19, /* type */ + HOWTO32 (AARCH64_R (TLSIE_LD32_GOTTPREL_LO12_NC), /* type */ + 2, /* rightshift */ + 2, /* size (0 = byte, 1 = short, 2 = long) */ + 12, /* bitsize */ + FALSE, /* pc_relative */ + 0, /* bitpos */ + complain_overflow_dont, /* complain_on_overflow */ + bfd_elf_generic_reloc, /* special_function */ + AARCH64_R_STR (TLSIE_LD32_GOTTPREL_LO12_NC), /* name */ + FALSE, /* partial_inplace */ + 0xffc, /* src_mask */ + 0xffc, /* dst_mask */ + FALSE), /* pcrel_offset */ + + HOWTO (AARCH64_R (TLSIE_LD_GOTTPREL_PREL19), /* type */ 2, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 21, /* bitsize */ @@ -1083,13 +948,13 @@ static reloc_howto_type elf64_aarch64_tls_howto_table[] = 0, /* bitpos */ complain_overflow_dont, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ - "R_AARCH64_TLSIE_LD_GOTTPREL_PREL19", /* name */ + AARCH64_R_STR (TLSIE_LD_GOTTPREL_PREL19), /* name */ FALSE, /* partial_inplace */ 0x1ffffc, /* src_mask */ 0x1ffffc, /* dst_mask */ FALSE), /* pcrel_offset */ - HOWTO (R_AARCH64_TLSLE_MOVW_TPREL_G2, /* type */ + HOWTO64 (AARCH64_R (TLSLE_MOVW_TPREL_G2), /* type */ 32, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 12, /* bitsize */ @@ -1097,13 +962,13 @@ static reloc_howto_type elf64_aarch64_tls_howto_table[] = 0, /* bitpos */ complain_overflow_dont, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ - "R_AARCH64_TLSLE_MOVW_TPREL_G2", /* name */ + AARCH64_R_STR (TLSLE_MOVW_TPREL_G2), /* name */ FALSE, /* partial_inplace */ 0xffff, /* src_mask */ 0xffff, /* dst_mask */ FALSE), /* pcrel_offset */ - HOWTO (R_AARCH64_TLSLE_MOVW_TPREL_G1, /* type */ + HOWTO (AARCH64_R (TLSLE_MOVW_TPREL_G1), /* type */ 16, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 12, /* bitsize */ @@ -1111,13 +976,13 @@ static reloc_howto_type elf64_aarch64_tls_howto_table[] = 0, /* bitpos */ complain_overflow_dont, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ - "R_AARCH64_TLSLE_MOVW_TPREL_G1", /* name */ + AARCH64_R_STR (TLSLE_MOVW_TPREL_G1), /* name */ FALSE, /* partial_inplace */ 0xffff, /* src_mask */ 0xffff, /* dst_mask */ FALSE), /* pcrel_offset */ - HOWTO (R_AARCH64_TLSLE_MOVW_TPREL_G1_NC, /* type */ + HOWTO64 (AARCH64_R (TLSLE_MOVW_TPREL_G1_NC), /* type */ 16, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 12, /* bitsize */ @@ -1125,13 +990,13 @@ static reloc_howto_type elf64_aarch64_tls_howto_table[] = 0, /* bitpos */ complain_overflow_dont, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ - "R_AARCH64_TLSLE_MOVW_TPREL_G1_NC", /* name */ + AARCH64_R_STR (TLSLE_MOVW_TPREL_G1_NC), /* name */ FALSE, /* partial_inplace */ 0xffff, /* src_mask */ 0xffff, /* dst_mask */ FALSE), /* pcrel_offset */ - HOWTO (R_AARCH64_TLSLE_MOVW_TPREL_G0, /* type */ + HOWTO (AARCH64_R (TLSLE_MOVW_TPREL_G0), /* type */ 0, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 12, /* bitsize */ @@ -1139,13 +1004,13 @@ static reloc_howto_type elf64_aarch64_tls_howto_table[] = 0, /* bitpos */ complain_overflow_dont, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ - "R_AARCH64_TLSLE_MOVW_TPREL_G0", /* name */ + AARCH64_R_STR (TLSLE_MOVW_TPREL_G0), /* name */ FALSE, /* partial_inplace */ 0xffff, /* src_mask */ 0xffff, /* dst_mask */ FALSE), /* pcrel_offset */ - HOWTO (R_AARCH64_TLSLE_MOVW_TPREL_G0_NC, /* type */ + HOWTO (AARCH64_R (TLSLE_MOVW_TPREL_G0_NC), /* type */ 0, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 12, /* bitsize */ @@ -1153,13 +1018,13 @@ static reloc_howto_type elf64_aarch64_tls_howto_table[] = 0, /* bitpos */ complain_overflow_dont, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ - "R_AARCH64_TLSLE_MOVW_TPREL_G0_NC", /* name */ + AARCH64_R_STR (TLSLE_MOVW_TPREL_G0_NC), /* name */ FALSE, /* partial_inplace */ 0xffff, /* src_mask */ 0xffff, /* dst_mask */ FALSE), /* pcrel_offset */ - HOWTO (R_AARCH64_TLSLE_ADD_TPREL_HI12, /* type */ + HOWTO (AARCH64_R (TLSLE_ADD_TPREL_HI12), /* type */ 12, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 12, /* bitsize */ @@ -1167,13 +1032,13 @@ static reloc_howto_type elf64_aarch64_tls_howto_table[] = 0, /* bitpos */ complain_overflow_dont, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ - "R_AARCH64_TLSLE_ADD_TPREL_HI12", /* name */ + AARCH64_R_STR (TLSLE_ADD_TPREL_HI12), /* name */ FALSE, /* partial_inplace */ 0xfff, /* src_mask */ 0xfff, /* dst_mask */ FALSE), /* pcrel_offset */ - HOWTO (R_AARCH64_TLSLE_ADD_TPREL_LO12, /* type */ + HOWTO (AARCH64_R (TLSLE_ADD_TPREL_LO12), /* type */ 0, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 12, /* bitsize */ @@ -1181,13 +1046,13 @@ static reloc_howto_type elf64_aarch64_tls_howto_table[] = 0, /* bitpos */ complain_overflow_dont, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ - "R_AARCH64_TLSLE_ADD_TPREL_LO12", /* name */ + AARCH64_R_STR (TLSLE_ADD_TPREL_LO12), /* name */ FALSE, /* partial_inplace */ 0xfff, /* src_mask */ 0xfff, /* dst_mask */ FALSE), /* pcrel_offset */ - HOWTO (R_AARCH64_TLSLE_ADD_TPREL_LO12_NC, /* type */ + HOWTO (AARCH64_R (TLSLE_ADD_TPREL_LO12_NC), /* type */ 0, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 12, /* bitsize */ @@ -1195,16 +1060,13 @@ static reloc_howto_type elf64_aarch64_tls_howto_table[] = 0, /* bitpos */ complain_overflow_dont, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ - "R_AARCH64_TLSLE_ADD_TPREL_LO12_NC", /* name */ + AARCH64_R_STR (TLSLE_ADD_TPREL_LO12_NC), /* name */ FALSE, /* partial_inplace */ 0xfff, /* src_mask */ 0xfff, /* dst_mask */ FALSE), /* pcrel_offset */ -}; -static reloc_howto_type elf64_aarch64_tlsdesc_howto_table[] = -{ - HOWTO (R_AARCH64_TLSDESC_LD_PREL19, /* type */ + HOWTO (AARCH64_R (TLSDESC_LD_PREL19), /* type */ 2, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 21, /* bitsize */ @@ -1212,13 +1074,13 @@ static reloc_howto_type elf64_aarch64_tlsdesc_howto_table[] = 0, /* bitpos */ complain_overflow_dont, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ - "R_AARCH64_TLSDESC_LD_PREL19", /* name */ + AARCH64_R_STR (TLSDESC_LD_PREL19), /* name */ FALSE, /* partial_inplace */ 0x1ffffc, /* src_mask */ 0x1ffffc, /* dst_mask */ TRUE), /* pcrel_offset */ - HOWTO (R_AARCH64_TLSDESC_ADR_PREL21, /* type */ + HOWTO (AARCH64_R (TLSDESC_ADR_PREL21), /* type */ 0, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 21, /* bitsize */ @@ -1226,7 +1088,7 @@ static reloc_howto_type elf64_aarch64_tlsdesc_howto_table[] = 0, /* bitpos */ complain_overflow_dont, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ - "R_AARCH64_TLSDESC_ADR_PREL21", /* name */ + AARCH64_R_STR (TLSDESC_ADR_PREL21), /* name */ FALSE, /* partial_inplace */ 0x1fffff, /* src_mask */ 0x1fffff, /* dst_mask */ @@ -1234,7 +1096,7 @@ static reloc_howto_type elf64_aarch64_tlsdesc_howto_table[] = /* Get to the page for the GOT entry for the symbol (G(S) - P) using an ADRP instruction. */ - HOWTO (R_AARCH64_TLSDESC_ADR_PAGE21, /* type */ + HOWTO (AARCH64_R (TLSDESC_ADR_PAGE21), /* type */ 12, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 21, /* bitsize */ @@ -1242,14 +1104,14 @@ static reloc_howto_type elf64_aarch64_tlsdesc_howto_table[] = 0, /* bitpos */ complain_overflow_dont, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ - "R_AARCH64_TLSDESC_ADR_PAGE21", /* name */ + AARCH64_R_STR (TLSDESC_ADR_PAGE21), /* name */ FALSE, /* partial_inplace */ 0x1fffff, /* src_mask */ 0x1fffff, /* dst_mask */ TRUE), /* pcrel_offset */ - /* LD64: GOT offset G(S) & 0xfff. */ - HOWTO (R_AARCH64_TLSDESC_LD64_LO12_NC, /* type */ + /* LD64: GOT offset G(S) & 0xff8. */ + HOWTO64 (AARCH64_R (TLSDESC_LD64_LO12_NC), /* type */ 3, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 12, /* bitsize */ @@ -1257,14 +1119,29 @@ static reloc_howto_type elf64_aarch64_tlsdesc_howto_table[] = 0, /* bitpos */ complain_overflow_dont, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ - "R_AARCH64_TLSDESC_LD64_LO12_NC", /* name */ + AARCH64_R_STR (TLSDESC_LD64_LO12_NC), /* name */ FALSE, /* partial_inplace */ - 0xfff, /* src_mask */ - 0xfff, /* dst_mask */ + 0xff8, /* src_mask */ + 0xff8, /* dst_mask */ + FALSE), /* pcrel_offset */ + + /* LD32: GOT offset G(S) & 0xffc. */ + HOWTO32 (AARCH64_R (TLSDESC_LD32_LO12_NC), /* type */ + 2, /* rightshift */ + 2, /* size (0 = byte, 1 = short, 2 = long) */ + 12, /* bitsize */ + FALSE, /* pc_relative */ + 0, /* bitpos */ + complain_overflow_dont, /* complain_on_overflow */ + bfd_elf_generic_reloc, /* special_function */ + AARCH64_R_STR (TLSDESC_LD32_LO12_NC), /* name */ + FALSE, /* partial_inplace */ + 0xffc, /* src_mask */ + 0xffc, /* dst_mask */ FALSE), /* pcrel_offset */ /* ADD: GOT offset G(S) & 0xfff. */ - HOWTO (R_AARCH64_TLSDESC_ADD_LO12_NC, /* type */ + HOWTO (AARCH64_R (TLSDESC_ADD_LO12_NC), /* type */ 0, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 12, /* bitsize */ @@ -1272,13 +1149,13 @@ static reloc_howto_type elf64_aarch64_tlsdesc_howto_table[] = 0, /* bitpos */ complain_overflow_dont, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ - "R_AARCH64_TLSDESC_ADD_LO12_NC", /* name */ + AARCH64_R_STR (TLSDESC_ADD_LO12_NC), /* name */ FALSE, /* partial_inplace */ 0xfff, /* src_mask */ 0xfff, /* dst_mask */ FALSE), /* pcrel_offset */ - HOWTO (R_AARCH64_TLSDESC_OFF_G1, /* type */ + HOWTO64 (AARCH64_R (TLSDESC_OFF_G1), /* type */ 16, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 12, /* bitsize */ @@ -1286,13 +1163,13 @@ static reloc_howto_type elf64_aarch64_tlsdesc_howto_table[] = 0, /* bitpos */ complain_overflow_dont, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ - "R_AARCH64_TLSDESC_OFF_G1", /* name */ + AARCH64_R_STR (TLSDESC_OFF_G1), /* name */ FALSE, /* partial_inplace */ 0xffff, /* src_mask */ 0xffff, /* dst_mask */ FALSE), /* pcrel_offset */ - HOWTO (R_AARCH64_TLSDESC_OFF_G0_NC, /* type */ + HOWTO64 (AARCH64_R (TLSDESC_OFF_G0_NC), /* type */ 0, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 12, /* bitsize */ @@ -1300,13 +1177,13 @@ static reloc_howto_type elf64_aarch64_tlsdesc_howto_table[] = 0, /* bitpos */ complain_overflow_dont, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ - "R_AARCH64_TLSDESC_OFF_G0_NC", /* name */ + AARCH64_R_STR (TLSDESC_OFF_G0_NC), /* name */ FALSE, /* partial_inplace */ 0xffff, /* src_mask */ 0xffff, /* dst_mask */ FALSE), /* pcrel_offset */ - HOWTO (R_AARCH64_TLSDESC_LDR, /* type */ + HOWTO64 (AARCH64_R (TLSDESC_LDR), /* type */ 0, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 12, /* bitsize */ @@ -1314,13 +1191,13 @@ static reloc_howto_type elf64_aarch64_tlsdesc_howto_table[] = 0, /* bitpos */ complain_overflow_dont, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ - "R_AARCH64_TLSDESC_LDR", /* name */ + AARCH64_R_STR (TLSDESC_LDR), /* name */ FALSE, /* partial_inplace */ 0x0, /* src_mask */ 0x0, /* dst_mask */ FALSE), /* pcrel_offset */ - HOWTO (R_AARCH64_TLSDESC_ADD, /* type */ + HOWTO64 (AARCH64_R (TLSDESC_ADD), /* type */ 0, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 12, /* bitsize */ @@ -1328,13 +1205,13 @@ static reloc_howto_type elf64_aarch64_tlsdesc_howto_table[] = 0, /* bitpos */ complain_overflow_dont, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ - "R_AARCH64_TLSDESC_ADD", /* name */ + AARCH64_R_STR (TLSDESC_ADD), /* name */ FALSE, /* partial_inplace */ 0x0, /* src_mask */ 0x0, /* dst_mask */ FALSE), /* pcrel_offset */ - HOWTO (R_AARCH64_TLSDESC_CALL, /* type */ + HOWTO (AARCH64_R (TLSDESC_CALL), /* type */ 0, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 12, /* bitsize */ @@ -1342,16 +1219,254 @@ static reloc_howto_type elf64_aarch64_tlsdesc_howto_table[] = 0, /* bitpos */ complain_overflow_dont, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ - "R_AARCH64_TLSDESC_CALL", /* name */ + AARCH64_R_STR (TLSDESC_CALL), /* name */ FALSE, /* partial_inplace */ 0x0, /* src_mask */ 0x0, /* dst_mask */ FALSE), /* pcrel_offset */ + + HOWTO (AARCH64_R (COPY), /* type */ + 0, /* rightshift */ + 2, /* size (0 = byte, 1 = short, 2 = long) */ + 64, /* bitsize */ + FALSE, /* pc_relative */ + 0, /* bitpos */ + complain_overflow_bitfield, /* complain_on_overflow */ + bfd_elf_generic_reloc, /* special_function */ + AARCH64_R_STR (COPY), /* name */ + TRUE, /* partial_inplace */ + 0xffffffff, /* src_mask */ + 0xffffffff, /* dst_mask */ + FALSE), /* pcrel_offset */ + + HOWTO (AARCH64_R (GLOB_DAT), /* type */ + 0, /* rightshift */ + 2, /* size (0 = byte, 1 = short, 2 = long) */ + 64, /* bitsize */ + FALSE, /* pc_relative */ + 0, /* bitpos */ + complain_overflow_bitfield, /* complain_on_overflow */ + bfd_elf_generic_reloc, /* special_function */ + AARCH64_R_STR (GLOB_DAT), /* name */ + TRUE, /* partial_inplace */ + 0xffffffff, /* src_mask */ + 0xffffffff, /* dst_mask */ + FALSE), /* pcrel_offset */ + + HOWTO (AARCH64_R (JUMP_SLOT), /* type */ + 0, /* rightshift */ + 2, /* size (0 = byte, 1 = short, 2 = long) */ + 64, /* bitsize */ + FALSE, /* pc_relative */ + 0, /* bitpos */ + complain_overflow_bitfield, /* complain_on_overflow */ + bfd_elf_generic_reloc, /* special_function */ + AARCH64_R_STR (JUMP_SLOT), /* name */ + TRUE, /* partial_inplace */ + 0xffffffff, /* src_mask */ + 0xffffffff, /* dst_mask */ + FALSE), /* pcrel_offset */ + + HOWTO (AARCH64_R (RELATIVE), /* type */ + 0, /* rightshift */ + 2, /* size (0 = byte, 1 = short, 2 = long) */ + 64, /* bitsize */ + FALSE, /* pc_relative */ + 0, /* bitpos */ + complain_overflow_bitfield, /* complain_on_overflow */ + bfd_elf_generic_reloc, /* special_function */ + AARCH64_R_STR (RELATIVE), /* name */ + TRUE, /* partial_inplace */ + ALL_ONES, /* src_mask */ + ALL_ONES, /* dst_mask */ + FALSE), /* pcrel_offset */ + + HOWTO (AARCH64_R (TLS_DTPMOD), /* type */ + 0, /* rightshift */ + 2, /* size (0 = byte, 1 = short, 2 = long) */ + 64, /* bitsize */ + FALSE, /* pc_relative */ + 0, /* bitpos */ + complain_overflow_dont, /* complain_on_overflow */ + bfd_elf_generic_reloc, /* special_function */ + AARCH64_R_STR (TLS_DTPMOD), /* name */ + FALSE, /* partial_inplace */ + 0, /* src_mask */ + ALL_ONES, /* dst_mask */ + FALSE), /* pc_reloffset */ + + HOWTO (AARCH64_R (TLS_DTPREL), /* type */ + 0, /* rightshift */ + 2, /* size (0 = byte, 1 = short, 2 = long) */ + 64, /* bitsize */ + FALSE, /* pc_relative */ + 0, /* bitpos */ + complain_overflow_dont, /* complain_on_overflow */ + bfd_elf_generic_reloc, /* special_function */ + AARCH64_R_STR (TLS_DTPREL), /* name */ + FALSE, /* partial_inplace */ + 0, /* src_mask */ + ALL_ONES, /* dst_mask */ + FALSE), /* pcrel_offset */ + + HOWTO (AARCH64_R (TLS_TPREL), /* type */ + 0, /* rightshift */ + 2, /* size (0 = byte, 1 = short, 2 = long) */ + 64, /* bitsize */ + FALSE, /* pc_relative */ + 0, /* bitpos */ + complain_overflow_dont, /* complain_on_overflow */ + bfd_elf_generic_reloc, /* special_function */ + AARCH64_R_STR (TLS_TPREL), /* name */ + FALSE, /* partial_inplace */ + 0, /* src_mask */ + ALL_ONES, /* dst_mask */ + FALSE), /* pcrel_offset */ + + HOWTO (AARCH64_R (TLSDESC), /* type */ + 0, /* rightshift */ + 2, /* size (0 = byte, 1 = short, 2 = long) */ + 64, /* bitsize */ + FALSE, /* pc_relative */ + 0, /* bitpos */ + complain_overflow_dont, /* complain_on_overflow */ + bfd_elf_generic_reloc, /* special_function */ + AARCH64_R_STR (TLSDESC), /* name */ + FALSE, /* partial_inplace */ + 0, /* src_mask */ + ALL_ONES, /* dst_mask */ + FALSE), /* pcrel_offset */ + + HOWTO (AARCH64_R (IRELATIVE), /* type */ + 0, /* rightshift */ + 2, /* size (0 = byte, 1 = short, 2 = long) */ + 64, /* bitsize */ + FALSE, /* pc_relative */ + 0, /* bitpos */ + complain_overflow_bitfield, /* complain_on_overflow */ + bfd_elf_generic_reloc, /* special_function */ + AARCH64_R_STR (IRELATIVE), /* name */ + FALSE, /* partial_inplace */ + 0, /* src_mask */ + ALL_ONES, /* dst_mask */ + FALSE), /* pcrel_offset */ + + EMPTY_HOWTO (0), }; +static reloc_howto_type elfNN_aarch64_howto_none = + HOWTO (R_AARCH64_NONE, /* type */ + 0, /* rightshift */ + 0, /* size (0 = byte, 1 = short, 2 = long) */ + 0, /* bitsize */ + FALSE, /* pc_relative */ + 0, /* bitpos */ + complain_overflow_dont,/* complain_on_overflow */ + bfd_elf_generic_reloc, /* special_function */ + "R_AARCH64_NONE", /* name */ + FALSE, /* partial_inplace */ + 0, /* src_mask */ + 0, /* dst_mask */ + FALSE); /* pcrel_offset */ + +/* Given HOWTO, return the bfd internal relocation enumerator. */ + +static bfd_reloc_code_real_type +elfNN_aarch64_bfd_reloc_from_howto (reloc_howto_type *howto) +{ + const int size + = (int) ARRAY_SIZE (elfNN_aarch64_howto_table); + const ptrdiff_t offset + = howto - elfNN_aarch64_howto_table; + + if (offset > 0 && offset < size - 1) + return BFD_RELOC_AARCH64_RELOC_START + offset; + + if (howto == &elfNN_aarch64_howto_none) + return BFD_RELOC_AARCH64_NONE; + + return BFD_RELOC_AARCH64_RELOC_START; +} + +/* Given R_TYPE, return the bfd internal relocation enumerator. */ + +static bfd_reloc_code_real_type +elfNN_aarch64_bfd_reloc_from_type (unsigned int r_type) +{ + static bfd_boolean initialized_p = FALSE; + /* Indexed by R_TYPE, values are offsets in the howto_table. */ + static unsigned int offsets[R_AARCH64_end]; + + if (initialized_p == FALSE) + { + unsigned int i; + + for (i = 1; i < ARRAY_SIZE (elfNN_aarch64_howto_table) - 1; ++i) + if (elfNN_aarch64_howto_table[i].type != 0) + offsets[elfNN_aarch64_howto_table[i].type] = i; + + initialized_p = TRUE; + } + + if (r_type == R_AARCH64_NONE || r_type == R_AARCH64_NULL) + return BFD_RELOC_AARCH64_NONE; + + return BFD_RELOC_AARCH64_RELOC_START + offsets[r_type]; +} + +struct elf_aarch64_reloc_map +{ + bfd_reloc_code_real_type from; + bfd_reloc_code_real_type to; +}; + +/* Map bfd generic reloc to AArch64-specific reloc. */ +static const struct elf_aarch64_reloc_map elf_aarch64_reloc_map[] = +{ + {BFD_RELOC_NONE, BFD_RELOC_AARCH64_NONE}, + + /* Basic data relocations. */ + {BFD_RELOC_CTOR, BFD_RELOC_AARCH64_NN}, + {BFD_RELOC_64, BFD_RELOC_AARCH64_64}, + {BFD_RELOC_32, BFD_RELOC_AARCH64_32}, + {BFD_RELOC_16, BFD_RELOC_AARCH64_16}, + {BFD_RELOC_64_PCREL, BFD_RELOC_AARCH64_64_PCREL}, + {BFD_RELOC_32_PCREL, BFD_RELOC_AARCH64_32_PCREL}, + {BFD_RELOC_16_PCREL, BFD_RELOC_AARCH64_16_PCREL}, +}; + +/* Given the bfd internal relocation enumerator in CODE, return the + corresponding howto entry. */ + +static reloc_howto_type * +elfNN_aarch64_howto_from_bfd_reloc (bfd_reloc_code_real_type code) +{ + unsigned int i; + + /* Convert bfd generic reloc to AArch64-specific reloc. */ + if (code < BFD_RELOC_AARCH64_RELOC_START + || code > BFD_RELOC_AARCH64_RELOC_END) + for (i = 0; i < ARRAY_SIZE (elf_aarch64_reloc_map); i++) + if (elf_aarch64_reloc_map[i].from == code) + { + code = elf_aarch64_reloc_map[i].to; + break; + } + + if (code > BFD_RELOC_AARCH64_RELOC_START + && code < BFD_RELOC_AARCH64_RELOC_END) + if (elfNN_aarch64_howto_table[code - BFD_RELOC_AARCH64_RELOC_START].type) + return &elfNN_aarch64_howto_table[code - BFD_RELOC_AARCH64_RELOC_START]; + + return NULL; +} + static reloc_howto_type * elfNN_aarch64_howto_from_type (unsigned int r_type) { + bfd_reloc_code_real_type val; + reloc_howto_type *howto; + #if ARCH_SIZE == 32 if (r_type > 256) { @@ -1360,24 +1475,15 @@ elfNN_aarch64_howto_from_type (unsigned int r_type) } #endif - if (r_type >= R_AARCH64_static_min && r_type < R_AARCH64_static_max) - return &elf64_aarch64_howto_table[r_type - R_AARCH64_static_min]; - - if (r_type >= R_AARCH64_tls_min && r_type < R_AARCH64_tls_max) - return &elf64_aarch64_tls_howto_table[r_type - R_AARCH64_tls_min]; - - if (r_type >= R_AARCH64_tlsdesc_min && r_type < R_AARCH64_tlsdesc_max) - return &elf64_aarch64_tlsdesc_howto_table[r_type - R_AARCH64_tlsdesc_min]; + if (r_type == R_AARCH64_NONE) + return &elfNN_aarch64_howto_none; - if (r_type >= R_AARCH64_dyn_min && r_type < R_AARCH64_dyn_max) - return &elf64_aarch64_howto_dynrelocs[r_type - R_AARCH64_dyn_min]; + val = elfNN_aarch64_bfd_reloc_from_type (r_type); + howto = elfNN_aarch64_howto_from_bfd_reloc (val); - switch (r_type) - { - case R_AARCH64_NONE: - return &elf64_aarch64_howto_none; + if (howto != NULL) + return howto; - } bfd_set_error (bfd_error_bad_value); return NULL; } @@ -1392,119 +1498,14 @@ elfNN_aarch64_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED, arelent *bfd_reloc, bfd_reloc->howto = elfNN_aarch64_howto_from_type (r_type); } -struct elf64_aarch64_reloc_map -{ - bfd_reloc_code_real_type bfd_reloc_val; - unsigned int elf_reloc_val; -}; - -/* All entries in this list must also be present in - elf64_aarch64_howto_table. */ -static const struct elf64_aarch64_reloc_map elf64_aarch64_reloc_map[] = -{ - {BFD_RELOC_NONE, R_AARCH64_NONE}, - - /* Basic data relocations. */ - {BFD_RELOC_CTOR, R_AARCH64_ABS64}, - {BFD_RELOC_64, R_AARCH64_ABS64}, - {BFD_RELOC_32, R_AARCH64_ABS32}, - {BFD_RELOC_16, R_AARCH64_ABS16}, - {BFD_RELOC_64_PCREL, R_AARCH64_PREL64}, - {BFD_RELOC_32_PCREL, R_AARCH64_PREL32}, - {BFD_RELOC_16_PCREL, R_AARCH64_PREL16}, - - /* Group relocations to low order bits of a 16, 32, 48 or 64 bit - value inline. */ - {BFD_RELOC_AARCH64_MOVW_G0_NC, R_AARCH64_MOVW_UABS_G0_NC}, - {BFD_RELOC_AARCH64_MOVW_G1_NC, R_AARCH64_MOVW_UABS_G1_NC}, - {BFD_RELOC_AARCH64_MOVW_G2_NC, R_AARCH64_MOVW_UABS_G2_NC}, - - /* Group relocations to create high bits of a 16, 32, 48 or 64 bit - signed value inline. */ - {BFD_RELOC_AARCH64_MOVW_G0_S, R_AARCH64_MOVW_SABS_G0}, - {BFD_RELOC_AARCH64_MOVW_G1_S, R_AARCH64_MOVW_SABS_G1}, - {BFD_RELOC_AARCH64_MOVW_G2_S, R_AARCH64_MOVW_SABS_G2}, - - /* Group relocations to create high bits of a 16, 32, 48 or 64 bit - unsigned value inline. */ - {BFD_RELOC_AARCH64_MOVW_G0, R_AARCH64_MOVW_UABS_G0}, - {BFD_RELOC_AARCH64_MOVW_G1, R_AARCH64_MOVW_UABS_G1}, - {BFD_RELOC_AARCH64_MOVW_G2, R_AARCH64_MOVW_UABS_G2}, - {BFD_RELOC_AARCH64_MOVW_G3, R_AARCH64_MOVW_UABS_G3}, - - /* Relocations to generate 19, 21 and 33 bit PC-relative load/store. */ - {BFD_RELOC_AARCH64_LD_LO19_PCREL, R_AARCH64_LD_PREL_LO19}, - {BFD_RELOC_AARCH64_ADR_LO21_PCREL, R_AARCH64_ADR_PREL_LO21}, - {BFD_RELOC_AARCH64_ADR_HI21_PCREL, R_AARCH64_ADR_PREL_PG_HI21}, - {BFD_RELOC_AARCH64_ADR_HI21_NC_PCREL, R_AARCH64_ADR_PREL_PG_HI21_NC}, - {BFD_RELOC_AARCH64_ADD_LO12, R_AARCH64_ADD_ABS_LO12_NC}, - {BFD_RELOC_AARCH64_LDST8_LO12, R_AARCH64_LDST8_ABS_LO12_NC}, - {BFD_RELOC_AARCH64_LDST16_LO12, R_AARCH64_LDST16_ABS_LO12_NC}, - {BFD_RELOC_AARCH64_LDST32_LO12, R_AARCH64_LDST32_ABS_LO12_NC}, - {BFD_RELOC_AARCH64_LDST64_LO12, R_AARCH64_LDST64_ABS_LO12_NC}, - {BFD_RELOC_AARCH64_LDST128_LO12, R_AARCH64_LDST128_ABS_LO12_NC}, - - /* Relocations for control-flow instructions. */ - {BFD_RELOC_AARCH64_TSTBR14, R_AARCH64_TSTBR14}, - {BFD_RELOC_AARCH64_BRANCH19, R_AARCH64_CONDBR19}, - {BFD_RELOC_AARCH64_JUMP26, R_AARCH64_JUMP26}, - {BFD_RELOC_AARCH64_CALL26, R_AARCH64_CALL26}, - - /* Relocations for PIC. */ - {BFD_RELOC_AARCH64_GOT_LD_PREL19, R_AARCH64_GOT_LD_PREL19}, - {BFD_RELOC_AARCH64_ADR_GOT_PAGE, R_AARCH64_ADR_GOT_PAGE}, - {BFD_RELOC_AARCH64_LD64_GOT_LO12_NC, R_AARCH64_LD64_GOT_LO12_NC}, - - /* Relocations for TLS. */ - {BFD_RELOC_AARCH64_TLSGD_ADR_PAGE21, R_AARCH64_TLSGD_ADR_PAGE21}, - {BFD_RELOC_AARCH64_TLSGD_ADD_LO12_NC, R_AARCH64_TLSGD_ADD_LO12_NC}, - {BFD_RELOC_AARCH64_TLSIE_MOVW_GOTTPREL_G1, - R_AARCH64_TLSIE_MOVW_GOTTPREL_G1}, - {BFD_RELOC_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC, - R_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC}, - {BFD_RELOC_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21, - R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21}, - {BFD_RELOC_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC, - R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC}, - {BFD_RELOC_AARCH64_TLSIE_LD_GOTTPREL_PREL19, - R_AARCH64_TLSIE_LD_GOTTPREL_PREL19}, - {BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G2, R_AARCH64_TLSLE_MOVW_TPREL_G2}, - {BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1, R_AARCH64_TLSLE_MOVW_TPREL_G1}, - {BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1_NC, - R_AARCH64_TLSLE_MOVW_TPREL_G1_NC}, - {BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0, R_AARCH64_TLSLE_MOVW_TPREL_G0}, - {BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0_NC, - R_AARCH64_TLSLE_MOVW_TPREL_G0_NC}, - {BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12, R_AARCH64_TLSLE_ADD_TPREL_LO12}, - {BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_HI12, R_AARCH64_TLSLE_ADD_TPREL_HI12}, - {BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12_NC, - R_AARCH64_TLSLE_ADD_TPREL_LO12_NC}, - {BFD_RELOC_AARCH64_TLSDESC_LD_PREL19, R_AARCH64_TLSDESC_LD_PREL19}, - {BFD_RELOC_AARCH64_TLSDESC_ADR_PREL21, R_AARCH64_TLSDESC_ADR_PREL21}, - {BFD_RELOC_AARCH64_TLSDESC_ADR_PAGE21, R_AARCH64_TLSDESC_ADR_PAGE21}, - {BFD_RELOC_AARCH64_TLSDESC_ADD_LO12_NC, R_AARCH64_TLSDESC_ADD_LO12_NC}, - {BFD_RELOC_AARCH64_TLSDESC_LD64_LO12_NC, R_AARCH64_TLSDESC_LD64_LO12_NC}, - {BFD_RELOC_AARCH64_TLSDESC_OFF_G1, R_AARCH64_TLSDESC_OFF_G1}, - {BFD_RELOC_AARCH64_TLSDESC_OFF_G0_NC, R_AARCH64_TLSDESC_OFF_G0_NC}, - {BFD_RELOC_AARCH64_TLSDESC_LDR, R_AARCH64_TLSDESC_LDR}, - {BFD_RELOC_AARCH64_TLSDESC_ADD, R_AARCH64_TLSDESC_ADD}, - {BFD_RELOC_AARCH64_TLSDESC_CALL, R_AARCH64_TLSDESC_CALL}, - {BFD_RELOC_AARCH64_TLS_DTPMOD64, R_AARCH64_TLS_DTPMOD64}, - {BFD_RELOC_AARCH64_TLS_DTPREL64, R_AARCH64_TLS_DTPREL64}, - {BFD_RELOC_AARCH64_TLS_TPREL64, R_AARCH64_TLS_TPREL64}, - {BFD_RELOC_AARCH64_TLSDESC, R_AARCH64_TLSDESC}, -}; - static reloc_howto_type * elfNN_aarch64_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED, bfd_reloc_code_real_type code) { - unsigned int i; + reloc_howto_type *howto = elfNN_aarch64_howto_from_bfd_reloc (code); - for (i = 0; i < ARRAY_SIZE (elf64_aarch64_reloc_map); i++) - if (elf64_aarch64_reloc_map[i].bfd_reloc_val == code) - return elf64_aarch64_howto_from_type - (elf64_aarch64_reloc_map[i].elf_reloc_val); + if (howto != NULL) + return howto; bfd_set_error (bfd_error_bad_value); return NULL; @@ -1516,10 +1517,10 @@ elfNN_aarch64_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED, { unsigned int i; - for (i = 0; i < ARRAY_SIZE (elf64_aarch64_howto_table); i++) - if (elf64_aarch64_howto_table[i].name != NULL - && strcasecmp (elf64_aarch64_howto_table[i].name, r_name) == 0) - return &elf64_aarch64_howto_table[i]; + for (i = 1; i < ARRAY_SIZE (elfNN_aarch64_howto_table) - 1; ++i) + if (elfNN_aarch64_howto_table[i].name != NULL + && strcasecmp (elfNN_aarch64_howto_table[i].name, r_name) == 0) + return &elfNN_aarch64_howto_table[i]; return NULL; } @@ -2086,99 +2087,105 @@ static bfd_vma aarch64_resolve_relocation (unsigned int r_type, bfd_vma place, bfd_vma value, bfd_vma addend, bfd_boolean weak_undef_p) { - switch (r_type) + switch (elfNN_aarch64_bfd_reloc_from_type (r_type)) { - case R_AARCH64_TLSDESC_CALL: - case R_AARCH64_NONE: - case R_AARCH64_NULL: + case BFD_RELOC_AARCH64_TLSDESC_CALL: + case BFD_RELOC_AARCH64_NONE: break; - case R_AARCH64_ADR_PREL_LO21: - case R_AARCH64_CONDBR19: - case R_AARCH64_LD_PREL_LO19: - case R_AARCH64_PREL16: - case R_AARCH64_PREL32: - case R_AARCH64_PREL64: - case R_AARCH64_TSTBR14: + case BFD_RELOC_AARCH64_ADR_LO21_PCREL: + case BFD_RELOC_AARCH64_BRANCH19: + case BFD_RELOC_AARCH64_LD_LO19_PCREL: + case BFD_RELOC_AARCH64_16_PCREL: + case BFD_RELOC_AARCH64_32_PCREL: + case BFD_RELOC_AARCH64_64_PCREL: + case BFD_RELOC_AARCH64_TSTBR14: if (weak_undef_p) value = place; value = value + addend - place; break; - case R_AARCH64_CALL26: - case R_AARCH64_JUMP26: + case BFD_RELOC_AARCH64_CALL26: + case BFD_RELOC_AARCH64_JUMP26: value = value + addend - place; break; - case R_AARCH64_ABS16: - case R_AARCH64_ABS32: - case R_AARCH64_MOVW_SABS_G0: - case R_AARCH64_MOVW_SABS_G1: - case R_AARCH64_MOVW_SABS_G2: - case R_AARCH64_MOVW_UABS_G0: - case R_AARCH64_MOVW_UABS_G0_NC: - case R_AARCH64_MOVW_UABS_G1: - case R_AARCH64_MOVW_UABS_G1_NC: - case R_AARCH64_MOVW_UABS_G2: - case R_AARCH64_MOVW_UABS_G2_NC: - case R_AARCH64_MOVW_UABS_G3: + case BFD_RELOC_AARCH64_16: + case BFD_RELOC_AARCH64_32: + case BFD_RELOC_AARCH64_MOVW_G0_S: + case BFD_RELOC_AARCH64_MOVW_G1_S: + case BFD_RELOC_AARCH64_MOVW_G2_S: + case BFD_RELOC_AARCH64_MOVW_G0: + case BFD_RELOC_AARCH64_MOVW_G0_NC: + case BFD_RELOC_AARCH64_MOVW_G1: + case BFD_RELOC_AARCH64_MOVW_G1_NC: + case BFD_RELOC_AARCH64_MOVW_G2: + case BFD_RELOC_AARCH64_MOVW_G2_NC: + case BFD_RELOC_AARCH64_MOVW_G3: value = value + addend; break; - case R_AARCH64_ADR_PREL_PG_HI21: - case R_AARCH64_ADR_PREL_PG_HI21_NC: + case BFD_RELOC_AARCH64_ADR_HI21_PCREL: + case BFD_RELOC_AARCH64_ADR_HI21_NC_PCREL: if (weak_undef_p) value = PG (place); value = PG (value + addend) - PG (place); break; - case R_AARCH64_GOT_LD_PREL19: + case BFD_RELOC_AARCH64_GOT_LD_PREL19: value = value + addend - place; break; - case R_AARCH64_ADR_GOT_PAGE: - case R_AARCH64_TLSDESC_ADR_PAGE21: - case R_AARCH64_TLSGD_ADR_PAGE21: - case R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21: + case BFD_RELOC_AARCH64_ADR_GOT_PAGE: + case BFD_RELOC_AARCH64_TLSDESC_ADR_PAGE21: + case BFD_RELOC_AARCH64_TLSGD_ADR_PAGE21: + case BFD_RELOC_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21: value = PG (value + addend) - PG (place); break; - case R_AARCH64_ADD_ABS_LO12_NC: - case R_AARCH64_LD64_GOT_LO12_NC: - case R_AARCH64_LDST8_ABS_LO12_NC: - case R_AARCH64_LDST16_ABS_LO12_NC: - case R_AARCH64_LDST32_ABS_LO12_NC: - case R_AARCH64_LDST64_ABS_LO12_NC: - case R_AARCH64_LDST128_ABS_LO12_NC: - case R_AARCH64_TLSDESC_ADD_LO12_NC: - case R_AARCH64_TLSDESC_ADD: - case R_AARCH64_TLSDESC_LD64_LO12_NC: - case R_AARCH64_TLSDESC_LDR: - case R_AARCH64_TLSGD_ADD_LO12_NC: - case R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC: - case R_AARCH64_TLSLE_ADD_TPREL_LO12: - case R_AARCH64_TLSLE_ADD_TPREL_LO12_NC: + case BFD_RELOC_AARCH64_ADD_LO12: + case BFD_RELOC_AARCH64_LD64_GOT_LO12_NC: + case BFD_RELOC_AARCH64_LD32_GOT_LO12_NC: + case BFD_RELOC_AARCH64_LDST8_LO12: + case BFD_RELOC_AARCH64_LDST16_LO12: + case BFD_RELOC_AARCH64_LDST32_LO12: + case BFD_RELOC_AARCH64_LDST64_LO12: + case BFD_RELOC_AARCH64_LDST128_LO12: + case BFD_RELOC_AARCH64_TLSDESC_ADD_LO12_NC: + case BFD_RELOC_AARCH64_TLSDESC_ADD: + case BFD_RELOC_AARCH64_TLSDESC_LD64_LO12_NC: + case BFD_RELOC_AARCH64_TLSDESC_LD32_LO12_NC: + case BFD_RELOC_AARCH64_TLSDESC_LDR: + case BFD_RELOC_AARCH64_TLSGD_ADD_LO12_NC: + case BFD_RELOC_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC: + case BFD_RELOC_AARCH64_TLSIE_LD32_GOTTPREL_LO12_NC: + case BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12: + case BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12_NC: value = PG_OFFSET (value + addend); break; - case R_AARCH64_TLSLE_MOVW_TPREL_G1: - case R_AARCH64_TLSLE_MOVW_TPREL_G1_NC: + case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1: + case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1_NC: value = (value + addend) & (bfd_vma) 0xffff0000; break; - case R_AARCH64_TLSLE_ADD_TPREL_HI12: + case BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_HI12: value = (value + addend) & (bfd_vma) 0xfff000; break; - case R_AARCH64_TLSLE_MOVW_TPREL_G0: - case R_AARCH64_TLSLE_MOVW_TPREL_G0_NC: + case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0: + case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0_NC: value = (value + addend) & (bfd_vma) 0xffff; break; - case R_AARCH64_TLSLE_MOVW_TPREL_G2: + case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G2: value = (value + addend) & ~(bfd_vma) 0xffffffff; value -= place & ~(bfd_vma) 0xffffffff; break; + + default: + break; } + return value; } @@ -2244,7 +2251,7 @@ aarch64_type_of_stub (struct bfd_link_info *info, /* We don't want to redirect any old unconditional jump in this way, only one which is being used for a sibcall, where it is acceptable for the IP0 and IP1 registers to be clobbered. */ - if ((r_type == R_AARCH64_CALL26 || r_type == R_AARCH64_JUMP26) + if ((r_type == AARCH64_R (CALL26) || r_type == AARCH64_R (JUMP26)) && (branch_offset > AARCH64_MAX_FWD_BRANCH_OFFSET || branch_offset < AARCH64_MAX_BWD_BRANCH_OFFSET)) { @@ -2461,14 +2468,14 @@ aarch64_build_one_stub (struct bfd_hash_entry *gen_entry, switch (stub_entry->stub_type) { case aarch64_stub_adrp_branch: - if (aarch64_relocate (R_AARCH64_ADR_PREL_PG_HI21, stub_bfd, stub_sec, + if (aarch64_relocate (AARCH64_R (ADR_PREL_PG_HI21), stub_bfd, stub_sec, stub_entry->stub_offset, sym_value)) /* The stub would not have been relaxed if the offset was out of range. */ BFD_FAIL (); _bfd_final_link_relocate - (elfNN_aarch64_howto_from_type (R_AARCH64_ADD_ABS_LO12_NC), + (elfNN_aarch64_howto_from_type (AARCH64_R (ADD_ABS_LO12_NC)), stub_bfd, stub_sec, stub_sec->contents, @@ -2481,7 +2488,7 @@ aarch64_build_one_stub (struct bfd_hash_entry *gen_entry, /* We want the value relative to the address 12 bytes back from the value itself. */ _bfd_final_link_relocate (elfNN_aarch64_howto_from_type - (R_AARCH64_PREL64), stub_bfd, stub_sec, + (AARCH64_R (PRELNN)), stub_bfd, stub_sec, stub_sec->contents, stub_entry->stub_offset + 16, sym_value + 12, 0); @@ -2822,8 +2829,8 @@ elfNN_aarch64_size_stubs (bfd *output_bfd, /* Only look for stubs on unconditional branch and branch and link instructions. */ - if (r_type != (unsigned int) R_AARCH64_CALL26 - && r_type != (unsigned int) R_AARCH64_JUMP26) + if (r_type != (unsigned int) AARCH64_R (CALL26) + && r_type != (unsigned int) AARCH64_R (JUMP26)) continue; /* Now determine the call target, its name, value, @@ -3339,66 +3346,69 @@ bfd_elf_aarch64_put_addend (bfd *abfd, addend >>= howto->rightshift; - switch (howto->type) + switch (elfNN_aarch64_bfd_reloc_from_howto (howto)) { - case R_AARCH64_JUMP26: - case R_AARCH64_CALL26: + case BFD_RELOC_AARCH64_JUMP26: + case BFD_RELOC_AARCH64_CALL26: contents = reencode_branch_ofs_26 (contents, addend); break; - case R_AARCH64_CONDBR19: + case BFD_RELOC_AARCH64_BRANCH19: contents = reencode_cond_branch_ofs_19 (contents, addend); break; - case R_AARCH64_TSTBR14: + case BFD_RELOC_AARCH64_TSTBR14: contents = reencode_tst_branch_ofs_14 (contents, addend); break; - case R_AARCH64_LD_PREL_LO19: - case R_AARCH64_GOT_LD_PREL19: + case BFD_RELOC_AARCH64_LD_LO19_PCREL: + case BFD_RELOC_AARCH64_GOT_LD_PREL19: if (old_addend & ((1 << howto->rightshift) - 1)) return bfd_reloc_overflow; contents = reencode_ld_lit_ofs_19 (contents, addend); break; - case R_AARCH64_TLSDESC_CALL: + case BFD_RELOC_AARCH64_TLSDESC_CALL: break; - case R_AARCH64_TLSGD_ADR_PAGE21: - case R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21: - case R_AARCH64_TLSDESC_ADR_PAGE21: - case R_AARCH64_ADR_GOT_PAGE: - case R_AARCH64_ADR_PREL_LO21: - case R_AARCH64_ADR_PREL_PG_HI21: - case R_AARCH64_ADR_PREL_PG_HI21_NC: + case BFD_RELOC_AARCH64_TLSGD_ADR_PAGE21: + case BFD_RELOC_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21: + case BFD_RELOC_AARCH64_TLSDESC_ADR_PAGE21: + case BFD_RELOC_AARCH64_ADR_GOT_PAGE: + case BFD_RELOC_AARCH64_ADR_LO21_PCREL: + case BFD_RELOC_AARCH64_ADR_HI21_PCREL: + case BFD_RELOC_AARCH64_ADR_HI21_NC_PCREL: contents = reencode_adr_imm (contents, addend); break; - case R_AARCH64_TLSGD_ADD_LO12_NC: - case R_AARCH64_TLSLE_ADD_TPREL_LO12: - case R_AARCH64_TLSLE_ADD_TPREL_HI12: - case R_AARCH64_TLSLE_ADD_TPREL_LO12_NC: - case R_AARCH64_TLSDESC_ADD_LO12_NC: - case R_AARCH64_ADD_ABS_LO12_NC: + case BFD_RELOC_AARCH64_TLSGD_ADD_LO12_NC: + case BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12: + case BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_HI12: + case BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12_NC: + case BFD_RELOC_AARCH64_TLSDESC_ADD_LO12_NC: + case BFD_RELOC_AARCH64_ADD_LO12: /* Corresponds to: add rd, rn, #uimm12 to provide the low order 12 bits of the page offset following - R_AARCH64_ADR_PREL_PG_HI21 which computes the + BFD_RELOC_AARCH64_ADR_HI21_PCREL which computes the (pc-relative) page base. */ contents = reencode_add_imm (contents, addend); break; - case R_AARCH64_LDST8_ABS_LO12_NC: - case R_AARCH64_LDST16_ABS_LO12_NC: - case R_AARCH64_LDST32_ABS_LO12_NC: - case R_AARCH64_LDST64_ABS_LO12_NC: - case R_AARCH64_LDST128_ABS_LO12_NC: - case R_AARCH64_TLSDESC_LD64_LO12_NC: - case R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC: - case R_AARCH64_LD64_GOT_LO12_NC: + case BFD_RELOC_AARCH64_LDST8_LO12: + case BFD_RELOC_AARCH64_LDST16_LO12: + case BFD_RELOC_AARCH64_LDST32_LO12: + case BFD_RELOC_AARCH64_LDST64_LO12: + case BFD_RELOC_AARCH64_LDST128_LO12: + case BFD_RELOC_AARCH64_TLSDESC_LD64_LO12_NC: + case BFD_RELOC_AARCH64_TLSDESC_LD32_LO12_NC: + case BFD_RELOC_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC: + case BFD_RELOC_AARCH64_TLSIE_LD32_GOTTPREL_LO12_NC: + case BFD_RELOC_AARCH64_LD64_GOT_LO12_NC: + case BFD_RELOC_AARCH64_LD32_GOT_LO12_NC: if (old_addend & ((1 << howto->rightshift) - 1)) return bfd_reloc_overflow; /* Used for ldr*|str* rt, [rn, #uimm12] to provide the low order - 12 bits of the page offset following R_AARCH64_ADR_PREL_PG_HI21 + 12 bits of the page offset following BFD_RELOC_AARCH64_ADR_HI21_PCREL which computes the (pc-relative) page base. */ contents = reencode_ldst_pos_imm (contents, addend); break; @@ -3408,14 +3418,14 @@ bfd_elf_aarch64_put_addend (bfd *abfd, instruction to MOVN or MOVZ depending on sign of calculated value. */ - case R_AARCH64_TLSLE_MOVW_TPREL_G2: - case R_AARCH64_TLSLE_MOVW_TPREL_G1: - case R_AARCH64_TLSLE_MOVW_TPREL_G1_NC: - case R_AARCH64_TLSLE_MOVW_TPREL_G0: - case R_AARCH64_TLSLE_MOVW_TPREL_G0_NC: - case R_AARCH64_MOVW_SABS_G0: - case R_AARCH64_MOVW_SABS_G1: - case R_AARCH64_MOVW_SABS_G2: + case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G2: + case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1: + case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1_NC: + case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0: + case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0_NC: + case BFD_RELOC_AARCH64_MOVW_G0_S: + case BFD_RELOC_AARCH64_MOVW_G1_S: + case BFD_RELOC_AARCH64_MOVW_G2_S: /* NOTE: We can only come here with movz or movn. */ if (addend < 0) { @@ -3433,13 +3443,13 @@ bfd_elf_aarch64_put_addend (bfd *abfd, /* Group relocations to create a 16, 32, 48 or 64 bit unsigned data or abs address inline. */ - case R_AARCH64_MOVW_UABS_G0: - case R_AARCH64_MOVW_UABS_G0_NC: - case R_AARCH64_MOVW_UABS_G1: - case R_AARCH64_MOVW_UABS_G1_NC: - case R_AARCH64_MOVW_UABS_G2: - case R_AARCH64_MOVW_UABS_G2_NC: - case R_AARCH64_MOVW_UABS_G3: + case BFD_RELOC_AARCH64_MOVW_G0: + case BFD_RELOC_AARCH64_MOVW_G0_NC: + case BFD_RELOC_AARCH64_MOVW_G1: + case BFD_RELOC_AARCH64_MOVW_G1_NC: + case BFD_RELOC_AARCH64_MOVW_G2: + case BFD_RELOC_AARCH64_MOVW_G2_NC: + case BFD_RELOC_AARCH64_MOVW_G3: contents = reencode_movw_imm (contents, addend); break; @@ -3488,6 +3498,7 @@ aarch64_calculate_got_entry_vma (struct elf_link_hash_entry *h, if (h != NULL) { + BFD_ASSERT (basegot != NULL); off = h->got.offset; BFD_ASSERT (off != (bfd_vma) - 1); if (!WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h) @@ -3499,8 +3510,9 @@ aarch64_calculate_got_entry_vma (struct elf_link_hash_entry *h, /* This is actually a static link, or it is a -Bsymbolic link and the symbol is defined locally. We must initialize this entry in the global offset table. Since the offset must - always be a multiple of 8, we use the least significant bit - to record whether we have initialized it already. + always be a multiple of 8 (4 in the case of ILP32), we use + the least significant bit to record whether we have + initialized it already. When doing a dynamic link, we create a .rel(a).got relocation entry to initialize the value. This is done in the finish_dynamic_symbol routine. */ @@ -3524,72 +3536,83 @@ aarch64_calculate_got_entry_vma (struct elf_link_hash_entry *h, /* Change R_TYPE to a more efficient access model where possible, return the new reloc type. */ -static unsigned int -aarch64_tls_transition_without_check (unsigned int r_type, +static bfd_reloc_code_real_type +aarch64_tls_transition_without_check (bfd_reloc_code_real_type r_type, struct elf_link_hash_entry *h) { bfd_boolean is_local = h == NULL; + switch (r_type) { - case R_AARCH64_TLSGD_ADR_PAGE21: - case R_AARCH64_TLSDESC_ADR_PAGE21: - return is_local - ? R_AARCH64_TLSLE_MOVW_TPREL_G1 : R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21; - - case R_AARCH64_TLSGD_ADD_LO12_NC: - case R_AARCH64_TLSDESC_LD64_LO12_NC: - return is_local - ? R_AARCH64_TLSLE_MOVW_TPREL_G0_NC - : R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC; - - case R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21: - return is_local ? R_AARCH64_TLSLE_MOVW_TPREL_G1 : r_type; - - case R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC: - return is_local ? R_AARCH64_TLSLE_MOVW_TPREL_G0_NC : r_type; - - case R_AARCH64_TLSDESC_ADD_LO12_NC: - case R_AARCH64_TLSDESC_CALL: + case BFD_RELOC_AARCH64_TLSGD_ADR_PAGE21: + case BFD_RELOC_AARCH64_TLSDESC_ADR_PAGE21: + return (is_local + ? BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1 + : BFD_RELOC_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21); + + case BFD_RELOC_AARCH64_TLSGD_ADD_LO12_NC: + case BFD_RELOC_AARCH64_TLSDESC_LDNN_LO12_NC: + return (is_local + ? BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0_NC + : BFD_RELOC_AARCH64_TLSIE_LDNN_GOTTPREL_LO12_NC); + + case BFD_RELOC_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21: + return is_local ? BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1 : r_type; + + case BFD_RELOC_AARCH64_TLSIE_LDNN_GOTTPREL_LO12_NC: + return is_local ? BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0_NC : r_type; + + case BFD_RELOC_AARCH64_TLSDESC_ADD_LO12_NC: + case BFD_RELOC_AARCH64_TLSDESC_CALL: /* Instructions with these relocations will become NOPs. */ - return R_AARCH64_NONE; + return BFD_RELOC_AARCH64_NONE; + + default: + break; } return r_type; } static unsigned int -aarch64_reloc_got_type (unsigned int r_type) +aarch64_reloc_got_type (bfd_reloc_code_real_type r_type) { switch (r_type) { - case R_AARCH64_LD64_GOT_LO12_NC: - case R_AARCH64_ADR_GOT_PAGE: - case R_AARCH64_GOT_LD_PREL19: + case BFD_RELOC_AARCH64_LD64_GOT_LO12_NC: + case BFD_RELOC_AARCH64_LD32_GOT_LO12_NC: + case BFD_RELOC_AARCH64_ADR_GOT_PAGE: + case BFD_RELOC_AARCH64_GOT_LD_PREL19: return GOT_NORMAL; - case R_AARCH64_TLSGD_ADR_PAGE21: - case R_AARCH64_TLSGD_ADD_LO12_NC: + case BFD_RELOC_AARCH64_TLSGD_ADR_PAGE21: + case BFD_RELOC_AARCH64_TLSGD_ADD_LO12_NC: return GOT_TLS_GD; - case R_AARCH64_TLSDESC_ADD_LO12_NC: - case R_AARCH64_TLSDESC_ADR_PAGE21: - case R_AARCH64_TLSDESC_CALL: - case R_AARCH64_TLSDESC_LD64_LO12_NC: + case BFD_RELOC_AARCH64_TLSDESC_ADD_LO12_NC: + case BFD_RELOC_AARCH64_TLSDESC_ADR_PAGE21: + case BFD_RELOC_AARCH64_TLSDESC_CALL: + case BFD_RELOC_AARCH64_TLSDESC_LD64_LO12_NC: + case BFD_RELOC_AARCH64_TLSDESC_LD32_LO12_NC: return GOT_TLSDESC_GD; - case R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21: - case R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC: + case BFD_RELOC_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21: + case BFD_RELOC_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC: + case BFD_RELOC_AARCH64_TLSIE_LD32_GOTTPREL_LO12_NC: return GOT_TLS_IE; - case R_AARCH64_TLSLE_ADD_TPREL_HI12: - case R_AARCH64_TLSLE_ADD_TPREL_LO12: - case R_AARCH64_TLSLE_ADD_TPREL_LO12_NC: - case R_AARCH64_TLSLE_MOVW_TPREL_G0: - case R_AARCH64_TLSLE_MOVW_TPREL_G0_NC: - case R_AARCH64_TLSLE_MOVW_TPREL_G1: - case R_AARCH64_TLSLE_MOVW_TPREL_G1_NC: - case R_AARCH64_TLSLE_MOVW_TPREL_G2: + case BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_HI12: + case BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12: + case BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12_NC: + case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0: + case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0_NC: + case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1: + case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1_NC: + case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G2: return GOT_UNKNOWN; + + default: + break; } return GOT_UNKNOWN; } @@ -3597,7 +3620,7 @@ aarch64_reloc_got_type (unsigned int r_type) static bfd_boolean aarch64_can_relax_tls (bfd *input_bfd, struct bfd_link_info *info, - unsigned int r_type, + bfd_reloc_code_real_type r_type, struct elf_link_hash_entry *h, unsigned long r_symndx) { @@ -3622,21 +3645,27 @@ aarch64_can_relax_tls (bfd *input_bfd, return TRUE; } -static unsigned int +/* Given the relocation code R_TYPE, return the relaxed bfd reloc + enumerator. */ + +static bfd_reloc_code_real_type aarch64_tls_transition (bfd *input_bfd, struct bfd_link_info *info, unsigned int r_type, struct elf_link_hash_entry *h, unsigned long r_symndx) { - if (! aarch64_can_relax_tls (input_bfd, info, r_type, h, r_symndx)) - return r_type; + bfd_reloc_code_real_type bfd_r_type + = elfNN_aarch64_bfd_reloc_from_type (r_type); - return aarch64_tls_transition_without_check (r_type, h); + if (! aarch64_can_relax_tls (input_bfd, info, bfd_r_type, h, r_symndx)) + return bfd_r_type; + + return aarch64_tls_transition_without_check (bfd_r_type, h); } /* Return the base VMA address which should be subtracted from real addresses - when resolving R_AARCH64_TLS_DTPREL64 relocation. */ + when resolving R_AARCH64_TLS_DTPREL relocation. */ static bfd_vma dtpoff_base (struct bfd_link_info *info) @@ -3646,7 +3675,6 @@ dtpoff_base (struct bfd_link_info *info) return elf_hash_table (info)->tls_sec->vma; } - /* Return the base VMA address which should be subtracted from real addresses when resolving R_AARCH64_TLS_GOTTPREL64 relocations. */ @@ -3778,6 +3806,9 @@ elfNN_aarch64_final_link_relocate (reloc_howto_type *howto, bfd_vma *saved_addend) { unsigned int r_type = howto->type; + bfd_reloc_code_real_type bfd_r_type + = elfNN_aarch64_bfd_reloc_from_howto (howto); + bfd_reloc_code_real_type new_bfd_r_type; unsigned long r_symndx; bfd_byte *hit_data = contents + rel->r_offset; bfd_vma place; @@ -3793,10 +3824,14 @@ elfNN_aarch64_final_link_relocate (reloc_howto_type *howto, /* It is possible to have linker relaxations on some TLS access models. Update our information here. */ - r_type = aarch64_tls_transition (input_bfd, info, r_type, h, r_symndx); - - if (r_type != howto->type) - howto = elfNN_aarch64_howto_from_type (r_type); + new_bfd_r_type = aarch64_tls_transition (input_bfd, info, r_type, h, r_symndx); + if (new_bfd_r_type != bfd_r_type) + { + bfd_r_type = new_bfd_r_type; + howto = elfNN_aarch64_howto_from_bfd_reloc (bfd_r_type); + BFD_ASSERT (howto != NULL); + r_type = howto->type; + } place = input_section->output_section->vma + input_section->output_offset + rel->r_offset; @@ -3808,15 +3843,15 @@ elfNN_aarch64_final_link_relocate (reloc_howto_type *howto, weak_undef_p = (h ? h->root.type == bfd_link_hash_undefweak : bfd_is_und_section (sym_sec)); - switch (r_type) + + switch (bfd_r_type) { - case R_AARCH64_NONE: - case R_AARCH64_NULL: - case R_AARCH64_TLSDESC_CALL: + case BFD_RELOC_AARCH64_NONE: + case BFD_RELOC_AARCH64_TLSDESC_CALL: *unresolved_reloc_p = FALSE; return bfd_reloc_ok; - case R_AARCH64_ABS64: + case BFD_RELOC_AARCH64_NN: /* When generating a shared object or relocatable executable, these relocations are copied into the output file to be resolved at @@ -3871,7 +3906,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; - outrel.r_info = ELFNN_R_INFO (symbol, R_AARCH64_RELATIVE); + outrel.r_info = ELFNN_R_INFO (symbol, AARCH64_R (RELATIVE)); outrel.r_addend += value; } @@ -3900,8 +3935,8 @@ elfNN_aarch64_final_link_relocate (reloc_howto_type *howto, value += signed_addend; break; - case R_AARCH64_JUMP26: - case R_AARCH64_CALL26: + case BFD_RELOC_AARCH64_JUMP26: + case BFD_RELOC_AARCH64_CALL26: { asection *splt = globals->root.splt; bfd_boolean via_plt_p = @@ -3954,40 +3989,43 @@ elfNN_aarch64_final_link_relocate (reloc_howto_type *howto, signed_addend, weak_undef_p); break; - case R_AARCH64_ABS16: - case R_AARCH64_ABS32: - case R_AARCH64_ADD_ABS_LO12_NC: - case R_AARCH64_ADR_PREL_LO21: - case R_AARCH64_ADR_PREL_PG_HI21: - case R_AARCH64_ADR_PREL_PG_HI21_NC: - case R_AARCH64_CONDBR19: - case R_AARCH64_LD_PREL_LO19: - case R_AARCH64_LDST8_ABS_LO12_NC: - case R_AARCH64_LDST16_ABS_LO12_NC: - case R_AARCH64_LDST32_ABS_LO12_NC: - case R_AARCH64_LDST64_ABS_LO12_NC: - case R_AARCH64_LDST128_ABS_LO12_NC: - case R_AARCH64_MOVW_SABS_G0: - case R_AARCH64_MOVW_SABS_G1: - case R_AARCH64_MOVW_SABS_G2: - case R_AARCH64_MOVW_UABS_G0: - case R_AARCH64_MOVW_UABS_G0_NC: - case R_AARCH64_MOVW_UABS_G1: - case R_AARCH64_MOVW_UABS_G1_NC: - case R_AARCH64_MOVW_UABS_G2: - case R_AARCH64_MOVW_UABS_G2_NC: - case R_AARCH64_MOVW_UABS_G3: - case R_AARCH64_PREL16: - case R_AARCH64_PREL32: - case R_AARCH64_PREL64: - case R_AARCH64_TSTBR14: + case BFD_RELOC_AARCH64_16: +#if ARCH_SIZE == 64 + case BFD_RELOC_AARCH64_32: +#endif + case BFD_RELOC_AARCH64_ADD_LO12: + case BFD_RELOC_AARCH64_ADR_LO21_PCREL: + case BFD_RELOC_AARCH64_ADR_HI21_PCREL: + case BFD_RELOC_AARCH64_ADR_HI21_NC_PCREL: + case BFD_RELOC_AARCH64_BRANCH19: + case BFD_RELOC_AARCH64_LD_LO19_PCREL: + case BFD_RELOC_AARCH64_LDST8_LO12: + case BFD_RELOC_AARCH64_LDST16_LO12: + case BFD_RELOC_AARCH64_LDST32_LO12: + case BFD_RELOC_AARCH64_LDST64_LO12: + case BFD_RELOC_AARCH64_LDST128_LO12: + case BFD_RELOC_AARCH64_MOVW_G0_S: + case BFD_RELOC_AARCH64_MOVW_G1_S: + case BFD_RELOC_AARCH64_MOVW_G2_S: + case BFD_RELOC_AARCH64_MOVW_G0: + case BFD_RELOC_AARCH64_MOVW_G0_NC: + case BFD_RELOC_AARCH64_MOVW_G1: + case BFD_RELOC_AARCH64_MOVW_G1_NC: + case BFD_RELOC_AARCH64_MOVW_G2: + case BFD_RELOC_AARCH64_MOVW_G2_NC: + case BFD_RELOC_AARCH64_MOVW_G3: + case BFD_RELOC_AARCH64_16_PCREL: + case BFD_RELOC_AARCH64_32_PCREL: + case BFD_RELOC_AARCH64_64_PCREL: + case BFD_RELOC_AARCH64_TSTBR14: value = aarch64_resolve_relocation (r_type, place, value, signed_addend, weak_undef_p); break; - case R_AARCH64_LD64_GOT_LO12_NC: - case R_AARCH64_ADR_GOT_PAGE: - case R_AARCH64_GOT_LD_PREL19: + case BFD_RELOC_AARCH64_LD64_GOT_LO12_NC: + case BFD_RELOC_AARCH64_LD32_GOT_LO12_NC: + case BFD_RELOC_AARCH64_ADR_GOT_PAGE: + case BFD_RELOC_AARCH64_GOT_LD_PREL19: if (globals->root.sgot == NULL) BFD_ASSERT (h != NULL); @@ -4001,10 +4039,11 @@ elfNN_aarch64_final_link_relocate (reloc_howto_type *howto, } break; - case R_AARCH64_TLSGD_ADR_PAGE21: - case R_AARCH64_TLSGD_ADD_LO12_NC: - case R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21: - case R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC: + case BFD_RELOC_AARCH64_TLSGD_ADR_PAGE21: + case BFD_RELOC_AARCH64_TLSGD_ADD_LO12_NC: + case BFD_RELOC_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21: + case BFD_RELOC_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC: + case BFD_RELOC_AARCH64_TLSIE_LD32_GOTTPREL_LO12_NC: if (globals->root.sgot == NULL) return bfd_reloc_notsupported; @@ -4017,24 +4056,25 @@ elfNN_aarch64_final_link_relocate (reloc_howto_type *howto, *unresolved_reloc_p = FALSE; break; - case R_AARCH64_TLSLE_ADD_TPREL_HI12: - case R_AARCH64_TLSLE_ADD_TPREL_LO12: - case R_AARCH64_TLSLE_ADD_TPREL_LO12_NC: - case R_AARCH64_TLSLE_MOVW_TPREL_G0: - case R_AARCH64_TLSLE_MOVW_TPREL_G0_NC: - case R_AARCH64_TLSLE_MOVW_TPREL_G1: - case R_AARCH64_TLSLE_MOVW_TPREL_G1_NC: - case R_AARCH64_TLSLE_MOVW_TPREL_G2: + case BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_HI12: + case BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12: + case BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12_NC: + case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0: + case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0_NC: + case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1: + case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1_NC: + case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G2: value = aarch64_resolve_relocation (r_type, place, value, signed_addend - tpoff_base (info), weak_undef_p); *unresolved_reloc_p = FALSE; break; - case R_AARCH64_TLSDESC_ADR_PAGE21: - case R_AARCH64_TLSDESC_LD64_LO12_NC: - case R_AARCH64_TLSDESC_ADD_LO12_NC: - case R_AARCH64_TLSDESC_ADD: - case R_AARCH64_TLSDESC_LDR: + case BFD_RELOC_AARCH64_TLSDESC_ADR_PAGE21: + case BFD_RELOC_AARCH64_TLSDESC_LD64_LO12_NC: + case BFD_RELOC_AARCH64_TLSDESC_LD32_LO12_NC: + case BFD_RELOC_AARCH64_TLSDESC_ADD_LO12_NC: + case BFD_RELOC_AARCH64_TLSDESC_ADD: + case BFD_RELOC_AARCH64_TLSDESC_LDR: if (globals->root.sgot == NULL) return bfd_reloc_notsupported; @@ -4081,10 +4121,10 @@ elfNN_aarch64_tls_relax (struct elf_aarch64_link_hash_table *globals, BFD_ASSERT (globals && input_bfd && contents && rel); - switch (r_type) + switch (elfNN_aarch64_bfd_reloc_from_type (r_type)) { - case R_AARCH64_TLSGD_ADR_PAGE21: - case R_AARCH64_TLSDESC_ADR_PAGE21: + case BFD_RELOC_AARCH64_TLSGD_ADR_PAGE21: + case BFD_RELOC_AARCH64_TLSDESC_ADR_PAGE21: if (is_local) { /* GD->LE relaxation: @@ -4106,7 +4146,7 @@ elfNN_aarch64_tls_relax (struct elf_aarch64_link_hash_table *globals, return bfd_reloc_continue; } - case R_AARCH64_TLSDESC_LD64_LO12_NC: + case BFD_RELOC_AARCH64_TLSDESC_LDNN_LO12_NC: if (is_local) { /* GD->LE relaxation: @@ -4126,7 +4166,7 @@ elfNN_aarch64_tls_relax (struct elf_aarch64_link_hash_table *globals, return bfd_reloc_continue; } - case R_AARCH64_TLSGD_ADD_LO12_NC: + case BFD_RELOC_AARCH64_TLSGD_ADD_LO12_NC: if (is_local) { /* GD->LE relaxation @@ -4153,7 +4193,7 @@ elfNN_aarch64_tls_relax (struct elf_aarch64_link_hash_table *globals, NOP => add x0, x1, x0 */ - BFD_ASSERT (ELFNN_R_TYPE (rel[1].r_info) == R_AARCH64_CALL26); + BFD_ASSERT (ELFNN_R_TYPE (rel[1].r_info) == AARCH64_R (CALL26)); /* Remove the relocation on the BL instruction. */ rel[1].r_info = ELFNN_R_INFO (STN_UNDEF, R_AARCH64_NONE); @@ -4168,8 +4208,8 @@ elfNN_aarch64_tls_relax (struct elf_aarch64_link_hash_table *globals, return bfd_reloc_continue; } - case R_AARCH64_TLSDESC_ADD_LO12_NC: - case R_AARCH64_TLSDESC_CALL: + case BFD_RELOC_AARCH64_TLSDESC_ADD_LO12_NC: + case BFD_RELOC_AARCH64_TLSDESC_CALL: /* GD->IE/LE relaxation: add x0, x0, #:tlsdesc_lo12:var => nop blr xd => nop @@ -4177,7 +4217,7 @@ elfNN_aarch64_tls_relax (struct elf_aarch64_link_hash_table *globals, bfd_putl32 (INSN_NOP, contents + rel->r_offset); return bfd_reloc_ok; - case R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21: + case BFD_RELOC_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21: /* IE->LE relaxation: adrp xd, :gottprel:var => movz xd, :tprel_g1:var */ @@ -4188,7 +4228,7 @@ elfNN_aarch64_tls_relax (struct elf_aarch64_link_hash_table *globals, } return bfd_reloc_continue; - case R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC: + case BFD_RELOC_AARCH64_TLSIE_LDNN_GOTTPREL_LO12_NC: /* IE->LE relaxation: ldr xd, [xm, #:gottprel_lo12:var] => movk xd, :tprel_g0_nc:var */ @@ -4237,7 +4277,8 @@ elfNN_aarch64_relocate_section (bfd *output_bfd, for (; rel < relend; rel++) { unsigned int r_type; - unsigned int relaxed_r_type; + bfd_reloc_code_real_type bfd_r_type; + bfd_reloc_code_real_type relaxed_bfd_r_type; reloc_howto_type *howto; unsigned long r_symndx; Elf_Internal_Sym *sym; @@ -4263,6 +4304,7 @@ elfNN_aarch64_relocate_section (bfd *output_bfd, input_bfd, input_section, r_type); return FALSE; } + bfd_r_type = elfNN_aarch64_bfd_reloc_from_howto (howto); h = NULL; sym = NULL; @@ -4333,7 +4375,7 @@ elfNN_aarch64_relocate_section (bfd *output_bfd, && (h == NULL || h->root.type == bfd_link_hash_defined || h->root.type == bfd_link_hash_defweak) - && IS_AARCH64_TLS_RELOC (r_type) != (sym_type == STT_TLS)) + && IS_AARCH64_TLS_RELOC (bfd_r_type) != (sym_type == STT_TLS)) { (*_bfd_error_handler) ((sym_type == STT_TLS @@ -4343,19 +4385,19 @@ elfNN_aarch64_relocate_section (bfd *output_bfd, input_section, (long) rel->r_offset, howto->name, name); } - /* We relax only if we can see that there can be a valid transition from a reloc type to another. We call elfNN_aarch64_final_link_relocate unless we're completely done, i.e., the relaxation produced the final output we want. */ - relaxed_r_type = aarch64_tls_transition (input_bfd, info, r_type, - h, r_symndx); - if (relaxed_r_type != r_type) + relaxed_bfd_r_type = aarch64_tls_transition (input_bfd, info, r_type, + h, r_symndx); + if (relaxed_bfd_r_type != bfd_r_type) { - r_type = relaxed_r_type; - howto = elfNN_aarch64_howto_from_type (r_type); - + bfd_r_type = relaxed_bfd_r_type; + howto = elfNN_aarch64_howto_from_bfd_reloc (bfd_r_type); + BFD_ASSERT (howto != NULL); + r_type = howto->type; r = elfNN_aarch64_tls_relax (globals, input_bfd, contents, rel, h); unresolved_reloc = 0; } @@ -4380,10 +4422,10 @@ elfNN_aarch64_relocate_section (bfd *output_bfd, h, &unresolved_reloc, save_addend, &addend); - switch (r_type) + switch (elfNN_aarch64_bfd_reloc_from_type (r_type)) { - case R_AARCH64_TLSGD_ADR_PAGE21: - case R_AARCH64_TLSGD_ADD_LO12_NC: + case BFD_RELOC_AARCH64_TLSGD_ADR_PAGE21: + case BFD_RELOC_AARCH64_TLSGD_ADD_LO12_NC: if (! symbol_got_offset_mark_p (input_bfd, h, r_symndx)) { bfd_boolean need_relocs = FALSE; @@ -4405,7 +4447,7 @@ elfNN_aarch64_relocate_section (bfd *output_bfd, if (need_relocs) { Elf_Internal_Rela rela; - rela.r_info = ELFNN_R_INFO (indx, R_AARCH64_TLS_DTPMOD64); + rela.r_info = ELFNN_R_INFO (indx, AARCH64_R (TLS_DTPMOD)); rela.r_addend = 0; rela.r_offset = globals->root.sgot->output_section->vma + globals->root.sgot->output_offset + off; @@ -4429,7 +4471,7 @@ elfNN_aarch64_relocate_section (bfd *output_bfd, relocation to fixup the tls offset at load time. */ rela.r_info = - ELFNN_R_INFO (indx, R_AARCH64_TLS_DTPREL64); + ELFNN_R_INFO (indx, AARCH64_R (TLS_DTPREL)); rela.r_addend = 0; rela.r_offset = (globals->root.sgot->output_section->vma @@ -4459,8 +4501,8 @@ elfNN_aarch64_relocate_section (bfd *output_bfd, } break; - case R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21: - case R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC: + case BFD_RELOC_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21: + case BFD_RELOC_AARCH64_TLSIE_LDNN_GOTTPREL_LO12_NC: if (! symbol_got_offset_mark_p (input_bfd, h, r_symndx)) { bfd_boolean need_relocs = FALSE; @@ -4489,7 +4531,7 @@ elfNN_aarch64_relocate_section (bfd *output_bfd, else rela.r_addend = 0; - rela.r_info = ELFNN_R_INFO (indx, R_AARCH64_TLS_TPREL64); + rela.r_info = ELFNN_R_INFO (indx, AARCH64_R (TLS_TPREL)); rela.r_offset = globals->root.sgot->output_section->vma + globals->root.sgot->output_offset + off; @@ -4510,19 +4552,19 @@ elfNN_aarch64_relocate_section (bfd *output_bfd, } break; - case R_AARCH64_TLSLE_ADD_TPREL_LO12: - case R_AARCH64_TLSLE_ADD_TPREL_HI12: - case R_AARCH64_TLSLE_ADD_TPREL_LO12_NC: - case R_AARCH64_TLSLE_MOVW_TPREL_G2: - case R_AARCH64_TLSLE_MOVW_TPREL_G1: - case R_AARCH64_TLSLE_MOVW_TPREL_G1_NC: - case R_AARCH64_TLSLE_MOVW_TPREL_G0: - case R_AARCH64_TLSLE_MOVW_TPREL_G0_NC: + case BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12: + case BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_HI12: + case BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12_NC: + case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G2: + case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1: + case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1_NC: + case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0: + case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0_NC: break; - case R_AARCH64_TLSDESC_ADR_PAGE21: - case R_AARCH64_TLSDESC_LD64_LO12_NC: - case R_AARCH64_TLSDESC_ADD_LO12_NC: + case BFD_RELOC_AARCH64_TLSDESC_ADR_PAGE21: + case BFD_RELOC_AARCH64_TLSDESC_LDNN_LO12_NC: + case BFD_RELOC_AARCH64_TLSDESC_ADD_LO12_NC: if (! symbol_tlsdesc_got_offset_mark_p (input_bfd, h, r_symndx)) { bfd_boolean need_relocs = FALSE; @@ -4540,7 +4582,8 @@ elfNN_aarch64_relocate_section (bfd *output_bfd, { bfd_byte *loc; Elf_Internal_Rela rela; - rela.r_info = ELFNN_R_INFO (indx, R_AARCH64_TLSDESC); + rela.r_info = ELFNN_R_INFO (indx, AARCH64_R (TLSDESC)); + rela.r_addend = 0; rela.r_offset = (globals->root.sgotplt->output_section->vma + globals->root.sgotplt->output_offset @@ -4575,6 +4618,8 @@ elfNN_aarch64_relocate_section (bfd *output_bfd, symbol_tlsdesc_got_offset_mark (input_bfd, h, r_symndx); } break; + default: + break; } if (!save_addend) @@ -4894,28 +4939,30 @@ elfNN_aarch64_gc_sweep_hook (bfd *abfd, } r_type = ELFNN_R_TYPE (rel->r_info); - r_type = aarch64_tls_transition (abfd,info, r_type, h ,r_symndx); - switch (r_type) + switch (aarch64_tls_transition (abfd,info, r_type, h ,r_symndx)) { - case R_AARCH64_LD64_GOT_LO12_NC: - case R_AARCH64_GOT_LD_PREL19: - case R_AARCH64_ADR_GOT_PAGE: - case R_AARCH64_TLSGD_ADR_PAGE21: - case R_AARCH64_TLSGD_ADD_LO12_NC: - case R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21: - case R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC: - case R_AARCH64_TLSLE_ADD_TPREL_LO12: - case R_AARCH64_TLSLE_ADD_TPREL_HI12: - case R_AARCH64_TLSLE_ADD_TPREL_LO12_NC: - case R_AARCH64_TLSLE_MOVW_TPREL_G2: - case R_AARCH64_TLSLE_MOVW_TPREL_G1: - case R_AARCH64_TLSLE_MOVW_TPREL_G1_NC: - case R_AARCH64_TLSLE_MOVW_TPREL_G0: - case R_AARCH64_TLSLE_MOVW_TPREL_G0_NC: - case R_AARCH64_TLSDESC_ADR_PAGE21: - case R_AARCH64_TLSDESC_ADD_LO12_NC: - case R_AARCH64_TLSDESC_LD64_LO12_NC: - if (h != NULL) + case BFD_RELOC_AARCH64_LD64_GOT_LO12_NC: + case BFD_RELOC_AARCH64_LD32_GOT_LO12_NC: + case BFD_RELOC_AARCH64_GOT_LD_PREL19: + case BFD_RELOC_AARCH64_ADR_GOT_PAGE: + case BFD_RELOC_AARCH64_TLSGD_ADR_PAGE21: + case BFD_RELOC_AARCH64_TLSGD_ADD_LO12_NC: + case BFD_RELOC_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21: + case BFD_RELOC_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC: + case BFD_RELOC_AARCH64_TLSIE_LD32_GOTTPREL_LO12_NC: + case BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12: + case BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_HI12: + case BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12_NC: + case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G2: + case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1: + case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1_NC: + case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0: + case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0_NC: + case BFD_RELOC_AARCH64_TLSDESC_ADR_PAGE21: + case BFD_RELOC_AARCH64_TLSDESC_ADD_LO12_NC: + case BFD_RELOC_AARCH64_TLSDESC_LD64_LO12_NC: + case BFD_RELOC_AARCH64_TLSDESC_LD32_LO12_NC: + if (h != NULL) { if (h->got.refcount > 0) h->got.refcount -= 1; @@ -4927,9 +4974,9 @@ elfNN_aarch64_gc_sweep_hook (bfd *abfd, } break; - case R_AARCH64_ADR_PREL_PG_HI21_NC: - case R_AARCH64_ADR_PREL_PG_HI21: - case R_AARCH64_ADR_PREL_LO21: + case BFD_RELOC_AARCH64_ADR_HI21_NC_PCREL: + case BFD_RELOC_AARCH64_ADR_HI21_PCREL: + case BFD_RELOC_AARCH64_ADR_LO21_PCREL: if (h != NULL && info->executable) { if (h->plt.refcount > 0) @@ -4937,10 +4984,10 @@ elfNN_aarch64_gc_sweep_hook (bfd *abfd, } break; - case R_AARCH64_CALL26: - case R_AARCH64_JUMP26: - /* If this is a local symbol then we resolve it - directly without creating a PLT entry. */ + case BFD_RELOC_AARCH64_CALL26: + case BFD_RELOC_AARCH64_JUMP26: + /* If this is a local symbol then we resolve it + directly without creating a PLT entry. */ if (h == NULL) continue; @@ -4948,7 +4995,7 @@ elfNN_aarch64_gc_sweep_hook (bfd *abfd, h->plt.refcount -= 1; break; - case R_AARCH64_ABS64: + case BFD_RELOC_AARCH64_NN: if (h != NULL && info->executable) { if (h->plt.refcount > 0) @@ -5114,6 +5161,7 @@ elfNN_aarch64_check_relocs (bfd *abfd, struct bfd_link_info *info, struct elf_link_hash_entry *h; unsigned long r_symndx; unsigned int r_type; + bfd_reloc_code_real_type bfd_r_type; r_symndx = ELFNN_R_SYM (rel->r_info); r_type = ELFNN_R_TYPE (rel->r_info); @@ -5140,11 +5188,11 @@ elfNN_aarch64_check_relocs (bfd *abfd, struct bfd_link_info *info, } /* Could be done earlier, if h were already available. */ - r_type = aarch64_tls_transition (abfd, info, r_type, h, r_symndx); + bfd_r_type = aarch64_tls_transition (abfd, info, r_type, h, r_symndx); - switch (r_type) + switch (bfd_r_type) { - case R_AARCH64_ABS64: + case BFD_RELOC_AARCH64_NN: /* We don't need to handle relocs into sections not going into the "real" output. */ @@ -5237,29 +5285,32 @@ elfNN_aarch64_check_relocs (bfd *abfd, struct bfd_link_info *info, /* RR: We probably want to keep a consistency check that there are no dangling GOT_PAGE relocs. */ - case R_AARCH64_LD64_GOT_LO12_NC: - case R_AARCH64_GOT_LD_PREL19: - case R_AARCH64_ADR_GOT_PAGE: - case R_AARCH64_TLSGD_ADR_PAGE21: - case R_AARCH64_TLSGD_ADD_LO12_NC: - case R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21: - case R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC: - case R_AARCH64_TLSLE_ADD_TPREL_LO12: - case R_AARCH64_TLSLE_ADD_TPREL_HI12: - case R_AARCH64_TLSLE_ADD_TPREL_LO12_NC: - case R_AARCH64_TLSLE_MOVW_TPREL_G2: - case R_AARCH64_TLSLE_MOVW_TPREL_G1: - case R_AARCH64_TLSLE_MOVW_TPREL_G1_NC: - case R_AARCH64_TLSLE_MOVW_TPREL_G0: - case R_AARCH64_TLSLE_MOVW_TPREL_G0_NC: - case R_AARCH64_TLSDESC_ADR_PAGE21: - case R_AARCH64_TLSDESC_ADD_LO12_NC: - case R_AARCH64_TLSDESC_LD64_LO12_NC: + case BFD_RELOC_AARCH64_LD64_GOT_LO12_NC: + case BFD_RELOC_AARCH64_LD32_GOT_LO12_NC: + case BFD_RELOC_AARCH64_GOT_LD_PREL19: + case BFD_RELOC_AARCH64_ADR_GOT_PAGE: + case BFD_RELOC_AARCH64_TLSGD_ADR_PAGE21: + case BFD_RELOC_AARCH64_TLSGD_ADD_LO12_NC: + case BFD_RELOC_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21: + case BFD_RELOC_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC: + case BFD_RELOC_AARCH64_TLSIE_LD32_GOTTPREL_LO12_NC: + case BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12: + case BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_HI12: + case BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12_NC: + case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G2: + case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1: + case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1_NC: + case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0: + case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0_NC: + case BFD_RELOC_AARCH64_TLSDESC_ADR_PAGE21: + case BFD_RELOC_AARCH64_TLSDESC_ADD_LO12_NC: + case BFD_RELOC_AARCH64_TLSDESC_LD64_LO12_NC: + case BFD_RELOC_AARCH64_TLSDESC_LD32_LO12_NC: { unsigned got_type; unsigned old_got_type; - got_type = aarch64_reloc_got_type (r_type); + got_type = aarch64_reloc_got_type (bfd_r_type); if (h) { @@ -5322,9 +5373,9 @@ elfNN_aarch64_check_relocs (bfd *abfd, struct bfd_link_info *info, break; } - case R_AARCH64_ADR_PREL_PG_HI21_NC: - case R_AARCH64_ADR_PREL_PG_HI21: - case R_AARCH64_ADR_PREL_LO21: + case BFD_RELOC_AARCH64_ADR_HI21_NC_PCREL: + case BFD_RELOC_AARCH64_ADR_HI21_PCREL: + case BFD_RELOC_AARCH64_ADR_LO21_PCREL: if (h != NULL && info->executable) { /* If this reloc is in a read-only section, we might @@ -5342,8 +5393,8 @@ elfNN_aarch64_check_relocs (bfd *abfd, struct bfd_link_info *info, relocations in shared libraries. */ break; - case R_AARCH64_CALL26: - case R_AARCH64_JUMP26: + case BFD_RELOC_AARCH64_CALL26: + case BFD_RELOC_AARCH64_JUMP26: /* If this is a local symbol then we resolve it directly without creating a PLT entry. */ if (h == NULL) @@ -5352,8 +5403,12 @@ elfNN_aarch64_check_relocs (bfd *abfd, struct bfd_link_info *info, h->needs_plt = 1; h->plt.refcount += 1; break; + + default: + break; } } + return TRUE; } @@ -5511,11 +5566,11 @@ elfNN_aarch64_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSE { switch ((int) ELFNN_R_TYPE (rela->r_info)) { - case R_AARCH64_RELATIVE: + case AARCH64_R (RELATIVE): return reloc_class_relative; - case R_AARCH64_JUMP_SLOT: + case AARCH64_R (JUMP_SLOT): return reloc_class_plt; - case R_AARCH64_COPY: + case AARCH64_R (COPY): return reloc_class_copy; default: return reloc_class_normal; @@ -6496,8 +6551,6 @@ elfNN_aarch64_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED, #undef add_dynamic_entry return TRUE; - - } static inline void @@ -6539,18 +6592,18 @@ elfNN_aarch64_create_small_pltn_entry (struct elf_link_hash_entry *h, /* Fill in the top 21 bits for this: ADRP x16, PLT_GOT + n * 8. ADRP: ((PG(S+A)-PG(P)) >> 12) & 0x1fffff */ - elf64_aarch64_update_plt_entry (output_bfd, R_AARCH64_ADR_PREL_PG_HI21, + elf64_aarch64_update_plt_entry (output_bfd, AARCH64_R (ADR_PREL_PG_HI21), plt_entry, PG (gotplt_entry_address) - PG (plt_entry_address)); /* Fill in the lo12 bits for the load from the pltgot. */ - elf64_aarch64_update_plt_entry (output_bfd, R_AARCH64_LDST64_ABS_LO12_NC, + elf64_aarch64_update_plt_entry (output_bfd, AARCH64_R (LDSTNN_ABS_LO12_NC), plt_entry + 4, PG_OFFSET (gotplt_entry_address)); /* Fill in the the lo12 bits for the add from the pltgot entry. */ - elf64_aarch64_update_plt_entry (output_bfd, R_AARCH64_ADD_ABS_LO12_NC, + elf64_aarch64_update_plt_entry (output_bfd, AARCH64_R (ADD_ABS_LO12_NC), plt_entry + 8, PG_OFFSET (gotplt_entry_address)); @@ -6669,7 +6722,7 @@ elfNN_aarch64_finish_dynamic_symbol (bfd *output_bfd, return FALSE; BFD_ASSERT ((h->got.offset & 1) != 0); - rela.r_info = ELFNN_R_INFO (0, R_AARCH64_RELATIVE); + rela.r_info = ELFNN_R_INFO (0, AARCH64_R (RELATIVE)); rela.r_addend = (h->root.u.def.value + h->root.u.def.section->output_section->vma + h->root.u.def.section->output_offset); @@ -6679,7 +6732,7 @@ elfNN_aarch64_finish_dynamic_symbol (bfd *output_bfd, BFD_ASSERT ((h->got.offset & 1) == 0); bfd_put_NN (output_bfd, (bfd_vma) 0, htab->root.sgot->contents + h->got.offset); - rela.r_info = ELFNN_R_INFO (h->dynindx, R_AARCH64_GLOB_DAT); + rela.r_info = ELFNN_R_INFO (h->dynindx, AARCH64_R (GLOB_DAT)); rela.r_addend = 0; } @@ -6704,7 +6757,7 @@ elfNN_aarch64_finish_dynamic_symbol (bfd *output_bfd, rela.r_offset = (h->root.u.def.value + h->root.u.def.section->output_section->vma + h->root.u.def.section->output_offset); - rela.r_info = ELFNN_R_INFO (h->dynindx, R_AARCH64_COPY); + rela.r_info = ELFNN_R_INFO (h->dynindx, AARCH64_R (COPY)); rela.r_addend = 0; loc = htab->srelbss->contents; loc += htab->srelbss->reloc_count++ * RELOC_SIZE (htab); @@ -6758,15 +6811,15 @@ elfNN_aarch64_init_small_plt0_entry (bfd *output_bfd ATTRIBUTE_UNUSED, /* Fill in the top 21 bits for this: ADRP x16, PLT_GOT + n * 8. ADRP: ((PG(S+A)-PG(P)) >> 12) & 0x1fffff */ - elf64_aarch64_update_plt_entry (output_bfd, R_AARCH64_ADR_PREL_PG_HI21, + elf64_aarch64_update_plt_entry (output_bfd, AARCH64_R (ADR_PREL_PG_HI21), htab->root.splt->contents + 4, PG (plt_got_base + 16) - PG (plt_base + 4)); - elf64_aarch64_update_plt_entry (output_bfd, R_AARCH64_LDST64_ABS_LO12_NC, + elf64_aarch64_update_plt_entry (output_bfd, AARCH64_R (LDSTNN_ABS_LO12_NC), htab->root.splt->contents + 8, PG_OFFSET (plt_got_base + 16)); - elf64_aarch64_update_plt_entry (output_bfd, R_AARCH64_ADD_ABS_LO12_NC, + elf64_aarch64_update_plt_entry (output_bfd, AARCH64_R (ADD_ABS_LO12_NC), htab->root.splt->contents + 12, PG_OFFSET (plt_got_base + 16)); } diff --git a/bfd/libbfd.h b/bfd/libbfd.h index 9450729062..274b49d803 100644 --- a/bfd/libbfd.h +++ b/bfd/libbfd.h @@ -2524,64 +2524,84 @@ static const char *const bfd_reloc_code_real_names[] = { "@@uninitialized@@", "BFD_RELOC_MICROBLAZE_64_TLSDTPREL", "BFD_RELOC_MICROBLAZE_64_TLSGOTTPREL", "BFD_RELOC_MICROBLAZE_64_TLSTPREL", - "BFD_RELOC_AARCH64_ADD_LO12", - "BFD_RELOC_AARCH64_GOT_LD_PREL19", - "BFD_RELOC_AARCH64_ADR_GOT_PAGE", + "BFD_RELOC_AARCH64_RELOC_START", + "BFD_RELOC_AARCH64_NONE", + "BFD_RELOC_AARCH64_64", + "BFD_RELOC_AARCH64_32", + "BFD_RELOC_AARCH64_16", + "BFD_RELOC_AARCH64_64_PCREL", + "BFD_RELOC_AARCH64_32_PCREL", + "BFD_RELOC_AARCH64_16_PCREL", + "BFD_RELOC_AARCH64_MOVW_G0", + "BFD_RELOC_AARCH64_MOVW_G0_NC", + "BFD_RELOC_AARCH64_MOVW_G1", + "BFD_RELOC_AARCH64_MOVW_G1_NC", + "BFD_RELOC_AARCH64_MOVW_G2", + "BFD_RELOC_AARCH64_MOVW_G2_NC", + "BFD_RELOC_AARCH64_MOVW_G3", + "BFD_RELOC_AARCH64_MOVW_G0_S", + "BFD_RELOC_AARCH64_MOVW_G1_S", + "BFD_RELOC_AARCH64_MOVW_G2_S", + "BFD_RELOC_AARCH64_LD_LO19_PCREL", + "BFD_RELOC_AARCH64_ADR_LO21_PCREL", "BFD_RELOC_AARCH64_ADR_HI21_PCREL", "BFD_RELOC_AARCH64_ADR_HI21_NC_PCREL", - "BFD_RELOC_AARCH64_ADR_LO21_PCREL", + "BFD_RELOC_AARCH64_ADD_LO12", + "BFD_RELOC_AARCH64_LDST8_LO12", + "BFD_RELOC_AARCH64_TSTBR14", "BFD_RELOC_AARCH64_BRANCH19", - "BFD_RELOC_AARCH64_CALL26", - "BFD_RELOC_AARCH64_GAS_INTERNAL_FIXUP", "BFD_RELOC_AARCH64_JUMP26", - "BFD_RELOC_AARCH64_LD_LO19_PCREL", - "BFD_RELOC_AARCH64_LD64_GOT_LO12_NC", - "BFD_RELOC_AARCH64_LDST_LO12", - "BFD_RELOC_AARCH64_LDST8_LO12", + "BFD_RELOC_AARCH64_CALL26", "BFD_RELOC_AARCH64_LDST16_LO12", "BFD_RELOC_AARCH64_LDST32_LO12", "BFD_RELOC_AARCH64_LDST64_LO12", "BFD_RELOC_AARCH64_LDST128_LO12", - "BFD_RELOC_AARCH64_MOVW_G0", - "BFD_RELOC_AARCH64_MOVW_G0_S", - "BFD_RELOC_AARCH64_MOVW_G0_NC", - "BFD_RELOC_AARCH64_MOVW_G1", - "BFD_RELOC_AARCH64_MOVW_G1_NC", - "BFD_RELOC_AARCH64_MOVW_G1_S", - "BFD_RELOC_AARCH64_MOVW_G2", - "BFD_RELOC_AARCH64_MOVW_G2_NC", - "BFD_RELOC_AARCH64_MOVW_G2_S", - "BFD_RELOC_AARCH64_MOVW_G3", - "BFD_RELOC_AARCH64_TLSDESC", - "BFD_RELOC_AARCH64_TLSDESC_ADD", - "BFD_RELOC_AARCH64_TLSDESC_ADD_LO12_NC", - "BFD_RELOC_AARCH64_TLSDESC_ADR_PAGE21", - "BFD_RELOC_AARCH64_TLSDESC_ADR_PREL21", - "BFD_RELOC_AARCH64_TLSDESC_CALL", - "BFD_RELOC_AARCH64_TLSDESC_LD64_LO12_NC", - "BFD_RELOC_AARCH64_TLSDESC_LD_PREL19", - "BFD_RELOC_AARCH64_TLSDESC_LDR", - "BFD_RELOC_AARCH64_TLSDESC_OFF_G0_NC", - "BFD_RELOC_AARCH64_TLSDESC_OFF_G1", - "BFD_RELOC_AARCH64_TLSGD_ADD_LO12_NC", + "BFD_RELOC_AARCH64_GOT_LD_PREL19", + "BFD_RELOC_AARCH64_ADR_GOT_PAGE", + "BFD_RELOC_AARCH64_LD64_GOT_LO12_NC", + "BFD_RELOC_AARCH64_LD32_GOT_LO12_NC", "BFD_RELOC_AARCH64_TLSGD_ADR_PAGE21", + "BFD_RELOC_AARCH64_TLSGD_ADD_LO12_NC", + "BFD_RELOC_AARCH64_TLSIE_MOVW_GOTTPREL_G1", + "BFD_RELOC_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC", "BFD_RELOC_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21", - "BFD_RELOC_AARCH64_TLSIE_LD_GOTTPREL_PREL19", "BFD_RELOC_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC", - "BFD_RELOC_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC", - "BFD_RELOC_AARCH64_TLSIE_MOVW_GOTTPREL_G1", + "BFD_RELOC_AARCH64_TLSIE_LD32_GOTTPREL_LO12_NC", + "BFD_RELOC_AARCH64_TLSIE_LD_GOTTPREL_PREL19", + "BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G2", + "BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1", + "BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1_NC", + "BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0", + "BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0_NC", "BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_HI12", "BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12", "BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12_NC", - "BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0", - "BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0_NC", - "BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1", - "BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1_NC", - "BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G2", - "BFD_RELOC_AARCH64_TLS_DTPMOD64", - "BFD_RELOC_AARCH64_TLS_DTPREL64", - "BFD_RELOC_AARCH64_TLS_TPREL64", - "BFD_RELOC_AARCH64_TSTBR14", + "BFD_RELOC_AARCH64_TLSDESC_LD_PREL19", + "BFD_RELOC_AARCH64_TLSDESC_ADR_PREL21", + "BFD_RELOC_AARCH64_TLSDESC_ADR_PAGE21", + "BFD_RELOC_AARCH64_TLSDESC_LD64_LO12_NC", + "BFD_RELOC_AARCH64_TLSDESC_LD32_LO12_NC", + "BFD_RELOC_AARCH64_TLSDESC_ADD_LO12_NC", + "BFD_RELOC_AARCH64_TLSDESC_OFF_G1", + "BFD_RELOC_AARCH64_TLSDESC_OFF_G0_NC", + "BFD_RELOC_AARCH64_TLSDESC_LDR", + "BFD_RELOC_AARCH64_TLSDESC_ADD", + "BFD_RELOC_AARCH64_TLSDESC_CALL", + "BFD_RELOC_AARCH64_COPY", + "BFD_RELOC_AARCH64_GLOB_DAT", + "BFD_RELOC_AARCH64_JUMP_SLOT", + "BFD_RELOC_AARCH64_RELATIVE", + "BFD_RELOC_AARCH64_TLS_DTPMOD", + "BFD_RELOC_AARCH64_TLS_DTPREL", + "BFD_RELOC_AARCH64_TLS_TPREL", + "BFD_RELOC_AARCH64_TLSDESC", + "BFD_RELOC_AARCH64_IRELATIVE", + "BFD_RELOC_AARCH64_RELOC_END", + "BFD_RELOC_AARCH64_GAS_INTERNAL_FIXUP", + "BFD_RELOC_AARCH64_LDST_LO12", + "BFD_RELOC_AARCH64_LD_GOT_LO12_NC", + "BFD_RELOC_AARCH64_TLSIE_LD_GOTTPREL_LO12_NC", + "BFD_RELOC_AARCH64_TLSDESC_LD_LO12_NC", "BFD_RELOC_TILEPRO_COPY", "BFD_RELOC_TILEPRO_GLOB_DAT", "BFD_RELOC_TILEPRO_JMP_SLOT", diff --git a/bfd/reloc.c b/bfd/reloc.c index 4d57e23abc..f880fd7969 100644 --- a/bfd/reloc.c +++ b/bfd/reloc.c @@ -6113,62 +6113,88 @@ ENUMDOC to two words (uses imm instruction). ENUM - BFD_RELOC_AARCH64_ADD_LO12 + BFD_RELOC_AARCH64_RELOC_START ENUMDOC - AArch64 ADD immediate instruction, holding bits 0 to 11 of the address. - Used in conjunction with BFD_RELOC_AARCH64_ADR_HI21_PCREL. + AArch64 pseudo relocation code to mark the start of the AArch64 + relocation enumerators. N.B. the order of the enumerators is + important as several tables in the AArch64 bfd backend are indexed + by these enumerators; make sure they are all synced. ENUM - BFD_RELOC_AARCH64_GOT_LD_PREL19 + BFD_RELOC_AARCH64_NONE ENUMDOC - AArch64 Load Literal instruction, holding a 19 bit PC relative word - offset of the global offset table entry for a symbol. The lowest two - bits must be zero and are not stored in the instruction, giving a 21 - bit signed byte offset. This relocation type requires signed overflow - checking. + AArch64 null relocation code. ENUM - BFD_RELOC_AARCH64_ADR_GOT_PAGE + BFD_RELOC_AARCH64_64 +ENUMX + BFD_RELOC_AARCH64_32 +ENUMX + BFD_RELOC_AARCH64_16 ENUMDOC - Get to the page base of the global offset table entry for a symbol as - part of an ADRP instruction using a 21 bit PC relative value.Used in - conjunction with BFD_RELOC_AARCH64_LD64_GOT_LO12_NC. + Basic absolute relocations of N bits. These are equivalent to +BFD_RELOC_N and they were added to assist the indexing of the howto +table. ENUM - BFD_RELOC_AARCH64_ADR_HI21_PCREL + BFD_RELOC_AARCH64_64_PCREL +ENUMX + BFD_RELOC_AARCH64_32_PCREL +ENUMX + BFD_RELOC_AARCH64_16_PCREL ENUMDOC - AArch64 ADRP instruction, with bits 12 to 32 of a pc-relative page - offset, giving a 4KB aligned page base address. + PC-relative relocations. These are equivalent to BFD_RELOC_N_PCREL +and they were added to assist the indexing of the howto table. ENUM - BFD_RELOC_AARCH64_ADR_HI21_NC_PCREL + BFD_RELOC_AARCH64_MOVW_G0 ENUMDOC - AArch64 ADRP instruction, with bits 12 to 32 of a pc-relative page - offset, giving a 4KB aligned page base address, but with no overflow - checking. + AArch64 MOV[NZK] instruction with most significant bits 0 to 15 + of an unsigned address/value. ENUM - BFD_RELOC_AARCH64_ADR_LO21_PCREL + BFD_RELOC_AARCH64_MOVW_G0_NC ENUMDOC - AArch64 ADR instruction, holding a simple 21 bit pc-relative byte offset. + AArch64 MOV[NZK] instruction with less significant bits 0 to 15 of + an address/value. No overflow checking. ENUM - BFD_RELOC_AARCH64_BRANCH19 + BFD_RELOC_AARCH64_MOVW_G1 ENUMDOC - AArch64 19 bit pc-relative conditional branch and compare & branch. - The lowest two bits must be zero and are not stored in the instruction, - giving a 21 bit signed byte offset. + AArch64 MOV[NZK] instruction with most significant bits 16 to 31 + of an unsigned address/value. ENUM - BFD_RELOC_AARCH64_CALL26 + BFD_RELOC_AARCH64_MOVW_G1_NC ENUMDOC - AArch64 26 bit pc-relative unconditional branch and link. - The lowest two bits must be zero and are not stored in the instruction, - giving a 28 bit signed byte offset. + AArch64 MOV[NZK] instruction with less significant bits 16 to 31 + of an address/value. No overflow checking. ENUM - BFD_RELOC_AARCH64_GAS_INTERNAL_FIXUP + BFD_RELOC_AARCH64_MOVW_G2 ENUMDOC - AArch64 pseudo relocation code to be used internally by the AArch64 - assembler and not (currently) written to any object files. + AArch64 MOV[NZK] instruction with most significant bits 32 to 47 + of an unsigned address/value. ENUM - BFD_RELOC_AARCH64_JUMP26 + BFD_RELOC_AARCH64_MOVW_G2_NC ENUMDOC - AArch64 26 bit pc-relative unconditional branch. - The lowest two bits must be zero and are not stored in the instruction, - giving a 28 bit signed byte offset. + AArch64 MOV[NZK] instruction with less significant bits 32 to 47 + of an address/value. No overflow checking. +ENUM + BFD_RELOC_AARCH64_MOVW_G3 +ENUMDOC + AArch64 MOV[NZK] instruction with most signficant bits 48 to 64 + of a signed or unsigned address/value. +ENUM + BFD_RELOC_AARCH64_MOVW_G0_S +ENUMDOC + AArch64 MOV[NZ] instruction with most significant bits 0 to 15 + of a signed value. Changes instruction to MOVZ or MOVN depending on the + value's sign. +ENUM + BFD_RELOC_AARCH64_MOVW_G1_S +ENUMDOC + AArch64 MOV[NZ] instruction with most significant bits 16 to 31 + of a signed value. Changes instruction to MOVZ or MOVN depending on the + value's sign. +ENUM + BFD_RELOC_AARCH64_MOVW_G2_S +ENUMDOC + AArch64 MOV[NZ] instruction with most significant bits 32 to 47 + of a signed value. Changes instruction to MOVZ or MOVN depending on the + value's sign. ENUM BFD_RELOC_AARCH64_LD_LO19_PCREL ENUMDOC @@ -6176,21 +6202,54 @@ ENUMDOC offset. The lowest two bits must be zero and are not stored in the instruction, giving a 21 bit signed byte offset. ENUM - BFD_RELOC_AARCH64_LD64_GOT_LO12_NC + BFD_RELOC_AARCH64_ADR_LO21_PCREL ENUMDOC - Unsigned 12 bit byte offset for 64 bit load/store from the page of - the GOT entry for this symbol. Used in conjunction with - BFD_RELOC_AARCH64_ADR_GOTPAGE. + AArch64 ADR instruction, holding a simple 21 bit pc-relative byte offset. ENUM - BFD_RELOC_AARCH64_LDST_LO12 + BFD_RELOC_AARCH64_ADR_HI21_PCREL ENUMDOC - AArch64 unspecified load/store instruction, holding bits 0 to 11 of the - address. Used in conjunction with BFD_RELOC_AARCH64_ADR_HI21_PCREL. + AArch64 ADRP instruction, with bits 12 to 32 of a pc-relative page + offset, giving a 4KB aligned page base address. +ENUM + BFD_RELOC_AARCH64_ADR_HI21_NC_PCREL +ENUMDOC + AArch64 ADRP instruction, with bits 12 to 32 of a pc-relative page + offset, giving a 4KB aligned page base address, but with no overflow + checking. +ENUM + BFD_RELOC_AARCH64_ADD_LO12 +ENUMDOC + AArch64 ADD immediate instruction, holding bits 0 to 11 of the address. + Used in conjunction with BFD_RELOC_AARCH64_ADR_HI21_PCREL. ENUM BFD_RELOC_AARCH64_LDST8_LO12 ENUMDOC AArch64 8-bit load/store instruction, holding bits 0 to 11 of the address. Used in conjunction with BFD_RELOC_AARCH64_ADR_HI21_PCREL. +ENUM + BFD_RELOC_AARCH64_TSTBR14 +ENUMDOC + AArch64 14 bit pc-relative test bit and branch. + The lowest two bits must be zero and are not stored in the instruction, + giving a 16 bit signed byte offset. +ENUM + BFD_RELOC_AARCH64_BRANCH19 +ENUMDOC + AArch64 19 bit pc-relative conditional branch and compare & branch. + The lowest two bits must be zero and are not stored in the instruction, + giving a 21 bit signed byte offset. +ENUM + BFD_RELOC_AARCH64_JUMP26 +ENUMDOC + AArch64 26 bit pc-relative unconditional branch. + The lowest two bits must be zero and are not stored in the instruction, + giving a 28 bit signed byte offset. +ENUM + BFD_RELOC_AARCH64_CALL26 +ENUMDOC + AArch64 26 bit pc-relative unconditional branch and link. + The lowest two bits must be zero and are not stored in the instruction, + giving a 28 bit signed byte offset. ENUM BFD_RELOC_AARCH64_LDST16_LO12 ENUMDOC @@ -6212,96 +6271,122 @@ ENUMDOC AArch64 128-bit load/store instruction, holding bits 0 to 11 of the address. Used in conjunction with BFD_RELOC_AARCH64_ADR_HI21_PCREL. ENUM - BFD_RELOC_AARCH64_MOVW_G0 + BFD_RELOC_AARCH64_GOT_LD_PREL19 ENUMDOC - AArch64 MOV[NZK] instruction with most significant bits 0 to 15 - of an unsigned address/value. + AArch64 Load Literal instruction, holding a 19 bit PC relative word + offset of the global offset table entry for a symbol. The lowest two + bits must be zero and are not stored in the instruction, giving a 21 + bit signed byte offset. This relocation type requires signed overflow + checking. ENUM - BFD_RELOC_AARCH64_MOVW_G0_S + BFD_RELOC_AARCH64_ADR_GOT_PAGE ENUMDOC - AArch64 MOV[NZ] instruction with most significant bits 0 to 15 - of a signed value. Changes instruction to MOVZ or MOVN depending on the - value's sign. + Get to the page base of the global offset table entry for a symbol as + part of an ADRP instruction using a 21 bit PC relative value.Used in + conjunction with BFD_RELOC_AARCH64_LD64_GOT_LO12_NC. ENUM - BFD_RELOC_AARCH64_MOVW_G0_NC + BFD_RELOC_AARCH64_LD64_GOT_LO12_NC ENUMDOC - AArch64 MOV[NZK] instruction with less significant bits 0 to 15 of - an address/value. No overflow checking. + Unsigned 12 bit byte offset for 64 bit load/store from the page of + the GOT entry for this symbol. Used in conjunction with + BFD_RELOC_AARCH64_ADR_GOTPAGE. Valid in LP64 ABI only. ENUM - BFD_RELOC_AARCH64_MOVW_G1 + BFD_RELOC_AARCH64_LD32_GOT_LO12_NC ENUMDOC - AArch64 MOV[NZK] instruction with most significant bits 16 to 31 - of an unsigned address/value. + Unsigned 12 bit byte offset for 32 bit load/store from the page of + the GOT entry for this symbol. Used in conjunction with + BFD_RELOC_AARCH64_ADR_GOTPAGE. Valid in ILP32 ABI only. ENUM - BFD_RELOC_AARCH64_MOVW_G1_NC + BFD_RELOC_AARCH64_TLSGD_ADR_PAGE21 ENUMDOC - AArch64 MOV[NZK] instruction with less significant bits 16 to 31 - of an address/value. No overflow checking. + Get to the page base of the global offset table entry for a symbols + tls_index structure as part of an adrp instruction using a 21 bit PC + relative value. Used in conjunction with + BFD_RELOC_AARCH64_TLSGD_ADD_LO12_NC. ENUM - BFD_RELOC_AARCH64_MOVW_G1_S + BFD_RELOC_AARCH64_TLSGD_ADD_LO12_NC ENUMDOC - AArch64 MOV[NZ] instruction with most significant bits 16 to 31 - of a signed value. Changes instruction to MOVZ or MOVN depending on the - value's sign. + Unsigned 12 bit byte offset to global offset table entry for a symbols + tls_index structure. Used in conjunction with + BFD_RELOC_AARCH64_TLSGD_ADR_PAGE21. ENUM - BFD_RELOC_AARCH64_MOVW_G2 + BFD_RELOC_AARCH64_TLSIE_MOVW_GOTTPREL_G1 ENUMDOC - AArch64 MOV[NZK] instruction with most significant bits 32 to 47 - of an unsigned address/value. + AArch64 TLS INITIAL EXEC relocation. ENUM - BFD_RELOC_AARCH64_MOVW_G2_NC + BFD_RELOC_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC ENUMDOC - AArch64 MOV[NZK] instruction with less significant bits 32 to 47 - of an address/value. No overflow checking. + AArch64 TLS INITIAL EXEC relocation. ENUM - BFD_RELOC_AARCH64_MOVW_G2_S + BFD_RELOC_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21 ENUMDOC - AArch64 MOV[NZ] instruction with most significant bits 32 to 47 - of a signed value. Changes instruction to MOVZ or MOVN depending on the - value's sign. + AArch64 TLS INITIAL EXEC relocation. ENUM - BFD_RELOC_AARCH64_MOVW_G3 + BFD_RELOC_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC ENUMDOC - AArch64 MOV[NZK] instruction with most signficant bits 48 to 64 - of a signed or unsigned address/value. + AArch64 TLS INITIAL EXEC relocation. ENUM - BFD_RELOC_AARCH64_TLSDESC + BFD_RELOC_AARCH64_TLSIE_LD32_GOTTPREL_LO12_NC ENUMDOC - AArch64 TLS relocation. + AArch64 TLS INITIAL EXEC relocation. ENUM - BFD_RELOC_AARCH64_TLSDESC_ADD + BFD_RELOC_AARCH64_TLSIE_LD_GOTTPREL_PREL19 ENUMDOC - AArch64 TLS DESC relocation. + AArch64 TLS INITIAL EXEC relocation. ENUM - BFD_RELOC_AARCH64_TLSDESC_ADD_LO12_NC + BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G2 ENUMDOC - AArch64 TLS DESC relocation. + AArch64 TLS LOCAL EXEC relocation. ENUM - BFD_RELOC_AARCH64_TLSDESC_ADR_PAGE21 + BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1 ENUMDOC - AArch64 TLS DESC relocation. + AArch64 TLS LOCAL EXEC relocation. ENUM - BFD_RELOC_AARCH64_TLSDESC_ADR_PREL21 + BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1_NC +ENUMDOC + AArch64 TLS LOCAL EXEC relocation. +ENUM + BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0 +ENUMDOC + AArch64 TLS LOCAL EXEC relocation. +ENUM + BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0_NC +ENUMDOC + AArch64 TLS LOCAL EXEC relocation. +ENUM + BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_HI12 +ENUMDOC + AArch64 TLS LOCAL EXEC relocation. +ENUM + BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12 +ENUMDOC + AArch64 TLS LOCAL EXEC relocation. +ENUM + BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12_NC +ENUMDOC + AArch64 TLS LOCAL EXEC relocation. +ENUM + BFD_RELOC_AARCH64_TLSDESC_LD_PREL19 ENUMDOC AArch64 TLS DESC relocation. ENUM - BFD_RELOC_AARCH64_TLSDESC_CALL + BFD_RELOC_AARCH64_TLSDESC_ADR_PREL21 ENUMDOC AArch64 TLS DESC relocation. ENUM - BFD_RELOC_AARCH64_TLSDESC_LD64_LO12_NC + BFD_RELOC_AARCH64_TLSDESC_ADR_PAGE21 ENUMDOC AArch64 TLS DESC relocation. ENUM - BFD_RELOC_AARCH64_TLSDESC_LD_PREL19 + BFD_RELOC_AARCH64_TLSDESC_LD64_LO12_NC ENUMDOC AArch64 TLS DESC relocation. ENUM - BFD_RELOC_AARCH64_TLSDESC_LDR + BFD_RELOC_AARCH64_TLSDESC_LD32_LO12_NC ENUMDOC AArch64 TLS DESC relocation. ENUM - BFD_RELOC_AARCH64_TLSDESC_OFF_G0_NC + BFD_RELOC_AARCH64_TLSDESC_ADD_LO12_NC ENUMDOC AArch64 TLS DESC relocation. ENUM @@ -6309,88 +6394,90 @@ ENUM ENUMDOC AArch64 TLS DESC relocation. ENUM - BFD_RELOC_AARCH64_TLSGD_ADD_LO12_NC + BFD_RELOC_AARCH64_TLSDESC_OFF_G0_NC ENUMDOC - Unsigned 12 bit byte offset to global offset table entry for a symbols - tls_index structure. Used in conjunction with - BFD_RELOC_AARCH64_TLSGD_ADR_PAGE21. + AArch64 TLS DESC relocation. ENUM - BFD_RELOC_AARCH64_TLSGD_ADR_PAGE21 + BFD_RELOC_AARCH64_TLSDESC_LDR ENUMDOC - Get to the page base of the global offset table entry for a symbols - tls_index structure as part of an adrp instruction using a 21 bit PC - relative value. Used in conjunction with - BFD_RELOC_AARCH64_TLSGD_ADD_LO12_NC. + AArch64 TLS DESC relocation. ENUM - BFD_RELOC_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21 + BFD_RELOC_AARCH64_TLSDESC_ADD ENUMDOC - AArch64 TLS INITIAL EXEC relocation. + AArch64 TLS DESC relocation. ENUM - BFD_RELOC_AARCH64_TLSIE_LD_GOTTPREL_PREL19 + BFD_RELOC_AARCH64_TLSDESC_CALL ENUMDOC - AArch64 TLS INITIAL EXEC relocation. + AArch64 TLS DESC relocation. ENUM - BFD_RELOC_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC + BFD_RELOC_AARCH64_COPY ENUMDOC - AArch64 TLS INITIAL EXEC relocation. + AArch64 TLS relocation. ENUM - BFD_RELOC_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC + BFD_RELOC_AARCH64_GLOB_DAT ENUMDOC - AArch64 TLS INITIAL EXEC relocation. + AArch64 TLS relocation. ENUM - BFD_RELOC_AARCH64_TLSIE_MOVW_GOTTPREL_G1 + BFD_RELOC_AARCH64_JUMP_SLOT ENUMDOC - AArch64 TLS INITIAL EXEC relocation. + AArch64 TLS relocation. ENUM - BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_HI12 + BFD_RELOC_AARCH64_RELATIVE ENUMDOC - AArch64 TLS LOCAL EXEC relocation. + AArch64 TLS relocation. ENUM - BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12 + BFD_RELOC_AARCH64_TLS_DTPMOD ENUMDOC - AArch64 TLS LOCAL EXEC relocation. + AArch64 TLS relocation. ENUM - BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12_NC + BFD_RELOC_AARCH64_TLS_DTPREL ENUMDOC - AArch64 TLS LOCAL EXEC relocation. + AArch64 TLS relocation. ENUM - BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0 + BFD_RELOC_AARCH64_TLS_TPREL ENUMDOC - AArch64 TLS LOCAL EXEC relocation. + AArch64 TLS relocation. ENUM - BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0_NC + BFD_RELOC_AARCH64_TLSDESC ENUMDOC - AArch64 TLS LOCAL EXEC relocation. + AArch64 TLS relocation. ENUM - BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1 + BFD_RELOC_AARCH64_IRELATIVE ENUMDOC - AArch64 TLS LOCAL EXEC relocation. + AArch64 support for STT_GNU_IFUNC. ENUM - BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1_NC + BFD_RELOC_AARCH64_RELOC_END ENUMDOC - AArch64 TLS LOCAL EXEC relocation. + AArch64 pseudo relocation code to mark the end of the AArch64 + relocation enumerators that have direct mapping to ELF reloc codes. + There are a few more enumerators after this one; those are mainly + used by the AArch64 assembler for the internal fixup or to select + one of the above enumerators. ENUM - BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G2 + BFD_RELOC_AARCH64_GAS_INTERNAL_FIXUP ENUMDOC - AArch64 TLS LOCAL EXEC relocation. + AArch64 pseudo relocation code to be used internally by the AArch64 + assembler and not (currently) written to any object files. ENUM - BFD_RELOC_AARCH64_TLS_DTPMOD64 + BFD_RELOC_AARCH64_LDST_LO12 ENUMDOC - AArch64 TLS relocation. + AArch64 unspecified load/store instruction, holding bits 0 to 11 of the + address. Used in conjunction with BFD_RELOC_AARCH64_ADR_HI21_PCREL. ENUM - BFD_RELOC_AARCH64_TLS_DTPREL64 + BFD_RELOC_AARCH64_LD_GOT_LO12_NC ENUMDOC - AArch64 TLS relocation. + AArch64 pseudo relocation code to be used internally by the AArch64 + assembler and not (currently) written to any object files. ENUM - BFD_RELOC_AARCH64_TLS_TPREL64 + BFD_RELOC_AARCH64_TLSIE_LD_GOTTPREL_LO12_NC ENUMDOC - AArch64 TLS relocation. + AArch64 pseudo relocation code to be used internally by the AArch64 + assembler and not (currently) written to any object files. ENUM - BFD_RELOC_AARCH64_TSTBR14 + BFD_RELOC_AARCH64_TLSDESC_LD_LO12_NC ENUMDOC - AArch64 14 bit pc-relative test bit and branch. - The lowest two bits must be zero and are not stored in the instruction, - giving a 16 bit signed byte offset. + AArch64 pseudo relocation code to be used internally by the AArch64 + assembler and not (currently) written to any object files. ENUM BFD_RELOC_TILEPRO_COPY diff --git a/gas/ChangeLog b/gas/ChangeLog index 5270688921..d998e3bad8 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,18 @@ +2013-06-26 Yufeng Zhang + + * config/tc-aarch64.c (reloc_table): Replace + BFD_RELOC_AARCH64_LD64_GOT_LO12_NC with + BFD_RELOC_AARCH64_LD_GOT_LO12_NC; likewise to + BFD_RELOC_AARCH64_TLSDESC_LD64_LO12_NC and + BFD_RELOC_AARCH64_TLSIE_LD_GOTTPREL_LO12_NC. + (md_apply_fix): Handle BFD_RELOC_AARCH64_LD_GOT_LO12_NC, + BFD_RELOC_AARCH64_LD32_GOT_LO12_NC, + BFD_RELOC_AARCH64_TLSDESC_LD_LO12_NC, + BFD_RELOC_AARCH64_TLSDESC_LD32_LO12_NC, + BFD_RELOC_AARCH64_TLSIE_LD_GOTTPREL_LO12_NC and + BFD_RELOC_AARCH64_TLSIE_LD32_GOTTPREL_LO12_NC. + (aarch64_force_relocation): Likewise. + 2013-06-26 Yufeng Zhang * config/tc-aarch64.c (ilp32_p): New static variable. diff --git a/gas/config/tc-aarch64.c b/gas/config/tc-aarch64.c index 239b9eef61..52811ef385 100644 --- a/gas/config/tc-aarch64.c +++ b/gas/config/tc-aarch64.c @@ -2377,7 +2377,7 @@ static struct reloc_table_entry reloc_table[] = { 0, 0, 0, - BFD_RELOC_AARCH64_LD64_GOT_LO12_NC}, + BFD_RELOC_AARCH64_LD_GOT_LO12_NC}, /* Get to the page containing GOT TLS entry for a symbol */ {"tlsgd", 0, @@ -2405,7 +2405,7 @@ static struct reloc_table_entry reloc_table[] = { 0, 0, BFD_RELOC_AARCH64_TLSDESC_ADD_LO12_NC, - BFD_RELOC_AARCH64_TLSDESC_LD64_LO12_NC}, + BFD_RELOC_AARCH64_TLSDESC_LD_LO12_NC}, /* Get to the page containing GOT TLS entry for a symbol */ {"gottprel", 0, @@ -2419,7 +2419,7 @@ static struct reloc_table_entry reloc_table[] = { 0, 0, 0, - BFD_RELOC_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC}, + BFD_RELOC_AARCH64_TLSIE_LD_GOTTPREL_LO12_NC}, /* Get tp offset for a symbol. */ {"tprel", 0, @@ -6506,10 +6506,33 @@ md_apply_fix (fixS * fixP, valueT * valP, segT seg) } break; + case BFD_RELOC_AARCH64_TLSIE_LD_GOTTPREL_LO12_NC: + fixP->fx_r_type = (ilp32_p + ? BFD_RELOC_AARCH64_TLSIE_LD32_GOTTPREL_LO12_NC + : BFD_RELOC_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC); + S_SET_THREAD_LOCAL (fixP->fx_addsy); + /* Should always be exported to object file, see + aarch64_force_relocation(). */ + gas_assert (!fixP->fx_done); + gas_assert (seg->use_rela_p); + break; + + case BFD_RELOC_AARCH64_TLSDESC_LD_LO12_NC: + fixP->fx_r_type = (ilp32_p + ? BFD_RELOC_AARCH64_TLSDESC_LD32_LO12_NC + : BFD_RELOC_AARCH64_TLSDESC_LD64_LO12_NC); + S_SET_THREAD_LOCAL (fixP->fx_addsy); + /* Should always be exported to object file, see + aarch64_force_relocation(). */ + gas_assert (!fixP->fx_done); + gas_assert (seg->use_rela_p); + break; + case BFD_RELOC_AARCH64_TLSGD_ADR_PAGE21: case BFD_RELOC_AARCH64_TLSGD_ADD_LO12_NC: case BFD_RELOC_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21: case BFD_RELOC_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC: + case BFD_RELOC_AARCH64_TLSIE_LD32_GOTTPREL_LO12_NC: case BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12: case BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_HI12: case BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12_NC: @@ -6521,6 +6544,7 @@ md_apply_fix (fixS * fixP, valueT * valP, segT seg) case BFD_RELOC_AARCH64_TLSDESC_ADR_PAGE21: case BFD_RELOC_AARCH64_TLSDESC_ADD_LO12_NC: case BFD_RELOC_AARCH64_TLSDESC_LD64_LO12_NC: + case BFD_RELOC_AARCH64_TLSDESC_LD32_LO12_NC: S_SET_THREAD_LOCAL (fixP->fx_addsy); /* Should always be exported to object file, see aarch64_force_relocation(). */ @@ -6528,6 +6552,16 @@ md_apply_fix (fixS * fixP, valueT * valP, segT seg) gas_assert (seg->use_rela_p); break; + case BFD_RELOC_AARCH64_LD_GOT_LO12_NC: + /* Should always be exported to object file, see + aarch64_force_relocation(). */ + fixP->fx_r_type = (ilp32_p + ? BFD_RELOC_AARCH64_LD32_GOT_LO12_NC + : BFD_RELOC_AARCH64_LD64_GOT_LO12_NC); + gas_assert (!fixP->fx_done); + gas_assert (seg->use_rela_p); + break; + case BFD_RELOC_AARCH64_ADR_HI21_PCREL: case BFD_RELOC_AARCH64_ADR_HI21_NC_PCREL: case BFD_RELOC_AARCH64_ADD_LO12: @@ -6539,6 +6573,7 @@ md_apply_fix (fixS * fixP, valueT * valP, segT seg) case BFD_RELOC_AARCH64_GOT_LD_PREL19: case BFD_RELOC_AARCH64_ADR_GOT_PAGE: case BFD_RELOC_AARCH64_LD64_GOT_LO12_NC: + case BFD_RELOC_AARCH64_LD32_GOT_LO12_NC: /* Should always be exported to object file, see aarch64_force_relocation(). */ gas_assert (!fixP->fx_done); @@ -6669,10 +6704,18 @@ aarch64_force_relocation (struct fix *fixp) even if the symbol is extern or weak. */ return 0; + case BFD_RELOC_AARCH64_TLSIE_LD_GOTTPREL_LO12_NC: + case BFD_RELOC_AARCH64_TLSDESC_LD_LO12_NC: + case BFD_RELOC_AARCH64_LD_GOT_LO12_NC: + /* Pseudo relocs that need to be fixed up according to + ilp32_p. */ + return 0; + case BFD_RELOC_AARCH64_TLSGD_ADR_PAGE21: case BFD_RELOC_AARCH64_TLSGD_ADD_LO12_NC: case BFD_RELOC_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21: case BFD_RELOC_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC: + case BFD_RELOC_AARCH64_TLSIE_LD32_GOTTPREL_LO12_NC: case BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12: case BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_HI12: case BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12_NC: @@ -6684,8 +6727,10 @@ aarch64_force_relocation (struct fix *fixp) case BFD_RELOC_AARCH64_TLSDESC_ADR_PAGE21: case BFD_RELOC_AARCH64_TLSDESC_ADD_LO12_NC: case BFD_RELOC_AARCH64_TLSDESC_LD64_LO12_NC: + case BFD_RELOC_AARCH64_TLSDESC_LD32_LO12_NC: case BFD_RELOC_AARCH64_ADR_GOT_PAGE: case BFD_RELOC_AARCH64_LD64_GOT_LO12_NC: + case BFD_RELOC_AARCH64_LD32_GOT_LO12_NC: case BFD_RELOC_AARCH64_ADR_HI21_PCREL: case BFD_RELOC_AARCH64_ADR_HI21_NC_PCREL: case BFD_RELOC_AARCH64_ADD_LO12: diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog index 6a31de76d8..e309d0ea0b 100644 --- a/gas/testsuite/ChangeLog +++ b/gas/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2013-06-26 Yufeng Zhang + + * gas/aarch64/ilp32-basic.d: New file. + * gas/aarch64/ilp32-basic.s: New file. + 2013-06-25 Maciej W. Rozycki * gas/mips/micromips-insn32.d: New test. diff --git a/gas/testsuite/gas/aarch64/ilp32-basic.d b/gas/testsuite/gas/aarch64/ilp32-basic.d new file mode 100644 index 0000000000..b876c7aa43 --- /dev/null +++ b/gas/testsuite/gas/aarch64/ilp32-basic.d @@ -0,0 +1,23 @@ +#as: -milp32 +#objdump: -dr + +.*: file format elf32-.*aarch64 + + +Disassembly of section \.text: + +00000000 <.*>: + 0: 90000004 adrp x4, c <.*> + 0: R_AARCH64_P32_ADR_PREL_PG_HI21 ptrs + 4: 91000083 add x3, x4, #0x0 + 4: R_AARCH64_P32_ADD_ABS_LO12_NC ptrs + 8: b9000080 str w0, \[x4\] + 8: R_AARCH64_P32_LDST32_ABS_LO12_NC ptrs + c: b9000461 str w1, \[x3,#4\] + 10: b9000862 str w2, \[x3,#8\] + 14: 90000004 adrp x4, c <.*> + 14: R_AARCH64_P32_ADR_GOT_PAGE ptrs + 18: f9400083 ldr x3, \[x4\] + 18: R_AARCH64_P32_LD32_GOT_LO12_NC ptrs + 1c: 2a0403e0 mov w0, w4 + 20: d65f03c0 ret diff --git a/gas/testsuite/gas/aarch64/ilp32-basic.s b/gas/testsuite/gas/aarch64/ilp32-basic.s new file mode 100644 index 0000000000..790dcdf65c --- /dev/null +++ b/gas/testsuite/gas/aarch64/ilp32-basic.s @@ -0,0 +1,17 @@ + .cpu generic + .text + .align 2 + .global foo + .type foo, %function +foo: + adrp x4, ptrs + add x3, x4, :lo12:ptrs + str w0, [x4,#:lo12:ptrs] + str w1, [x3,4] + str w2, [x3,8] + adrp x4, :got:ptrs + ldr x3, [x4,#:got_lo12:ptrs] + mov w0, w4 + ret + .size foo, .-foo + .comm ptrs,12,8 diff --git a/include/elf/ChangeLog b/include/elf/ChangeLog index 20ba2297ed..673250dc2f 100644 --- a/include/elf/ChangeLog +++ b/include/elf/ChangeLog @@ -1,3 +1,7 @@ +2013-06-26 Yufeng Zhang + + * aarch64.h: Add ELF32 reloc codes and remove fake ELF64 ones. + 2013-06-24 Maciej W. Rozycki * mips.h (ELF_ST_IS_MIPS_PLT): Respect STO_MIPS16 setting. diff --git a/include/elf/aarch64.h b/include/elf/aarch64.h index a7b86c10ed..41016038f1 100644 --- a/include/elf/aarch64.h +++ b/include/elf/aarch64.h @@ -43,7 +43,126 @@ START_RELOC_NUMBERS (elf_aarch64_reloc_type) /* Null relocations. */ RELOC_NUMBER (R_AARCH64_NONE, 0) /* No reloc */ -FAKE_RELOC (R_AARCH64_static_min, 256) +/* Basic data relocations. */ + +/* .word: (S+A) */ +RELOC_NUMBER (R_AARCH64_P32_ABS32, 1) + +/* .half: (S+A) */ +RELOC_NUMBER (R_AARCH64_P32_ABS16, 2) + +/* .word: (S+A-P) */ +RELOC_NUMBER (R_AARCH64_P32_PREL32, 3) + +/* .half: (S+A-P) */ +RELOC_NUMBER (R_AARCH64_P32_PREL16, 4) + +/* Group relocations to create a 16, 32, 48 or 64 bit + unsigned data or abs address inline. */ + +/* MOV[ZK]: ((S+A) >> 0) & 0xffff */ +RELOC_NUMBER (R_AARCH64_P32_MOVW_UABS_G0, 5) + +/* MOV[ZK]: ((S+A) >> 0) & 0xffff */ +RELOC_NUMBER (R_AARCH64_P32_MOVW_UABS_G0_NC, 6) + +/* MOV[ZK]: ((S+A) >> 16) & 0xffff */ +RELOC_NUMBER (R_AARCH64_P32_MOVW_UABS_G1, 7) + +/* Group relocations to create high part of a 16, 32, 48 or 64 bit + signed data or abs address inline. Will change instruction + to MOVN or MOVZ depending on sign of calculated value. */ + +/* MOV[ZN]: ((S+A) >> 0) & 0xffff */ +RELOC_NUMBER (R_AARCH64_P32_MOVW_SABS_G0, 8) + +/* Relocations to generate 19, 21 and 33 bit PC-relative load/store + addresses: PG(x) is (x & ~0xfff). */ + +/* LD-lit: ((S+A-P) >> 2) & 0x7ffff */ +RELOC_NUMBER (R_AARCH64_P32_LD_PREL_LO19, 9) + +/* ADR: (S+A-P) & 0x1fffff */ +RELOC_NUMBER (R_AARCH64_P32_ADR_PREL_LO21, 10) + +/* ADRH: ((PG(S+A)-PG(P)) >> 12) & 0x1fffff */ +RELOC_NUMBER (R_AARCH64_P32_ADR_PREL_PG_HI21, 11) + +/* ADD: (S+A) & 0xfff */ +RELOC_NUMBER (R_AARCH64_P32_ADD_ABS_LO12_NC, 12) + +/* LD/ST8: (S+A) & 0xfff */ +RELOC_NUMBER (R_AARCH64_P32_LDST8_ABS_LO12_NC, 13) + +/* LD/ST16: (S+A) & 0xffe */ +RELOC_NUMBER (R_AARCH64_P32_LDST16_ABS_LO12_NC, 14) + +/* LD/ST32: (S+A) & 0xffc */ +RELOC_NUMBER (R_AARCH64_P32_LDST32_ABS_LO12_NC, 15) + +/* LD/ST64: (S+A) & 0xff8 */ +RELOC_NUMBER (R_AARCH64_P32_LDST64_ABS_LO12_NC, 16) + +/* LD/ST128: (S+A) & 0xff0 */ +RELOC_NUMBER (R_AARCH64_P32_LDST128_ABS_LO12_NC, 17) + +/* Relocations for control-flow instructions. */ + +/* TBZ/NZ: ((S+A-P) >> 2) & 0x3fff. */ +RELOC_NUMBER (R_AARCH64_P32_TSTBR14, 18) + +/* B.cond: ((S+A-P) >> 2) & 0x7ffff. */ +RELOC_NUMBER (R_AARCH64_P32_CONDBR19, 19) + +/* B: ((S+A-P) >> 2) & 0x3ffffff. */ +RELOC_NUMBER (R_AARCH64_P32_JUMP26, 20) + +/* BL: ((S+A-P) >> 2) & 0x3ffffff. */ +RELOC_NUMBER (R_AARCH64_P32_CALL26, 21) + + +RELOC_NUMBER (R_AARCH64_P32_GOT_LD_PREL19, 25) +RELOC_NUMBER (R_AARCH64_P32_ADR_GOT_PAGE, 26) +RELOC_NUMBER (R_AARCH64_P32_LD32_GOT_LO12_NC, 27) + + +RELOC_NUMBER (R_AARCH64_P32_TLSGD_ADR_PAGE21, 81) +RELOC_NUMBER (R_AARCH64_P32_TLSGD_ADD_LO12_NC, 82) +RELOC_NUMBER (R_AARCH64_P32_TLSIE_ADR_GOTTPREL_PAGE21, 103) +RELOC_NUMBER (R_AARCH64_P32_TLSIE_LD32_GOTTPREL_LO12_NC, 104) +RELOC_NUMBER (R_AARCH64_P32_TLSIE_LD_GOTTPREL_PREL19, 105) +RELOC_NUMBER (R_AARCH64_P32_TLSLE_MOVW_TPREL_G1, 106) +RELOC_NUMBER (R_AARCH64_P32_TLSLE_MOVW_TPREL_G0, 107) +RELOC_NUMBER (R_AARCH64_P32_TLSLE_MOVW_TPREL_G0_NC, 108) +RELOC_NUMBER (R_AARCH64_P32_TLSLE_ADD_TPREL_HI12, 109) +RELOC_NUMBER (R_AARCH64_P32_TLSLE_ADD_TPREL_LO12, 110) +RELOC_NUMBER (R_AARCH64_P32_TLSLE_ADD_TPREL_LO12_NC, 111) + +RELOC_NUMBER (R_AARCH64_P32_TLSDESC_LD_PREL19, 122) +RELOC_NUMBER (R_AARCH64_P32_TLSDESC_ADR_PREL21, 123) +RELOC_NUMBER (R_AARCH64_P32_TLSDESC_ADR_PAGE21, 124) +RELOC_NUMBER (R_AARCH64_P32_TLSDESC_LD32_LO12_NC, 125) +RELOC_NUMBER (R_AARCH64_P32_TLSDESC_ADD_LO12_NC, 126) +RELOC_NUMBER (R_AARCH64_P32_TLSDESC_CALL, 127) + +/* Dynamic relocations */ + +/* Copy symbol at runtime. */ +RELOC_NUMBER (R_AARCH64_P32_COPY, 180) + +/* Create GOT entry. */ +RELOC_NUMBER (R_AARCH64_P32_GLOB_DAT, 181) + + /* Create PLT entry. */ +RELOC_NUMBER (R_AARCH64_P32_JUMP_SLOT, 182) + +/* Adjust by program base. */ +RELOC_NUMBER (R_AARCH64_P32_RELATIVE, 183) +RELOC_NUMBER (R_AARCH64_P32_TLS_DTPMOD, 184) +RELOC_NUMBER (R_AARCH64_P32_TLS_DTPREL, 185) +RELOC_NUMBER (R_AARCH64_P32_TLS_TPREL, 186) +RELOC_NUMBER (R_AARCH64_P32_TLSDESC, 187) +RELOC_NUMBER (R_AARCH64_P32_IRELATIVE, 188) RELOC_NUMBER (R_AARCH64_NULL, 256) /* No reloc */ @@ -157,9 +276,6 @@ RELOC_NUMBER (R_AARCH64_GOT_LD_PREL19, 309) RELOC_NUMBER (R_AARCH64_ADR_GOT_PAGE, 311) RELOC_NUMBER (R_AARCH64_LD64_GOT_LO12_NC, 312) -FAKE_RELOC (R_AARCH64_static_max, 313) - -FAKE_RELOC (R_AARCH64_tls_min, 512) RELOC_NUMBER (R_AARCH64_TLSGD_ADR_PAGE21, 513) RELOC_NUMBER (R_AARCH64_TLSGD_ADD_LO12_NC, 514) RELOC_NUMBER (R_AARCH64_TLSIE_MOVW_GOTTPREL_G1, 539) @@ -175,9 +291,7 @@ RELOC_NUMBER (R_AARCH64_TLSLE_MOVW_TPREL_G0_NC, 548) RELOC_NUMBER (R_AARCH64_TLSLE_ADD_TPREL_HI12, 549) RELOC_NUMBER (R_AARCH64_TLSLE_ADD_TPREL_LO12, 550) RELOC_NUMBER (R_AARCH64_TLSLE_ADD_TPREL_LO12_NC, 551) -FAKE_RELOC (R_AARCH64_tls_max, 552) -FAKE_RELOC (R_AARCH64_tlsdesc_min, 560) RELOC_NUMBER (R_AARCH64_TLSDESC_LD_PREL19, 560) RELOC_NUMBER (R_AARCH64_TLSDESC_ADR_PREL21, 561) RELOC_NUMBER (R_AARCH64_TLSDESC_ADR_PAGE21, 562) @@ -188,10 +302,8 @@ RELOC_NUMBER (R_AARCH64_TLSDESC_OFF_G0_NC, 566) RELOC_NUMBER (R_AARCH64_TLSDESC_LDR, 567) RELOC_NUMBER (R_AARCH64_TLSDESC_ADD, 568) RELOC_NUMBER (R_AARCH64_TLSDESC_CALL, 569) -FAKE_RELOC (R_AARCH64_tlsdesc_max, 570) /* Dynamic relocations */ -FAKE_RELOC (R_AARCH64_dyn_min, 1024) /* Copy symbol at runtime. */ RELOC_NUMBER (R_AARCH64_COPY, 1024) @@ -204,11 +316,11 @@ RELOC_NUMBER (R_AARCH64_JUMP_SLOT, 1026) /* Adjust by program base. */ RELOC_NUMBER (R_AARCH64_RELATIVE, 1027) -RELOC_NUMBER (R_AARCH64_TLS_DTPMOD64, 1028) -RELOC_NUMBER (R_AARCH64_TLS_DTPREL64, 1029) -RELOC_NUMBER (R_AARCH64_TLS_TPREL64, 1030) +RELOC_NUMBER (R_AARCH64_TLS_DTPMOD, 1028) +RELOC_NUMBER (R_AARCH64_TLS_DTPREL, 1029) +RELOC_NUMBER (R_AARCH64_TLS_TPREL, 1030) RELOC_NUMBER (R_AARCH64_TLSDESC, 1031) -FAKE_RELOC (R_AARCH64_dyn_max, 1032) +RELOC_NUMBER (R_AARCH64_IRELATIVE, 1032) END_RELOC_NUMBERS (R_AARCH64_end) -- 2.34.1