-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathelf_reloc_ppc.h
276 lines (256 loc) · 7.86 KB
/
elf_reloc_ppc.h
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
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
/* elf_reloc_ppc.h ELF relocation types for PowerPC */
/* (c) in 2002-2008,2016 by Frank Wille */
#define R_PPC_NONE 0
#define R_PPC_ADDR32 1
#define R_PPC_ADDR24 2
#define R_PPC_ADDR16 3
#define R_PPC_ADDR16_LO 4
#define R_PPC_ADDR16_HI 5
#define R_PPC_ADDR16_HA 6
#define R_PPC_ADDR14 7
#define R_PPC_ADDR14_BRTAKEN 8
#define R_PPC_ADDR14_BRNTAKEN 9
#define R_PPC_REL24 10
#define R_PPC_REL14 11
#define R_PPC_REL14_BRTAKEN 12
#define R_PPC_REL14_BRNTAKEN 13
#define R_PPC_GOT16 14
#define R_PPC_GOT16_LO 15
#define R_PPC_GOT16_HI 16
#define R_PPC_GOT16_HA 17
#define R_PPC_PLTREL24 18
#define R_PPC_COPY 19
#define R_PPC_GLOB_DAT 20
#define R_PPC_JMP_SLOT 21
#define R_PPC_RELATIVE 22
#define R_PPC_LOCAL24PC 23
#define R_PPC_UADDR32 24
#define R_PPC_UADDR16 25
#define R_PPC_REL32 26
#define R_PPC_PLT32 27
#define R_PPC_PLTREL32 28
#define R_PPC_PLT16_LO 29
#define R_PPC_PLT16_HI 30
#define R_PPC_PLT16_HA 31
#define R_PPC_SDAREL16 32
#define R_PPC_SECTOFF 33
#define R_PPC_SECTOFF_LO 34
#define R_PPC_SECTOFF_HI 35
#define R_PPC_SECTOFF_HA 36
#define R_PPC_ADDR30 37
#define R_PPC_EMB_NADDR32 101
#define R_PPC_EMB_NADDR16 102
#define R_PPC_EMB_NADDR16_LO 103
#define R_PPC_EMB_NADDR16_HI 104
#define R_PPC_EMB_NADDR16_HA 105
#define R_PPC_EMB_SDAI16 106
#define R_PPC_EMB_SDA2I16 107
#define R_PPC_EMB_SDA2REL 108
#define R_PPC_EMB_SDA21 109
#define R_PPC_EMB_MRKREF 110
#define R_PPC_EMB_RELSEC16 111
#define R_PPC_EMB_RELST_LO 112
#define R_PPC_EMB_RELST_HI 113
#define R_PPC_EMB_RELST_HA 114
#define R_PPC_EMB_BIT_FLD 115
#define R_PPC_EMB_RELSDA 116
#define R_PPC_MORPHOS_DREL 200
#define R_PPC_MORPHOS_DREL_LO 201
#define R_PPC_MORPHOS_DREL_HI 202
#define R_PPC_MORPHOS_DREL_HA 203
#define R_PPC_AMIGAOS_BREL 210
#define R_PPC_AMIGAOS_BREL_LO 211
#define R_PPC_AMIGAOS_BREL_HI 212
#define R_PPC_AMIGAOS_BREL_HA 213
#define R_PPC_GNU_VTINHERIT 253
#define R_PPC_GNU_VTENTRY 254
#define R_PPC_TOC16 255
if ((*rl)->type <= LAST_PPC_RELOC) {
nreloc *r = (nreloc *)(*rl)->reloc;
*refsym = r->sym;
*addend = r->addend;
pos = r->bitoffset;
size = r->size;
*roffset = r->byteoffset;
mask = r->mask;
switch ((*rl)->type) {
case REL_ABS:
if (pos==0 && mask==~0) {
if (size == 32)
t = R_PPC_ADDR32;
else if (size == 16)
t = R_PPC_ADDR16;
}
else if (size==30 && pos==0 && mask==~3)
t = R_PPC_ADDR30;
else if (size==24 && pos==6 && mask==0x3fffffc)
t = R_PPC_ADDR24;
else if (size==14 && pos==0 && mask==0xfffc)
t = R_PPC_ADDR14;
else if (size==16 && pos==0) {
if (mask == 0x0000ffff)
t = R_PPC_ADDR16_LO;
else if (mask == 0xffff0000) {
if (rl2 = (*rl)->next) {
nreloc *r2 = (nreloc *)rl2->reloc;
if (rl2->type==(*rl)->type && r2->byteoffset==*roffset &&
r2->bitoffset==pos && r2->size==size && r2->mask==0x8000) {
t = R_PPC_ADDR16_HA;
*rl = (*rl)->next;
}
}
else
t = R_PPC_ADDR16_HI;
}
}
break;
case REL_PC:
if (size==32 && pos==0 && mask==~0)
t = R_PPC_REL32;
else if (size==24 && pos==6 && mask==0x3fffffc)
t = R_PPC_REL24;
else if (size==14 && pos==0 && mask==0xfffc)
t = R_PPC_REL14;
break;
case REL_GOT:
if (size==16 && pos==0 && mask==~0)
t = R_PPC_GOT16;
else if (size==16 && pos==0) {
if (mask == 0x0000ffff)
t = R_PPC_GOT16_LO;
else if (mask == 0xffff0000) {
if (rl2 = (*rl)->next) {
nreloc *r2 = (nreloc *)rl2->reloc;
if (rl2->type==(*rl)->type && r2->byteoffset==*roffset &&
r2->bitoffset==pos && r2->size==size && r2->mask==0x8000) {
t = R_PPC_GOT16_HA;
*rl = (*rl)->next;
}
}
else
t = R_PPC_GOT16_HI;
}
}
break;
case REL_PLT:
if (size==32 && pos==0 && mask==~0)
t = R_PPC_PLT32;
else if (size==16 && pos==0) {
if (mask == 0x0000ffff)
t = R_PPC_PLT16_LO;
else if (mask == 0xffff0000) {
if (rl2 = (*rl)->next) {
nreloc *r2 = (nreloc *)rl2->reloc;
if (rl2->type==(*rl)->type && r2->byteoffset==*roffset &&
r2->bitoffset==pos && r2->size==size && r2->mask==0x8000) {
t = R_PPC_PLT16_HA;
*rl = (*rl)->next;
}
}
else
t = R_PPC_PLT16_HI;
}
}
break;
case REL_PLTPC:
if (size==32 && pos==0 && mask==~0)
t = R_PPC_PLTREL32;
else if (size==24 && pos==6 && mask==0x3fffffc)
t = R_PPC_PLTREL24;
break;
case REL_SD:
if (size==16 && pos==0 && mask==~0)
t = R_PPC_SDAREL16;
break;
case REL_LOCALPC:
if (size==24 && pos==6 && mask==0x3fffffc)
t = R_PPC_LOCAL24PC;
break;
case REL_UABS:
if (pos==0 && mask==~0) {
if (size == 32)
t = R_PPC_UADDR32;
else if (size == 16)
t = R_PPC_UADDR16;
}
break;
case REL_SECOFF:
if (size==16 && pos==0 && mask==~0)
t = R_PPC_SECTOFF;
else if (size==16 && pos==0) {
if (mask == 0x0000ffff)
t = R_PPC_SECTOFF_LO;
else if (mask == 0xffff0000) {
if (rl2 = (*rl)->next) {
nreloc *r2 = (nreloc *)rl2->reloc;
if (rl2->type==(*rl)->type && r2->byteoffset==*roffset &&
r2->bitoffset==pos && r2->size==size && r2->mask==0x8000) {
t = R_PPC_SECTOFF_HA;
*rl = (*rl)->next;
}
}
else
t = R_PPC_SECTOFF_HI;
}
}
break;
case REL_PPCEABI_SDA2:
if (size==16 && pos==0 && mask==~0)
t = R_PPC_EMB_SDA2REL;
break;
case REL_PPCEABI_SDA21:
if (size==16 && pos==0 && mask==~0) {
t = R_PPC_EMB_SDA21;
*roffset -= 2; /* sda21 starts at beginning of instr. word! */
}
break;
case REL_PPCEABI_SDAI16:
if (size==16 && pos==0 && mask==~0)
t = R_PPC_EMB_SDAI16;
break;
case REL_PPCEABI_SDA2I16:
if (size==16 && pos==0 && mask==~0)
t = R_PPC_EMB_SDA2I16;
break;
case REL_MORPHOS_DREL:
if (size==16 && pos==0 && mask==~0)
t = R_PPC_MORPHOS_DREL;
else if (size==16 && pos==0) {
if (mask == 0x0000ffff)
t = R_PPC_MORPHOS_DREL_LO;
else if (mask == 0xffff0000) {
if (rl2 = (*rl)->next) {
nreloc *r2 = (nreloc *)rl2->reloc;
if (rl2->type==(*rl)->type && r2->byteoffset==*roffset &&
r2->bitoffset==pos && r2->size==size && r2->mask==0x8000) {
t = R_PPC_MORPHOS_DREL_HA;
*rl = (*rl)->next;
}
}
else
t = R_PPC_MORPHOS_DREL_HI;
}
}
break;
case REL_AMIGAOS_BREL:
if (size==16 && pos==0 && mask==~0)
t = R_PPC_AMIGAOS_BREL;
else if (size==16 && pos==0) {
if (mask == 0x0000ffff)
t = R_PPC_AMIGAOS_BREL_LO;
else if (mask == 0xffff0000) {
if (rl2 = (*rl)->next) {
nreloc *r2 = (nreloc *)rl2->reloc;
if (rl2->type==(*rl)->type && r2->byteoffset==*roffset &&
r2->bitoffset==pos && r2->size==size && r2->mask==0x8000) {
t = R_PPC_AMIGAOS_BREL_HA;
*rl = (*rl)->next;
}
}
else
t = R_PPC_AMIGAOS_BREL_HI;
}
}
break;
}
}