吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 21298|回复: 27
收起左侧

[Android 原创] ELF文件格式学习,ELF section修复

  [复制链接]
藿香正气 发表于 2017-5-11 15:01
本帖最后由 藿香正气 于 2018-5-14 10:48 编辑

0x0001
学习Android逆向也有一段时间,翻看大神们的帖子收获了不少,开始对ELF、so文件很感兴趣,尤其对内存dump和修复的技术很好奇,看了ThomasKing的ELF section修复的帖子更是深受启发,链接:http://www.52pojie.cn/thread-294642-1-1.html,通过帖子中给出的修复思路,再配合一篇关于ELF文件结构解析的文章让小弟完整立体的了解ELF的文件结构和加载运行等机制,出于好奇想知道这个SECTION的修复具体的实现,但是大神没有给出源码,在网上搜索也没有人在这方面提供资料,因此就决定通过这篇帖子给出的思路,自己实现一个section修复工具,顺便也学习一下elf文件
0x0002
其实TomasKing的帖子中已经把思路都写得很清楚了,但在实现时确实有一些坑,当时天真的认为shstrtab这个section会在dump下的文件中找到,结果发现根本没有,这里需要自己写一个shstrtab然后添加在section header 尾部,还有一个问题就是大神说道”通过__global_offset_table 偏移 + 4 * (rel.plt.size) / sizeof(Elf32_Rel)(这里还需要添加2个int的填充位置)得到got的末尾“ 实际是添加了3个int的填充位,这里不知道大神写错了还是程序之间的差异。下面就给我源码吧 代码比较挫看的时候大家忍一忍 有不对的地方请大家斧正
[C] 纯文本查看 复制代码
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
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
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
#define _CRT_SECURE_NO_WARNINGS
#include "fix.h"
 
char* str = "..dynsym..dynstr..hash..rel.dyn..rel.plt..plt..text@.ARM.extab..ARM.exidx..fini_array..init_array..dynamic..got..data..bss..shstrtab\0";
char* str1 = "\0.dynsym\0.dynstr\0.hash\0.rel.dyn\0.rel.plt\0.plt\[url=mailto:0.text@.ARM.extab]0.text@.ARM.extab[/url]\0.ARM.exidx\0.fini_array\0.init_array\0.dynamic\0.got\0.data\0.bss\0.shstrtab\0";
Elf32_Shdr shdr[SHDRS] = { 0 };
 
void get_elf_header(char* buffer,Elf32_Ehdr** pehdr)
{
        int header_len = sizeof(Elf32_Ehdr);
        memset(*pehdr, 0, header_len);
        memcpy(*pehdr, (void*)buffer, header_len);
}
 
void get_program_table(Elf32_Ehdr ehdr,char* buffer,Elf32_Phdr** pphdr)
{
        int ph_size = ehdr.e_phentsize;
        int ph_num = ehdr.e_phnum;
        memset(*pphdr, 0, ph_size * ph_num);
        memcpy(*pphdr, buffer + ehdr.e_phoff,ph_size * ph_num);
}
 
long get_file_len(FILE* p)
{
    fseek (p, 0, SEEK_END);
    long fsize = ftell (p);
    rewind (p);
    return fsize;
}
 
 
void get_Info(Elf32_Phdr* phdr, Elf32_Ehdr *pehdr, char* buffer)
{
        Elf32_Dyn* dyn = NULL;
        Elf32_Dyn* d = NULL;
        Elf32_Phdr load = { 0 };
         
        int ph_num = pehdr->e_phnum;
        int dyn_size = 0, dyn_off = 0;
        int nbucket = 0, nchain = 0;
        int flag = 0, i = 0;
 
        for(;i < ph_num;i++) {
                if (phdr[i].p_type == PT_LOAD) {
                        if (phdr[i].p_vaddr > 0x0) {
                                load = phdr[i];
                                shdr[BSS].sh_name = strstr(str,".bss") - str;
                                shdr[BSS].sh_type = SHT_NOBITS;
                                shdr[BSS].sh_flags = SHF_WRITE | SHF_ALLOC;
                                shdr[BSS].sh_addr =  phdr[i].p_vaddr + phdr[i].p_filesz;
                                shdr[BSS].sh_offset = shdr[BSS].sh_addr - 0x1000;
                                shdr[BSS].sh_addralign = 1;
 
                                continue;
                        }
                }
 
                if(phdr[i].p_type == PT_DYNAMIC) {
                        shdr[DYNAMIC].sh_name = strstr(str, ".dynamic") - str;
                        shdr[DYNAMIC].sh_type = SHT_DYNAMIC;
                        shdr[DYNAMIC].sh_flags = SHF_WRITE | SHF_ALLOC;
                        shdr[DYNAMIC].sh_addr = phdr[i].p_vaddr;
                        shdr[DYNAMIC].sh_offset = phdr[i].p_offset;
                        shdr[DYNAMIC].sh_size = phdr[i].p_filesz;
                        shdr[DYNAMIC].sh_link = 2;
                        shdr[DYNAMIC].sh_info = 0;
                        shdr[DYNAMIC].sh_addralign = 4;
                        shdr[DYNAMIC].sh_entsize = 8;
                        dyn_size = phdr[i].p_filesz;
                    dyn_off = phdr[i].p_offset;
                    continue;
                }
 
                if(phdr[i].p_type == PT_LOPROC || phdr[i].p_type == PT_LOPROC + 1) {
                        shdr[ARMEXIDX].sh_name = strstr(str, ".ARM.exidx") - str;
                        shdr[ARMEXIDX].sh_type = SHT_LOPROC;
                        shdr[ARMEXIDX].sh_flags = SHF_ALLOC;
                        shdr[ARMEXIDX].sh_addr = phdr[i].p_vaddr;
                        shdr[ARMEXIDX].sh_offset = phdr[i].p_offset;
                        shdr[ARMEXIDX].sh_size = phdr[i].p_filesz;
                        shdr[ARMEXIDX].sh_link = 7;
                        shdr[ARMEXIDX].sh_info = 0;
                        shdr[ARMEXIDX].sh_addralign = 4;
                        shdr[ARMEXIDX].sh_entsize = 8;
                        continue;
                }
        }
 
        dyn = (Elf32_Dyn*)malloc(dyn_size);
        memcpy(dyn,buffer+dyn_off,dyn_size);
        i = 0;
        for (; i < dyn_size / sizeof(Elf32_Dyn); i++) {
                switch (dyn[i].d_tag) {
                        case DT_SYMTAB:
                                shdr[DYNSYM].sh_name = strstr(str, ".dynsym") - str;
                                shdr[DYNSYM].sh_type = SHT_DYNSYM;
                                shdr[DYNSYM].sh_flags = SHF_ALLOC;
                                shdr[DYNSYM].sh_addr = dyn[i].d_un.d_ptr;
                                shdr[DYNSYM].sh_offset = dyn[i].d_un.d_ptr;
                                shdr[DYNSYM].sh_link = 2;
                                shdr[DYNSYM].sh_info = 1;
                                shdr[DYNSYM].sh_addralign = 4;
                                shdr[DYNSYM].sh_entsize = 16;
                                break;
 
                        case DT_STRTAB:
                                shdr[DYNSTR].sh_name = strstr(str, ".dynstr") - str;
                                shdr[DYNSTR].sh_type = SHT_STRTAB;
                                shdr[DYNSTR].sh_flags = SHF_ALLOC;
                                shdr[DYNSTR].sh_offset = dyn[i].d_un.d_ptr;
                                shdr[DYNSTR].sh_addr = dyn[i].d_un.d_ptr;
                                shdr[DYNSTR].sh_addralign = 1;
                                shdr[DYNSTR].sh_entsize = 0;
                                break;
 
                        case DT_HASH:
                                shdr[HASH].sh_name = strstr(str, ".hash") - str;
                                shdr[HASH].sh_type = SHT_HASH;
                                shdr[HASH].sh_flags = SHF_ALLOC;
                                shdr[HASH].sh_addr = dyn[i].d_un.d_ptr;
                                shdr[HASH].sh_offset = dyn[i].d_un.d_ptr;
                                memcpy(&nbucket, buffer + shdr[HASH].sh_offset, 4);
                                memcpy(&nchain, buffer + shdr[HASH].sh_offset + 4, 4);
                                shdr[HASH].sh_size = (nbucket + nchain + 2) * sizeof(int);
                                shdr[HASH].sh_link = 4;
                                shdr[HASH].sh_info = 1;
                                shdr[HASH].sh_addralign = 4;
                                shdr[HASH].sh_entsize = 4;
                                break;
 
                        case DT_REL:
                                shdr[RELDYN].sh_name = strstr(str, ".rel.dyn") - str;
                                shdr[RELDYN].sh_type = SHT_REL;
                                shdr[RELDYN].sh_flags = SHF_ALLOC;
                                shdr[RELDYN].sh_addr = dyn[i].d_un.d_ptr;
                                shdr[RELDYN].sh_offset = dyn[i].d_un.d_ptr;
                                shdr[RELDYN].sh_link = 4;
                                shdr[RELDYN].sh_info = 0;
                                shdr[RELDYN].sh_addralign = 4;
                                shdr[RELDYN].sh_entsize = 8;
                                break;
 
                        case DT_JMPREL:
                                shdr[RELPLT].sh_name = strstr(str, ".rel.plt") - str;
                                shdr[RELPLT].sh_type = SHT_REL;
                                shdr[RELPLT].sh_flags = SHF_ALLOC;
                                shdr[RELPLT].sh_addr = dyn[i].d_un.d_ptr;
                                shdr[RELPLT].sh_offset = dyn[i].d_un.d_ptr;
                                shdr[RELPLT].sh_link = 1;
                                shdr[RELPLT].sh_info = 6;
                                shdr[RELPLT].sh_addralign = 4;
                                shdr[RELPLT].sh_entsize = 8;
                                break;
 
                        case DT_PLTRELSZ:
                                shdr[RELPLT].sh_size = dyn[i].d_un.d_val;
                                break;
 
                        case DT_FINI:
                                shdr[FINIARRAY].sh_name = strstr(str, ".fini_array") - str;
                                shdr[FINIARRAY].sh_type = 15;
                                shdr[FINIARRAY].sh_flags = SHF_WRITE | SHF_ALLOC;
                                shdr[FINIARRAY].sh_offset = dyn[i].d_un.d_ptr - 0x1000;
                                shdr[FINIARRAY].sh_addr = dyn[i].d_un.d_ptr;
                                shdr[FINIARRAY].sh_addralign = 4;
                                shdr[FINIARRAY].sh_entsize = 0;
                                break;
 
                        case DT_INIT:
                                shdr[INITARRAY].sh_name = strstr(str, ".init_array") - str;
                                shdr[INITARRAY].sh_type = 14;
                                shdr[INITARRAY].sh_flags = SHF_WRITE | SHF_ALLOC;
                                shdr[INITARRAY].sh_offset = dyn[i].d_un.d_ptr - 0x1000;
                                shdr[INITARRAY].sh_addr = dyn[i].d_un.d_ptr;
                                shdr[INITARRAY].sh_addralign = 4;
                                shdr[INITARRAY].sh_entsize = 0;
                                break;
 
                        case DT_RELSZ:
                                shdr[RELDYN].sh_size = dyn[i].d_un.d_val;
                                break;
                         
                        case DT_STRSZ:
                                shdr[DYNSTR].sh_size = dyn[i].d_un.d_val;
                                break;
 
                        case DT_PLTGOT:
                                shdr[GOT].sh_name = strstr(str, ".got") - str;
                                shdr[GOT].sh_type = SHT_PROGBITS;
                                shdr[GOT].sh_flags = SHF_WRITE | SHF_ALLOC;
                                shdr[GOT].sh_addr = shdr[DYNAMIC].sh_addr + shdr[DYNAMIC].sh_size;
                                shdr[GOT].sh_offset = shdr[GOT].sh_addr - 0x1000;
                                shdr[GOT].sh_size = dyn[i].d_un.d_ptr;
                                shdr[GOT].sh_addralign = 4;
                                break;
                }
        }
        shdr[GOT].sh_size = shdr[GOT].sh_size + 4 * (shdr[RELPLT].sh_size) / sizeof(Elf32_Rel) + 3 * sizeof(int) - shdr[GOT].sh_addr;
 
        //STRTAB地址 - SYMTAB地址 = SYMTAB大小
        shdr[DYNSYM].sh_size = shdr[DYNSTR].sh_addr - shdr[DYNSYM].sh_addr;
 
        shdr[FINIARRAY].sh_size = shdr[INITARRAY].sh_addr - shdr[FINIARRAY].sh_addr;
        shdr[INITARRAY].sh_size = shdr[DYNAMIC].sh_addr - shdr[INITARRAY].sh_addr;
         
        shdr[PLT].sh_name = strstr(str, ".plt") - str;
        shdr[PLT].sh_type = SHT_PROGBITS;
        shdr[PLT].sh_flags = SHF_ALLOC | SHF_EXECINSTR;
        shdr[PLT].sh_addr = shdr[RELPLT].sh_addr + shdr[RELPLT].sh_size;
        shdr[PLT].sh_offset = shdr[PLT].sh_addr;
        shdr[PLT].sh_size = (20 + 12 * (shdr[RELPLT].sh_size) / sizeof(Elf32_Rel));
        shdr[PLT].sh_addralign = 4;
 
        shdr[TEXT].sh_name = strstr(str, ".text") - str;
        shdr[TEXT].sh_type = SHT_PROGBITS;
        shdr[TEXT].sh_flags = SHF_ALLOC | SHF_EXECINSTR;
        shdr[TEXT].sh_addr = shdr[PLT].sh_addr + shdr[PLT].sh_size;
        shdr[TEXT].sh_offset = shdr[TEXT].sh_addr;
        shdr[TEXT].sh_size = shdr[ARMEXIDX].sh_addr - shdr[TEXT].sh_addr;
         
        shdr[DATA].sh_name = strstr(str, ".data") - str;
        shdr[DATA].sh_type = SHT_PROGBITS;
        shdr[DATA].sh_flags = SHF_WRITE | SHF_ALLOC;
        shdr[DATA].sh_addr = shdr[GOT].sh_addr + shdr[GOT].sh_size;
        shdr[DATA].sh_offset = shdr[DATA].sh_addr - 0x1000;
        shdr[DATA].sh_size = load.p_vaddr + load.p_filesz - shdr[DATA].sh_addr;
        shdr[DATA].sh_addralign = 4;
        shdr[GOT].sh_size = shdr[DATA].sh_offset - shdr[GOT].sh_offset;
 
        shdr[STRTAB].sh_name = strstr(str, ".shstrtab") - str;
        shdr[STRTAB].sh_type = SHT_STRTAB;
        shdr[STRTAB].sh_flags = SHT_NULL;
        shdr[STRTAB].sh_addr = 0;
        shdr[STRTAB].sh_offset = shdr[BSS].sh_addr - 0x1000;
        shdr[STRTAB].sh_size = strlen(str) + 1;
        shdr[STRTAB].sh_addralign = 1;
}
 
