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
|
/*
* PSn00bSDK dynamic linker
* (C) 2021 spicyjpeg - MPL licensed
*
* This file is used internally by the dynamic linker to parse the "header"
* (.dynamic and .dynsym sections) of dynamically-linked libraries built with
* the provided linker script. Most of it is copied from the standard Unix
* elf.h header, with the only changes being removed typedefs and #defines
* converted to enums.
*/
#pragma once
#include <stdint.h>
typedef enum {
DT_NULL = 0, /* Marks end of dynamic section */
DT_NEEDED = 1, /* Name of needed library */
DT_PLTRELSZ = 2, /* Size in bytes of PLT relocs */
DT_PLTGOT = 3, /* Processor defined value */
DT_HASH = 4, /* Address of symbol hash table */
DT_STRTAB = 5, /* Address of string table */
DT_SYMTAB = 6, /* Address of symbol table */
DT_RELA = 7, /* Address of Rela relocs */
DT_RELASZ = 8, /* Total size of Rela relocs */
DT_RELAENT = 9, /* Size of one Rela reloc */
DT_STRSZ = 10, /* Size of string table */
DT_SYMENT = 11, /* Size of one symbol table entry */
DT_INIT = 12, /* Address of init function */
DT_FINI = 13, /* Address of termination function */
DT_SONAME = 14, /* Name of shared object */
DT_RPATH = 15, /* Library search path (deprecated) */
DT_SYMBOLIC = 16, /* Start symbol search here */
DT_REL = 17, /* Address of Rel relocs */
DT_RELSZ = 18, /* Total size of Rel relocs */
DT_RELENT = 19, /* Size of one Rel reloc */
DT_PLTREL = 20, /* Type of reloc in PLT */
DT_DEBUG = 21, /* For debugging; unspecified */
DT_TEXTREL = 22, /* Reloc might modify .text */
DT_JMPREL = 23, /* Address of PLT relocs */
DT_BIND_NOW = 24, /* Process relocations of object */
DT_INIT_ARRAY = 25, /* Array with addresses of init fct */
DT_FINI_ARRAY = 26, /* Array with addresses of fini fct */
DT_INIT_ARRAYSZ = 27, /* Size in bytes of DT_INIT_ARRAY */
DT_FINI_ARRAYSZ = 28, /* Size in bytes of DT_FINI_ARRAY */
DT_RUNPATH = 29, /* Library search path */
DT_FLAGS = 30, /* Flags for the object being loaded */
DT_ENCODING = 32, /* Start of encoded range */
DT_PREINIT_ARRAY = 32, /* Array with addresses of preinit fct*/
DT_PREINIT_ARRAYSZ = 33, /* size in bytes of DT_PREINIT_ARRAY */
DT_SYMTAB_SHNDX = 34, /* Address of SYMTAB_SHNDX section */
DT_NUM = 35, /* Number used */
DT_LOOS = 0x6000000d, /* Start of OS-specific */
DT_HIOS = 0x6ffff000, /* End of OS-specific */
DT_LOPROC = 0x70000000, /* Start of processor-specific */
DT_HIPROC = 0x7fffffff, /* End of processor-specific */
DT_MIPS_RLD_VERSION = 0x70000001,
DT_MIPS_FLAGS = 0x70000005,
DT_MIPS_BASE_ADDRESS = 0x70000006,
DT_MIPS_LOCAL_GOTNO = 0x7000000a,
DT_MIPS_SYMTABNO = 0x70000011,
DT_MIPS_UNREFEXTNO = 0x70000012,
DT_MIPS_GOTSYM = 0x70000013,
DT_MIPS_HIPAGENO = 0x70000014
} Elf32_d_tag;
typedef enum {
RHF_NONE = 0, /* No flags */
RHF_QUICKSTART = 1, /* Use quickstart */
RHF_NOTPOT = 2, /* Hash size not power of 2 */
RHF_NO_LIBRARY_REPLACEMENT = 4 /* Ignore LD_LIBRARY_PATH */
} Elf32_d_MIPS_FLAGS;
typedef struct {
Elf32_d_tag d_tag; /* Dynamic entry type */
union {
uint32_t d_val; /* Integer value */
void *d_ptr; /* Address value */
} d_un;
} Elf32_Dyn;
typedef struct {
uint32_t st_name; /* Symbol name (string tbl index) */
void *st_value; /* Symbol value */
size_t st_size; /* Symbol size */
uint8_t st_info; /* Symbol type and binding */
uint8_t st_other; /* Symbol visibility */
uint16_t st_shndx; /* Section index */
} Elf32_Sym;
#define ELF32_ST_BIND(val) ((Elf32_st_bind) (((uint8_t) (val)) >> 4))
#define ELF32_ST_TYPE(val) ((Elf32_st_type) ((val) & 0xf))
#define ELF32_ST_INFO(bind, type) ((((uint8_t) (bind)) << 4) + (((uint8_t) (type)) & 0xf))
typedef enum {
STB_LOCAL = 0, /* Local symbol */
STB_GLOBAL = 1, /* Global symbol */
STB_WEAK = 2, /* Weak symbol */
STB_NUM = 3, /* Number of defined types. */
STB_LOOS = 10, /* Start of OS-specific */
STB_GNU_UNIQUE = 10, /* Unique symbol. */
STB_HIOS = 12, /* End of OS-specific */
STB_LOPROC = 13, /* Start of processor-specific */
STB_HIPROC = 15 /* End of processor-specific */
} Elf32_st_bind;
typedef enum {
STT_NOTYPE = 0, /* Symbol type is unspecified */
STT_OBJECT = 1, /* Symbol is a data object */
STT_FUNC = 2, /* Symbol is a code object */
STT_SECTION = 3, /* Symbol associated with a section */
STT_FILE = 4, /* Symbol's name is file name */
STT_COMMON = 5, /* Symbol is a common data object */
STT_TLS = 6, /* Symbol is thread-local data object*/
STT_NUM = 7, /* Number of defined types. */
STT_LOOS = 10, /* Start of OS-specific */
STT_GNU_IFUNC = 10, /* Symbol is indirect code object */
STT_HIOS = 12, /* End of OS-specific */
STT_LOPROC = 13, /* Start of processor-specific */
STT_HIPROC = 15 /* End of processor-specific */
} Elf32_st_type;
|