1441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Interface for libebl.
2cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Copyright (C) 2000, 2001, 2002, 2004, 2005, 2006, 2007, 2008 Red Hat, Inc.
3cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   This file is part of Red Hat elfutils.
4cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
5cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Red Hat elfutils is free software; you can redistribute it and/or modify
6cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   it under the terms of the GNU General Public License as published by the
7cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Free Software Foundation; version 2 of the License.
8cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
9cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Red Hat elfutils is distributed in the hope that it will be useful, but
10cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   WITHOUT ANY WARRANTY; without even the implied warranty of
11cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   General Public License for more details.
13cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
14cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   You should have received a copy of the GNU General Public License along
15cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   with Red Hat elfutils; if not, write to the Free Software Foundation,
16cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
17cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
18cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   In addition, as a special exception, Red Hat, Inc. gives You the
19cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   additional right to link the code of Red Hat elfutils with code licensed
20cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   under any Open Source Initiative certified open source license
21cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   (http://www.opensource.org/licenses/index.php) which requires the
22cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   distribution of source code with any binary distribution and to
23cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   distribute linked combinations of the two.  Non-GPL Code permitted under
24cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   this exception must only link to the code of Red Hat elfutils through
25cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   those well defined interfaces identified in the file named EXCEPTION
26cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   found in the source code files (the "Approved Interfaces").  The files
27cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   of Non-GPL Code may instantiate templates or use macros or inline
28cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   functions from the Approved Interfaces without causing the resulting
29cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   work to be covered by the GNU General Public License.  Only Red Hat,
30cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Inc. may make changes or additions to the list of Approved Interfaces.
31cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Red Hat's grant of this exception is conditioned upon your not adding
32cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   any new exceptions.  If you wish to add a new Approved Interface or
33cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   exception, please contact Red Hat.  You must obey the GNU General Public
34cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   License in all respects for all of the Red Hat elfutils code and other
35cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   code used in conjunction with Red Hat elfutils except the Non-GPL Code
36cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   covered by this exception.  If you modify this file, you may extend this
37cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   exception to your version of the file, but you are not obligated to do
38cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   so.  If you do not wish to provide this exception without modification,
39cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   you must delete this exception statement from your version and license
40cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   this file solely under the GPL without exception.
41cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
42cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Red Hat elfutils is an included package of the Open Invention Network.
43cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   An included package of the Open Invention Network is a package for which
44cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Open Invention Network licensees cross-license their patents.  No patent
45cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   license is granted, either expressly or impliedly, by designation as an
46cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   included package.  Should you wish to participate in the Open Invention
47cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Network licensing program, please visit www.openinventionnetwork.com
48cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   <http://www.openinventionnetwork.com>.  */
49441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
50441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#ifndef _LIBEBL_H
51441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define _LIBEBL_H 1
52441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
53441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#include <gelf.h>
54cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng#include "libdw.h"
55441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#include <stdbool.h>
56441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#include <stddef.h>
57441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#include <stdint.h>
58441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
59cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng#include "elf-knowledge.h"
60441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
61441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
62cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng/* Opaque type for the handle.  */
63cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengtypedef struct ebl Ebl;
64441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
65441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
66cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng#ifdef __cplusplus
67cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengextern "C" {
68cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng#endif
69441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
70441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Get backend handle for object associated with ELF handle.  */
71441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern Ebl *ebl_openbackend (Elf *elf);
72441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Similar but without underlying ELF file.  */
73441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern Ebl *ebl_openbackend_machine (GElf_Half machine);
74441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Similar but with emulation name given.  */
75441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern Ebl *ebl_openbackend_emulation (const char *emulation);
76441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
77441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Free resources allocated for backend handle.  */
78441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern void ebl_closebackend (Ebl *bh);
79441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
80441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
81cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng/* Information about the descriptor.  */
82cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
83cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng/* Get ELF machine.  */
84cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengextern int ebl_get_elfmachine (Ebl *ebl) __attribute__ ((__pure__));
85cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
86cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng/* Get ELF class.  */
87cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengextern int ebl_get_elfclass (Ebl *ebl) __attribute__ ((__pure__));
88cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
89cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng/* Get ELF data encoding.  */
90cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengextern int ebl_get_elfdata (Ebl *ebl) __attribute__ ((__pure__));
91cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
92cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
93441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Function to call the callback functions including default ELF
94441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project   handling.  */
95441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
96441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Return backend name.  */
97441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern const char *ebl_backend_name (Ebl *ebl);
98441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
99441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Return relocation type name.  */
100441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern const char *ebl_object_type_name (Ebl *ebl, int object,
101441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project					 char *buf, size_t len);
102441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
103441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Return relocation type name.  */
104441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern const char *ebl_reloc_type_name (Ebl *ebl, int reloc,
105441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project					char *buf, size_t len);
106441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
107441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Check relocation type.  */
108441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern bool ebl_reloc_type_check (Ebl *ebl, int reloc);
109441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
110441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Check relocation type use.  */
111441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern bool ebl_reloc_valid_use (Ebl *ebl, int reloc);
112441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
113cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng/* Check if relocation type is for simple absolute relocations.
114cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Return ELF_T_{BYTE,HALF,SWORD,SXWORD} for a simple type, else ELF_T_NUM.  */
115cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengextern Elf_Type ebl_reloc_simple_type (Ebl *ebl, int reloc);
116cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
117441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Return true if the symbol type is that referencing the GOT.  E.g.,
118441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project   R_386_GOTPC.  */
119441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern bool ebl_gotpc_reloc_check (Ebl *ebl, int reloc);
120441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
121441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Return segment type name.  */
122441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern const char *ebl_segment_type_name (Ebl *ebl, int segment,
123441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project					  char *buf, size_t len);
124441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
125441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Return section type name.  */
126441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern const char *ebl_section_type_name (Ebl *ebl, int section,
127441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project					  char *buf, size_t len);
128441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
129441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Return section name.  */
130441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern const char *ebl_section_name (Ebl *ebl, int section, int xsection,
131441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				     char *buf, size_t len,
132441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				     const char *scnnames[], size_t shnum);
133441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
134441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Return machine flag names.  */
135441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern const char *ebl_machine_flag_name (Ebl *ebl, GElf_Word flags,
136441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project					  char *buf, size_t len);
137441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
138441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Check whether machine flag is valid.  */
139441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern bool ebl_machine_flag_check (Ebl *ebl, GElf_Word flags);
140441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
141cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng/* Check whether SHF_MASKPROC flags are valid.  */
142cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengextern bool ebl_machine_section_flag_check (Ebl *ebl, GElf_Xword flags);
143cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
144cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng/* Check whether the section with the given index, header, and name
145cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   is a special machine section that is valid despite a combination
146cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   of flags or other details that are not generically valid.  */
147cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengextern bool ebl_check_special_section (Ebl *ebl, int ndx,
148cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng				       const GElf_Shdr *shdr, const char *name);
149cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
150441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Return symbol type name.  */
151441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern const char *ebl_symbol_type_name (Ebl *ebl, int symbol,
152441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project					 char *buf, size_t len);
153441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
154441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Return symbol binding name.  */
155441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern const char *ebl_symbol_binding_name (Ebl *ebl, int binding,
156441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project					    char *buf, size_t len);
157441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
158441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Return dynamic tag name.  */
159441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern const char *ebl_dynamic_tag_name (Ebl *ebl, int64_t tag,
160441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project					 char *buf, size_t len);
161441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
162441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Check dynamic tag.  */
163441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern bool ebl_dynamic_tag_check (Ebl *ebl, int64_t tag);
164441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
165cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng/* Check whether given symbol's st_value and st_size are OK despite failing
166cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   normal checks.  */
167cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengextern bool ebl_check_special_symbol (Ebl *ebl, GElf_Ehdr *ehdr,
168cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng				      const GElf_Sym *sym, const char *name,
169cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng				      const GElf_Shdr *destshdr);
170cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
171441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Return combined section header flags value.  */
172441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern GElf_Word ebl_sh_flags_combine (Ebl *ebl, GElf_Word flags1,
173441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				       GElf_Word flags2);
174441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
175441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Return symbolic representation of OS ABI.  */
176441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern const char *ebl_osabi_name (Ebl *ebl, int osabi, char *buf, size_t len);
177441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
178441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
179441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Return name of the note section type for a core file.  */
180441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern const char *ebl_core_note_type_name (Ebl *ebl, uint32_t type, char *buf,
181441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project					    size_t len);
182441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
183441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Return name of the note section type for an object file.  */
184441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern const char *ebl_object_note_type_name (Ebl *ebl, uint32_t type,
185441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project					      char *buf, size_t len);
186441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
187441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Print information about object note if available.  */
188441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern void ebl_object_note (Ebl *ebl, const char *name, uint32_t type,
189441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project			     uint32_t descsz, const char *desc);
190441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
191cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng/* Check whether an attribute in a .gnu_attributes section is recognized.
192cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Fills in *TAG_NAME with the name for this tag.
193cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   If VALUE is a known value for that tag, also fills in *VALUE_NAME.  */
194cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengextern bool ebl_check_object_attribute (Ebl *ebl, const char *vendor,
195cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng					int tag, uint64_t value,
196cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng					const char **tag_name,
197cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng					const char **value_name);
198cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
199cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
200441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Check section name for being that of a debug informatino section.  */
201441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern bool ebl_debugscn_p (Ebl *ebl, const char *name);
202441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
203cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng/* Check whether given relocation is a copy relocation.  */
204cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengextern bool ebl_copy_reloc_p (Ebl *ebl, int reloc);
205cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
206cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng/* Check whether given relocation is a no-op relocation.  */
207cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengextern bool ebl_none_reloc_p (Ebl *ebl, int reloc);
208cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
209cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng/* Check whether given relocation is a relative relocation.  */
210cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengextern bool ebl_relative_reloc_p (Ebl *ebl, int reloc);
211cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
212cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng/* Check whether section should be stripped.  */
213cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengextern bool ebl_section_strip_p (Ebl *ebl, const GElf_Ehdr *ehdr,
214cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng				 const GElf_Shdr *shdr, const char *name,
215cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng				 bool remove_comment, bool only_remove_debug);
216cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
217cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng/* Check if backend uses a bss PLT in this file.  */
218cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengextern bool ebl_bss_plt_p (Ebl *ebl, GElf_Ehdr *ehdr);
219cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
220cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng/* Return size of entry in SysV-style hash table.  */
221cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengextern int ebl_sysvhash_entrysize (Ebl *ebl);
222cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
223cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng/* Return location expression to find return value given a
224cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   DW_TAG_subprogram, DW_TAG_subroutine_type, or similar DIE describing
225cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   function itself (whose DW_AT_type attribute describes its return type).
226cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Returns -1 for a libdw error (see dwarf_errno).
227cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Returns -2 for an unrecognized type formation.
228cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Returns zero if the function has no return value (e.g. "void" in C).
229cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Otherwise, *LOCOPS gets a location expression to find the return value,
230cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   and returns the number of operations in the expression.  The pointer is
231cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   permanently allocated at least as long as the Ebl handle is open.  */
232cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengextern int ebl_return_value_location (Ebl *ebl,
233cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng				      Dwarf_Die *functypedie,
234cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng				      const Dwarf_Op **locops);
235cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
236cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng/* Fill in register information given DWARF register numbers.
237cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   If NAME is null, return the maximum REGNO + 1 that has a name.
238cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Otherwise, store in NAME the name for DWARF register number REGNO
239cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   and return the number of bytes written (including '\0' terminator).
240cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Return -1 if NAMELEN is too short or REGNO is negative or too large.
241cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Return 0 if REGNO is unused (a gap in the DWARF number assignment).
242cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   On success, set *SETNAME to a description like "integer" or "FPU"
243cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   fit for "%s registers" title display, and *PREFIX to the string
244cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   that precedes NAME in canonical assembler syntax (e.g. "%" or "$").
245cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   The NAME string contains identifier characters only (maybe just digits).  */
246cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengextern ssize_t ebl_register_info (Ebl *ebl,
247cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng				  int regno, char *name, size_t namelen,
248cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng				  const char **prefix, const char **setname,
249cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng				  int *bits, int *type);
250cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
251cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng/* Fill in the DWARF register numbers for the registers used in system calls.
252cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   The SP and PC are what kernel reports call the user stack pointer and PC.
253cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   The CALLNO and ARGS are the system call number and incoming arguments.
254cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Each of these is filled with the DWARF register number corresponding,
255cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   or -1 if there is none.  Returns zero when the information is available.  */
256cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengextern int ebl_syscall_abi (Ebl *ebl, int *sp, int *pc,
257cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng			    int *callno, int args[6]);
258441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
259441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* ELF string table handling.  */
260441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstruct Ebl_Strtab;
261441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstruct Ebl_Strent;
262441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
263441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Create new ELF string table object in memory.  */
264441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern struct Ebl_Strtab *ebl_strtabinit (bool nullstr);
265441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
266441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Free resources allocated for ELF string table ST.  */
267441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern void ebl_strtabfree (struct Ebl_Strtab *st);
268441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
269441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Add string STR (length LEN is != 0) to ELF string table ST.  */
270441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern struct Ebl_Strent *ebl_strtabadd (struct Ebl_Strtab *st,
271441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project					 const char *str, size_t len);
272441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
273441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Finalize string table ST and store size and memory location information
274441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project   in DATA.  */
275441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern void ebl_strtabfinalize (struct Ebl_Strtab *st, Elf_Data *data);
276441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
277441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Get offset in string table for string associated with SE.  */
278441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern size_t ebl_strtaboffset (struct Ebl_Strent *se);
279441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
280441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Return the string associated with SE.  */
281441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern const char *ebl_string (struct Ebl_Strent *se);
282441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
283441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
284441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* ELF wide char string table handling.  */
285441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstruct Ebl_WStrtab;
286441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstruct Ebl_WStrent;
287441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
288441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Create new ELF wide char string table object in memory.  */
289441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern struct Ebl_WStrtab *ebl_wstrtabinit (bool nullstr);
290441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
291441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Free resources allocated for ELF wide char string table ST.  */
292441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern void ebl_wstrtabfree (struct Ebl_WStrtab *st);
293441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
294441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Add string STR (length LEN is != 0) to ELF string table ST.  */
295441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern struct Ebl_WStrent *ebl_wstrtabadd (struct Ebl_WStrtab *st,
296441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project					   const wchar_t *str, size_t len);
297441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
298441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Finalize string table ST and store size and memory location information
299441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project   in DATA.  */
300441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern void ebl_wstrtabfinalize (struct Ebl_WStrtab *st, Elf_Data *data);
301441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
302441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Get offset in wide char string table for string associated with SE.  */
303441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern size_t ebl_wstrtaboffset (struct Ebl_WStrent *se);
304441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
305441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
306441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Generic string table handling.  */
307441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstruct Ebl_GStrtab;
308441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstruct Ebl_GStrent;
309441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
310441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Create new string table object in memory.  */
311441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern struct Ebl_GStrtab *ebl_gstrtabinit (unsigned int width, bool nullstr);
312441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
313441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Free resources allocated for string table ST.  */
314441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern void ebl_gstrtabfree (struct Ebl_GStrtab *st);
315441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
316441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Add string STR (length LEN is != 0) to string table ST.  */
317441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern struct Ebl_GStrent *ebl_gstrtabadd (struct Ebl_GStrtab *st,
318441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project					   const char *str, size_t len);
319441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
320441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Finalize string table ST and store size and memory location information
321441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project   in DATA.  */
322441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern void ebl_gstrtabfinalize (struct Ebl_GStrtab *st, Elf_Data *data);
323441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
324441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Get offset in wide char string table for string associated with SE.  */
325441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern size_t ebl_gstrtaboffset (struct Ebl_GStrent *se);
326441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
327cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
328cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng/* Register map info. */
329cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengtypedef struct
330cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng{
331cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  Dwarf_Half offset;		/* Byte offset in register data block.  */
332cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  Dwarf_Half regno;		/* DWARF register number.  */
333cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  uint8_t bits;			/* Bits of data for one register.  */
334cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  uint8_t pad;			/* Bytes of padding after register's data.  */
335cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  Dwarf_Half count;		/* Consecutive register numbers here.  */
336cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng} Ebl_Register_Location;
337cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
338cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng/* Non-register data items in core notes.  */
339cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengtypedef struct
340cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng{
341cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  const char *name;		/* Printable identifier.  */
342cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  const char *group;		/* Identifier for category of related items.  */
343cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  Dwarf_Half offset;		/* Byte offset in note data.  */
344cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  Dwarf_Half count;
345cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  Elf_Type type;
346cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  char format;
347cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  bool thread_identifier;
348cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng} Ebl_Core_Item;
349cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
350cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng/* Describe the format of a core file note with type field matching N_TYPE
351cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   and descriptor size matching DESCSZ.  */
352cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengextern int ebl_core_note (Ebl *ebl, GElf_Word n_type, GElf_Word descsz,
353cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng			  GElf_Word *regs_offset, size_t *nregloc,
354cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng			  const Ebl_Register_Location **reglocs,
355cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng			  size_t *nitems, const Ebl_Core_Item **items)
356cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  __nonnull_attribute__ (1, 4, 5, 6, 7, 8);
357cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
358cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng/* Describe the auxv type number.  */
359cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengextern int ebl_auxv_info (Ebl *ebl, GElf_Xword a_type,
360cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng			  const char **name, const char **format)
361cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  __nonnull_attribute__ (1, 3, 4);
362cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
363cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
364cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng#ifdef __cplusplus
365cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng}
366cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng#endif
367cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
368441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#endif	/* libebl.h */
369