| 1 | // sparc.h -- ELF definitions specific to EM_SPARC -*- C++ -*- |
| 2 | |
| 3 | // Copyright (C) 2008-2018 Free Software Foundation, Inc. |
| 4 | // Written by David S. Miller <davem@davemloft.net>. |
| 5 | |
| 6 | // This file is part of elfcpp. |
| 7 | |
| 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. |
| 12 | |
| 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.) |
| 21 | |
| 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. |
| 26 | |
| 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 |
| 30 | // 02110-1301, USA. |
| 31 | |
| 32 | #ifndef ELFCPP_SPARC_H |
| 33 | #define ELFCPP_SPARC_H |
| 34 | |
| 35 | // Documentation for the TLS relocs is taken from |
| 36 | // http://people.redhat.com/drepper/tls.pdf |
| 37 | // |
| 38 | // More full documentation on sparc specific ELF file |
| 39 | // format details can be found at |
| 40 | // |
| 41 | // http://docs.sun.com/app/docs/doc/819/0690/ |
| 42 | // "Linker and Libraries Guide" |
| 43 | // |
| 44 | // specifically Chapter 7 "Object File Format" and |
| 45 | // Chapter 8 "Thread-Local Storage" |
| 46 | |
| 47 | namespace elfcpp |
| 48 | { |
| 49 | |
| 50 | enum |
| 51 | { |
| 52 | R_SPARC_NONE = 0, // No reloc |
| 53 | R_SPARC_8 = 1, // Direct 8 bit |
| 54 | R_SPARC_16 = 2, // Direct 16 bit |
| 55 | R_SPARC_32 = 3, // Direct 32 bit |
| 56 | R_SPARC_DISP8 = 4, // PC relative 8 bit |
| 57 | R_SPARC_DISP16 = 5, // PC relative 16 bit |
| 58 | R_SPARC_DISP32 = 6, // PC relative 32 bit |
| 59 | R_SPARC_WDISP30 = 7, // PC relative 30 bit shifted |
| 60 | R_SPARC_WDISP22 = 8, // PC relative 22 bit shifted |
| 61 | R_SPARC_HI22 = 9, // High 22 bit |
| 62 | R_SPARC_22 = 10, // Direct 22 bit |
| 63 | R_SPARC_13 = 11, // Direct 13 bit |
| 64 | R_SPARC_LO10 = 12, // Truncated 10 bit |
| 65 | R_SPARC_GOT10 = 13, // Truncated 10 bit GOT entry |
| 66 | R_SPARC_GOT13 = 14, // 13 bit GOT entry |
| 67 | R_SPARC_GOT22 = 15, // 22 bit GOT entry shifted |
| 68 | R_SPARC_PC10 = 16, // PC relative 10 bit truncated |
| 69 | R_SPARC_PC22 = 17, // PC relative 22 bit shifted |
| 70 | R_SPARC_WPLT30 = 18, // 30 bit PC relative PLT address |
| 71 | R_SPARC_COPY = 19, // Copy symbol at runtime |
| 72 | R_SPARC_GLOB_DAT = 20, // Create GOT entry |
| 73 | R_SPARC_JMP_SLOT = 21, // Create PLT entry |
| 74 | R_SPARC_RELATIVE = 22, // Adjust by program base |
| 75 | R_SPARC_UA32 = 23, // Direct 32 bit unaligned |
| 76 | R_SPARC_PLT32 = 24, // Direct 32 bit ref to PLT entry |
| 77 | R_SPARC_HIPLT22 = 25, // High 22 bit PLT entry |
| 78 | R_SPARC_LOPLT10 = 26, // Truncated 10 bit PLT entry |
| 79 | R_SPARC_PCPLT32 = 27, // PC rel 32 bit ref to PLT entry |
| 80 | R_SPARC_PCPLT22 = 28, // PC rel high 22 bit PLT entry |
| 81 | R_SPARC_PCPLT10 = 29, // PC rel trunc 10 bit PLT entry |
| 82 | R_SPARC_10 = 30, // Direct 10 bit |
| 83 | R_SPARC_11 = 31, // Direct 11 bit |
| 84 | R_SPARC_64 = 32, // Direct 64 bit |
| 85 | R_SPARC_OLO10 = 33, // 10bit with secondary 13bit addend |
| 86 | R_SPARC_HH22 = 34, // Top 22 bits of direct 64 bit |
| 87 | R_SPARC_HM10 = 35, // High middle 10 bits of ... |
| 88 | R_SPARC_LM22 = 36, // Low middle 22 bits of ... |
| 89 | R_SPARC_PC_HH22 = 37, // Top 22 bits of pc rel 64 bit |
| 90 | R_SPARC_PC_HM10 = 38, // High middle 10 bit of ... |
| 91 | R_SPARC_PC_LM22 = 39, // Low miggle 22 bits of ... |
| 92 | R_SPARC_WDISP16 = 40, // PC relative 16 bit shifted |
| 93 | R_SPARC_WDISP19 = 41, // PC relative 19 bit shifted |
| 94 | R_SPARC_GLOB_JMP = 42, // was part of v9 ABI but was removed |
| 95 | R_SPARC_7 = 43, // Direct 7 bit |
| 96 | R_SPARC_5 = 44, // Direct 5 bit |
| 97 | R_SPARC_6 = 45, // Direct 6 bit |
| 98 | R_SPARC_DISP64 = 46, // PC relative 64 bit |
| 99 | R_SPARC_PLT64 = 47, // Direct 64 bit ref to PLT entry |
| 100 | R_SPARC_HIX22 = 48, // High 22 bit complemented |
| 101 | R_SPARC_LOX10 = 49, // Truncated 11 bit complemented |
| 102 | R_SPARC_H44 = 50, // Direct high 12 of 44 bit |
| 103 | R_SPARC_M44 = 51, // Direct mid 22 of 44 bit |
| 104 | R_SPARC_L44 = 52, // Direct low 10 of 44 bit |
| 105 | R_SPARC_REGISTER = 53, // Global register usage |
| 106 | R_SPARC_UA64 = 54, // Direct 64 bit unaligned |
| 107 | R_SPARC_UA16 = 55, // Direct 16 bit unaligned |
| 108 | R_SPARC_TLS_GD_HI22 = 56, // Initial General Dynamic reloc, high 22-bit |
| 109 | R_SPARC_TLS_GD_LO10 = 57, // Initial General Dynamic reloc, low 10-bit |
| 110 | R_SPARC_TLS_GD_ADD = 58, // Initial General Dynamic reloc, add |
| 111 | R_SPARC_TLS_GD_CALL = 59, // Initial General Dynamic reloc, call |
| 112 | R_SPARC_TLS_LDM_HI22 = 60, // Initial Local Dynamic reloc, high 22-bit |
| 113 | R_SPARC_TLS_LDM_LO10 = 61, // Initial Local Dynamic reloc, low 10-bit |
| 114 | R_SPARC_TLS_LDM_ADD = 62, // Initial Local Dynamic reloc, add |
| 115 | R_SPARC_TLS_LDM_CALL = 63, // Initial Local Dynamic reloc, call |
| 116 | R_SPARC_TLS_LDO_HIX22 = 64, // Initial Local Dynamic, high extended 22-bit |
| 117 | R_SPARC_TLS_LDO_LOX10 = 65, // Initial Local Dynamic, low extended 10-bit |
| 118 | R_SPARC_TLS_LDO_ADD = 66, // Initial Local Dynamic, add extended |
| 119 | R_SPARC_TLS_IE_HI22 = 67, // Initial Initial Exec reloc, high 22-bit |
| 120 | R_SPARC_TLS_IE_LO10 = 68, // Initial Initial Exec reloc, low 10-bit |
| 121 | R_SPARC_TLS_IE_LD = 69, // Initial Initial Exec reloc, load 32-bit |
| 122 | R_SPARC_TLS_IE_LDX = 70, // Initial Initial Exec reloc, load 64-bit |
| 123 | R_SPARC_TLS_IE_ADD = 71, // Initial Initial Exec reloc, add |
| 124 | R_SPARC_TLS_LE_HIX22 = 72, // Initial Local Exec reloc, high extended 22-bit |
| 125 | R_SPARC_TLS_LE_LOX10 = 73, // Initial Local Exec reloc, low extended 10-bit |
| 126 | R_SPARC_TLS_DTPMOD32 = 74, // Outstanding General/Local Dynamic reloc, 32-bit |
| 127 | R_SPARC_TLS_DTPMOD64 = 75, // Outstanding General/Local Dynamic reloc, 64-bit |
| 128 | R_SPARC_TLS_DTPOFF32 = 76, // Outstanding General Dynamic reloc, 32-bit |
| 129 | R_SPARC_TLS_DTPOFF64 = 77, // Outstanding General Dynamic reloc, 64-bit |
| 130 | R_SPARC_TLS_TPOFF32 = 78, // Outstanding Initial Exec reloc, 32-bit |
| 131 | R_SPARC_TLS_TPOFF64 = 79, // Outstanding Initial Exec reloc, 64-bit |
| 132 | |
| 133 | // GOT data code transformations |
| 134 | R_SPARC_GOTDATA_HIX22 = 80, |
| 135 | R_SPARC_GOTDATA_LOX10 = 81, |
| 136 | R_SPARC_GOTDATA_OP_HIX22 = 82, |
| 137 | R_SPARC_GOTDATA_OP_LOX10 = 83, |
| 138 | R_SPARC_GOTDATA_OP = 84, |
| 139 | |
| 140 | R_SPARC_H34 = 85, // Direct high 12 of 34 bit |
| 141 | R_SPARC_SIZE32 = 86, // size of symbol, 32-bit |
| 142 | R_SPARC_SIZE64 = 87, // size of symbol, 64-bit |
| 143 | R_SPARC_WDISP10 = 88, // PC relative 10 bit shifted |
| 144 | |
| 145 | R_SPARC_JMP_IREL = 248, // Create PLT slot to IFUNC function |
| 146 | R_SPARC_IRELATIVE = 249, // Adjust indirectly by program base |
| 147 | |
| 148 | // GNU vtable garbage collection extensions. |
| 149 | R_SPARC_GNU_VTINHERIT = 250, |
| 150 | R_SPARC_GNU_VTENTRY = 251, |
| 151 | |
| 152 | R_SPARC_REV32 = 252, |
| 153 | }; |
| 154 | |
| 155 | // e_flags values defined for sparc |
| 156 | enum |
| 157 | { |
| 158 | EF_SPARC_EXT_MASK = 0xffff00, // reserved for vendor extensions |
| 159 | EF_SPARC_32PLUS_MASK = 0xffff00, // bits indicating V8+ type |
| 160 | EF_SPARC_32PLUS = 0x000100, // generic V8+ features |
| 161 | EF_SPARC_SUN_US1 = 0x000200, // Sun UltraSPARC-I extensions |
| 162 | EF_SPARC_HAL_R1 = 0x000400, // HAL R1 extensions |
| 163 | EF_SPARC_SUN_US3 = 0x000800, // Sun UltraSPARC-III extensions |
| 164 | EF_SPARC_LEDATA = 0x800000, // little endian data |
| 165 | EF_SPARCV9_MM = 0x3, // memory model mask |
| 166 | EF_SPARCV9_TSO = 0x0, // total store ordering |
| 167 | EF_SPARCV9_PSO = 0x1, // partial store ordering |
| 168 | EF_SPARCV9_RMO = 0x2, // relaxed store ordering |
| 169 | }; |
| 170 | |
| 171 | } // End namespace elfcpp. |
| 172 | |
| 173 | #endif // !defined(ELFCPP_SPARC_H) |