elf.h 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  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. #ifndef _OBJTOOL_ELF_H
  18. #define _OBJTOOL_ELF_H
  19. #include <stdio.h>
  20. #include <gelf.h>
  21. #include <linux/list.h>
  22. #include <linux/hashtable.h>
  23. struct section {
  24. struct list_head list;
  25. GElf_Shdr sh;
  26. struct list_head symbol_list;
  27. DECLARE_HASHTABLE(symbol_hash, 8);
  28. struct list_head rela_list;
  29. DECLARE_HASHTABLE(rela_hash, 16);
  30. struct section *base, *rela;
  31. struct symbol *sym;
  32. Elf_Data *elf_data;
  33. char *name;
  34. int idx;
  35. unsigned long data;
  36. unsigned int len;
  37. };
  38. struct symbol {
  39. struct list_head list;
  40. struct hlist_node hash;
  41. GElf_Sym sym;
  42. struct section *sec;
  43. char *name;
  44. unsigned int idx;
  45. unsigned char bind, type;
  46. unsigned long offset;
  47. unsigned int len;
  48. };
  49. struct rela {
  50. struct list_head list;
  51. struct hlist_node hash;
  52. GElf_Rela rela;
  53. struct symbol *sym;
  54. unsigned int type;
  55. unsigned long offset;
  56. int addend;
  57. };
  58. struct elf {
  59. Elf *elf;
  60. GElf_Ehdr ehdr;
  61. int fd;
  62. char *name;
  63. struct list_head sections;
  64. DECLARE_HASHTABLE(rela_hash, 16);
  65. };
  66. struct elf *elf_open(const char *name);
  67. struct section *find_section_by_name(struct elf *elf, const char *name);
  68. struct symbol *find_symbol_by_offset(struct section *sec, unsigned long offset);
  69. struct rela *find_rela_by_dest(struct section *sec, unsigned long offset);
  70. struct rela *find_rela_by_dest_range(struct section *sec, unsigned long offset,
  71. unsigned int len);
  72. struct symbol *find_containing_func(struct section *sec, unsigned long offset);
  73. void elf_close(struct elf *elf);
  74. #endif /* _OBJTOOL_ELF_H */