int main(int argc, char const *argv[])
{
        FILE* fr = NULL,* fw = NULL;
        long flen = 0,result = 0;
        char* buffer = NULL;
        Elf32_Ehdr *pehdr = NULL;
        Elf32_Phdr* pphdr = NULL;
 
        if (argc < 2) {
                printf("less args\n");
                return;
        }
 
        fr = fopen(argv[1],"rb");
        if(fr == NULL) {
                printf("Open failed: \n");
                goto error;
        }
 
        flen = get_file_len(fr);
 
        buffer = (char*)malloc(sizeof(char)*flen);
        if (buffer == NULL) {
                printf("Malloc error\n");
                goto error;
        }
 
        result = fread (buffer,1,flen,fr);
        if (result != flen) {
                printf("Reading error\n");
                goto error;
        }
 
        fw = fopen("fix.so","wb");
        if(fw == NULL) {
                printf("Open failed: fix.so\n");
                goto error;
        }
         
        pehdr = (Elf32_Ehdr*)malloc(sizeof(Elf32_Ehdr));
        get_elf_header(buffer, &pehdr);
 
        pphdr = (Elf32_Phdr*)malloc(pehdr->e_phentsize * pehdr->e_phnum);
        get_program_table(*pehdr, buffer, &pphdr);
 
        get_Info(pphdr, pehdr, buffer);
         
        pehdr->e_shnum = SHDRS;
        pehdr->e_shstrndx = SHDRS - 1;
        pehdr->e_shoff = shdr[STRTAB].sh_offset + strlen(str) + 1;
        memcpy(buffer, pehdr, sizeof(Elf32_Ehdr));
        memcpy(buffer + shdr[GOT].sh_offset, buffer + shdr[GOT].sh_offset + 0x1000, shdr[GOT].sh_size);
        //memset(buffer + shdr[DATA].sh_offset, 0, shdr[DATA].sh_offset);
        memcpy(buffer + shdr[STRTAB].sh_offset, str1, strlen(str) + 1);
        memcpy(buffer + pehdr->e_shoff, shdr, pehdr->e_shentsize * pehdr->e_shnum);
        flen = shdr[STRTAB].sh_offset + strlen(str) + 1 + SHDRS * sizeof(Elf32_Shdr);
        fwrite(buffer, sizeof(char)*flen, 1, fw);
 
error:
        if(fw != NULL)
                fclose(fw);
        if(fr != NULL)
                fclose(fr);
        if(buffer != NULL)
                free(buffer);
        return 0;
}


[C] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "elf.h"
 
#define SHDRS 16
/*
.dynsym .dynstr .hash .rel.dyn .rel.plt
.plt .text .ARM.extab .ARM.exidx .fini_array
.init_array .dynamic .got .data
*/
#define NONE 0
#define DYNSYM 1
#define DYNSTR 2
#define HASH 3
#define RELDYN 4
#define RELPLT 5
#define PLT 6
#define TEXT 7
#define ARMEXIDX 8
#define FINIARRAY 9
#define INITARRAY 10
#define DYNAMIC 11
#define GOT 12
#define DATA 13
#define BSS 14
#define STRTAB 15
//


