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