aarch64.h 8.5 KB

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