at v4.6 85 lines 2.2 kB view raw
1/* 2 * Copyright (C) 2015 Josh Poimboeuf <jpoimboe@redhat.com> 3 * 4 * This program is free software; you can redistribute it and/or 5 * modify it under the terms of the GNU General Public License 6 * as published by the Free Software Foundation; either version 2 7 * of the License, or (at your option) any later version. 8 * 9 * This program is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 * GNU General Public License for more details. 13 * 14 * You should have received a copy of the GNU General Public License 15 * along with this program; if not, see <http://www.gnu.org/licenses/>. 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 /* _OBJTOOL_ELF_H */