2 * Author: Humberto Naves (hsnaves@gmail.com)
11 #define ELF_HEADER_IDENT 16
12 #define ELF_PRX_TYPE 0xFFA0
13 #define ELF_MACHINE_MIPS 8
14 #define ELF_VERSION_CURRENT 1
15 #define ELF_FLAGS_MACH_ALLEGREX 0x00A20000
16 #define ELF_FLAGS_ABI_EABI32 0x00003000
17 #define ELF_FLAGS_MIPS_ARCH2 0x10000000
20 /* Structure to hold prx header data */
23 uint8 ident
[ELF_HEADER_IDENT
];
41 struct elf_section
*sections
;
43 struct elf_program
*programs
;
46 struct prx_reloc
*relocs
;
47 struct prx_reloc
*relocsbyaddr
;
49 struct prx_modinfo
*modinfo
;
53 #define SHT_PROGBITS 1
56 #define SHT_LOPROC 0x70000000
57 #define SHT_HIPROC 0x7fffffff
58 #define SHT_LOUSER 0x80000000
59 #define SHT_HIUSER 0xffffffff
61 #define SHT_PRXRELOC (SHT_LOPROC | 0xA0)
65 #define SHF_EXECINSTR 4
67 /* Structure defining a single elf section */
88 #define PT_LOPROC 0x70000000
89 #define PT_HIPROC 0x7fffffff
90 #define PT_PRXRELOC (PT_LOPROC | 0xA0)
91 #define PT_PRXRELOC2 (PT_LOPROC | 0xA1)
112 /* MIPS Reloc Entry Types */
113 #define R_MIPS_NONE 0
117 #define R_MIPS_HI16 5
118 #define R_MIPS_LO16 6
119 #define R_MIPSX_HI16 13
120 #define R_MIPSX_J26 14
121 #define R_MIPSX_JAL26 15
148 struct prx_import
*imports
;
149 struct prx_export
*exports
;
165 struct prx_function
*funcs
;
166 struct prx_variable
*vars
;
180 struct prx_function
*funcs
;
181 struct prx_variable
*vars
;
186 struct prx_function
{
195 struct prx_variable
{
202 uint32
read_uint32_le (const uint8
*bytes
);
203 uint16
read_uint16_le (const uint8
*bytes
);
204 void write_uint32_le (uint8
*bytes
, uint32 val
);
206 struct prx
*prx_load (const char *path
);
207 void prx_free (struct prx
*p
);
208 void prx_print (struct prx
*p
, int prtrelocs
);
210 void prx_resolve_nids (struct prx
*p
, struct nidstable
*nids
);
212 uint32
prx_translate (struct prx
*p
, uint32 vaddr
);
214 int prx_inside_prx (struct prx
*p
, uint32 offset
, uint32 size
);
215 int prx_inside_progfile (struct elf_program
*program
, uint32 vaddr
, uint32 size
);
216 int prx_inside_progmem (struct elf_program
*program
, uint32 vaddr
, uint32 size
);
217 int prx_inside_strprogfile (struct elf_program
*program
, uint32 vaddr
);
219 uint32
prx_findreloc (struct prx
*p
, uint32 target
);
220 uint32
prx_findrelocbyaddr (struct prx
*p
, uint32 vaddr
);