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