1/* Backend hook signatures internal interface for libebl.
2   Copyright (C) 2000,2001,2002,2004,2005,2006,2007,2008 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.  */
51const char *EBLHOOK(object_type_name) (int, char *, size_t);
52
53/* Return symbolic representation of relocation type.  */
54const char *EBLHOOK(reloc_type_name) (int, char *, size_t);
55
56/* Check relocation type.  */
57bool EBLHOOK(reloc_type_check) (int);
58
59/* Check if relocation type is for simple absolute relocations.  */
60Elf_Type EBLHOOK(reloc_simple_type) (Ebl *, int);
61
62/* Check relocation type use.  */
63bool EBLHOOK(reloc_valid_use) (Elf *, int);
64
65/* Return true if the symbol type is that referencing the GOT.  */
66bool EBLHOOK(gotpc_reloc_check) (Elf *, int);
67
68/* Return symbolic representation of segment type.  */
69const char *EBLHOOK(segment_type_name) (int, char *, size_t);
70
71/* Return symbolic representation of section type.  */
72const char *EBLHOOK(section_type_name) (int, char *, size_t);
73
74/* Return section name.  */
75const char *EBLHOOK(section_name) (int, int, char *, size_t);
76
77/* Return next machine flag name.  */
78const char *EBLHOOK(machine_flag_name) (GElf_Word *);
79
80/* Check whether machine flags are valid.  */
81bool EBLHOOK(machine_flag_check) (GElf_Word);
82
83/* Check whether SHF_MASKPROC flag bits are valid.  */
84bool 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.  */
89bool EBLHOOK(check_special_section) (Ebl *, int,
90				     const GElf_Shdr *, const char *);
91
92/* Return symbolic representation of symbol type.  */
93const char *EBLHOOK(symbol_type_name) (int, char *, size_t);
94
95/* Return symbolic representation of symbol binding.  */
96const char *EBLHOOK(symbol_binding_name) (int, char *, size_t);
97
98/* Return symbolic representation of dynamic tag.  */
99const char *EBLHOOK(dynamic_tag_name) (int64_t, char *, size_t);
100
101/* Check dynamic tag.  */
102bool EBLHOOK(dynamic_tag_check) (int64_t);
103
104/* Combine section header flags values.  */
105GElf_Word EBLHOOK(sh_flags_combine) (GElf_Word, GElf_Word);
106
107/* Return symbolic representation of OS ABI.  */
108const char *EBLHOOK(osabi_name) (int, char *, size_t);
109
110/* Name of a note entry type for core files.  */
111const char *EBLHOOK(core_note_type_name) (uint32_t, char *, size_t);
112
113/* Name of a note entry type for object files.  */
114const char *EBLHOOK(object_note_type_name) (uint32_t, char *, size_t);
115
116/* Describe core note format.  */
117int EBLHOOK(core_note) (GElf_Word, GElf_Word, GElf_Word *, size_t *,
118			const Ebl_Register_Location **,
119			size_t *, const Ebl_Core_Item **);
120
121/* Handle object file note.  */
122bool EBLHOOK(object_note) (const char *, uint32_t, uint32_t, const char *);
123
124/* Check object attribute.  */
125bool EBLHOOK(check_object_attribute) (Ebl *, const char *, int, uint64_t,
126				      const char **, const char **);
127
128/* Describe auxv element type.  */
129int EBLHOOK(auxv_info) (GElf_Xword, const char **, const char **);
130
131/* Check section name for being that of a debug informatino section.  */
132bool EBLHOOK(debugscn_p) (const char *);
133
134/* Check whether given relocation is a copy relocation.  */
135bool EBLHOOK(copy_reloc_p) (int);
136
137/* Check whether given relocation is a no-op relocation.  */
138bool EBLHOOK(none_reloc_p) (int);
139
140/* Check whether given relocation is a relative relocation.  */
141bool EBLHOOK(relative_reloc_p) (int);
142
143/* Check whether given symbol's value is ok despite normal checks.  */
144bool EBLHOOK(check_special_symbol) (Elf *, GElf_Ehdr *, const GElf_Sym *,
145			      const char *, const GElf_Shdr *);
146
147/* Check if backend uses a bss PLT in this file.  */
148bool EBLHOOK(bss_plt_p) (Elf *, GElf_Ehdr *);
149
150/* Return location expression to find return value given the
151   DW_AT_type DIE of a DW_TAG_subprogram DIE.  */
152int EBLHOOK(return_value_location) (Dwarf_Die *functypedie,
153				    const Dwarf_Op **locp);
154
155/* Return register name information.  */
156ssize_t EBLHOOK(register_info) (Ebl *ebl,
157				int regno, char *name, size_t namelen,
158				const char **prefix, const char **setname,
159				int *bits, int *type);
160
161/* Return system call ABI registers.  */
162int EBLHOOK(syscall_abi) (Ebl *ebl, int *sp, int *pc,
163			  int *callno, int args[6]);
164
165/* Disassembler function.  */
166int EBLHOOK(disasm) (const uint8_t **startp, const uint8_t *end,
167		     GElf_Addr addr, const char *fmt, DisasmOutputCB_t outcb,
168		     DisasmGetSymCB_t symcb, void *outcbarg, void *symcbarg);
169
170
171/* Destructor for ELF backend handle.  */
172void EBLHOOK(destr) (struct ebl *);
173