aboutsummaryrefslogtreecommitdiff
blob: 619140558f0be05c6bb37590ce62fe2d97bd31e0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
// sparc.h -- ELF definitions specific to EM_SPARC  -*- C++ -*-

// Copyright (C) 2008-2018 Free Software Foundation, Inc.
// Written by David S. Miller <davem@davemloft.net>.

// 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_SPARC_H
#define ELFCPP_SPARC_H

// Documentation for the TLS relocs is taken from
//   http://people.redhat.com/drepper/tls.pdf
//
// More full documentation on sparc specific ELF file
// format details can be found at
//
//   http://docs.sun.com/app/docs/doc/819/0690/
//   "Linker and Libraries Guide"
//
// specifically Chapter 7 "Object File Format" and
// Chapter 8 "Thread-Local Storage"

namespace elfcpp
{

enum
{
  R_SPARC_NONE = 0,           // No reloc
  R_SPARC_8 = 1,              // Direct 8 bit
  R_SPARC_16 = 2,             // Direct 16 bit
  R_SPARC_32 = 3,             // Direct 32 bit
  R_SPARC_DISP8 = 4,          // PC relative 8 bit
  R_SPARC_DISP16 = 5,         // PC relative 16 bit
  R_SPARC_DISP32 = 6,         // PC relative 32 bit
  R_SPARC_WDISP30 = 7,        // PC relative 30 bit shifted
  R_SPARC_WDISP22 = 8,        // PC relative 22 bit shifted
  R_SPARC_HI22 = 9,           // High 22 bit
  R_SPARC_22 = 10,            // Direct 22 bit
  R_SPARC_13 = 11,            // Direct 13 bit
  R_SPARC_LO10 = 12,          // Truncated 10 bit
  R_SPARC_GOT10 = 13,         // Truncated 10 bit GOT entry
  R_SPARC_GOT13 = 14,         // 13 bit GOT entry
  R_SPARC_GOT22 = 15,         // 22 bit GOT entry shifted
  R_SPARC_PC10 = 16,          // PC relative 10 bit truncated
  R_SPARC_PC22 = 17,          // PC relative 22 bit shifted
  R_SPARC_WPLT30 = 18,        // 30 bit PC relative PLT address
  R_SPARC_COPY = 19,          // Copy symbol at runtime
  R_SPARC_GLOB_DAT = 20,      // Create GOT entry
  R_SPARC_JMP_SLOT = 21,      // Create PLT entry
  R_SPARC_RELATIVE = 22,      // Adjust by program base
  R_SPARC_UA32 = 23,          // Direct 32 bit unaligned
  R_SPARC_PLT32 = 24,         // Direct 32 bit ref to PLT entry
  R_SPARC_HIPLT22 = 25,       // High 22 bit PLT entry
  R_SPARC_LOPLT10 = 26,       // Truncated 10 bit PLT entry
  R_SPARC_PCPLT32 = 27,       // PC rel 32 bit ref to PLT entry
  R_SPARC_PCPLT22 = 28,       // PC rel high 22 bit PLT entry
  R_SPARC_PCPLT10 = 29,       // PC rel trunc 10 bit PLT entry
  R_SPARC_10 = 30,            // Direct 10 bit
  R_SPARC_11 = 31,            // Direct 11 bit
  R_SPARC_64 = 32,            // Direct 64 bit
  R_SPARC_OLO10 = 33,         // 10bit with secondary 13bit addend
  R_SPARC_HH22 = 34,          // Top 22 bits of direct 64 bit
  R_SPARC_HM10 = 35,          // High middle 10 bits of ...
  R_SPARC_LM22 = 36,          // Low middle 22 bits of ...
  R_SPARC_PC_HH22 = 37,       // Top 22 bits of pc rel 64 bit
  R_SPARC_PC_HM10 = 38,       // High middle 10 bit of ...
  R_SPARC_PC_LM22 = 39,       // Low miggle 22 bits of ...
  R_SPARC_WDISP16 = 40,       // PC relative 16 bit shifted
  R_SPARC_WDISP19 = 41,       // PC relative 19 bit shifted
  R_SPARC_GLOB_JMP = 42,      // was part of v9 ABI but was removed
  R_SPARC_7 = 43,             // Direct 7 bit
  R_SPARC_5 = 44,             // Direct 5 bit
  R_SPARC_6 = 45,             // Direct 6 bit
  R_SPARC_DISP64 = 46,        // PC relative 64 bit
  R_SPARC_PLT64 = 47,         // Direct 64 bit ref to PLT entry
  R_SPARC_HIX22 = 48,         // High 22 bit complemented
  R_SPARC_LOX10 = 49,         // Truncated 11 bit complemented
  R_SPARC_H44 = 50,           // Direct high 12 of 44 bit
  R_SPARC_M44 = 51,           // Direct mid 22 of 44 bit
  R_SPARC_L44 = 52,           // Direct low 10 of 44 bit
  R_SPARC_REGISTER = 53,      // Global register usage
  R_SPARC_UA64 = 54,          // Direct 64 bit unaligned
  R_SPARC_UA16 = 55,          // Direct 16 bit unaligned
  R_SPARC_TLS_GD_HI22 = 56,   // Initial General Dynamic reloc, high 22-bit
  R_SPARC_TLS_GD_LO10 = 57,   // Initial General Dynamic reloc, low 10-bit
  R_SPARC_TLS_GD_ADD = 58,    // Initial General Dynamic reloc, add
  R_SPARC_TLS_GD_CALL = 59,   // Initial General Dynamic reloc, call
  R_SPARC_TLS_LDM_HI22 = 60,  // Initial Local Dynamic reloc, high 22-bit
  R_SPARC_TLS_LDM_LO10 = 61,  // Initial Local Dynamic reloc, low 10-bit
  R_SPARC_TLS_LDM_ADD = 62,   // Initial Local Dynamic reloc, add
  R_SPARC_TLS_LDM_CALL = 63,  // Initial Local Dynamic reloc, call
  R_SPARC_TLS_LDO_HIX22 = 64, // Initial Local Dynamic, high extended 22-bit
  R_SPARC_TLS_LDO_LOX10 = 65, // Initial Local Dynamic, low extended 10-bit
  R_SPARC_TLS_LDO_ADD = 66,   // Initial Local Dynamic, add extended
  R_SPARC_TLS_IE_HI22 = 67,   // Initial Initial Exec reloc, high 22-bit
  R_SPARC_TLS_IE_LO10 = 68,   // Initial Initial Exec reloc, low 10-bit
  R_SPARC_TLS_IE_LD = 69,     // Initial Initial Exec reloc, load 32-bit
  R_SPARC_TLS_IE_LDX = 70,    // Initial Initial Exec reloc, load 64-bit
  R_SPARC_TLS_IE_ADD = 71,    // Initial Initial Exec reloc, add
  R_SPARC_TLS_LE_HIX22 = 72,  // Initial Local Exec reloc, high extended 22-bit
  R_SPARC_TLS_LE_LOX10 = 73,  // Initial Local Exec reloc, low extended 10-bit
  R_SPARC_TLS_DTPMOD32 = 74,  // Outstanding General/Local Dynamic reloc, 32-bit
  R_SPARC_TLS_DTPMOD64 = 75,  // Outstanding General/Local Dynamic reloc, 64-bit
  R_SPARC_TLS_DTPOFF32 = 76,  // Outstanding General Dynamic reloc, 32-bit
  R_SPARC_TLS_DTPOFF64 = 77,  // Outstanding General Dynamic reloc, 64-bit
  R_SPARC_TLS_TPOFF32 = 78,   // Outstanding Initial Exec reloc, 32-bit
  R_SPARC_TLS_TPOFF64 = 79,   // Outstanding Initial Exec reloc, 64-bit

