blob: 3d23f57b183095e3c44d73e06b1bd7514a731ff5 [file] [log] [blame]
#ifndef LTRACE_ELF_H
#define LTRACE_ELF_H
#include <gelf.h>
#include <stdlib.h>
struct ltelf {
int fd;
Elf *elf;
GElf_Ehdr ehdr;
Elf_Data *dynsym;
size_t dynsym_count;
const char *dynstr;
GElf_Addr plt_addr;
size_t plt_size;
Elf_Data *relplt;
size_t relplt_count;
Elf_Data *symtab;
const char *strtab;
size_t symtab_count;
Elf_Data *opd;
GElf_Addr *opd_addr;
size_t opd_size;
Elf32_Word *hash;
int hash_type;
int lte_flags;
GElf_Addr dyn_addr;
size_t dyn_sz;
GElf_Addr base_addr;
#ifdef __mips__
size_t pltgot_addr;
size_t mips_local_gotno;
size_t mips_gotsym;
#endif // __mips__
GElf_Addr plt_stub_vma;
};
#define ELF_MAX_SEGMENTS 50
#define LTE_HASH_MALLOCED 1
#define LTE_PLT_EXECUTABLE 2
#define PLTS_ARE_EXECUTABLE(lte) ((lte->lte_flags & LTE_PLT_EXECUTABLE) != 0)
extern int library_num;
extern char *library[MAX_LIBRARIES];
extern struct library_symbol *read_elf(Process *);
extern GElf_Addr arch_plt_sym_val(struct ltelf *, size_t, GElf_Rela *);
#ifndef SHT_GNU_HASH
#define SHT_GNU_HASH 0x6ffffff6 /* GNU-style hash table. */
#endif
#endif