[C] 纯文本查看 复制代码
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071
0072
0073
0074
0075
0076
0077
0078
0079
0080
0081
0082
0083
0084
0085
0086
0087
0088
0089
0090
0091
0092
0093
0094
0095
0096
0097
0098
0099
0100
0101
0102
0103
0104
0105
0106
0107
0108
0109
0110
0111
0112
0113
0114
0115
0116
0117
0118
0119
0120
0121
0122
0123
0124
0125
0126
0127
0128
0129
0130
0131
0132
0133
0134
0135
0136
0137
0138
0139
0140
0141
0142
0143
0144
0145
0146
0147
0148
0149
0150
0151
0152
0153
0154
0155
0156
0157
0158
0159
0160
0161
0162
0163
0164
0165
0166
0167
0168
0169
0170
0171
0172
0173
0174
0175
0176
0177
0178
0179
0180
0181
0182
0183
0184
0185
0186
0187
0188
0189
0190
0191
0192
0193
0194
0195
0196
0197
0198
0199
0200
0201
0202
0203
0204
0205
0206
0207
0208
0209
0210
0211
0212
0213
0214
0215
0216
0217
0218
0219
0220
0221
0222
0223
0224
0225
0226
0227
0228
0229
0230
0231
0232
0233
0234
0235
0236
0237
0238
0239
0240
0241
0242
0243
0244
0245
0246
0247
0248
0249
0250
0251
0252
0253
0254
0255
0256
0257
0258
0259
0260
0261
0262
0263
0264
0265
0266
0267
0268
0269
0270
0271
0272
0273
0274
0275
0276
0277
0278
0279
0280
0281
0282
0283
0284
0285
0286
0287
0288
0289
0290
0291
0292
0293
0294
0295
0296
0297
0298
0299
0300
0301
0302
0303
0304
0305
0306
0307
0308
0309
0310
0311
0312
0313
0314
0315
0316
0317
0318
0319
0320
0321
0322
0323
0324
0325
0326
0327
0328
0329
0330
0331
0332
0333
0334
0335
0336
0337
0338
0339
0340
0341
0342
0343
0344
0345
0346
0347
0348
0349
0350
0351
0352
0353
0354
0355
0356
0357
0358
0359
0360
0361
0362
0363
0364
0365
0366
0367
0368
0369
0370
0371
0372
0373
0374
0375
0376
0377
0378
0379
0380
0381
0382
0383
0384
0385
0386
0387
0388
0389
0390
0391
0392
0393
0394
0395
0396
0397
0398
0399
0400
0401
0402
0403
0404
0405
0406
0407
0408
0409
0410
0411
0412
0413
0414
0415
0416
0417
0418
0419
0420
0421
0422
0423
0424
0425
0426
0427
0428
0429
0430
0431
0432
0433
0434
0435
0436
0437
0438
0439
0440
0441
0442
0443
0444
0445
0446
0447
0448
0449
0450
0451
0452
0453
0454
0455
0456
0457
0458
0459
0460
0461
0462
0463
0464
0465
0466
0467
0468
0469
0470
0471
0472
0473
0474
0475
0476
0477
0478
0479
0480
0481
0482
0483
0484
0485
0486
0487
0488
0489
0490
0491
0492
0493
0494
0495
0496
0497
0498
0499
0500
0501
0502
0503
0504
0505
0506
0507
0508
0509
0510
0511
0512
0513
0514
0515
0516
0517
0518
0519
0520
0521
0522
0523
0524
0525
0526
0527
0528
0529
0530
0531
0532
0533
0534
0535
0536
0537
0538
0539
0540
0541
0542
0543
0544
0545
0546
0547
0548
0549
0550
0551
0552
0553
0554
0555
0556
0557
0558
0559
0560
0561
0562
0563
0564
0565
0566
0567
0568
0569
0570
0571
0572
0573
0574
0575
0576
0577
0578
0579
0580
0581
0582
0583
0584
0585
0586
0587
0588
0589
0590
0591
0592
0593
0594
0595
0596
0597
0598
0599
0600
0601
0602
0603
0604
0605
0606
0607
0608
0609
0610
0611
0612
0613
0614
0615
0616
0617
0618
0619
0620
0621
0622
0623
0624
0625
0626
0627
0628
0629
0630
0631
0632
0633
0634
0635
0636
0637
0638
0639
0640
0641
0642
0643
0644
0645
0646
0647
0648
0649
0650
0651
0652
0653
0654
0655
0656
0657
0658
0659
0660
0661
0662
0663
0664
0665
0666
0667
0668
0669
0670
0671
0672
0673
0674
0675
0676
0677
0678
0679
0680
0681
0682
0683
0684
0685
0686
0687
0688
0689
0690
0691
0692
0693
0694
0695
0696
0697
0698
0699
0700
0701
0702
0703
0704
0705
0706
0707
0708
0709
0710
0711
0712
0713
0714
0715
0716
0717
0718
0719
0720
0721
0722
0723
0724
0725
0726
0727
0728
0729
0730
0731
0732
0733
0734
0735
0736
0737
0738
0739
0740
0741
0742
0743
0744
0745
0746
0747
0748
0749
0750
0751
0752
0753
0754
0755
0756
0757
0758
0759
0760
0761
0762
0763
0764
0765
0766
0767
0768
0769
0770
0771
0772
0773
0774
0775
0776
0777
0778
0779
0780
0781
0782
0783
0784
0785
0786
0787
0788
0789
0790
0791
0792
0793
0794
0795
0796
0797
0798
0799
0800
0801
0802
0803
0804
0805
0806
0807
0808
0809
0810
0811
0812
0813
0814
0815
0816
0817
0818
0819
0820
0821
0822
0823
0824
0825
0826
0827
0828
0829
0830
0831
0832
0833
0834
0835
0836
0837
0838
0839
0840
0841
0842
0843
0844
0845
0846
0847
0848
0849
0850
0851
0852
0853
0854
0855
0856
0857
0858
0859
0860
0861
0862
0863
0864
0865
0866
0867
0868
0869
0870
0871
0872
0873
0874
0875
0876
0877
0878
0879
0880
0881
0882
0883
0884
0885
0886
0887
0888
0889
0890
0891
0892
0893
0894
0895
0896
0897
0898
0899
0900
0901
0902
0903
0904
0905
0906
0907
0908
0909
0910
0911
0912
0913
0914
0915
0916
0917
0918
0919
0920
0921
0922
0923
0924
0925
0926
0927
0928
0929
0930
0931
0932
0933
0934
0935
0936
0937
0938
0939
0940
0941
0942
0943
0944
0945
0946
0947
0948
0949
0950
0951
0952
0953
0954
0955
0956
0957
0958
0959
0960
0961
0962
0963
0964
0965
0966
0967
0968
0969
0970
0971
0972
0973
0974
0975
0976
0977
0978
0979
0980
0981
0982
0983
0984
0985
0986
0987
0988
0989
0990
0991
0992
0993
0994
0995
0996
0997
0998
0999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
#ifndef _QEMU_ELF_H
#define _QEMU_ELF_H
#include <inttypes.h>
/* 32-bit ELF base types. */
typedef uint32_t Elf32_Addr;
typedef uint16_t Elf32_Half;
typedef uint32_t Elf32_Off;
typedef int32_t  Elf32_Sword;
typedef uint32_t Elf32_Word;
/* 64-bit ELF base types. */
typedef uint64_t Elf64_Addr;
typedef uint16_t Elf64_Half;
typedef int16_t         Elf64_SHalf;
typedef uint64_t Elf64_Off;
typedef int32_t         Elf64_Sword;
typedef uint32_t Elf64_Word;
typedef uint64_t Elf64_Xword;
typedef int64_t  Elf64_Sxword;
/* These constants are for the segment types stored in the image headers */
#define PT_NULL    0
#define PT_LOAD    1
#define PT_DYNAMIC 2
#define PT_INTERP  3
#define PT_NOTE    4
#define PT_SHLIB   5
#define PT_PHDR    6
#define PT_LOPROC  0x70000000
#define PT_HIPROC  0x7fffffff
#define PT_MIPS_REGINFO        0x70000000
#define PT_MIPS_OPTIONS        0x70000001
/* Flags in the e_flags field of the header */
/* MIPS architecture level. */
#define EF_MIPS_ARCH_1        0x00000000        /* -mips1 code.  */
#define EF_MIPS_ARCH_2        0x10000000        /* -mips2 code.  */
#define EF_MIPS_ARCH_3        0x20000000        /* -mips3 code.  */
#define EF_MIPS_ARCH_4        0x30000000        /* -mips4 code.  */
#define EF_MIPS_ARCH_5        0x40000000        /* -mips5 code.  */
#define EF_MIPS_ARCH_32        0x50000000        /* MIPS32 code.  */
#define EF_MIPS_ARCH_64        0x60000000        /* MIPS64 code.  */
/* The ABI of a file. */
#define EF_MIPS_ABI_O32        0x00001000        /* O32 ABI.  */
#define EF_MIPS_ABI_O64        0x00002000        /* O32 extended for 64 bit.  */
#define EF_MIPS_NOREORDER 0x00000001
#define EF_MIPS_PIC       0x00000002
#define EF_MIPS_CPIC      0x00000004
#define EF_MIPS_ABI2        0x00000020
#define EF_MIPS_OPTIONS_FIRST        0x00000080
#define EF_MIPS_32BITMODE        0x00000100
#define EF_MIPS_ABI        0x0000f000
#define EF_MIPS_ARCH      0xf0000000
/* These constants define the different elf file types */
#define ET_NONE   0
#define ET_REL    1
#define ET_EXEC   2
#define ET_DYN    3
#define ET_CORE   4
#define ET_LOPROC 0xff00
#define ET_HIPROC 0xffff
/* These constants define the various ELF target machines */
#define EM_NONE  0
#define EM_M32   1
#define EM_SPARC 2
#define EM_386   3
#define EM_68K   4
#define EM_88K   5
#define EM_486   6   /* Perhaps disused */
#define EM_860   7
#define EM_MIPS        8        /* MIPS R3000 (officially, big-endian only) */
#define EM_MIPS_RS4_BE 10        /* MIPS R4000 big-endian */
#define EM_PARISC      15        /* HPPA */
#define EM_SPARC32PLUS 18        /* Sun's "v8plus" */
#define EM_PPC               20        /* PowerPC */
#define EM_PPC64       21       /* PowerPC64 */
#define EM_ARM        40        /* ARM */
#define EM_SH               42        /* SuperH */
#define EM_SPARCV9     43        /* SPARC v9 64-bit */
#define EM_IA_64        50        /* HP/Intel IA-64 */
#define EM_X86_64        62        /* AMD x86-64 */
#define EM_S390        22        /* IBM S/390 */
#define EM_CRIS         76      /* Axis Communications 32-bit embedded processor */
#define EM_V850        87        /* NEC v850 */
#define EM_H8_300H      47      /* Hitachi H8/300H */
#define EM_H8S          48      /* Hitachi H8S     */
/*
 * This is an interim value that we will use until the committee comes
 * up with a final number.
 */
#define EM_ALPHA        0x9026
/* Bogus old v850 magic number, used by old tools.  */
#define EM_CYGNUS_V850        0x9080
/*
 * This is the old interim value for S/390 architecture
 */
#define EM_S390_OLD     0xA390
/* This is the info that is needed to parse the dynamic section of the file */
#define DT_NULL        0
#define DT_NEEDED        1
#define DT_PLTRELSZ        2
#define DT_PLTGOT        3
#define DT_HASH                4
#define DT_STRTAB        5
#define DT_SYMTAB        6
#define DT_RELA                7
#define DT_RELASZ        8
#define DT_RELAENT        9
#define DT_STRSZ        10
#define DT_SYMENT        11
#define DT_INIT                25
#define DT_FINI                26
#define DT_SONAME        14
#define DT_RPATH         15
#define DT_SYMBOLIC        16
#define DT_REL            17
#define DT_RELSZ        18
#define DT_RELENT        19
#define DT_PLTREL        20
#define DT_DEBUG        21
#define DT_TEXTREL        22
#define DT_JMPREL        23
#define DT_LOPROC        0x70000000
#define DT_HIPROC        0x7fffffff
#define DT_MIPS_RLD_VERSION        0x70000001
#define DT_MIPS_TIME_STAMP        0x70000002
#define DT_MIPS_ICHECKSUM        0x70000003
#define DT_MIPS_IVERSION        0x70000004
#define DT_MIPS_FLAGS        0x70000005
#define RHF_NONE          0
#define RHF_HARDWAY          1
#define RHF_NOTPOT          2
#define DT_MIPS_BASE_ADDRESS        0x70000006
#define DT_MIPS_CONFLICT        0x70000008
#define DT_MIPS_LIBLIST        0x70000009
#define DT_MIPS_LOCAL_GOTNO        0x7000000a
#define DT_MIPS_CONFLICTNO        0x7000000b
#define DT_MIPS_LIBLISTNO        0x70000010
#define DT_MIPS_SYMTABNO        0x70000011
#define DT_MIPS_UNREFEXTNO        0x70000012
#define DT_MIPS_GOTSYM        0x70000013
#define DT_MIPS_HIPAGENO        0x70000014
#define DT_MIPS_RLD_MAP        0x70000016
/* This info is needed when parsing the symbol table */
#define STB_LOCAL  0
#define STB_GLOBAL 1
#define STB_WEAK   2
#define STT_NOTYPE  0
#define STT_OBJECT  1
#define STT_FUNC    2
#define STT_SECTION 3
#define STT_FILE    4
#define ELF_ST_BIND(x)        ((x) >> 4)
#define ELF_ST_TYPE(x)        (((unsigned int) x) & 0xf)
#define ELF32_ST_BIND(x)        ELF_ST_BIND(x)
#define ELF32_ST_TYPE(x)        ELF_ST_TYPE(x)
#define ELF64_ST_BIND(x)        ELF_ST_BIND(x)
#define ELF64_ST_TYPE(x)        ELF_ST_TYPE(x)
/* Symbolic values for the entries in the auxiliary table
   put on the initial stack */
