1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18#ifndef _OBJTOOL_ELF_H
19#define _OBJTOOL_ELF_H
20
21#include <stdio.h>
22#include <gelf.h>
23#include <linux/list.h>
24#include <linux/hashtable.h>
25
26#ifdef LIBELF_USE_DEPRECATED
27# define elf_getshdrnum elf_getshnum
28# define elf_getshdrstrndx elf_getshstrndx
29#endif
30
31struct section {
32 struct list_head list;
33 GElf_Shdr sh;
34 struct list_head symbol_list;
35 DECLARE_HASHTABLE(symbol_hash, 8);
36 struct list_head rela_list;
37 DECLARE_HASHTABLE(rela_hash, 16);
38 struct section *base, *rela;
39 struct symbol *sym;
40 Elf_Data *elf_data;
41 char *name;
42 int idx;
43 unsigned long data;
44 unsigned int len;
45};
46
47struct symbol {
48 struct list_head list;
49 struct hlist_node hash;
50 GElf_Sym sym;
51 struct section *sec;
52 char *name;
53 unsigned int idx;
54 unsigned char bind, type;
55 unsigned long offset;
56 unsigned int len;
57};
58
59struct rela {
60 struct list_head list;
61 struct hlist_node hash;
62 GElf_Rela rela;
63 struct symbol *sym;
64 unsigned int type;
65 unsigned long offset;
66 int addend;
67};
68
69struct elf {
70 Elf *elf;
71 GElf_Ehdr ehdr;
72 int fd;
73 char *name;
74 struct list_head sections;
75 DECLARE_HASHTABLE(rela_hash, 16);
76};
77
78
79struct elf *elf_open(const char *name);
80struct section *find_section_by_name(struct elf *elf, const char *name);
81struct symbol *find_symbol_by_offset(struct section *sec, unsigned long offset);
82struct symbol *find_symbol_containing(struct section *sec, unsigned long offset);
83struct rela *find_rela_by_dest(struct section *sec, unsigned long offset);
84struct rela *find_rela_by_dest_range(struct section *sec, unsigned long offset,
85 unsigned int len);
86struct symbol *find_containing_func(struct section *sec, unsigned long offset);
87void elf_close(struct elf *elf);
88
89
90
91#endif
92