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