#define AT_NULL   0        /* end of vector */
#define AT_IGNORE 1        /* entry should be ignored */
#define AT_EXECFD 2        /* file descriptor of program */
#define AT_PHDR   3        /* program headers for program */
#define AT_PHENT  4        /* size of program header entry */
#define AT_PHNUM  5        /* number of program headers */
#define AT_PAGESZ 6        /* system page size */
#define AT_BASE   7        /* base address of interpreter */
#define AT_FLAGS  8        /* flags */
#define AT_ENTRY  9        /* entry point of program */
#define AT_NOTELF 10        /* program is not ELF */
#define AT_UID    11        /* real uid */
#define AT_EUID   12        /* effective uid */
#define AT_GID    13        /* real gid */
#define AT_EGID   14        /* effective gid */
#define AT_PLATFORM 15  /* string identifying CPU for optimizations */
#define AT_HWCAP  16    /* arch dependent hints at CPU capabilities */
#define AT_CLKTCK 17        /* frequency at which times() increments */
typedef struct dynamic{
  Elf32_Sword d_tag;
  union{
    Elf32_Sword        d_val;
    Elf32_Addr        d_ptr;
  } d_un;
} Elf32_Dyn;
typedef struct {
  Elf64_Sxword d_tag;        /* entry tag value */
  union {
    Elf64_Xword d_val;
    Elf64_Addr d_ptr;
  } d_un;
} Elf64_Dyn;
/* The following are used with relocations */
#define ELF32_R_SYM(x) ((x) >> 8)
#define ELF32_R_TYPE(x) ((x) & 0xff)
#define ELF64_R_SYM(i)        ((i) >> 32)
#define ELF64_R_TYPE(i)        ((i) & 0xffffffff)
#define ELF64_R_TYPE_DATA(i)            (((ELF64_R_TYPE(i) >> 8) ^ 0x00800000) - 0x00800000)
#define R_386_NONE        0
#define R_386_32        1
#define R_386_PC32        2
#define R_386_GOT32        3
#define R_386_PLT32        4
#define R_386_COPY        5
#define R_386_GLOB_DAT        6
#define R_386_JMP_SLOT        7
#define R_386_RELATIVE        8
#define R_386_GOTOFF        9
#define R_386_GOTPC        10
#define R_386_NUM        11
#define R_MIPS_NONE        0
#define R_MIPS_16        1
#define R_MIPS_32        2
#define R_MIPS_REL32        3
#define R_MIPS_26        4
#define R_MIPS_HI16        5
#define R_MIPS_LO16        6
#define R_MIPS_GPREL16        7
#define R_MIPS_LITERAL        8
#define R_MIPS_GOT16        9
#define R_MIPS_PC16        10
#define R_MIPS_CALL16        11
#define R_MIPS_GPREL32        12
/* The remaining relocs are defined on Irix, although they are not
   in the MIPS ELF ABI.  */
#define R_MIPS_UNUSED1        13
#define R_MIPS_UNUSED2        14
#define R_MIPS_UNUSED3        15
#define R_MIPS_SHIFT5        16
#define R_MIPS_SHIFT6        17
#define R_MIPS_64        18
#define R_MIPS_GOT_DISP        19
#define R_MIPS_GOT_PAGE        20
#define R_MIPS_GOT_OFST        21
/*
 * The following two relocation types are specified in the MIPS ABI
 * conformance guide version 1.2 but not yet in the psABI.
 */
#define R_MIPS_GOTHI16        22
#define R_MIPS_GOTLO16        23
#define R_MIPS_SUB        24
#define R_MIPS_INSERT_A        25
#define R_MIPS_INSERT_B        26
#define R_MIPS_DELETE        27
#define R_MIPS_HIGHER        28
#define R_MIPS_HIGHEST        29
/*
 * The following two relocation types are specified in the MIPS ABI
 * conformance guide version 1.2 but not yet in the psABI.
 */
#define R_MIPS_CALLHI16        30
#define R_MIPS_CALLLO16        31
/*
 * This range is reserved for vendor specific relocations.
 */
#define R_MIPS_LOVENDOR        100
#define R_MIPS_HIVENDOR        127
/*
 * Sparc ELF relocation types
 */
#define        R_SPARC_NONE        0
#define        R_SPARC_8        1
#define        R_SPARC_16        2
#define        R_SPARC_32        3
#define        R_SPARC_DISP8        4
#define        R_SPARC_DISP16        5
#define        R_SPARC_DISP32        6
#define        R_SPARC_WDISP30        7
#define        R_SPARC_WDISP22        8
#define        R_SPARC_HI22        9
#define        R_SPARC_22        10
#define        R_SPARC_13        11
#define        R_SPARC_LO10        12
#define        R_SPARC_GOT10        13
#define        R_SPARC_GOT13        14
#define        R_SPARC_GOT22        15
#define        R_SPARC_PC10        16
#define        R_SPARC_PC22        17
#define        R_SPARC_WPLT30        18
#define        R_SPARC_COPY        19
#define        R_SPARC_GLOB_DAT        20
#define        R_SPARC_JMP_SLOT        21
#define        R_SPARC_RELATIVE        22
#define        R_SPARC_UA32        23
#define R_SPARC_PLT32        24
#define R_SPARC_HIPLT22        25
#define R_SPARC_LOPLT10        26
#define R_SPARC_PCPLT32        27
#define R_SPARC_PCPLT22        28
#define R_SPARC_PCPLT10        29
#define R_SPARC_10        30
#define R_SPARC_11        31
#define R_SPARC_64        32
#define R_SPARC_OLO10           33
#define R_SPARC_HH22            34
#define R_SPARC_HM10            35
#define R_SPARC_LM22            36
#define R_SPARC_WDISP16        40
#define R_SPARC_WDISP19        41
#define R_SPARC_7        43
#define R_SPARC_5        44
#define R_SPARC_6        45
/* Bits present in AT_HWCAP, primarily for Sparc32.  */
#define HWCAP_SPARC_FLUSH       1    /* CPU supports flush instruction. */
#define HWCAP_SPARC_STBAR       2
#define HWCAP_SPARC_SWAP        4
#define HWCAP_SPARC_MULDIV      8
#define HWCAP_SPARC_V9        16
#define HWCAP_SPARC_ULTRA3        32
/*
 * 68k ELF relocation types
 */
#define R_68K_NONE        0
#define R_68K_32        1
#define R_68K_16        2
#define R_68K_8        3
#define R_68K_PC32        4
#define R_68K_PC16        5
#define R_68K_PC8        6
#define R_68K_GOT32        7
#define R_68K_GOT16        8
#define R_68K_GOT8        9
#define R_68K_GOT32O        10
#define R_68K_GOT16O        11
#define R_68K_GOT8O        12
#define R_68K_PLT32        13
#define R_68K_PLT16        14
#define R_68K_PLT8        15
#define R_68K_PLT32O        16
#define R_68K_PLT16O        17
#define R_68K_PLT8O        18
#define R_68K_COPY        19
#define R_68K_GLOB_DAT        20
#define R_68K_JMP_SLOT        21
#define R_68K_RELATIVE        22
/*
 * Alpha ELF relocation types
 */
#define R_ALPHA_NONE            0       /* No reloc */
#define R_ALPHA_REFLONG         1       /* Direct 32 bit */
#define R_ALPHA_REFQUAD         2       /* Direct 64 bit */
#define R_ALPHA_GPREL32         3       /* GP relative 32 bit */
#define R_ALPHA_LITERAL         4       /* GP relative 16 bit w/optimization */
#define R_ALPHA_LITUSE          5       /* Optimization hint for LITERAL */
#define R_ALPHA_GPDISP          6       /* Add displacement to GP */
#define R_ALPHA_BRADDR          7       /* PC+4 relative 23 bit shifted */
#define R_ALPHA_HINT            8       /* PC+4 relative 16 bit shifted */
#define R_ALPHA_SREL16          9       /* PC relative 16 bit */
#define R_ALPHA_SREL32          10      /* PC relative 32 bit */
#define R_ALPHA_SREL64          11      /* PC relative 64 bit */
#define R_ALPHA_GPRELHIGH       17      /* GP relative 32 bit, high 16 bits */
#define R_ALPHA_GPRELLOW        18      /* GP relative 32 bit, low 16 bits */
#define R_ALPHA_GPREL16         19      /* GP relative 16 bit */
#define R_ALPHA_COPY            24      /* Copy symbol at runtime */
#define R_ALPHA_GLOB_DAT        25      /* Create GOT entry */
#define R_ALPHA_JMP_SLOT        26      /* Create PLT entry */
#define R_ALPHA_RELATIVE        27      /* Adjust by program base */
#define R_ALPHA_BRSGP        28
#define R_ALPHA_TLSGD           29
#define R_ALPHA_TLS_LDM         30
#define R_ALPHA_DTPMOD64        31
#define R_ALPHA_GOTDTPREL       32
#define R_ALPHA_DTPREL64        33
#define R_ALPHA_DTPRELHI        34
#define R_ALPHA_DTPRELLO        35
#define R_ALPHA_DTPREL16        36
#define R_ALPHA_GOTTPREL        37
#define R_ALPHA_TPREL64         38
#define R_ALPHA_TPRELHI         39
#define R_ALPHA_TPRELLO         40
#define R_ALPHA_TPREL16         41
#define SHF_ALPHA_GPREL        0x10000000
/* PowerPC relocations defined by the ABIs */
#define R_PPC_NONE        0
#define R_PPC_ADDR32        1        /* 32bit absolute address */
#define R_PPC_ADDR24        2        /* 26bit address, 2 bits ignored.  */
#define R_PPC_ADDR16        3        /* 16bit absolute address */
#define R_PPC_ADDR16_LO        4        /* lower 16bit of absolute address */
#define R_PPC_ADDR16_HI        5        /* high 16bit of absolute address */
#define R_PPC_ADDR16_HA        6        /* adjusted high 16bit */
#define R_PPC_ADDR14        7        /* 16bit address, 2 bits ignored */
#define R_PPC_ADDR14_BRTAKEN        8
#define R_PPC_ADDR14_BRNTAKEN        9
#define R_PPC_REL24        10        /* PC relative 26 bit */
#define R_PPC_REL14        11        /* PC relative 16 bit */
#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
/* Keep this the last entry.  */
#define R_PPC_NUM        37
/* ARM specific declarations */
/* Processor specific flags for the ELF header e_flags field.  */
#define EF_ARM_RELEXEC     0x01
#define EF_ARM_HASENTRY    0x02
#define EF_ARM_INTERWORK   0x04
#define EF_ARM_APCS_26     0x08
#define EF_ARM_APCS_FLOAT  0x10
#define EF_ARM_PIC         0x20
#define EF_ALIGN8          0x40        /* 8-bit structure alignment is in use */
#define EF_NEW_ABI         0x80
#define EF_OLD_ABI         0x100
/* Additional symbol types for Thumb */
#define STT_ARM_TFUNC      0xd
/* ARM-specific values for sh_flags */
#define SHF_ARM_ENTRYSECT  0x10000000   /* Section contains an entry point */
#define SHF_ARM_COMDEF     0x80000000   /* Section may be multiply defined
   in the input to a link step */
