Ben Cheng | 25b3c04 | 2013-11-20 14:45:36 -0800 | [diff] [blame] | 1 | /* Backend hook signatures internal interface for libebl. |
| 2 | Copyright (C) 2000-2011 Red Hat, Inc. |
| 3 | This file is part of Red Hat elfutils. |
| 4 | |
| 5 | Red Hat elfutils is free software; you can redistribute it and/or modify |
| 6 | it under the terms of the GNU General Public License as published by the |
| 7 | Free Software Foundation; version 2 of the License. |
| 8 | |
| 9 | Red Hat elfutils is distributed in the hope that it will be useful, but |
| 10 | WITHOUT ANY WARRANTY; without even the implied warranty of |
| 11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| 12 | General Public License for more details. |
| 13 | |
| 14 | You should have received a copy of the GNU General Public License along |
| 15 | with Red Hat elfutils; if not, write to the Free Software Foundation, |
| 16 | Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA. |
| 17 | |
| 18 | In addition, as a special exception, Red Hat, Inc. gives You the |
| 19 | additional right to link the code of Red Hat elfutils with code licensed |
| 20 | under any Open Source Initiative certified open source license |
| 21 | (http://www.opensource.org/licenses/index.php) which requires the |
| 22 | distribution of source code with any binary distribution and to |
| 23 | distribute linked combinations of the two. Non-GPL Code permitted under |
| 24 | this exception must only link to the code of Red Hat elfutils through |
| 25 | those well defined interfaces identified in the file named EXCEPTION |
| 26 | found in the source code files (the "Approved Interfaces"). The files |
| 27 | of Non-GPL Code may instantiate templates or use macros or inline |
| 28 | functions from the Approved Interfaces without causing the resulting |
| 29 | work to be covered by the GNU General Public License. Only Red Hat, |
| 30 | Inc. may make changes or additions to the list of Approved Interfaces. |
| 31 | Red Hat's grant of this exception is conditioned upon your not adding |
| 32 | any new exceptions. If you wish to add a new Approved Interface or |
| 33 | exception, please contact Red Hat. You must obey the GNU General Public |
| 34 | License in all respects for all of the Red Hat elfutils code and other |
| 35 | code used in conjunction with Red Hat elfutils except the Non-GPL Code |
| 36 | covered by this exception. If you modify this file, you may extend this |
| 37 | exception to your version of the file, but you are not obligated to do |
| 38 | so. If you do not wish to provide this exception without modification, |
| 39 | you must delete this exception statement from your version and license |
| 40 | this file solely under the GPL without exception. |
| 41 | |
| 42 | Red Hat elfutils is an included package of the Open Invention Network. |
| 43 | An included package of the Open Invention Network is a package for which |
| 44 | Open Invention Network licensees cross-license their patents. No patent |
| 45 | license is granted, either expressly or impliedly, by designation as an |
| 46 | included package. Should you wish to participate in the Open Invention |
| 47 | Network licensing program, please visit www.openinventionnetwork.com |
| 48 | <http://www.openinventionnetwork.com>. */ |
| 49 | |
| 50 | /* Return symbol representaton of object file type. */ |
| 51 | const char *EBLHOOK(object_type_name) (int, char *, size_t); |
| 52 | |
| 53 | /* Return symbolic representation of relocation type. */ |
| 54 | const char *EBLHOOK(reloc_type_name) (int, char *, size_t); |
| 55 | |
| 56 | /* Check relocation type. */ |
| 57 | bool EBLHOOK(reloc_type_check) (int); |
| 58 | |
| 59 | /* Check if relocation type is for simple absolute relocations. */ |
| 60 | Elf_Type EBLHOOK(reloc_simple_type) (Ebl *, int); |
| 61 | |
| 62 | /* Check relocation type use. */ |
| 63 | bool EBLHOOK(reloc_valid_use) (Elf *, int); |
| 64 | |
| 65 | /* Return true if the symbol type is that referencing the GOT. */ |
| 66 | bool EBLHOOK(gotpc_reloc_check) (Elf *, int); |
| 67 | |
| 68 | /* Return symbolic representation of segment type. */ |
| 69 | const char *EBLHOOK(segment_type_name) (int, char *, size_t); |
| 70 | |
| 71 | /* Return symbolic representation of section type. */ |
| 72 | const char *EBLHOOK(section_type_name) (int, char *, size_t); |
| 73 | |
| 74 | /* Return section name. */ |
| 75 | const char *EBLHOOK(section_name) (int, int, char *, size_t); |
| 76 | |
| 77 | /* Return next machine flag name. */ |
| 78 | const char *EBLHOOK(machine_flag_name) (GElf_Word *); |
| 79 | |
| 80 | /* Check whether machine flags are valid. */ |
| 81 | bool EBLHOOK(machine_flag_check) (GElf_Word); |
| 82 | |
| 83 | /* Check whether SHF_MASKPROC flag bits are valid. */ |
| 84 | bool EBLHOOK(machine_section_flag_check) (GElf_Xword); |
| 85 | |
| 86 | /* Check whether the section with the given index, header, and name |
| 87 | is a special machine section that is valid despite a combination |
| 88 | of flags or other details that are not generically valid. */ |
| 89 | bool EBLHOOK(check_special_section) (Ebl *, int, |
| 90 | const GElf_Shdr *, const char *); |
| 91 | |
| 92 | /* Return symbolic representation of symbol type. */ |
| 93 | const char *EBLHOOK(symbol_type_name) (int, char *, size_t); |
| 94 | |
| 95 | /* Return symbolic representation of symbol binding. */ |
| 96 | const char *EBLHOOK(symbol_binding_name) (int, char *, size_t); |
| 97 | |
| 98 | /* Return symbolic representation of dynamic tag. */ |
| 99 | const char *EBLHOOK(dynamic_tag_name) (int64_t, char *, size_t); |
| 100 | |
| 101 | /* Check dynamic tag. */ |
| 102 | bool EBLHOOK(dynamic_tag_check) (int64_t); |
| 103 | |
| 104 | /* Combine section header flags values. */ |
| 105 | GElf_Word EBLHOOK(sh_flags_combine) (GElf_Word, GElf_Word); |
| 106 | |
| 107 | /* Return symbolic representation of OS ABI. */ |
| 108 | const char *EBLHOOK(osabi_name) (int, char *, size_t); |
| 109 | |
| 110 | /* Name of a note entry type for core files. */ |
| 111 | const char *EBLHOOK(core_note_type_name) (uint32_t, char *, size_t); |
| 112 | |
| 113 | /* Name of a note entry type for object files. */ |
| 114 | const char *EBLHOOK(object_note_type_name) (const char *, uint32_t, |
| 115 | char *, size_t); |
| 116 | |
| 117 | /* Describe core note format. */ |
| 118 | int EBLHOOK(core_note) (const GElf_Nhdr *, const char *, |
| 119 | GElf_Word *, size_t *, const Ebl_Register_Location **, |
| 120 | size_t *, const Ebl_Core_Item **); |
| 121 | |
| 122 | /* Handle object file note. */ |
| 123 | bool EBLHOOK(object_note) (const char *, uint32_t, uint32_t, const char *); |
| 124 | |
| 125 | /* Check object attribute. */ |
| 126 | bool EBLHOOK(check_object_attribute) (Ebl *, const char *, int, uint64_t, |
| 127 | const char **, const char **); |
| 128 | |
| 129 | /* Describe auxv element type. */ |
| 130 | int EBLHOOK(auxv_info) (GElf_Xword, const char **, const char **); |
| 131 | |
| 132 | /* Check section name for being that of a debug informatino section. */ |
| 133 | bool EBLHOOK(debugscn_p) (const char *); |
| 134 | |
| 135 | /* Check whether given relocation is a copy relocation. */ |
| 136 | bool EBLHOOK(copy_reloc_p) (int); |
| 137 | |
| 138 | /* Check whether given relocation is a no-op relocation. */ |
| 139 | bool EBLHOOK(none_reloc_p) (int); |
| 140 | |
| 141 | /* Check whether given relocation is a relative relocation. */ |
| 142 | bool EBLHOOK(relative_reloc_p) (int); |
| 143 | |
| 144 | /* Check whether given symbol's value is ok despite normal checks. */ |
| 145 | bool EBLHOOK(check_special_symbol) (Elf *, GElf_Ehdr *, const GElf_Sym *, |
| 146 | const char *, const GElf_Shdr *); |
| 147 | |
| 148 | /* Check whether only valid bits are set on the st_other symbol flag. |
| 149 | Standard ST_VISIBILITY have already been masked off. */ |
| 150 | bool EBLHOOK(check_st_other_bits) (unsigned char st_other); |
| 151 | |
| 152 | /* Check if backend uses a bss PLT in this file. */ |
| 153 | bool EBLHOOK(bss_plt_p) (Elf *, GElf_Ehdr *); |
| 154 | |
| 155 | /* Return location expression to find return value given the |
| 156 | DW_AT_type DIE of a DW_TAG_subprogram DIE. */ |
| 157 | int EBLHOOK(return_value_location) (Dwarf_Die *functypedie, |
| 158 | const Dwarf_Op **locp); |
| 159 | |
| 160 | /* Return register name information. */ |
| 161 | ssize_t EBLHOOK(register_info) (Ebl *ebl, |
| 162 | int regno, char *name, size_t namelen, |
| 163 | const char **prefix, const char **setname, |
| 164 | int *bits, int *type); |
| 165 | |
| 166 | /* Return system call ABI registers. */ |
| 167 | int EBLHOOK(syscall_abi) (Ebl *ebl, int *sp, int *pc, |
| 168 | int *callno, int args[6]); |
| 169 | |
| 170 | /* Disassembler function. */ |
| 171 | int EBLHOOK(disasm) (const uint8_t **startp, const uint8_t *end, |
| 172 | GElf_Addr addr, const char *fmt, DisasmOutputCB_t outcb, |
| 173 | DisasmGetSymCB_t symcb, void *outcbarg, void *symcbarg); |
| 174 | |
| 175 | /* Supply the machine-specific state of CFI before CIE initial programs. */ |
| 176 | int EBLHOOK(abi_cfi) (Ebl *ebl, Dwarf_CIE *abi_info); |
| 177 | |
| 178 | /* Destructor for ELF backend handle. */ |
| 179 | void EBLHOOK(destr) (struct ebl *); |