vita-toolchain

git clone https://git.neptards.moe/neptards/vita-toolchain.git
Log | Files | Refs | README | LICENSE

vita-elf.h (2409B)


      1 #ifndef VITA_ELF_H
      2 #define VITA_ELF_H
      3 
      4 #include <stdio.h>
      5 #include <libelf.h>
      6 #include <stdint.h>
      7 
      8 #include "vita-import.h"
      9 #include "varray.h"
     10 
     11 /* Convenience representation of a symtab entry */
     12 typedef struct vita_elf_symbol_t {
     13 	const char *name;
     14 	Elf32_Addr value;
     15 	uint8_t type;
     16 	uint8_t binding;
     17 	int shndx;
     18 } vita_elf_symbol_t;
     19 
     20 typedef struct vita_elf_rela_t {
     21 	uint8_t type;
     22 	vita_elf_symbol_t *symbol;
     23 	Elf32_Addr offset;
     24 	Elf32_Sword addend;
     25 } vita_elf_rela_t;
     26 
     27 typedef struct vita_elf_rela_table_t {
     28 	vita_elf_rela_t *relas;
     29 	int num_relas;
     30 
     31 	int target_ndx;
     32 
     33 	struct vita_elf_rela_table_t *next;
     34 } vita_elf_rela_table_t;
     35 
     36 typedef struct vita_elf_stub_t {
     37 	Elf32_Addr addr;
     38 	uint32_t module_nid;
     39 	uint32_t target_nid;
     40 
     41 	vita_elf_symbol_t *symbol;
     42 
     43 	vita_imports_module_t *module;
     44 	vita_imports_stub_t *target;
     45 } vita_elf_stub_t;
     46 
     47 typedef struct vita_elf_segment_info_t {
     48 	Elf32_Word type;	/* Segment type */
     49 	Elf32_Addr vaddr;	/* Top of segment space on TARGET */
     50 	Elf32_Word memsz;	/* Size of segment space */
     51 
     52 	/* vaddr_top/vaddr_bottom point to a reserved, unallocated memory space that
     53 	 * represents the segment space in the HOST.  This space can be used as
     54 	 * pointer targets for translated data structures. */
     55 	const void *vaddr_top;
     56 	const void *vaddr_bottom;
     57 } vita_elf_segment_info_t;
     58 
     59 typedef struct vita_elf_t {
     60 	FILE *file;
     61 	int mode;
     62 	Elf *elf;
     63 
     64 	varray fstubs_va;
     65 	varray vstubs_va;
     66 
     67 	int symtab_ndx;
     68 	vita_elf_symbol_t *symtab;
     69 	int num_symbols;
     70 
     71 	vita_elf_rela_table_t *rela_tables;
     72 
     73 	vita_elf_stub_t *fstubs;
     74 	vita_elf_stub_t *vstubs;
     75 	int num_fstubs;
     76 	int num_vstubs;
     77 
     78 	vita_elf_segment_info_t *segments;
     79 	int num_segments;
     80 } vita_elf_t;
     81 
     82 vita_elf_t *vita_elf_load(const char *filename, int check_stub_count);
     83 void vita_elf_free(vita_elf_t *ve);
     84 
     85 int vita_elf_lookup_imports(vita_elf_t *ve);
     86 
     87 const void *vita_elf_vaddr_to_host(const vita_elf_t *ve, Elf32_Addr vaddr);
     88 const void *vita_elf_segoffset_to_host(const vita_elf_t *ve, int segndx, uint32_t offset);
     89 
     90 Elf32_Addr vita_elf_host_to_vaddr(const vita_elf_t *ve, const void *host_addr);
     91 int vita_elf_host_to_segndx(const vita_elf_t *ve, const void *host_addr);
     92 int32_t vita_elf_host_to_segoffset(const vita_elf_t *ve, const void *host_addr, int segndx);
     93 
     94 int vita_elf_vaddr_to_segndx(const vita_elf_t *ve, Elf32_Addr vaddr);
     95 uint32_t vita_elf_vaddr_to_segoffset(const vita_elf_t *ve, Elf32_Addr vaddr, int segndx);
     96 
     97 #endif