/* ARM-specific program header flags */
#define PF_ARM_SB          0x10000000   /* Segment contains the location
   addressed by the static base */
/* ARM relocs.  */
#define R_ARM_NONE        0        /* No reloc */
#define R_ARM_PC24        1        /* PC relative 26 bit branch */
#define R_ARM_ABS32        2        /* Direct 32 bit  */
#define R_ARM_REL32        3        /* PC relative 32 bit */
#define R_ARM_PC13        4
#define R_ARM_ABS16        5        /* Direct 16 bit */
#define R_ARM_ABS12        6        /* Direct 12 bit */
#define R_ARM_THM_ABS5        7
#define R_ARM_ABS8        8        /* Direct 8 bit */
#define R_ARM_SBREL32        9
#define R_ARM_THM_PC22        10
#define R_ARM_THM_PC8        11
#define R_ARM_AMP_VCALL9        12
#define R_ARM_SWI24        13
#define R_ARM_THM_SWI8        14
#define R_ARM_XPC25        15
#define R_ARM_THM_XPC22        16
#define R_ARM_COPY        20        /* Copy symbol at runtime */
#define R_ARM_GLOB_DAT        21        /* Create GOT entry */
#define R_ARM_JUMP_SLOT        22        /* Create PLT entry */
#define R_ARM_RELATIVE        23        /* Adjust by program base */
#define R_ARM_GOTOFF        24        /* 32 bit offset to GOT */
#define R_ARM_GOTPC        25        /* 32 bit PC relative offset to GOT */
#define R_ARM_GOT32        26        /* 32 bit GOT entry */
#define R_ARM_PLT32        27        /* 32 bit PLT address */
#define R_ARM_CALL              28
#define R_ARM_JUMP24            29
#define R_ARM_GNU_VTENTRY        100
#define R_ARM_GNU_VTINHERIT        101
#define R_ARM_THM_PC11        102        /* thumb unconditional branch */
#define R_ARM_THM_PC9        103        /* thumb conditional branch */
#define R_ARM_RXPC25        249
#define R_ARM_RSBREL32        250
#define R_ARM_THM_RPC22        251
#define R_ARM_RREL32        252
#define R_ARM_RABS22        253
#define R_ARM_RPC24        254
#define R_ARM_RBASE        255
/* Keep this the last entry.  */
#define R_ARM_NUM        256
/* s390 relocations defined by the ABIs */
#define R_390_NONE        0        /* No reloc.  */
#define R_390_8        1        /* Direct 8 bit.  */
#define R_390_12        2        /* Direct 12 bit.  */
#define R_390_16        3        /* Direct 16 bit.  */
#define R_390_32        4        /* Direct 32 bit.  */
#define R_390_PC32        5        /* PC relative 32 bit.        */
#define R_390_GOT12        6        /* 12 bit GOT offset.  */
#define R_390_GOT32        7        /* 32 bit GOT offset.  */
#define R_390_PLT32        8        /* 32 bit PC relative PLT address.  */
#define R_390_COPY        9        /* Copy symbol at runtime.  */
#define R_390_GLOB_DAT        10        /* Create GOT entry.  */
#define R_390_JMP_SLOT        11        /* Create PLT entry.  */
#define R_390_RELATIVE        12        /* Adjust by program base.  */
#define R_390_GOTOFF32        13        /* 32 bit offset to GOT.         */
#define R_390_GOTPC        14        /* 32 bit PC rel. offset to GOT.  */
#define R_390_GOT16        15        /* 16 bit GOT offset.  */
#define R_390_PC16        16        /* PC relative 16 bit.        */
#define R_390_PC16DBL        17        /* PC relative 16 bit shifted by 1.  */
#define R_390_PLT16DBL        18        /* 16 bit PC rel. PLT shifted by 1.  */
#define R_390_PC32DBL        19        /* PC relative 32 bit shifted by 1.  */
#define R_390_PLT32DBL        20        /* 32 bit PC rel. PLT shifted by 1.  */
#define R_390_GOTPCDBL        21        /* 32 bit PC rel. GOT shifted by 1.  */
#define R_390_64        22        /* Direct 64 bit.  */
#define R_390_PC64        23        /* PC relative 64 bit.        */
#define R_390_GOT64        24        /* 64 bit GOT offset.  */
#define R_390_PLT64        25        /* 64 bit PC relative PLT address.  */
#define R_390_GOTENT        26        /* 32 bit PC rel. to GOT entry >> 1. */
#define R_390_GOTOFF16        27        /* 16 bit offset to GOT. */
#define R_390_GOTOFF64        28        /* 64 bit offset to GOT. */
#define R_390_GOTPLT12        29        /* 12 bit offset to jump slot.        */
#define R_390_GOTPLT16        30        /* 16 bit offset to jump slot.        */
#define R_390_GOTPLT32        31        /* 32 bit offset to jump slot.        */
#define R_390_GOTPLT64        32        /* 64 bit offset to jump slot.        */
#define R_390_GOTPLTENT        33        /* 32 bit rel. offset to jump slot.  */
#define R_390_PLTOFF16        34        /* 16 bit offset from GOT to PLT. */
#define R_390_PLTOFF32        35        /* 32 bit offset from GOT to PLT. */
#define R_390_PLTOFF64        36        /* 16 bit offset from GOT to PLT. */
#define R_390_TLS_LOAD        37        /* Tag for load insn in TLS code. */
#define R_390_TLS_GDCALL        38        /* Tag for function call in general
                                           dynamic TLS code.  */
#define R_390_TLS_LDCALL        39        /* Tag for function call in local
                                           dynamic TLS code.  */
#define R_390_TLS_GD32        40        /* Direct 32 bit for general dynamic
                                           thread local data.  */
#define R_390_TLS_GD64        41        /* Direct 64 bit for general dynamic
                                           thread local data.  */
#define R_390_TLS_GOTIE12        42        /* 12 bit GOT offset for static TLS
                                           block offset.  */
#define R_390_TLS_GOTIE32        43        /* 32 bit GOT offset for static TLS
                                           block offset.  */
#define R_390_TLS_GOTIE64        44        /* 64 bit GOT offset for static TLS
                                           block offset.  */
#define R_390_TLS_LDM32        45        /* Direct 32 bit for local dynamic
                                           thread local data in LD code.  */
#define R_390_TLS_LDM64        46        /* Direct 64 bit for local dynamic
                                           thread local data in LD code.  */
#define R_390_TLS_IE32        47        /* 32 bit address of GOT entry for
                                           negated static TLS block offset.  */
#define R_390_TLS_IE64        48        /* 64 bit address of GOT entry for
                                           negated static TLS block offset.  */
#define R_390_TLS_IEENT        49        /* 32 bit rel. offset to GOT entry for
                                           negated static TLS block offset.  */
#define R_390_TLS_LE32        50        /* 32 bit negated offset relative to
                                           static TLS block.  */
#define R_390_TLS_LE64        51        /* 64 bit negated offset relative to
                                           static TLS block.  */
#define R_390_TLS_LDO32        52        /* 32 bit offset relative to TLS
                                           block.  */
#define R_390_TLS_LDO64        53        /* 64 bit offset relative to TLS
                                           block.  */
#define R_390_TLS_DTPMOD        54        /* ID of module containing symbol.  */
#define R_390_TLS_DTPOFF        55        /* Offset in TLS block.  */
#define R_390_TLS_TPOFF        56        /* Negate offset in static TLS
                                           block.  */
/* Keep this the last entry.  */
#define R_390_NUM        57
/* x86-64 relocation types */
#define R_X86_64_NONE        0        /* No reloc */
#define R_X86_64_64        1        /* Direct 64 bit  */
#define R_X86_64_PC32        2        /* PC relative 32 bit signed */
#define R_X86_64_GOT32        3        /* 32 bit GOT entry */
#define R_X86_64_PLT32        4        /* 32 bit PLT address */
#define R_X86_64_COPY        5        /* Copy symbol at runtime */
#define R_X86_64_GLOB_DAT        6        /* Create GOT entry */
#define R_X86_64_JUMP_SLOT        7        /* Create PLT entry */
#define R_X86_64_RELATIVE        8        /* Adjust by program base */
#define R_X86_64_GOTPCREL        9        /* 32 bit signed pc relative
   offset to GOT */
#define R_X86_64_32        10        /* Direct 32 bit zero extended */
#define R_X86_64_32S        11        /* Direct 32 bit sign extended */
#define R_X86_64_16        12        /* Direct 16 bit zero extended */
#define R_X86_64_PC16        13        /* 16 bit sign extended pc relative */
#define R_X86_64_8        14        /* Direct 8 bit sign extended  */
#define R_X86_64_PC8        15        /* 8 bit sign extended pc relative */
#define R_X86_64_NUM        16
/* Legal values for e_flags field of Elf64_Ehdr.  */
#define EF_ALPHA_32BIT        1        /* All addresses are below 2GB */
/* HPPA specific definitions.  */
/* Legal values for e_flags field of Elf32_Ehdr.  */
#define EF_PARISC_TRAPNIL        0x00010000 /* Trap nil pointer dereference.  */
#define EF_PARISC_EXT        0x00020000 /* Program uses arch. extensions. */
#define EF_PARISC_LSB        0x00040000 /* Program expects little endian. */
#define EF_PARISC_WIDE        0x00080000 /* Program expects wide mode.  */
#define EF_PARISC_NO_KABP        0x00100000 /* No kernel assisted branch
      prediction.  */
#define EF_PARISC_LAZYSWAP        0x00400000 /* Allow lazy swapping.  */
#define EF_PARISC_ARCH        0x0000ffff /* Architecture version.  */
/* Defined values for `e_flags & EF_PARISC_ARCH' are:  */
#define EFA_PARISC_1_0            0x020b /* PA-RISC 1.0 big-endian.  */
#define EFA_PARISC_1_1            0x0210 /* PA-RISC 1.1 big-endian.  */
#define EFA_PARISC_2_0            0x0214 /* PA-RISC 2.0 big-endian.  */
/* Additional section indeces.  */
#define SHN_PARISC_ANSI_COMMON        0xff00           /* Section for tenatively declared
      symbols in ANSI C.  */
