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
26struct section {
27 struct list_head list;
28 GElf_Shdr sh;
29 struct list_head symbol_list;
30 DECLARE_HASHTABLE(symbol_hash, 8);
31 struct list_head rela_list;
32 DECLARE_HASHTABLE(rela_hash, 16);
33 struct section *base, *rela;
34 struct symbol *sym;
35 Elf_Data *elf_data;
36 char *name;
37 int idx;
38 unsigned long data;
39 unsigned int len;
40};
41
42struct symbol {
43 struct list_head list;
44 struct hlist_node hash;
45 GElf_Sym sym;
46 struct section *sec;
47 char *name;
48 unsigned int idx;
49 unsigned char bind, type;
50 unsigned long offset;
51 unsigned int len;
52};
53
54struct rela {
55 struct list_head list;
56 struct hlist_node hash;
57 GElf_Rela rela;
58 struct symbol *sym;
59 unsigned int type;
60 unsigned long offset;
61 int addend;
62};
63
64struct elf {
65 Elf *elf;
66 GElf_Ehdr ehdr;
67 int fd;
68 char *name;
69 struct list_head sections;
70 DECLARE_HASHTABLE(rela_hash, 16);
71};
72
73
74struct elf *elf_open(const char *name);
75struct section *find_section_by_name(struct elf *elf, const char *name);
76struct symbol *find_symbol_by_offset(struct section *sec, unsigned long offset);
77struct rela *find_rela_by_dest(struct section *sec, unsigned long offset);
78struct rela *find_rela_by_dest_range(struct section *sec, unsigned long offset,
79 unsigned int len);
80struct symbol *find_containing_func(struct section *sec, unsigned long offset);
81void elf_close(struct elf *elf);
82
83
84
85#endif
86