1 // aarch64.h -- ELF definitions specific to AARCH64 -*- C++ -*-
3 // Copyright (C) 2014-2020 Free Software Foundation, Inc.
4 // Written by Jing Yu (jingyu@google.com)
6 // This file is part of elfcpp.
8 // This program is free software; you can redistribute it and/or
9 // modify it under the terms of the GNU Library General Public License
10 // as published by the Free Software Foundation; either version 2, or
11 // (at your option) any later version.
13 // In addition to the permissions in the GNU Library General Public
14 // License, the Free Software Foundation gives you unlimited
15 // permission to link the compiled version of this file into
16 // combinations with other programs, and to distribute those
17 // combinations without any restriction coming from the use of this
18 // file. (The Library Public License restrictions do apply in other
19 // respects; for example, they cover modification of the file, and
20 /// distribution when not linked into a combined executable.)
22 // This program is distributed in the hope that it will be useful, but
23 // WITHOUT ANY WARRANTY; without even the implied warranty of
24 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
25 // Library General Public License for more details.
27 // You should have received a copy of the GNU Library General Public
28 // License along with this program; if not, write to the Free Software
29 // Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
32 #ifndef ELFCPP_AARCH64_H
33 #define ELFCPP_AARCH64_H
38 // The relocation type information is taken from:
40 // ELF for the ARM 64-bit Architecture (AArch64)
41 // Document number: ARM IHI 0056B, current through AArch64 ABI release 1.0
42 // Date of Issue: 22nd May, 2013
47 // Null relocation codes
48 R_AARCH64_NONE
= 0, // None
49 R_AARCH64_withdrawn
= 256, // Treat as R_AARCH64_NONE
52 R_AARCH64_ABS64
= 257, // S + A
53 R_AARCH64_ABS32
= 258, // S + A
54 R_AARCH64_ABS16
= 259, // S + A
55 R_AARCH64_PREL64
= 260, // S + A - P
56 R_AARCH64_PREL32
= 261, // S + A - P
57 R_AARCH64_PREL16
= 262, // S + A - P
58 R_AARCH64_MOVW_UABS_G0
= 263, // S + A
59 R_AARCH64_MOVW_UABS_G0_NC
= 264, // S + A
60 R_AARCH64_MOVW_UABS_G1
= 265, // S + A
61 R_AARCH64_MOVW_UABS_G1_NC
= 266, // S + A
62 R_AARCH64_MOVW_UABS_G2
= 267, // S + A
63 R_AARCH64_MOVW_UABS_G2_NC
= 268, // S + A
64 R_AARCH64_MOVW_UABS_G3
= 269, // S + A
65 R_AARCH64_MOVW_SABS_G0
= 270, // S + A
66 R_AARCH64_MOVW_SABS_G1
= 271, // S + A
67 R_AARCH64_MOVW_SABS_G2
= 272, // S + A
68 R_AARCH64_LD_PREL_LO19
= 273, // S + A - P
69 R_AARCH64_ADR_PREL_LO21
= 274, // S + A - P
70 R_AARCH64_ADR_PREL_PG_HI21
= 275, // Page(S+A) - Page(P)
71 R_AARCH64_ADR_PREL_PG_HI21_NC
= 276, // Page(S+A) - Page(P)
72 R_AARCH64_ADD_ABS_LO12_NC
= 277, // S + A
73 R_AARCH64_LDST8_ABS_LO12_NC
= 278, // S + A
74 R_AARCH64_TSTBR14
= 279, // S + A - P
75 R_AARCH64_CONDBR19
= 280, // S + A - P
76 R_AARCH64_JUMP26
= 282, // S + A - P
77 R_AARCH64_CALL26
= 283, // S + A - P
78 R_AARCH64_LDST16_ABS_LO12_NC
= 284, // S + A
79 R_AARCH64_LDST32_ABS_LO12_NC
= 285, // S + A
80 R_AARCH64_LDST64_ABS_LO12_NC
= 286, // S + A
81 R_AARCH64_MOVW_PREL_G0
= 287, // S + A - P
82 R_AARCH64_MOVW_PREL_G0_NC
= 288, // S + A - P
83 R_AARCH64_MOVW_PREL_G1
= 289, // S + A - P
84 R_AARCH64_MOVW_PREL_G1_NC
= 290, // S + A - P
85 R_AARCH64_MOVW_PREL_G2
= 291, // S + A - P
86 R_AARCH64_MOVW_PREL_G2_NC
= 292, // S + A - P
87 R_AARCH64_MOVW_PREL_G3
= 293, // S + A - P
88 R_AARCH64_LDST128_ABS_LO12_NC
= 299, // S + A
89 R_AARCH64_MOVW_GOTOFF_G0
= 300, // G(GDAT(S+A))-GOT
90 R_AARCH64_MOVW_GOTOFF_G0_NC
= 301, // G(GDAT(S+A))-GOT
91 R_AARCH64_MOVW_GOTOFF_G1
= 302, // G(GDAT(S+A))-GOT
92 R_AARCH64_MOVW_GOTOFF_G1_NC
= 303, // G(GDAT(S+A))-GOT
93 R_AARCH64_MOVW_GOTOFF_G2
= 304, // G(GDAT(S+A))-GOT
94 R_AARCH64_MOVW_GOTOFF_G2_NC
= 305, // G(GDAT(S+A))-GOT
95 R_AARCH64_MOVW_GOTOFF_G3
= 306, // G(GDAT(S+A))-GOT
96 R_AARCH64_GOTREL64
= 307, // S + A - GOT
97 R_AARCH64_GOTREL32
= 308, // S + A - GOT
98 R_AARCH64_GOT_LD_PREL19
= 309, // G(GDAT(S+A))-P
99 R_AARCH64_LD64_GOTOFF_LO15
= 310, // G(GDAT(S+A))-GOT
100 R_AARCH64_ADR_GOT_PAGE
= 311, // Page(G(GDAT(S+A)))-Page(P)
101 R_AARCH64_LD64_GOT_LO12_NC
= 312, // G(GDAT(S+A))
102 R_AARCH64_LD64_GOTPAGE_LO15
= 313, // G(GDAT(S+A))-Page(GOT)
104 // Relocations for thread-local storage
105 R_AARCH64_TLSGD_ADR_PREL21
= 512, // G(GTLSIDX(S,A)) - P
106 R_AARCH64_TLSGD_ADR_PAGE21
= 513, // Page(G(GTLSIDX(S,A)))-Page(P)
107 R_AARCH64_TLSGD_ADD_LO12_NC
= 514, // G(GTLSICX(S,A))
108 R_AARCH64_TLSGD_MOVW_G1
= 515, // G(GTLSIDX(S,A)) - GOT
109 R_AARCH64_TLSGD_MOVW_G0_NC
= 516, // G(GTLSIDX(S,A)) - GOT
111 R_AARCH64_TLSLD_ADR_PREL21
= 517, // G(GLDM(S)) - P
112 R_AARCH64_TLSLD_ADR_PAGE21
= 518, // Page(G(GLDM(S))) - Page(P)
113 R_AARCH64_TLSLD_ADD_LO12_NC
= 519, // G(GLDM(S))
114 R_AARCH64_TLSLD_MOVW_G1
= 520, // G(GLDM(S)) - GOT
115 R_AARCH64_TLSLD_MOVW_G0_NC
= 521, // G(GLDM(S)) - GOT
116 R_AARCH64_TLSLD_LD_PREL19
= 522, // G(GLDM(S)) - P
117 R_AARCH64_TLSLD_MOVW_DTPREL_G2
= 523, // DTPREL(S+A)
118 R_AARCH64_TLSLD_MOVW_DTPREL_G1
= 524, // DTPREL(S+A)
119 R_AARCH64_TLSLD_MOVW_DTPREL_G1_NC
= 525, // DTPREL(S+A)
120 R_AARCH64_TLSLD_MOVW_DTPREL_G0
= 526, // DTPREL(S+A)
121 R_AARCH64_TLSLD_MOVW_DTPREL_G0_NC
= 527, // DTPREL(S+A)
122 R_AARCH64_TLSLD_ADD_DTPREL_HI12
= 528, // DTPREL(S+A)
123 R_AARCH64_TLSLD_ADD_DTPREL_LO12
= 529, // DTPREL(S+A)
124 R_AARCH64_TLSLD_ADD_DTPREL_LO12_NC
= 530, // DTPREL(S+A)
125 R_AARCH64_TLSLD_LDST8_DTPREL_LO12
= 531, // DTPREL(S+A)
126 R_AARCH64_TLSLD_LDST8_DTPREL_LO12_NC
= 532, // DTPREL(S+A)
127 R_AARCH64_TLSLD_LDST16_DTPREL_LO12
= 533, // DTPREL(S+A)
128 R_AARCH64_TLSLD_LDST16_DTPREL_LO12_NC
= 534, // DTPREL(S+A)
129 R_AARCH64_TLSLD_LDST32_DTPREL_LO12
= 535, // DTPREL(S+A)
130 R_AARCH64_TLSLD_LDST32_DTPREL_LO12_NC
= 536, // DTPREL(S+A)
131 R_AARCH64_TLSLD_LDST64_DTPREL_LO12
= 537, // DTPREL(S+A)
132 R_AARCH64_TLSLD_LDST64_DTPREL_LO12_NC
= 538, // DTPREL(S+A)
133 R_AARCH64_TLSIE_MOVW_GOTTPREL_G1
= 539, // G(GTPREL(S+A)) - GOT
134 R_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC
= 540, // G(GTPREL(S+A)) - GOT
135 R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21
= 541, // Page(G(GTPREL(S+A)))-Page(P)
136 R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC
= 542, // G(GTPREL(S+A))
137 R_AARCH64_TLSIE_LD_GOTTPREL_PREL19
= 543, // G(GTPREL(S+A)) - P
138 R_AARCH64_TLSLE_MOVW_TPREL_G2
= 544, // TPREL(S+A)
139 R_AARCH64_TLSLE_MOVW_TPREL_G1
= 545, // TPREL(S+A)
140 R_AARCH64_TLSLE_MOVW_TPREL_G1_NC
= 546, // TPREL(S+A)
141 R_AARCH64_TLSLE_MOVW_TPREL_G0
= 547, // TPREL(S+A)
142 R_AARCH64_TLSLE_MOVW_TPREL_G0_NC
= 548, // TPREL(S+A)
143 R_AARCH64_TLSLE_ADD_TPREL_HI12
= 549, // TPREL(S+A)
144 R_AARCH64_TLSLE_ADD_TPREL_LO12
= 550, // TPREL(S+A)
145 R_AARCH64_TLSLE_ADD_TPREL_LO12_NC
= 551, // TPREL(S+A)
146 R_AARCH64_TLSLE_LDST8_TPREL_LO12
= 552, // TPREL(S+A)
147 R_AARCH64_TLSLE_LDST8_TPREL_LO12_NC
= 553, // TPREL(S+A)
148 R_AARCH64_TLSLE_LDST16_TPREL_LO12
= 554, // TPREL(S+A)
149 R_AARCH64_TLSLE_LDST16_TPREL_LO12_NC
= 555, // TPREL(S+A)
150 R_AARCH64_TLSLE_LDST32_TPREL_LO12
= 556, // TPREL(S+A)
151 R_AARCH64_TLSLE_LDST32_TPREL_LO12_NC
= 557, // TPREL(S+A)
152 R_AARCH64_TLSLE_LDST64_TPREL_LO12
= 558, // TPREL(S+A)
153 R_AARCH64_TLSLE_LDST64_TPREL_LO12_NC
= 559, // TPREL(S+A)
154 R_AARCH64_TLSDESC_LD_PREL19
= 560, // G(GTLSDESC(S+A)) - P
155 R_AARCH64_TLSDESC_ADR_PREL21
= 561, // G(GTLSDESC(S+A)) - P
156 R_AARCH64_TLSDESC_ADR_PAGE21
= 562, // Page(G(GTLSDESC(S+A)))-Page(P)
157 R_AARCH64_TLSDESC_LD64_LO12
= 563, // G(GTLSDESC(S+A))
158 R_AARCH64_TLSDESC_ADD_LO12
= 564, // G(GTLSDESC(S+A))
159 R_AARCH64_TLSDESC_OFF_G1
= 565, // G(GTLSDESC(S+A)) - GOT
160 R_AARCH64_TLSDESC_OFF_G0_NC
= 566, // G(GTLSDESC(S+A)) - GOT
161 R_AARCH64_TLSDESC_LDR
= 567, // None
162 R_AARCH64_TLSDESC_ADD
= 568, // None
163 R_AARCH64_TLSDESC_CALL
= 569, // None
164 R_AARCH64_TLSLE_LDST128_TPREL_LO12
= 570, // TPREL(S+A)
165 R_AARCH64_TLSLE_LDST128_TPREL_LO12_NC
= 571, // TPREL(S+A)
166 R_AARCH64_TLSLD_LDST128_DTPREL_LO12
= 572, // DTPREL(S+A)
167 R_AARCH64_TLSLD_LDST128_DTPREL_LO12_NC
= 573, // DTPREL(S+A)
169 // Dynamic relocations
170 R_AARCH64_COPY
= 1024,
171 R_AARCH64_GLOB_DAT
= 1025, // S + A
172 R_AARCH64_JUMP_SLOT
= 1026, // S + A
173 R_AARCH64_RELATIVE
= 1027, // Delta(S) + A
174 // Note (shenhan): the following 2 relocs are different from elf spec from
175 // arm. In elf docs, TLS_DTPMOD64 is defined as 1029, TLS_DTPREL64 1028.
176 // While actually the bfd linker (and the dynamic linker) treates TLS_DTPMOD64
177 // as 1028, TLS_DTPREL64 1029. See binutils-gdb/include/elf/aarch64.h.
178 R_AARCH64_TLS_DTPMOD64
= 1028, // LDM(S)
179 R_AARCH64_TLS_DTPREL64
= 1029, // DTPREL(S+A)
180 R_AARCH64_TLS_TPREL64
= 1030, // TPREL(S+A)
181 R_AARCH64_TLSDESC
= 1031, // TLSDESC(S+A)
182 R_AARCH64_IRELATIVE
= 1032, // Indirect(Delta(S) + A)
185 } // End namespace elfcpp.
187 #endif // !defined(ELFCPP_AARCH64_H)