#define SHN_PARISC_HUGE_COMMON        0xff01           /* Common blocks in huge model.  */
/* Legal values for sh_type field of Elf32_Shdr.  */
#define SHT_PARISC_EXT        0x70000000 /* Contains product specific ext. */
#define SHT_PARISC_UNWIND        0x70000001 /* Unwind information.  */
#define SHT_PARISC_DOC        0x70000002 /* Debug info for optimized code. */
/* Legal values for sh_flags field of Elf32_Shdr.  */
#define SHF_PARISC_SHORT        0x20000000 /* Section with short addressing. */
#define SHF_PARISC_HUGE        0x40000000 /* Section far from gp.  */
#define SHF_PARISC_SBP        0x80000000 /* Static branch prediction code. */
/* Legal values for ST_TYPE subfield of st_info (symbol type).  */
#define STT_PARISC_MILLICODE        13        /* Millicode function entry point.  */
#define STT_HP_OPAQUE        (STT_LOOS + 0x1)
#define STT_HP_STUB        (STT_LOOS + 0x2)
/* HPPA relocs.  */
#define R_PARISC_NONE        0        /* No reloc.  */
#define R_PARISC_DIR32        1        /* Direct 32-bit reference.  */
#define R_PARISC_DIR21L        2        /* Left 21 bits of eff. address.  */
#define R_PARISC_DIR17R        3        /* Right 17 bits of eff. address.  */
#define R_PARISC_DIR17F        4        /* 17 bits of eff. address.  */
#define R_PARISC_DIR14R        6        /* Right 14 bits of eff. address.  */
#define R_PARISC_PCREL32        9        /* 32-bit rel. address.  */
#define R_PARISC_PCREL21L        10        /* Left 21 bits of rel. address.  */
#define R_PARISC_PCREL17R        11        /* Right 17 bits of rel. address.  */
#define R_PARISC_PCREL17F        12        /* 17 bits of rel. address.  */
#define R_PARISC_PCREL14R        14        /* Right 14 bits of rel. address.  */
#define R_PARISC_DPREL21L        18        /* Left 21 bits of rel. address.  */
#define R_PARISC_DPREL14R        22        /* Right 14 bits of rel. address.  */
#define R_PARISC_GPREL21L        26        /* GP-relative, left 21 bits.  */
#define R_PARISC_GPREL14R        30        /* GP-relative, right 14 bits.  */
#define R_PARISC_LTOFF21L        34        /* LT-relative, left 21 bits.  */
#define R_PARISC_LTOFF14R        38        /* LT-relative, right 14 bits.  */
#define R_PARISC_SECREL32        41        /* 32 bits section rel. address.  */
#define R_PARISC_SEGBASE        48        /* No relocation, set segment base.  */
#define R_PARISC_SEGREL32        49        /* 32 bits segment rel. address.  */
#define R_PARISC_PLTOFF21L        50        /* PLT rel. address, left 21 bits.  */
#define R_PARISC_PLTOFF14R        54        /* PLT rel. address, right 14 bits.  */
#define R_PARISC_LTOFF_FPTR32        57        /* 32 bits LT-rel. function pointer. */
#define R_PARISC_LTOFF_FPTR21L        58        /* LT-rel. fct ptr, left 21 bits. */
#define R_PARISC_LTOFF_FPTR14R        62        /* LT-rel. fct ptr, right 14 bits. */
#define R_PARISC_FPTR64        64        /* 64 bits function address.  */
#define R_PARISC_PLABEL32        65        /* 32 bits function address.  */
#define R_PARISC_PCREL64        72        /* 64 bits PC-rel. address.  */
#define R_PARISC_PCREL22F        74        /* 22 bits PC-rel. address.  */
#define R_PARISC_PCREL14WR        75        /* PC-rel. address, right 14 bits.  */
#define R_PARISC_PCREL14DR        76        /* PC rel. address, right 14 bits.  */
#define R_PARISC_PCREL16F        77        /* 16 bits PC-rel. address.  */
#define R_PARISC_PCREL16WF        78        /* 16 bits PC-rel. address.  */
#define R_PARISC_PCREL16DF        79        /* 16 bits PC-rel. address.  */
#define R_PARISC_DIR64        80        /* 64 bits of eff. address.  */
#define R_PARISC_DIR14WR        83        /* 14 bits of eff. address.  */
#define R_PARISC_DIR14DR        84        /* 14 bits of eff. address.  */
#define R_PARISC_DIR16F        85        /* 16 bits of eff. address.  */
#define R_PARISC_DIR16WF        86        /* 16 bits of eff. address.  */
#define R_PARISC_DIR16DF        87        /* 16 bits of eff. address.  */
#define R_PARISC_GPREL64        88        /* 64 bits of GP-rel. address.  */
#define R_PARISC_GPREL14WR        91        /* GP-rel. address, right 14 bits.  */
#define R_PARISC_GPREL14DR        92        /* GP-rel. address, right 14 bits.  */
#define R_PARISC_GPREL16F        93        /* 16 bits GP-rel. address.  */
#define R_PARISC_GPREL16WF        94        /* 16 bits GP-rel. address.  */
#define R_PARISC_GPREL16DF        95        /* 16 bits GP-rel. address.  */
#define R_PARISC_LTOFF64        96        /* 64 bits LT-rel. address.  */
#define R_PARISC_LTOFF14WR        99        /* LT-rel. address, right 14 bits.  */
#define R_PARISC_LTOFF14DR        100        /* LT-rel. address, right 14 bits.  */
#define R_PARISC_LTOFF16F        101        /* 16 bits LT-rel. address.  */
#define R_PARISC_LTOFF16WF        102        /* 16 bits LT-rel. address.  */
#define R_PARISC_LTOFF16DF        103        /* 16 bits LT-rel. address.  */
#define R_PARISC_SECREL64        104        /* 64 bits section rel. address.  */
#define R_PARISC_SEGREL64        112        /* 64 bits segment rel. address.  */
#define R_PARISC_PLTOFF14WR        115        /* PLT-rel. address, right 14 bits.  */
#define R_PARISC_PLTOFF14DR        116        /* PLT-rel. address, right 14 bits.  */
#define R_PARISC_PLTOFF16F        117        /* 16 bits LT-rel. address.  */
#define R_PARISC_PLTOFF16WF        118        /* 16 bits PLT-rel. address.  */
#define R_PARISC_PLTOFF16DF        119        /* 16 bits PLT-rel. address.  */
#define R_PARISC_LTOFF_FPTR64        120        /* 64 bits LT-rel. function ptr.  */
#define R_PARISC_LTOFF_FPTR14WR        123        /* LT-rel. fct. ptr., right 14 bits. */
#define R_PARISC_LTOFF_FPTR14DR        124        /* LT-rel. fct. ptr., right 14 bits. */
#define R_PARISC_LTOFF_FPTR16F        125        /* 16 bits LT-rel. function ptr.  */
#define R_PARISC_LTOFF_FPTR16WF        126        /* 16 bits LT-rel. function ptr.  */
#define R_PARISC_LTOFF_FPTR16DF        127        /* 16 bits LT-rel. function ptr.  */
#define R_PARISC_LORESERVE        128
#define R_PARISC_COPY        128        /* Copy relocation.  */
#define R_PARISC_IPLT        129        /* Dynamic reloc, imported PLT */
#define R_PARISC_EPLT        130        /* Dynamic reloc, exported PLT */
#define R_PARISC_TPREL32        153        /* 32 bits TP-rel. address.  */
#define R_PARISC_TPREL21L        154        /* TP-rel. address, left 21 bits.  */
#define R_PARISC_TPREL14R        158        /* TP-rel. address, right 14 bits.  */
#define R_PARISC_LTOFF_TP21L        162        /* LT-TP-rel. address, left 21 bits. */
#define R_PARISC_LTOFF_TP14R        166        /* LT-TP-rel. address, right 14 bits.*/
#define R_PARISC_LTOFF_TP14F        167        /* 14 bits LT-TP-rel. address.  */
#define R_PARISC_TPREL64        216        /* 64 bits TP-rel. address.  */
#define R_PARISC_TPREL14WR        219        /* TP-rel. address, right 14 bits.  */
#define R_PARISC_TPREL14DR        220        /* TP-rel. address, right 14 bits.  */
#define R_PARISC_TPREL16F        221        /* 16 bits TP-rel. address.  */
#define R_PARISC_TPREL16WF        222        /* 16 bits TP-rel. address.  */
#define R_PARISC_TPREL16DF        223        /* 16 bits TP-rel. address.  */
#define R_PARISC_LTOFF_TP64        224        /* 64 bits LT-TP-rel. address.  */
#define R_PARISC_LTOFF_TP14WR        227        /* LT-TP-rel. address, right 14 bits.*/
#define R_PARISC_LTOFF_TP14DR        228        /* LT-TP-rel. address, right 14 bits.*/
#define R_PARISC_LTOFF_TP16F        229        /* 16 bits LT-TP-rel. address.  */
#define R_PARISC_LTOFF_TP16WF        230        /* 16 bits LT-TP-rel. address.  */
#define R_PARISC_LTOFF_TP16DF        231        /* 16 bits LT-TP-rel. address.  */
#define R_PARISC_HIRESERVE        255
/* Legal values for p_type field of Elf32_Phdr/Elf64_Phdr.  */
#define PT_HP_TLS        (PT_LOOS + 0x0)
#define PT_HP_CORE_NONE        (PT_LOOS + 0x1)
#define PT_HP_CORE_VERSION        (PT_LOOS + 0x2)
#define PT_HP_CORE_KERNEL        (PT_LOOS + 0x3)
#define PT_HP_CORE_COMM        (PT_LOOS + 0x4)
#define PT_HP_CORE_PROC        (PT_LOOS + 0x5)
#define PT_HP_CORE_LOADABLE        (PT_LOOS + 0x6)
#define PT_HP_CORE_STACK        (PT_LOOS + 0x7)
#define PT_HP_CORE_SHM        (PT_LOOS + 0x8)
#define PT_HP_CORE_MMF        (PT_LOOS + 0x9)
#define PT_HP_PARALLEL        (PT_LOOS + 0x10)
#define PT_HP_FASTBIND        (PT_LOOS + 0x11)
#define PT_HP_OPT_ANNOT        (PT_LOOS + 0x12)
#define PT_HP_HSL_ANNOT        (PT_LOOS + 0x13)
#define PT_HP_STACK        (PT_LOOS + 0x14)
#define PT_PARISC_ARCHEXT        0x70000000
#define PT_PARISC_UNWIND        0x70000001
/* Legal values for p_flags field of Elf32_Phdr/Elf64_Phdr.  */
#define PF_PARISC_SBP        0x08000000
#define PF_HP_PAGE_SIZE        0x00100000
#define PF_HP_FAR_SHARED        0x00200000
#define PF_HP_NEAR_SHARED        0x00400000
#define PF_HP_CODE        0x01000000
#define PF_HP_MODIFY        0x02000000
#define PF_HP_LAZYSWAP        0x04000000
#define PF_HP_SBP        0x08000000
/* IA-64 specific declarations.  */
/* Processor specific flags for the Ehdr e_flags field.  */
#define EF_IA_64_MASKOS        0x0000000f        /* os-specific flags */
#define EF_IA_64_ABI64        0x00000010        /* 64-bit ABI */
#define EF_IA_64_ARCH        0xff000000        /* arch. version mask */
/* Processor specific values for the Phdr p_type field.  */
#define PT_IA_64_ARCHEXT        (PT_LOPROC + 0)        /* arch extension bits */
#define PT_IA_64_UNWIND        (PT_LOPROC + 1)        /* ia64 unwind bits */
/* Processor specific flags for the Phdr p_flags field.  */
#define PF_IA_64_NORECOV        0x80000000        /* spec insns w/o recovery */
/* Processor specific values for the Shdr sh_type field.  */
#define SHT_IA_64_EXT        (SHT_LOPROC + 0) /* extension bits */
#define SHT_IA_64_UNWIND        (SHT_LOPROC + 1) /* unwind bits */
/* Processor specific flags for the Shdr sh_flags field.  */
#define SHF_IA_64_SHORT        0x10000000        /* section near gp */
#define SHF_IA_64_NORECOV        0x20000000        /* spec insns w/o recovery */
/* Processor specific values for the Dyn d_tag field.  */
#define DT_IA_64_PLT_RESERVE        (DT_LOPROC + 0)
#define DT_IA_64_NUM        1
/* IA-64 relocations.  */
#define R_IA64_NONE        0x00        /* none */
#define R_IA64_IMM14        0x21        /* symbol + addend, add imm14 */
#define R_IA64_IMM22        0x22        /* symbol + addend, add imm22 */
#define R_IA64_IMM64        0x23        /* symbol + addend, mov imm64 */
#define R_IA64_DIR32MSB        0x24        /* symbol + addend, data4 MSB */
#define R_IA64_DIR32LSB        0x25        /* symbol + addend, data4 LSB */
#define R_IA64_DIR64MSB        0x26        /* symbol + addend, data8 MSB */
#define R_IA64_DIR64LSB        0x27        /* symbol + addend, data8 LSB */
#define R_IA64_GPREL22        0x2a        /* @gprel(sym + add), add imm22 */
#define R_IA64_GPREL64I        0x2b        /* @gprel(sym + add), mov imm64 */
#define R_IA64_GPREL32MSB        0x2c        /* @gprel(sym + add), data4 MSB */
#define R_IA64_GPREL32LSB        0x2d        /* @gprel(sym + add), data4 LSB */
#define R_IA64_GPREL64MSB        0x2e        /* @gprel(sym + add), data8 MSB */
#define R_IA64_GPREL64LSB        0x2f        /* @gprel(sym + add), data8 LSB */
#define R_IA64_LTOFF22        0x32        /* @ltoff(sym + add), add imm22 */
#define R_IA64_LTOFF64I        0x33        /* @ltoff(sym + add), mov imm64 */
#define R_IA64_PLTOFF22        0x3a        /* @pltoff(sym + add), add imm22 */
#define R_IA64_PLTOFF64I        0x3b        /* @pltoff(sym + add), mov imm64 */
#define R_IA64_PLTOFF64MSB        0x3e        /* @pltoff(sym + add), data8 MSB */
#define R_IA64_PLTOFF64LSB        0x3f        /* @pltoff(sym + add), data8 LSB */
#define R_IA64_FPTR64I        0x43        /* @fptr(sym + add), mov imm64 */
#define R_IA64_FPTR32MSB        0x44        /* @fptr(sym + add), data4 MSB */
#define R_IA64_FPTR32LSB        0x45        /* @fptr(sym + add), data4 LSB */
#define R_IA64_FPTR64MSB        0x46        /* @fptr(sym + add), data8 MSB */
#define R_IA64_FPTR64LSB        0x47        /* @fptr(sym + add), data8 LSB */
#define R_IA64_PCREL60B        0x48        /* @pcrel(sym + add), brl */
#define R_IA64_PCREL21B        0x49        /* @pcrel(sym + add), ptb, call */
#define R_IA64_PCREL21M        0x4a        /* @pcrel(sym + add), chk.s */
#define R_IA64_PCREL21F        0x4b        /* @pcrel(sym + add), fchkf */
#define R_IA64_PCREL32MSB        0x4c        /* @pcrel(sym + add), data4 MSB */
#define R_IA64_PCREL32LSB        0x4d        /* @pcrel(sym + add), data4 LSB */
#define R_IA64_PCREL64MSB        0x4e        /* @pcrel(sym + add), data8 MSB */
#define R_IA64_PCREL64LSB        0x4f        /* @pcrel(sym + add), data8 LSB */
#define R_IA64_LTOFF_FPTR22        0x52        /* @ltoff(@fptr(s+a)), imm22 */
#define R_IA64_LTOFF_FPTR64I        0x53        /* @ltoff(@fptr(s+a)), imm64 */
#define R_IA64_LTOFF_FPTR32MSB        0x54        /* @ltoff(@fptr(s+a)), data4 MSB */
#define R_IA64_LTOFF_FPTR32LSB        0x55        /* @ltoff(@fptr(s+a)), data4 LSB */
#define R_IA64_LTOFF_FPTR64MSB        0x56        /* @ltoff(@fptr(s+a)), data8 MSB */
#define R_IA64_LTOFF_FPTR64LSB        0x57        /* @ltoff(@fptr(s+a)), data8 LSB */
#define R_IA64_SEGREL32MSB        0x5c        /* @segrel(sym + add), data4 MSB */
#define R_IA64_SEGREL32LSB        0x5d        /* @segrel(sym + add), data4 LSB */
#define R_IA64_SEGREL64MSB        0x5e        /* @segrel(sym + add), data8 MSB */
#define R_IA64_SEGREL64LSB        0x5f        /* @segrel(sym + add), data8 LSB */
#define R_IA64_SECREL32MSB        0x64        /* @secrel(sym + add), data4 MSB */
#define R_IA64_SECREL32LSB        0x65        /* @secrel(sym + add), data4 LSB */
#define R_IA64_SECREL64MSB        0x66        /* @secrel(sym + add), data8 MSB */
#define R_IA64_SECREL64LSB        0x67        /* @secrel(sym + add), data8 LSB */
#define R_IA64_REL32MSB        0x6c        /* data 4 + REL */
#define R_IA64_REL32LSB        0x6d        /* data 4 + REL */
#define R_IA64_REL64MSB        0x6e        /* data 8 + REL */
#define R_IA64_REL64LSB        0x6f        /* data 8 + REL */
#define R_IA64_LTV32MSB        0x74        /* symbol + addend, data4 MSB */
#define R_IA64_LTV32LSB        0x75        /* symbol + addend, data4 LSB */
#define R_IA64_LTV64MSB        0x76        /* symbol + addend, data8 MSB */
#define R_IA64_LTV64LSB        0x77        /* symbol + addend, data8 LSB */
#define R_IA64_PCREL21BI        0x79        /* @pcrel(sym + add), 21bit inst */
#define R_IA64_PCREL22        0x7a        /* @pcrel(sym + add), 22bit inst */
#define R_IA64_PCREL64I        0x7b        /* @pcrel(sym + add), 64bit inst */
#define R_IA64_IPLTMSB        0x80        /* dynamic reloc, imported PLT, MSB */
#define R_IA64_IPLTLSB        0x81        /* dynamic reloc, imported PLT, LSB */
#define R_IA64_COPY        0x84        /* copy relocation */
#define R_IA64_SUB        0x85        /* Addend and symbol difference */
#define R_IA64_LTOFF22X        0x86        /* LTOFF22, relaxable.  */
#define R_IA64_LDXMOV        0x87        /* Use of LTOFF22X.  */
#define R_IA64_TPREL14        0x91        /* @tprel(sym + add), imm14 */
#define R_IA64_TPREL22        0x92        /* @tprel(sym + add), imm22 */
#define R_IA64_TPREL64I        0x93        /* @tprel(sym + add), imm64 */
#define R_IA64_TPREL64MSB        0x96        /* @tprel(sym + add), data8 MSB */
#define R_IA64_TPREL64LSB        0x97        /* @tprel(sym + add), data8 LSB */
#define R_IA64_LTOFF_TPREL22        0x9a        /* @ltoff(@tprel(s+a)), imm2 */
#define R_IA64_DTPMOD64MSB        0xa6        /* @dtpmod(sym + add), data8 MSB */
#define R_IA64_DTPMOD64LSB        0xa7        /* @dtpmod(sym + add), data8 LSB */
#define R_IA64_LTOFF_DTPMOD22        0xaa        /* @ltoff(@dtpmod(sym + add)), imm22 */
#define R_IA64_DTPREL14        0xb1        /* @dtprel(sym + add), imm14 */
#define R_IA64_DTPREL22        0xb2        /* @dtprel(sym + add), imm22 */
#define R_IA64_DTPREL64I        0xb3        /* @dtprel(sym + add), imm64 */
#define R_IA64_DTPREL32MSB        0xb4        /* @dtprel(sym + add), data4 MSB */
#define R_IA64_DTPREL32LSB        0xb5        /* @dtprel(sym + add), data4 LSB */
#define R_IA64_DTPREL64MSB        0xb6        /* @dtprel(sym + add), data8 MSB */
#define R_IA64_DTPREL64LSB        0xb7        /* @dtprel(sym + add), data8 LSB */
#define R_IA64_LTOFF_DTPREL22        0xba        /* @ltoff(@dtprel(s+a)), imm22 */
typedef struct elf32_rel {
  Elf32_Addr        r_offset;
  Elf32_Word        r_info;
} Elf32_Rel;
typedef struct elf64_rel {
  Elf64_Addr r_offset;        /* Location at which to apply the action */
  Elf64_Xword r_info;        /* index and type of relocation */
} Elf64_Rel;
typedef struct elf32_rela{
  Elf32_Addr        r_offset;
  Elf32_Word        r_info;
  Elf32_Sword        r_addend;
} Elf32_Rela;
typedef struct elf64_rela {
  Elf64_Addr r_offset;        /* Location at which to apply the action */
  Elf64_Xword r_info;        /* index and type of relocation */
  Elf64_Sxword r_addend;        /* Constant addend used to compute value */
} Elf64_Rela;
typedef struct elf32_sym{
  Elf32_Word        st_name;
  Elf32_Addr        st_value;
  Elf32_Word        st_size;
  unsigned char        st_info;
  unsigned char        st_other;
  Elf32_Half        st_shndx;
} Elf32_Sym;
typedef struct elf64_sym {
  Elf64_Word st_name;        /* Symbol name, index in string tbl */
  unsigned char        st_info;        /* Type and binding attributes */
  unsigned char        st_other;        /* No defined meaning, 0 */
  Elf64_Half st_shndx;        /* Associated section index */
  Elf64_Addr st_value;        /* Value of the symbol */
  Elf64_Xword st_size;        /* Associated symbol size */
} Elf64_Sym;
#define EI_NIDENT        16
typedef struct elf32_hdr{
  unsigned char        e_ident[EI_NIDENT];
  Elf32_Half        e_type;
  Elf32_Half        e_machine;
  Elf32_Word        e_version;
  Elf32_Addr        e_entry;  /* Entry point */
  Elf32_Off        e_phoff;
  Elf32_Off        e_shoff;
  Elf32_Word        e_flags;
  Elf32_Half        e_ehsize;
  Elf32_Half        e_phentsize;
  Elf32_Half        e_phnum;
  Elf32_Half        e_shentsize;
  Elf32_Half        e_shnum;
  Elf32_Half        e_shstrndx;
} Elf32_Ehdr;
typedef struct elf64_hdr {
  unsigned char        e_ident[16];        /* ELF "magic number" */
  Elf64_Half e_type;
  Elf64_Half e_machine;
  Elf64_Word e_version;
  Elf64_Addr e_entry;        /* Entry point virtual address */
  Elf64_Off e_phoff;        /* Program header table file offset */
  Elf64_Off e_shoff;        /* Section header table file offset */
  Elf64_Word e_flags;
  Elf64_Half e_ehsize;
  Elf64_Half e_phentsize;
  Elf64_Half e_phnum;
  Elf64_Half e_shentsize;
  Elf64_Half e_shnum;
  Elf64_Half e_shstrndx;
} Elf64_Ehdr;
/* These constants define the permissions on sections in the program
   header, p_flags. */
