at v5.2 2.5 kB view raw
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 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 *data; 36 char *name; 37 int idx; 38 unsigned int len; 39 bool changed, text, rodata; 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 struct symbol *pfunc, *cfunc, *alias; 53 bool uaccess_safe; 54}; 55 56struct rela { 57 struct list_head list; 58 struct hlist_node hash; 59 GElf_Rela rela; 60 struct section *rela_sec; 61 struct symbol *sym; 62 unsigned int type; 63 unsigned long offset; 64 int addend; 65}; 66 67struct elf { 68 Elf *elf; 69 GElf_Ehdr ehdr; 70 int fd; 71 char *name; 72 struct list_head sections; 73 DECLARE_HASHTABLE(rela_hash, 16); 74}; 75 76 77struct elf *elf_open(const char *name, int flags); 78struct section *find_section_by_name(struct elf *elf, const char *name); 79struct symbol *find_symbol_by_offset(struct section *sec, unsigned long offset); 80struct symbol *find_symbol_by_name(struct elf *elf, const char *name); 81struct symbol *find_symbol_containing(struct section *sec, unsigned long offset); 82struct rela *find_rela_by_dest(struct section *sec, unsigned long offset); 83struct rela *find_rela_by_dest_range(struct section *sec, unsigned long offset, 84 unsigned int len); 85struct symbol *find_containing_func(struct section *sec, unsigned long offset); 86struct section *elf_create_section(struct elf *elf, const char *name, size_t 87 entsize, int nr); 88struct section *elf_create_rela_section(struct elf *elf, struct section *base); 89int elf_rebuild_rela_section(struct section *sec); 90int elf_write(struct elf *elf); 91void elf_close(struct elf *elf); 92 93#define for_each_sec(file, sec) \ 94 list_for_each_entry(sec, &file->elf->sections, list) 95 96#endif /* _OBJTOOL_ELF_H */