1 /* SPDX-License-Identifier: GPL-2.0-or-later */ 2 /* 3 * Copyright (C) 2015 Josh Poimboeuf <jpoimboe@redhat.com> 4 */ 5 6 #ifndef _OBJTOOL_ELF_H 7 #define _OBJTOOL_ELF_H 8 9 #include <stdio.h> 10 #include <gelf.h> 11 #include <linux/list.h> 12 #include <linux/hashtable.h> 13 14 #ifdef LIBELF_USE_DEPRECATED 15 # define elf_getshdrnum elf_getshnum 16 # define elf_getshdrstrndx elf_getshstrndx 17 #endif 18 19 /* 20 * Fallback for systems without this "read, mmaping if possible" cmd. 21 */ 22 #ifndef ELF_C_READ_MMAP 23 #define ELF_C_READ_MMAP ELF_C_READ 24 #endif 25 26 struct 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 *data; 36 char *name; 37 int idx; 38 unsigned int len; 39 bool changed, text, rodata; 40 }; 41 42 struct 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 struct symbol *pfunc, *cfunc, *alias; 53 bool uaccess_safe; 54 }; 55 56 struct rela { 57 struct list_head list; 58 struct hlist_node hash; 59 GElf_Rela rela; 60 struct section *sec; 61 struct symbol *sym; 62 unsigned int type; 63 unsigned long offset; 64 int addend; 65 bool jump_table_start; 66 }; 67 68 struct elf { 69 Elf *elf; 70 GElf_Ehdr ehdr; 71 int fd; 72 char *name; 73 struct list_head sections; 74 DECLARE_HASHTABLE(rela_hash, 16); 75 }; 76 77 78 struct elf *elf_read(const char *name, int flags); 79 struct section *find_section_by_name(struct elf *elf, const char *name); 80 struct symbol *find_symbol_by_offset(struct section *sec, unsigned long offset); 81 struct symbol *find_symbol_by_name(struct elf *elf, const char *name); 82 struct symbol *find_symbol_containing(struct section *sec, unsigned long offset); 83 struct rela *find_rela_by_dest(struct section *sec, unsigned long offset); 84 struct rela *find_rela_by_dest_range(struct section *sec, unsigned long offset, 85 unsigned int len); 86 struct symbol *find_containing_func(struct section *sec, unsigned long offset); 87 struct section *elf_create_section(struct elf *elf, const char *name, size_t 88 entsize, int nr); 89 struct section *elf_create_rela_section(struct elf *elf, struct section *base); 90 int elf_rebuild_rela_section(struct section *sec); 91 int elf_write(struct elf *elf); 92 void elf_close(struct elf *elf); 93 94 #define for_each_sec(file, sec) \ 95 list_for_each_entry(sec, &file->elf->sections, list) 96 97 #endif /* _OBJTOOL_ELF_H */ 98