Linux Audio

Check our new training course

Loading...
Note: File does not exist in v6.13.7.
  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
 26#ifdef LIBELF_USE_DEPRECATED
 27# define elf_getshdrnum    elf_getshnum
 28# define elf_getshdrstrndx elf_getshstrndx
 29#endif
 30
 31/*
 32 * Fallback for systems without this "read, mmaping if possible" cmd.
 33 */
 34#ifndef ELF_C_READ_MMAP
 35#define ELF_C_READ_MMAP ELF_C_READ
 36#endif
 37
 38struct section {
 39	struct list_head list;
 40	GElf_Shdr sh;
 41	struct list_head symbol_list;
 42	DECLARE_HASHTABLE(symbol_hash, 8);
 43	struct list_head rela_list;
 44	DECLARE_HASHTABLE(rela_hash, 16);
 45	struct section *base, *rela;
 46	struct symbol *sym;
 47	Elf_Data *data;
 48	char *name;
 49	int idx;
 50	unsigned int len;
 51	bool changed, text;
 52};
 53
 54struct symbol {
 55	struct list_head list;
 56	struct hlist_node hash;
 57	GElf_Sym sym;
 58	struct section *sec;
 59	char *name;
 60	unsigned int idx;
 61	unsigned char bind, type;
 62	unsigned long offset;
 63	unsigned int len;
 64	struct symbol *pfunc, *cfunc;
 65};
 66
 67struct rela {
 68	struct list_head list;
 69	struct hlist_node hash;
 70	GElf_Rela rela;
 71	struct symbol *sym;
 72	unsigned int type;
 73	unsigned long offset;
 74	int addend;
 75};
 76
 77struct elf {
 78	Elf *elf;
 79	GElf_Ehdr ehdr;
 80	int fd;
 81	char *name;
 82	struct list_head sections;
 83	DECLARE_HASHTABLE(rela_hash, 16);
 84};
 85
 86
 87struct elf *elf_open(const char *name, int flags);
 88struct section *find_section_by_name(struct elf *elf, const char *name);
 89struct symbol *find_symbol_by_offset(struct section *sec, unsigned long offset);
 90struct symbol *find_symbol_by_name(struct elf *elf, const char *name);
 91struct symbol *find_symbol_containing(struct section *sec, unsigned long offset);
 92struct rela *find_rela_by_dest(struct section *sec, unsigned long offset);
 93struct rela *find_rela_by_dest_range(struct section *sec, unsigned long offset,
 94				     unsigned int len);
 95struct symbol *find_containing_func(struct section *sec, unsigned long offset);
 96struct section *elf_create_section(struct elf *elf, const char *name, size_t
 97				   entsize, int nr);
 98struct section *elf_create_rela_section(struct elf *elf, struct section *base);
 99int elf_rebuild_rela_section(struct section *sec);
100int elf_write(struct elf *elf);
101void elf_close(struct elf *elf);
102
103#define for_each_sec(file, sec)						\
104	list_for_each_entry(sec, &file->elf->sections, list)
105
106#endif /* _OBJTOOL_ELF_H */