  // GOT data code transformations
  R_SPARC_GOTDATA_HIX22 = 80,
  R_SPARC_GOTDATA_LOX10 = 81,
  R_SPARC_GOTDATA_OP_HIX22 = 82,
  R_SPARC_GOTDATA_OP_LOX10 = 83,
  R_SPARC_GOTDATA_OP = 84,

  R_SPARC_H34 = 85,           // Direct high 12 of 34 bit
  R_SPARC_SIZE32 = 86,        // size of symbol, 32-bit
  R_SPARC_SIZE64 = 87,        // size of symbol, 64-bit
  R_SPARC_WDISP10 = 88,       // PC relative 10 bit shifted

  R_SPARC_JMP_IREL = 248,     // Create PLT slot to IFUNC function
  R_SPARC_IRELATIVE = 249,    // Adjust indirectly by program base

  // GNU vtable garbage collection extensions.
  R_SPARC_GNU_VTINHERIT = 250,
  R_SPARC_GNU_VTENTRY = 251,

  R_SPARC_REV32 = 252,
};

// e_flags values defined for sparc
enum
{
  EF_SPARC_EXT_MASK = 0xffff00,    // reserved for vendor extensions
  EF_SPARC_32PLUS_MASK = 0xffff00, // bits indicating V8+ type
  EF_SPARC_32PLUS = 0x000100,      // generic V8+ features
  EF_SPARC_SUN_US1 = 0x000200,     // Sun UltraSPARC-I extensions
  EF_SPARC_HAL_R1 = 0x000400,      // HAL R1 extensions
  EF_SPARC_SUN_US3 = 0x000800,     // Sun UltraSPARC-III extensions
  EF_SPARC_LEDATA = 0x800000,      // little endian data
  EF_SPARCV9_MM = 0x3,             // memory model mask
  EF_SPARCV9_TSO = 0x0,            // total store ordering
  EF_SPARCV9_PSO = 0x1,            // partial store ordering
  EF_SPARCV9_RMO = 0x2,            // relaxed store ordering
};

} // End namespace elfcpp.

#endif // !defined(ELFCPP_SPARC_H)