| #ifndef _ELF_SYMTAB_H_ |
| #define _ELF_SYMTAB_H_ 1 |
| /* |
| SPDX-License-Identifier: GPL-2.0-only |
| |
| Copyright (C) 2009 Red Hat Inc. |
| Copyright (C) 2009 Arnaldo Carvalho de Melo <acme@redhat.com> |
| */ |
| |
| #include <stdbool.h> |
| #include <stdint.h> |
| #include <gelf.h> |
| #include <elf.h> |
| |
| struct elf_symtab { |
| uint32_t nr_syms; |
| Elf_Data *syms; |
| Elf_Data *symstrs; |
| char *name; |
| }; |
| |
| struct elf_symtab *elf_symtab__new(const char *name, Elf *elf, GElf_Ehdr *ehdr); |
| void elf_symtab__delete(struct elf_symtab *symtab); |
| |
| static inline uint32_t elf_symtab__nr_symbols(const struct elf_symtab *symtab) |
| { |
| return symtab->nr_syms; |
| } |
| |
| static inline const char *elf_sym__name(const GElf_Sym *sym, |
| const struct elf_symtab *symtab) |
| { |
| return symtab->symstrs->d_buf + sym->st_name; |
| } |
| |
| static inline uint8_t elf_sym__type(const GElf_Sym *sym) |
| { |
| return GELF_ST_TYPE(sym->st_info); |
| } |
| |
| static inline uint16_t elf_sym__section(const GElf_Sym *sym) |
| { |
| return sym->st_shndx; |
| } |
| |
| static inline uint8_t elf_sym__bind(const GElf_Sym *sym) |
| { |
| return GELF_ST_BIND(sym->st_info); |
| } |
| |
| static inline uint8_t elf_sym__visibility(const GElf_Sym *sym) |
| { |
| return GELF_ST_VISIBILITY(sym->st_other); |
| } |
| |
| static inline uint32_t elf_sym__size(const GElf_Sym *sym) |
| { |
| return sym->st_size; |
| } |
| |
| static inline uint64_t elf_sym__value(const GElf_Sym *sym) |
| { |
| return sym->st_value; |
| } |
| |
| static inline bool elf_sym__is_local_function(const GElf_Sym *sym) |
| { |
| return elf_sym__type(sym) == STT_FUNC && |
| sym->st_name != 0 && |
| sym->st_shndx != SHN_UNDEF; |
| } |
| |
| static inline bool elf_sym__is_local_object(const GElf_Sym *sym) |
| { |
| return elf_sym__type(sym) == STT_OBJECT && |
| sym->st_name != 0 && |
| sym->st_shndx != SHN_UNDEF; |
| } |
| |
| /** |
| * elf_symtab__for_each_symbol - iterate thru all the symbols |
| * |
| * @symtab: struct elf_symtab instance to iterate |
| * @index: uint32_t index |
| * @sym: GElf_Sym iterator |
| */ |
| #define elf_symtab__for_each_symbol(symtab, index, sym) \ |
| for (index = 0, gelf_getsym(symtab->syms, index, &sym);\ |
| index < symtab->nr_syms; \ |
| index++, gelf_getsym(symtab->syms, index, &sym)) |
| |
| #endif /* _ELF_SYMTAB_H_ */ |