aboutsummaryrefslogtreecommitdiff
path: root/libpsn00b/include/elf.h
blob: b0ddf719984f0ccad57f8239ff1e5ecd9751015b (plain) (blame)
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;