#define PF_R        0x4
#define PF_W        0x2
#define PF_X        0x1
typedef struct elf32_phdr{
  Elf32_Word        p_type;
  Elf32_Off        p_offset;
  Elf32_Addr        p_vaddr;
  Elf32_Addr        p_paddr;
  Elf32_Word        p_filesz;
  Elf32_Word        p_memsz;
  Elf32_Word        p_flags;
  Elf32_Word        p_align;
} Elf32_Phdr;
typedef struct elf64_phdr {
  Elf64_Word p_type;
  Elf64_Word p_flags;
  Elf64_Off p_offset;        /* Segment file offset */
  Elf64_Addr p_vaddr;        /* Segment virtual address */
  Elf64_Addr p_paddr;        /* Segment physical address */
  Elf64_Xword p_filesz;        /* Segment size in file */
  Elf64_Xword p_memsz;        /* Segment size in memory */
  Elf64_Xword p_align;        /* Segment alignment, file & memory */
} Elf64_Phdr;
/* sh_type */
#define SHT_NULL        0
#define SHT_PROGBITS        1
#define SHT_SYMTAB        2
#define SHT_STRTAB        3
#define SHT_RELA        4
#define SHT_HASH        5
#define SHT_DYNAMIC        6
#define SHT_NOTE        7
#define SHT_NOBITS        8
#define SHT_REL        9
#define SHT_SHLIB        10
#define SHT_DYNSYM        11
#define SHT_NUM        12
#define SHT_LOPROC        0x70000000
#define SHT_HIPROC        0x7fffffff
#define SHT_LOUSER        0x80000000
#define SHT_HIUSER        0xffffffff
#define SHT_MIPS_LIST        0x70000000
#define SHT_MIPS_CONFLICT        0x70000002
#define SHT_MIPS_GPTAB        0x70000003
#define SHT_MIPS_UCODE        0x70000004
/* sh_flags */
#define SHF_WRITE        0x1
#define SHF_ALLOC        0x2
#define SHF_EXECINSTR        0x4
#define SHF_MASKPROC        0xf0000000
#define SHF_MIPS_GPREL        0x10000000
/* special section indexes */
#define SHN_UNDEF        0
#define SHN_LORESERVE        0xff00
#define SHN_LOPROC        0xff00
#define SHN_HIPROC        0xff1f
#define SHN_ABS        0xfff1
#define SHN_COMMON        0xfff2
#define SHN_HIRESERVE        0xffff
#define SHN_MIPS_ACCOMON        0xff00
typedef struct elf32_shdr {
  Elf32_Word        sh_name;
  Elf32_Word        sh_type;
  Elf32_Word        sh_flags;
  Elf32_Addr        sh_addr;
  Elf32_Off        sh_offset;
  Elf32_Word        sh_size;
  Elf32_Word        sh_link;
  Elf32_Word        sh_info;
  Elf32_Word        sh_addralign;
  Elf32_Word        sh_entsize;
} Elf32_Shdr;
typedef struct elf64_shdr {
  Elf64_Word sh_name;        /* Section name, index in string tbl */
  Elf64_Word sh_type;        /* Type of section */
  Elf64_Xword sh_flags;        /* Miscellaneous section attributes */
  Elf64_Addr sh_addr;        /* Section virtual addr at execution */
  Elf64_Off sh_offset;        /* Section file offset */
  Elf64_Xword sh_size;        /* Size of section in bytes */
  Elf64_Word sh_link;        /* Index of another section */
  Elf64_Word sh_info;        /* Additional section information */
  Elf64_Xword sh_addralign;        /* Section alignment */
  Elf64_Xword sh_entsize;        /* Entry size if section holds table */
} Elf64_Shdr;
#define        EI_MAG0        0        /* e_ident[] indexes */
#define        EI_MAG1        1
#define        EI_MAG2        2
#define        EI_MAG3        3
#define        EI_CLASS        4
#define        EI_DATA        5
#define        EI_VERSION        6
#define        EI_PAD        7
#define        ELFMAG0        0x7f        /* EI_MAG */
#define        ELFMAG1        'E'
#define        ELFMAG2        'L'
#define        ELFMAG3        'F'
#define        ELFMAG        "177ELF"
#define        SELFMAG        4
#define        ELFCLASSNONE        0        /* EI_CLASS */
#define        ELFCLASS32        1
#define        ELFCLASS64        2
#define        ELFCLASSNUM        3
#define ELFDATANONE        0        /* e_ident[EI_DATA] */
#define ELFDATA2LSB        1
#define ELFDATA2MSB        2
#define EV_NONE        0        /* e_version, EI_VERSION */
#define EV_CURRENT        1
#define EV_NUM        2
/* Notes used in ET_CORE */
#define NT_PRSTATUS        1
#define NT_PRFPREG        2
#define NT_PRPSINFO        3
#define NT_TASKSTRUCT        4
#define NT_PRXFPREG     0x46e62b7f      /* copied from gdb5.1/include/elf/common.h */
/* Note header in a PT_NOTE section */
typedef struct elf32_note {
  Elf32_Word        n_namesz;        /* Name size */
  Elf32_Word        n_descsz;        /* Content size */
  Elf32_Word        n_type;        /* Content type */
} Elf32_Nhdr;
/* Note header in a PT_NOTE section */
typedef struct elf64_note {
  Elf64_Word n_namesz;        /* Name size */
  Elf64_Word n_descsz;        /* Content size */
  Elf64_Word n_type;        /* Content type */
} Elf64_Nhdr;
#if ELF_CLASS == ELFCLASS32
#define elfhdr        elf32_hdr
#define elf_phdr        elf32_phdr
#define elf_note        elf32_note
#define elf_shdr        elf32_shdr
#define elf_sym        elf32_sym
#define elf_addr_t        Elf32_Off
#ifdef ELF_USES_RELOCA
# define ELF_RELOC      Elf32_Rela
#else
# define ELF_RELOC      Elf32_Rel
#endif
#else
#define elfhdr        elf64_hdr
#define elf_phdr        elf64_phdr
#define elf_note        elf64_note
#define elf_shdr        elf64_shdr
#define elf_sym        elf64_sym
#define elf_addr_t        Elf64_Off
#ifdef ELF_USES_RELOCA
# define ELF_RELOC      Elf64_Rela
#else
# define ELF_RELOC      Elf64_Rel
#endif
#endif /* ELF_CLASS */
#ifndef ElfW
# if ELF_CLASS == ELFCLASS32
#  define ElfW(x)  Elf32_ ## x
#  define ELFW(x)  ELF32_ ## x
# else
#  define ElfW(x)  Elf64_ ## x
#  define ELFW(x)  ELF64_ ## x
# endif
#endif
#endif /* _QEMU_ELF_H */


