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