2014-07-03 01:21:23 +02:00
|
|
|
// aarch64.h -- ELF definitions specific to AARCH64 -*- C++ -*-
|
|
|
|
|
2018-01-03 06:17:27 +01:00
|
|
|
// Copyright (C) 2014-2018 Free Software Foundation, Inc.
|
2014-07-03 01:21:23 +02:00
|
|
|
// Written by Jing Yu (jingyu@google.com)
|
|
|
|
|
|
|
|
// This file is part of elfcpp.
|
|
|
|
|
|
|
|
// This program is free software; you can redistribute it and/or
|
|
|
|
// modify it under the terms of the GNU Library General Public License
|
|
|
|
// as published by the Free Software Foundation; either version 2, or
|
|
|
|
// (at your option) any later version.
|
|
|
|
|
|
|
|
// In addition to the permissions in the GNU Library General Public
|
|
|
|
// License, the Free Software Foundation gives you unlimited
|
|
|
|
// permission to link the compiled version of this file into
|
|
|
|
// combinations with other programs, and to distribute those
|
|
|
|
// combinations without any restriction coming from the use of this
|
|
|
|
// file. (The Library Public License restrictions do apply in other
|
|
|
|
// respects; for example, they cover modification of the file, and
|
|
|
|
/// distribution when not linked into a combined executable.)
|
|
|
|
|
|
|
|
// This program is distributed in the hope that it will be useful, but
|
|
|
|
// WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
// Library General Public License for more details.
|
|
|
|
|
|
|
|
// You should have received a copy of the GNU Library General Public
|
|
|
|
// License along with this program; if not, write to the Free Software
|
|
|
|
// Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
|
|
|
|
// 02110-1301, USA.
|
|
|
|
|
|
|
|
#ifndef ELFCPP_AARCH64_H
|
|
|
|
#define ELFCPP_AARCH64_H
|
|
|
|
|
|
|
|
namespace elfcpp
|
|
|
|
{
|
|
|
|
|
|
|
|
// The relocation type information is taken from:
|
|
|
|
//
|
|
|
|
// ELF for the ARM 64-bit Architecture (AArch64)
|
|
|
|
// Document number: ARM IHI 0056B, current through AArch64 ABI release 1.0
|
|
|
|
// Date of Issue: 22nd May, 2013
|
|
|
|
//
|
|
|
|
|
|
|
|
enum
|
|
|
|
{
|
|
|
|
// Null relocation codes
|
|
|
|
R_AARCH64_NONE = 0, // None
|
2014-08-08 23:18:35 +02:00
|
|
|
R_AARCH64_withdrawn = 256, // Treat as R_AARCH64_NONE
|
2014-07-03 01:21:23 +02:00
|
|
|
|
|
|
|
// Static relocations
|
|
|
|
R_AARCH64_ABS64 = 257, // S + A
|
|
|
|
R_AARCH64_ABS32 = 258, // S + A
|
|
|
|
R_AARCH64_ABS16 = 259, // S + A
|
|
|
|
R_AARCH64_PREL64 = 260, // S + A - P
|
|
|
|
R_AARCH64_PREL32 = 261, // S + A - P
|
|
|
|
R_AARCH64_PREL16 = 262, // S + A - P
|
|
|
|
R_AARCH64_MOVW_UABS_G0 = 263, // S + A
|
|
|
|
R_AARCH64_MOVW_UABS_G0_NC = 264, // S + A
|
|
|
|
R_AARCH64_MOVW_UABS_G1 = 265, // S + A
|
|
|
|
R_AARCH64_MOVW_UABS_G1_NC = 266, // S + A
|
|
|
|
R_AARCH64_MOVW_UABS_G2 = 267, // S + A
|
|
|
|
R_AARCH64_MOVW_UABS_G2_NC = 268, // S + A
|
|
|
|
R_AARCH64_MOVW_UABS_G3 = 269, // S + A
|
|
|
|
R_AARCH64_MOVW_SABS_G0 = 270, // S + A
|
|
|
|
R_AARCH64_MOVW_SABS_G1 = 271, // S + A
|
|
|
|
R_AARCH64_MOVW_SABS_G2 = 272, // S + A
|
|
|
|
R_AARCH64_LD_PREL_LO19 = 273, // S + A - P
|
|
|
|
R_AARCH64_ADR_PREL_LO21 = 274, // S + A - P
|
|
|
|
R_AARCH64_ADR_PREL_PG_HI21 = 275, // Page(S+A) - Page(P)
|
|
|
|
R_AARCH64_ADR_PREL_PG_HI21_NC = 276, // Page(S+A) - Page(P)
|
|
|
|
R_AARCH64_ADD_ABS_LO12_NC = 277, // S + A
|
|
|
|
R_AARCH64_LDST8_ABS_LO12_NC = 278, // S + A
|
|
|
|
R_AARCH64_TSTBR14 = 279, // S + A - P
|
|
|
|
R_AARCH64_CONDBR19 = 280, // S + A - P
|
|
|
|
R_AARCH64_JUMP26 = 282, // S + A - P
|
|
|
|
R_AARCH64_CALL26 = 283, // S + A - P
|
|
|
|
R_AARCH64_LDST16_ABS_LO12_NC = 284, // S + A
|
|
|
|
R_AARCH64_LDST32_ABS_LO12_NC = 285, // S + A
|
|
|
|
R_AARCH64_LDST64_ABS_LO12_NC = 286, // S + A
|
|
|
|
R_AARCH64_MOVW_PREL_G0 = 287, // S + A - P
|
|
|
|
R_AARCH64_MOVW_PREL_G0_NC = 288, // S + A - P
|
|
|
|
R_AARCH64_MOVW_PREL_G1 = 289, // S + A - P
|
|
|
|
R_AARCH64_MOVW_PREL_G1_NC = 290, // S + A - P
|
|
|
|
R_AARCH64_MOVW_PREL_G2 = 291, // S + A - P
|
|
|
|
R_AARCH64_MOVW_PREL_G2_NC = 292, // S + A - P
|
|
|
|
R_AARCH64_MOVW_PREL_G3 = 293, // S + A - P
|
|
|
|
R_AARCH64_LDST128_ABS_LO12_NC = 299, // S + A
|
|
|
|
R_AARCH64_MOVW_GOTOFF_G0 = 300, // G(GDAT(S+A))-GOT
|
|
|
|
R_AARCH64_MOVW_GOTOFF_G0_NC = 301, // G(GDAT(S+A))-GOT
|
|
|
|
R_AARCH64_MOVW_GOTOFF_G1 = 302, // G(GDAT(S+A))-GOT
|
|
|
|
R_AARCH64_MOVW_GOTOFF_G1_NC = 303, // G(GDAT(S+A))-GOT
|
|
|
|
R_AARCH64_MOVW_GOTOFF_G2 = 304, // G(GDAT(S+A))-GOT
|
|
|
|
R_AARCH64_MOVW_GOTOFF_G2_NC = 305, // G(GDAT(S+A))-GOT
|
|
|
|
R_AARCH64_MOVW_GOTOFF_G3 = 306, // G(GDAT(S+A))-GOT
|
|
|
|
R_AARCH64_GOTREL64 = 307, // S + A - GOT
|
|
|
|
R_AARCH64_GOTREL32 = 308, // S + A - GOT
|
|
|
|
R_AARCH64_GOT_LD_PREL19 = 309, // G(GDAT(S+A))-P
|
|
|
|
R_AARCH64_LD64_GOTOFF_LO15 = 310, // G(GDAT(S+A))-GOT
|
|
|
|
R_AARCH64_ADR_GOT_PAGE = 311, // Page(G(GDAT(S+A)))-Page(P)
|
|
|
|
R_AARCH64_LD64_GOT_LO12_NC = 312, // G(GDAT(S+A))
|
|
|
|
R_AARCH64_LD64_GOTPAGE_LO15 = 313, // G(GDAT(S+A))-Page(GOT)
|
|
|
|
|
|
|
|
// Relocations for thread-local storage
|
|
|
|
R_AARCH64_TLSGD_ADR_PREL21 = 512, // G(GTLSIDX(S,A)) - P
|
|
|
|
R_AARCH64_TLSGD_ADR_PAGE21 = 513, // Page(G(GTLSIDX(S,A)))-Page(P)
|
|
|
|
R_AARCH64_TLSGD_ADD_LO12_NC = 514, // G(GTLSICX(S,A))
|
|
|
|
R_AARCH64_TLSGD_MOVW_G1 = 515, // G(GTLSIDX(S,A)) - GOT
|
|
|
|
R_AARCH64_TLSGD_MOVW_G0_NC = 516, // G(GTLSIDX(S,A)) - GOT
|
|
|
|
|
|
|
|
R_AARCH64_TLSLD_ADR_PREL21 = 517, // G(GLDM(S)) - P
|
|
|
|
R_AARCH64_TLSLD_ADR_PAGE21 = 518, // Page(G(GLDM(S))) - Page(P)
|
|
|
|
R_AARCH64_TLSLD_ADD_LO12_NC = 519, // G(GLDM(S))
|
|
|
|
R_AARCH64_TLSLD_MOVW_G1 = 520, // G(GLDM(S)) - GOT
|
|
|
|
R_AARCH64_TLSLD_MOVW_G0_NC = 521, // G(GLDM(S)) - GOT
|
|
|
|
R_AARCH64_TLSLD_LD_PREL19 = 522, // G(GLDM(S)) - P
|
|
|
|
R_AARCH64_TLSLD_MOVW_DTPREL_G2 = 523, // DTPREL(S+A)
|
|
|
|
R_AARCH64_TLSLD_MOVW_DTPREL_G1 = 524, // DTPREL(S+A)
|
|
|
|
R_AARCH64_TLSLD_MOVW_DTPREL_G1_NC = 525, // DTPREL(S+A)
|
|
|
|
R_AARCH64_TLSLD_MOVW_DTPREL_G0 = 526, // DTPREL(S+A)
|
|
|
|
R_AARCH64_TLSLD_MOVW_DTPREL_G0_NC = 527, // DTPREL(S+A)
|
|
|
|
R_AARCH64_TLSLD_ADD_DTPREL_HI12 = 528, // DTPREL(S+A)
|
|
|
|
R_AARCH64_TLSLD_ADD_DTPREL_LO12 = 529, // DTPREL(S+A)
|
|
|
|
R_AARCH64_TLSLD_ADD_DTPREL_LO12_NC = 530, // DTPREL(S+A)
|
|
|
|
R_AARCH64_TLSLD_LDST8_DTPREL_LO12 = 531, // DTPREL(S+A)
|
|
|
|
R_AARCH64_TLSLD_LDST8_DTPREL_LO12_NC = 532, // DTPREL(S+A)
|
|
|
|
R_AARCH64_TLSLD_LDST16_DTPREL_LO12 = 533, // DTPREL(S+A)
|
|
|
|
R_AARCH64_TLSLD_LDST16_DTPREL_LO12_NC = 534, // DTPREL(S+A)
|
|
|
|
R_AARCH64_TLSLD_LDST32_DTPREL_LO12 = 535, // DTPREL(S+A)
|
|
|
|
R_AARCH64_TLSLD_LDST32_DTPREL_LO12_NC = 536, // DTPREL(S+A)
|
|
|
|
R_AARCH64_TLSLD_LDST64_DTPREL_LO12 = 537, // DTPREL(S+A)
|
|
|
|
R_AARCH64_TLSLD_LDST64_DTPREL_LO12_NC = 538, // DTPREL(S+A)
|
|
|
|
R_AARCH64_TLSIE_MOVW_GOTTPREL_G1 = 539, // G(GTPREL(S+A)) - GOT
|
|
|
|
R_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC = 540, // G(GTPREL(S+A)) - GOT
|
|
|
|
R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21 = 541, // Page(G(GTPREL(S+A)))-Page(P)
|
|
|
|
R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC = 542, // G(GTPREL(S+A))
|
|
|
|
R_AARCH64_TLSIE_LD_GOTTPREL_PREL19 = 543, // G(GTPREL(S+A)) - P
|
|
|
|
R_AARCH64_TLSLE_MOVW_TPREL_G2 = 544, // TPREL(S+A)
|
|
|
|
R_AARCH64_TLSLE_MOVW_TPREL_G1 = 545, // TPREL(S+A)
|
|
|
|
R_AARCH64_TLSLE_MOVW_TPREL_G1_NC = 546, // TPREL(S+A)
|
|
|
|
R_AARCH64_TLSLE_MOVW_TPREL_G0 = 547, // TPREL(S+A)
|
|
|
|
R_AARCH64_TLSLE_MOVW_TPREL_G0_NC = 548, // TPREL(S+A)
|
|
|
|
R_AARCH64_TLSLE_ADD_TPREL_HI12 = 549, // TPREL(S+A)
|
|
|
|
R_AARCH64_TLSLE_ADD_TPREL_LO12 = 550, // TPREL(S+A)
|
|
|
|
R_AARCH64_TLSLE_ADD_TPREL_LO12_NC = 551, // TPREL(S+A)
|
|
|
|
R_AARCH64_TLSLE_LDST8_TPREL_LO12 = 552, // TPREL(S+A)
|
|
|
|
R_AARCH64_TLSLE_LDST8_TPREL_LO12_NC = 553, // TPREL(S+A)
|
|
|
|
R_AARCH64_TLSLE_LDST16_TPREL_LO12 = 554, // TPREL(S+A)
|
2018-03-28 03:24:48 +02:00
|
|
|
R_AARCH64_TLSLE_LDST16_TPREL_LO12_NC = 555, // TPREL(S+A)
|
2014-07-03 01:21:23 +02:00
|
|
|
R_AARCH64_TLSLE_LDST32_TPREL_LO12 = 556, // TPREL(S+A)
|
|
|
|
R_AARCH64_TLSLE_LDST32_TPREL_LO12_NC = 557, // TPREL(S+A)
|
|
|
|
R_AARCH64_TLSLE_LDST64_TPREL_LO12 = 558, // TPREL(S+A)
|
|
|
|
R_AARCH64_TLSLE_LDST64_TPREL_LO12_NC = 559, // TPREL(S+A)
|
|
|
|
R_AARCH64_TLSDESC_LD_PREL19 = 560, // G(GTLSDESC(S+A)) - P
|
|
|
|
R_AARCH64_TLSDESC_ADR_PREL21 = 561, // G(GTLSDESC(S+A)) - P
|
|
|
|
R_AARCH64_TLSDESC_ADR_PAGE21 = 562, // Page(G(GTLSDESC(S+A)))-Page(P)
|
|
|
|
R_AARCH64_TLSDESC_LD64_LO12 = 563, // G(GTLSDESC(S+A))
|
|
|
|
R_AARCH64_TLSDESC_ADD_LO12 = 564, // G(GTLSDESC(S+A))
|
|
|
|
R_AARCH64_TLSDESC_OFF_G1 = 565, // G(GTLSDESC(S+A)) - GOT
|
|
|
|
R_AARCH64_TLSDESC_OFF_G0_NC = 566, // G(GTLSDESC(S+A)) - GOT
|
|
|
|
R_AARCH64_TLSDESC_LDR = 567, // None
|
|
|
|
R_AARCH64_TLSDESC_ADD = 568, // None
|
|
|
|
R_AARCH64_TLSDESC_CALL = 569, // None
|
|
|
|
R_AARCH64_TLSLE_LDST128_TPREL_LO12 = 570, // TPREL(S+A)
|
|
|
|
R_AARCH64_TLSLE_LDST128_TPREL_LO12_NC = 571, // TPREL(S+A)
|
|
|
|
R_AARCH64_TLSLD_LDST128_DTPREL_LO12 = 572, // DTPREL(S+A)
|
|
|
|
R_AARCH64_TLSLD_LDST128_DTPREL_LO12_NC = 573, // DTPREL(S+A)
|
|
|
|
|
|
|
|
// Dynamic relocations
|
|
|
|
R_AARCH64_COPY = 1024,
|
|
|
|
R_AARCH64_GLOB_DAT = 1025, // S + A
|
|
|
|
R_AARCH64_JUMP_SLOT = 1026, // S + A
|
|
|
|
R_AARCH64_RELATIVE = 1027, // Delta(S) + A
|
Add tls support to gold aarch64 backend.
elfcpp/ChangeLog:
2014-09-17 Han Shen <shenhan@google.com>
* aarch64.h (R_AARCH64_TLS_DTPREL64): Switch enum value with ...
(R_AARCH64_TLS_DTPMOD64): ... enum value.
gold/ChangeLog:
2014-09-17 Han Shen <shenhan@google.com>
Jing Yu <jingyu@google.com>
* aarch64-reloc.def: Add TLSGD_ADR_PAGE21, TLSGD_ADD_LO12_NC,
TLSDESC_ADR_PAGE21, TLSDESC_LD64_LO12, TLSDESC_ADD_LO12, TLSDESC_CALL.
* aarch64.cc (Target_aarch64): Add data members
got_irelative_, got_tlsdesc_, rela_irelative_, got_mod_index_offset_,
tlsdesc_reloc_info_, tls_base_symbol_defined_. Initialize them in
constructor.
(Target_aarch64::do_reloc_symbol_index): New method.
(Target_aarch64::do_reloc_addend): New method.
(Target_aarch64::add_tlsdesc_info): New method.
(Target_aarch64::do_dynsym_value): New method.
(Target_aarch64::do_make_data_plt): Add new parameters: got,
got_irelative. Pass them to Output_data_plt_aarch64_standard.
(Target_aarch64::make_data_plt): Add new parameters: got,
got_irelative. Pass them to do_make_data_plt.
(Target_aarch64::Relocate): Add skip_call_tls_get_addr_ variable.
(Target_aarch64::Relocate:tls_gd_to_le): New method.
(Target_aarch64::Relocate:tls_ie_to_le): New method.
(Target_aarch64::Relocate:tls_desc_gd_to_le): New method.
(Target_aarch64::Relocate:tls_desc_gd_to_ie): New method.
(Target_aarch64::got_tlsdesc_section): New method.
(Target_aarch64::make_local_ifunc_plt_entry): New method.
(Target_aarch64::define_tls_base_symbol): New method.
(Target_aarch64::reserve_tlsdesc_entries): New method.
(Target_aarch64::got_mod_index_entry): New method.
(Target_aarch64::rela_tlsdesc_section): New method.
(Target_aarch64::rela_irelative_section): New method.
(Target_aarch64::Tlsdesc_info): New struct.
(Target_aarch64::got_section): Create .got.plt space for IRELATIVE
relocations and tlsdesc relocations.
(Target_aarch64::optimize_tls_reloc): Implement method.
(Output_data_plt_aarch64): Add member variables: tlsdesc_rel_, got_,
got_irelative_, irelative_count_, tlsdesc_got_offset_. Initialize them
in constructor.
(Output_data_plt_aarch64::reserve_tlsdesc_entry): New method.
(Output_data_plt_aarch64::has_tlsdesc_entry): New method.
(Output_data_plt_aarch64::get_tlsdesc_got_offset): New method.
(Output_data_plt_aarch64::get_tlsdesc_plt_offset): New method.
(Output_data_plt_aarch64::rela_tlsdesc): New method.
(Output_data_plt_aarch64::rela_irelative): New method.
(Output_data_plt_aarch64::entry_count): Count IRELATIVE relocations.
(Output_data_plt_aarch64::first_plt_entry_offset): Add const attribute.
(Output_data_plt_aarch64::get_plt_tlsdesc_entry_size): New method.
(Output_data_plt_aarch64::fill_tlsdesc_entry): New method.
(Output_data_plt_aarch64::do_get_plt_tlsdesc_entry_size): New method.
(Output_data_plt_aarch64::do_fill_tlsdesc_entry): New method.
(Output_data_plt_aarch64_standard): New member variables:
plt_tlsdesc_entry_size, tlsdesc_plt_entry.
(Output_data_plt_aarch64_standard::Output_data_plt_aarch64_standard):
New parameter: got, got_irelative.
(Output_data_plt_aarch64_standard::do_get_plt_entry_size): New method.
(Output_data_plt_aarch64_standard::do_fill_tlsdesc_entry): New method.
(Output_data_plt_aarch64::do_write): Replace got_address with
gotplt_address. Add irelative_count_ to count. Write tlsdesc entry.
(AArch64_relocate_functions::update_movnz): New method.
(AArch64_relocate_functions): Correct format.
(AArch64_relocate_functions::movnz): New method.
(Target_aarch64::Scan::local): Correct format. Move r_sym, got to
before the switch. Add new cases to switch.
Check ie_to_le relaxation on tlsie relocations. Add code handling
tlsgd tlsdesc cases.
(Target_aarch64::Scan::global): Move arp to front. Do copy_reloc when
needed. Add new cases to switch. Insert dynamic RELATIVE relocation
when needed. Add code handling tlsgd, tlsie, tlsdesc cases.
Call reloc_name_in_error_message to print unsupported reloc.
(Target_aarch64::make_plt_section): Pass got_ and got_irelative_ to
make_data_plt.
(Target_aarch64::do_finalize_sections): Emit relocs to save COPY
relocs. Fill in some more dynamic tags.
(Target_aarch64::Relocate::relocate): Handle tlsgd, tlsdesc relocs.
Skip call tls_get_addr when tlsgd is relaxed.
(Target_aarch64::Relocate::relocate_tls): Correct format. Add code
handling tlsgd, tlsdesc relocs, and tls gd->le, ie->le, tlsdesc->le,
tlsdesc->ie relaxation.
2014-09-17 23:14:59 +02:00
|
|
|
// Note (shenhan): the following 2 relocs are different from elf spec from
|
|
|
|
// arm. In elf docs, TLS_DTPMOD64 is defined as 1029, TLS_DTPREL64 1028.
|
|
|
|
// While actually the bfd linker (and the dynamic linker) treates TLS_DTPMOD64
|
|
|
|
// as 1028, TLS_DTPREL64 1029. See binutils-gdb/include/elf/aarch64.h.
|
|
|
|
R_AARCH64_TLS_DTPMOD64 = 1028, // LDM(S)
|
|
|
|
R_AARCH64_TLS_DTPREL64 = 1029, // DTPREL(S+A)
|
2014-07-03 01:21:23 +02:00
|
|
|
R_AARCH64_TLS_TPREL64 = 1030, // TPREL(S+A)
|
|
|
|
R_AARCH64_TLSDESC = 1031, // TLSDESC(S+A)
|
|
|
|
R_AARCH64_IRELATIVE = 1032, // Indirect(Delta(S) + A)
|
|
|
|
};
|
|
|
|
|
|
|
|
} // End namespace elfcpp.
|
|
|
|
|
|
|
|
#endif // !defined(ELFCPP_AARCH64_H)
|