--------------------------------------------------------------------
8月29日 修改了一些bug,主要是因为shdr[RELPLT].sh_type赋值错误,导致函数名不能正常解析,对细节进行了一些修改,目前这个版本基本上和ThomasKing大大的工具一样了,希望大家喜欢

免费评分

参与人数 10吾爱币 +9 热心值 +10 收起 理由
ducd + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
zhuzaiting + 1 + 1 谢谢@Thanks!
qaz003 + 2 + 1 用心讨论,共获提升!
海底总动员 + 1 我很赞同!
文可う润心 + 1 + 1 谢谢@Thanks!
dreamer2020 + 1 + 1 谢谢@Thanks!
雫Hao洋洋 + 1 + 1 我很赞同!
wmsuper + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
xaoxao + 1 热心回复!
caddy + 1 + 1 我很赞同!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| 藿香正气 发表于 2017-5-12 13:47
本帖最后由 藿香正气 于 2017-5-12 16:25 编辑
Thunderbolt 发表于 2017-5-12 10:19
教你个超级不要脸的绝招,你把TM的apk逆向一下不就都有了

不太理解什么意思 能不能帮我详细解释一下
 楼主| 藿香正气 发表于 2017-10-25 09:22
51bwn 发表于 2017-10-24 10:27
如何修改方法名呢,我直接修改是不行的,系统的学习是有多麻烦呀。

应该在导出表里可以修改
欧阳锋锋 发表于 2017-5-11 15:50
mayl8822 发表于 2017-5-11 15:52
感谢分享!!!
caddy 发表于 2017-5-11 16:40
谢谢分享
fatmou 发表于 2017-5-11 16:45
大神啊, 先看看,学习一下
hnguoxia 发表于 2017-5-11 17:10
学习了,谢谢大神!!
悠悠娴娴 发表于 2017-5-11 19:43
大神,接受我的膜拜
meng4450 发表于 2017-5-11 20:10

大神,学习一下
superlukia 发表于 2017-5-12 09:42
学习了,感谢分享
 楼主| 藿香正气 发表于 2017-5-12 09:49
谢谢各位大大支持,第一次写这样的文章,写的不好代码也没有注释希望大家包涵,有什么问题也可以和我交流
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2025-4-19 15:02

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表