ltrace-elf.h revision 02bd9eca0b439b6950ab72ba64b67181e5bf0fbd
1#ifndef LTRACE_ELF_H 2#define LTRACE_ELF_H 3 4#include <gelf.h> 5#include <stdlib.h> 6 7struct ltelf { 8 int fd; 9 Elf *elf; 10 GElf_Ehdr ehdr; 11 Elf_Data *dynsym; 12 size_t dynsym_count; 13 const char *dynstr; 14 GElf_Addr plt_addr; 15 size_t plt_size; 16 Elf_Data *relplt; 17 size_t relplt_count; 18 Elf_Data *symtab; 19 const char *strtab; 20 size_t symtab_count; 21 Elf_Data *opd; 22 GElf_Addr *opd_addr; 23 size_t opd_size; 24 Elf32_Word *hash; 25 int hash_type; 26 int lte_flags; 27 GElf_Addr dyn_addr; 28 size_t dyn_sz; 29 GElf_Addr base_addr; 30#ifdef __mips__ 31 size_t pltgot_addr; 32 size_t mips_local_gotno; 33 size_t mips_gotsym; 34#endif // __mips__ 35 GElf_Addr plt_stub_vma; 36}; 37 38#define ELF_MAX_SEGMENTS 50 39#define LTE_HASH_MALLOCED 1 40#define LTE_PLT_EXECUTABLE 2 41 42#define PLTS_ARE_EXECUTABLE(lte) ((lte->lte_flags & LTE_PLT_EXECUTABLE) != 0) 43 44extern size_t library_num; 45extern char *library[MAX_LIBRARIES]; 46 47extern int open_elf(struct ltelf *lte, const char *filename); 48extern struct library_symbol *read_elf(Process *); 49 50extern GElf_Addr arch_plt_sym_val(struct ltelf *, size_t, GElf_Rela *); 51 52#ifndef SHT_GNU_HASH 53#define SHT_GNU_HASH 0x6ffffff6 /* GNU-style hash table. */ 54#endif 55 56#if __WORDSIZE == 32 57#define PRI_ELF_ADDR PRIx32 58#define GELF_ADDR_CAST(x) (void *)(uint32_t)(x) 59#else 60#define PRI_ELF_ADDR PRIx64 61#define GELF_ADDR_CAST(x) (void *)(x) 62#endif 63 64#endif 65