blob: 507a46607c86c854d325d6867e3d36332903ec62 [file] [log] [blame]
Juan Cespedes1cd999a2001-07-03 00:46:04 +02001#ifndef LTRACE_ELF_H
2#define LTRACE_ELF_H
3
Juan Cespedesd914a202004-11-10 00:15:33 +01004#include <gelf.h>
5#include <stdlib.h>
Petr Machatafd43ef72012-02-10 12:25:11 +01006#include "proc.h"
Juan Cespedesd914a202004-11-10 00:15:33 +01007
Ian Wienand2d45b1a2006-02-20 22:48:07 +01008struct 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;
Petr Machata35fe5182006-07-18 12:58:12 +020026 int hash_type;
Paul Gilliam76c61f12006-06-14 06:55:21 +020027 int lte_flags;
Joe Damato87f4f582010-11-08 15:47:36 -080028 GElf_Addr dyn_addr;
29 size_t dyn_sz;
Joe Damato07581fb2010-11-08 15:47:37 -080030 GElf_Addr base_addr;
Eric Vaitl1228a912006-12-28 16:16:56 +010031#ifdef __mips__
Juan Cespedesa413e5b2007-09-04 17:34:53 +020032 size_t pltgot_addr;
33 size_t mips_local_gotno;
34 size_t mips_gotsym;
Eric Vaitl1228a912006-12-28 16:16:56 +010035#endif // __mips__
Petr Machatafe1c1712010-10-27 16:57:34 +020036 GElf_Addr plt_stub_vma;
Juan Cespedes1cd999a2001-07-03 00:46:04 +020037};
38
Joe Damato47cae1e2010-11-08 15:47:39 -080039#define ELF_MAX_SEGMENTS 50
Paul Gilliam76c61f12006-06-14 06:55:21 +020040#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
Zachary T Welchba6aca22010-12-08 18:55:09 -080045extern size_t library_num;
Juan Cespedes8d1b92b2009-07-03 10:39:34 +020046extern char *library[MAX_LIBRARIES];
Juan Cespedes1cd999a2001-07-03 00:46:04 +020047
Petr Machata02bd9ec2011-09-21 17:38:59 +020048extern int open_elf(struct ltelf *lte, const char *filename);
Petr Machatae84fa002012-02-07 13:43:03 +010049extern struct library_symbol *read_elf(Process *proc, GElf_Addr *entryp);
Juan Cespedesd914a202004-11-10 00:15:33 +010050
Ian Wienand2d45b1a2006-02-20 22:48:07 +010051extern GElf_Addr arch_plt_sym_val(struct ltelf *, size_t, GElf_Rela *);
Juan Cespedes96935a91997-08-09 23:45:39 +020052
Olaf Hering03c087b2006-09-25 02:31:27 +020053#ifndef SHT_GNU_HASH
54#define SHT_GNU_HASH 0x6ffffff6 /* GNU-style hash table. */
55#endif
Zachary T Welch3ba522f2010-12-14 15:12:47 -080056
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
Juan Cespedes1cd999a2001-07-03 00:46:04 +020065#endif