125b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Interface for libebl.
225b3c049e70834cf33790a28643ab058b507b35cBen Cheng   Copyright (C) 2000-2010 Red Hat, Inc.
325b3c049e70834cf33790a28643ab058b507b35cBen Cheng   This file is part of Red Hat elfutils.
425b3c049e70834cf33790a28643ab058b507b35cBen Cheng
525b3c049e70834cf33790a28643ab058b507b35cBen Cheng   Red Hat elfutils is free software; you can redistribute it and/or modify
625b3c049e70834cf33790a28643ab058b507b35cBen Cheng   it under the terms of the GNU General Public License as published by the
725b3c049e70834cf33790a28643ab058b507b35cBen Cheng   Free Software Foundation; version 2 of the License.
825b3c049e70834cf33790a28643ab058b507b35cBen Cheng
925b3c049e70834cf33790a28643ab058b507b35cBen Cheng   Red Hat elfutils is distributed in the hope that it will be useful, but
1025b3c049e70834cf33790a28643ab058b507b35cBen Cheng   WITHOUT ANY WARRANTY; without even the implied warranty of
1125b3c049e70834cf33790a28643ab058b507b35cBen Cheng   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
1225b3c049e70834cf33790a28643ab058b507b35cBen Cheng   General Public License for more details.
1325b3c049e70834cf33790a28643ab058b507b35cBen Cheng
1425b3c049e70834cf33790a28643ab058b507b35cBen Cheng   You should have received a copy of the GNU General Public License along
1525b3c049e70834cf33790a28643ab058b507b35cBen Cheng   with Red Hat elfutils; if not, write to the Free Software Foundation,
1625b3c049e70834cf33790a28643ab058b507b35cBen Cheng   Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
1725b3c049e70834cf33790a28643ab058b507b35cBen Cheng
1825b3c049e70834cf33790a28643ab058b507b35cBen Cheng   In addition, as a special exception, Red Hat, Inc. gives You the
1925b3c049e70834cf33790a28643ab058b507b35cBen Cheng   additional right to link the code of Red Hat elfutils with code licensed
2025b3c049e70834cf33790a28643ab058b507b35cBen Cheng   under any Open Source Initiative certified open source license
2125b3c049e70834cf33790a28643ab058b507b35cBen Cheng   (http://www.opensource.org/licenses/index.php) which requires the
2225b3c049e70834cf33790a28643ab058b507b35cBen Cheng   distribution of source code with any binary distribution and to
2325b3c049e70834cf33790a28643ab058b507b35cBen Cheng   distribute linked combinations of the two.  Non-GPL Code permitted under
2425b3c049e70834cf33790a28643ab058b507b35cBen Cheng   this exception must only link to the code of Red Hat elfutils through
2525b3c049e70834cf33790a28643ab058b507b35cBen Cheng   those well defined interfaces identified in the file named EXCEPTION
2625b3c049e70834cf33790a28643ab058b507b35cBen Cheng   found in the source code files (the "Approved Interfaces").  The files
2725b3c049e70834cf33790a28643ab058b507b35cBen Cheng   of Non-GPL Code may instantiate templates or use macros or inline
2825b3c049e70834cf33790a28643ab058b507b35cBen Cheng   functions from the Approved Interfaces without causing the resulting
2925b3c049e70834cf33790a28643ab058b507b35cBen Cheng   work to be covered by the GNU General Public License.  Only Red Hat,
3025b3c049e70834cf33790a28643ab058b507b35cBen Cheng   Inc. may make changes or additions to the list of Approved Interfaces.
3125b3c049e70834cf33790a28643ab058b507b35cBen Cheng   Red Hat's grant of this exception is conditioned upon your not adding
3225b3c049e70834cf33790a28643ab058b507b35cBen Cheng   any new exceptions.  If you wish to add a new Approved Interface or
3325b3c049e70834cf33790a28643ab058b507b35cBen Cheng   exception, please contact Red Hat.  You must obey the GNU General Public
3425b3c049e70834cf33790a28643ab058b507b35cBen Cheng   License in all respects for all of the Red Hat elfutils code and other
3525b3c049e70834cf33790a28643ab058b507b35cBen Cheng   code used in conjunction with Red Hat elfutils except the Non-GPL Code
3625b3c049e70834cf33790a28643ab058b507b35cBen Cheng   covered by this exception.  If you modify this file, you may extend this
3725b3c049e70834cf33790a28643ab058b507b35cBen Cheng   exception to your version of the file, but you are not obligated to do
3825b3c049e70834cf33790a28643ab058b507b35cBen Cheng   so.  If you do not wish to provide this exception without modification,
3925b3c049e70834cf33790a28643ab058b507b35cBen Cheng   you must delete this exception statement from your version and license
4025b3c049e70834cf33790a28643ab058b507b35cBen Cheng   this file solely under the GPL without exception.
4125b3c049e70834cf33790a28643ab058b507b35cBen Cheng
4225b3c049e70834cf33790a28643ab058b507b35cBen Cheng   Red Hat elfutils is an included package of the Open Invention Network.
4325b3c049e70834cf33790a28643ab058b507b35cBen Cheng   An included package of the Open Invention Network is a package for which
4425b3c049e70834cf33790a28643ab058b507b35cBen Cheng   Open Invention Network licensees cross-license their patents.  No patent
4525b3c049e70834cf33790a28643ab058b507b35cBen Cheng   license is granted, either expressly or impliedly, by designation as an
4625b3c049e70834cf33790a28643ab058b507b35cBen Cheng   included package.  Should you wish to participate in the Open Invention
4725b3c049e70834cf33790a28643ab058b507b35cBen Cheng   Network licensing program, please visit www.openinventionnetwork.com
4825b3c049e70834cf33790a28643ab058b507b35cBen Cheng   <http://www.openinventionnetwork.com>.  */
4925b3c049e70834cf33790a28643ab058b507b35cBen Cheng
5025b3c049e70834cf33790a28643ab058b507b35cBen Cheng#ifndef _LIBEBL_H
5125b3c049e70834cf33790a28643ab058b507b35cBen Cheng#define _LIBEBL_H 1
5225b3c049e70834cf33790a28643ab058b507b35cBen Cheng
5325b3c049e70834cf33790a28643ab058b507b35cBen Cheng#include <gelf.h>
5425b3c049e70834cf33790a28643ab058b507b35cBen Cheng#include "libdw.h"
5525b3c049e70834cf33790a28643ab058b507b35cBen Cheng#include <stdbool.h>
5625b3c049e70834cf33790a28643ab058b507b35cBen Cheng#include <stddef.h>
5725b3c049e70834cf33790a28643ab058b507b35cBen Cheng#include <stdint.h>
5825b3c049e70834cf33790a28643ab058b507b35cBen Cheng
5925b3c049e70834cf33790a28643ab058b507b35cBen Cheng#include "elf-knowledge.h"
6025b3c049e70834cf33790a28643ab058b507b35cBen Cheng
6125b3c049e70834cf33790a28643ab058b507b35cBen Cheng
6225b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Opaque type for the handle.  */
6325b3c049e70834cf33790a28643ab058b507b35cBen Chengtypedef struct ebl Ebl;
6425b3c049e70834cf33790a28643ab058b507b35cBen Cheng
6525b3c049e70834cf33790a28643ab058b507b35cBen Cheng
6625b3c049e70834cf33790a28643ab058b507b35cBen Cheng#ifdef __cplusplus
6725b3c049e70834cf33790a28643ab058b507b35cBen Chengextern "C" {
6825b3c049e70834cf33790a28643ab058b507b35cBen Cheng#endif
6925b3c049e70834cf33790a28643ab058b507b35cBen Cheng
7025b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Get backend handle for object associated with ELF handle.  */
7125b3c049e70834cf33790a28643ab058b507b35cBen Chengextern Ebl *ebl_openbackend (Elf *elf);
7225b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Similar but without underlying ELF file.  */
7325b3c049e70834cf33790a28643ab058b507b35cBen Chengextern Ebl *ebl_openbackend_machine (GElf_Half machine);
7425b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Similar but with emulation name given.  */
7525b3c049e70834cf33790a28643ab058b507b35cBen Chengextern Ebl *ebl_openbackend_emulation (const char *emulation);
7625b3c049e70834cf33790a28643ab058b507b35cBen Cheng
7725b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Free resources allocated for backend handle.  */
7825b3c049e70834cf33790a28643ab058b507b35cBen Chengextern void ebl_closebackend (Ebl *bh);
7925b3c049e70834cf33790a28643ab058b507b35cBen Cheng
8025b3c049e70834cf33790a28643ab058b507b35cBen Cheng
8125b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Information about the descriptor.  */
8225b3c049e70834cf33790a28643ab058b507b35cBen Cheng
8325b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Get ELF machine.  */
8425b3c049e70834cf33790a28643ab058b507b35cBen Chengextern int ebl_get_elfmachine (Ebl *ebl) __attribute__ ((__pure__));
8525b3c049e70834cf33790a28643ab058b507b35cBen Cheng
8625b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Get ELF class.  */
8725b3c049e70834cf33790a28643ab058b507b35cBen Chengextern int ebl_get_elfclass (Ebl *ebl) __attribute__ ((__pure__));
8825b3c049e70834cf33790a28643ab058b507b35cBen Cheng
8925b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Get ELF data encoding.  */
9025b3c049e70834cf33790a28643ab058b507b35cBen Chengextern int ebl_get_elfdata (Ebl *ebl) __attribute__ ((__pure__));
9125b3c049e70834cf33790a28643ab058b507b35cBen Cheng
9225b3c049e70834cf33790a28643ab058b507b35cBen Cheng
9325b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Function to call the callback functions including default ELF
9425b3c049e70834cf33790a28643ab058b507b35cBen Cheng   handling.  */
9525b3c049e70834cf33790a28643ab058b507b35cBen Cheng
9625b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Return backend name.  */
9725b3c049e70834cf33790a28643ab058b507b35cBen Chengextern const char *ebl_backend_name (Ebl *ebl);
9825b3c049e70834cf33790a28643ab058b507b35cBen Cheng
9925b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Return relocation type name.  */
10025b3c049e70834cf33790a28643ab058b507b35cBen Chengextern const char *ebl_object_type_name (Ebl *ebl, int object,
10125b3c049e70834cf33790a28643ab058b507b35cBen Cheng					 char *buf, size_t len);
10225b3c049e70834cf33790a28643ab058b507b35cBen Cheng
10325b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Return relocation type name.  */
10425b3c049e70834cf33790a28643ab058b507b35cBen Chengextern const char *ebl_reloc_type_name (Ebl *ebl, int reloc,
10525b3c049e70834cf33790a28643ab058b507b35cBen Cheng					char *buf, size_t len);
10625b3c049e70834cf33790a28643ab058b507b35cBen Cheng
10725b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Check relocation type.  */
10825b3c049e70834cf33790a28643ab058b507b35cBen Chengextern bool ebl_reloc_type_check (Ebl *ebl, int reloc);
10925b3c049e70834cf33790a28643ab058b507b35cBen Cheng
11025b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Check relocation type use.  */
11125b3c049e70834cf33790a28643ab058b507b35cBen Chengextern bool ebl_reloc_valid_use (Ebl *ebl, int reloc);
11225b3c049e70834cf33790a28643ab058b507b35cBen Cheng
11325b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Check if relocation type is for simple absolute relocations.
11425b3c049e70834cf33790a28643ab058b507b35cBen Cheng   Return ELF_T_{BYTE,HALF,SWORD,SXWORD} for a simple type, else ELF_T_NUM.  */
11525b3c049e70834cf33790a28643ab058b507b35cBen Chengextern Elf_Type ebl_reloc_simple_type (Ebl *ebl, int reloc);
11625b3c049e70834cf33790a28643ab058b507b35cBen Cheng
11725b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Return true if the symbol type is that referencing the GOT.  E.g.,
11825b3c049e70834cf33790a28643ab058b507b35cBen Cheng   R_386_GOTPC.  */
11925b3c049e70834cf33790a28643ab058b507b35cBen Chengextern bool ebl_gotpc_reloc_check (Ebl *ebl, int reloc);
12025b3c049e70834cf33790a28643ab058b507b35cBen Cheng
12125b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Return segment type name.  */
12225b3c049e70834cf33790a28643ab058b507b35cBen Chengextern const char *ebl_segment_type_name (Ebl *ebl, int segment,
12325b3c049e70834cf33790a28643ab058b507b35cBen Cheng					  char *buf, size_t len);
12425b3c049e70834cf33790a28643ab058b507b35cBen Cheng
12525b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Return section type name.  */
12625b3c049e70834cf33790a28643ab058b507b35cBen Chengextern const char *ebl_section_type_name (Ebl *ebl, int section,
12725b3c049e70834cf33790a28643ab058b507b35cBen Cheng					  char *buf, size_t len);
12825b3c049e70834cf33790a28643ab058b507b35cBen Cheng
12925b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Return section name.  */
13025b3c049e70834cf33790a28643ab058b507b35cBen Chengextern const char *ebl_section_name (Ebl *ebl, int section, int xsection,
13125b3c049e70834cf33790a28643ab058b507b35cBen Cheng				     char *buf, size_t len,
13225b3c049e70834cf33790a28643ab058b507b35cBen Cheng				     const char *scnnames[], size_t shnum);
13325b3c049e70834cf33790a28643ab058b507b35cBen Cheng
13425b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Return machine flag names.  */
13525b3c049e70834cf33790a28643ab058b507b35cBen Chengextern const char *ebl_machine_flag_name (Ebl *ebl, GElf_Word flags,
13625b3c049e70834cf33790a28643ab058b507b35cBen Cheng					  char *buf, size_t len);
13725b3c049e70834cf33790a28643ab058b507b35cBen Cheng
13825b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Check whether machine flag is valid.  */
13925b3c049e70834cf33790a28643ab058b507b35cBen Chengextern bool ebl_machine_flag_check (Ebl *ebl, GElf_Word flags);
14025b3c049e70834cf33790a28643ab058b507b35cBen Cheng
14125b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Check whether SHF_MASKPROC flags are valid.  */
14225b3c049e70834cf33790a28643ab058b507b35cBen Chengextern bool ebl_machine_section_flag_check (Ebl *ebl, GElf_Xword flags);
14325b3c049e70834cf33790a28643ab058b507b35cBen Cheng
14425b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Check whether the section with the given index, header, and name
14525b3c049e70834cf33790a28643ab058b507b35cBen Cheng   is a special machine section that is valid despite a combination
14625b3c049e70834cf33790a28643ab058b507b35cBen Cheng   of flags or other details that are not generically valid.  */
14725b3c049e70834cf33790a28643ab058b507b35cBen Chengextern bool ebl_check_special_section (Ebl *ebl, int ndx,
14825b3c049e70834cf33790a28643ab058b507b35cBen Cheng				       const GElf_Shdr *shdr, const char *name);
14925b3c049e70834cf33790a28643ab058b507b35cBen Cheng
15025b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Return symbol type name.  */
15125b3c049e70834cf33790a28643ab058b507b35cBen Chengextern const char *ebl_symbol_type_name (Ebl *ebl, int symbol,
15225b3c049e70834cf33790a28643ab058b507b35cBen Cheng					 char *buf, size_t len);
15325b3c049e70834cf33790a28643ab058b507b35cBen Cheng
15425b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Return symbol binding name.  */
15525b3c049e70834cf33790a28643ab058b507b35cBen Chengextern const char *ebl_symbol_binding_name (Ebl *ebl, int binding,
15625b3c049e70834cf33790a28643ab058b507b35cBen Cheng					    char *buf, size_t len);
15725b3c049e70834cf33790a28643ab058b507b35cBen Cheng
15825b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Return dynamic tag name.  */
15925b3c049e70834cf33790a28643ab058b507b35cBen Chengextern const char *ebl_dynamic_tag_name (Ebl *ebl, int64_t tag,
16025b3c049e70834cf33790a28643ab058b507b35cBen Cheng					 char *buf, size_t len);
16125b3c049e70834cf33790a28643ab058b507b35cBen Cheng
16225b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Check dynamic tag.  */
16325b3c049e70834cf33790a28643ab058b507b35cBen Chengextern bool ebl_dynamic_tag_check (Ebl *ebl, int64_t tag);
16425b3c049e70834cf33790a28643ab058b507b35cBen Cheng
16525b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Check whether given symbol's st_value and st_size are OK despite failing
16625b3c049e70834cf33790a28643ab058b507b35cBen Cheng   normal checks.  */
16725b3c049e70834cf33790a28643ab058b507b35cBen Chengextern bool ebl_check_special_symbol (Ebl *ebl, GElf_Ehdr *ehdr,
16825b3c049e70834cf33790a28643ab058b507b35cBen Cheng				      const GElf_Sym *sym, const char *name,
16925b3c049e70834cf33790a28643ab058b507b35cBen Cheng				      const GElf_Shdr *destshdr);
17025b3c049e70834cf33790a28643ab058b507b35cBen Cheng
17125b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Check whether only valid bits are set on the st_other symbol flag.  */
17225b3c049e70834cf33790a28643ab058b507b35cBen Chengextern bool ebl_check_st_other_bits (Ebl *ebl, unsigned char st_other);
17325b3c049e70834cf33790a28643ab058b507b35cBen Cheng
17425b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Return combined section header flags value.  */
17525b3c049e70834cf33790a28643ab058b507b35cBen Chengextern GElf_Word ebl_sh_flags_combine (Ebl *ebl, GElf_Word flags1,
17625b3c049e70834cf33790a28643ab058b507b35cBen Cheng				       GElf_Word flags2);
17725b3c049e70834cf33790a28643ab058b507b35cBen Cheng
17825b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Return symbolic representation of OS ABI.  */
17925b3c049e70834cf33790a28643ab058b507b35cBen Chengextern const char *ebl_osabi_name (Ebl *ebl, int osabi, char *buf, size_t len);
18025b3c049e70834cf33790a28643ab058b507b35cBen Cheng
18125b3c049e70834cf33790a28643ab058b507b35cBen Cheng
18225b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Return name of the note section type for a core file.  */
18325b3c049e70834cf33790a28643ab058b507b35cBen Chengextern const char *ebl_core_note_type_name (Ebl *ebl, uint32_t type, char *buf,
18425b3c049e70834cf33790a28643ab058b507b35cBen Cheng					    size_t len);
18525b3c049e70834cf33790a28643ab058b507b35cBen Cheng
18625b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Return name of the note section type for an object file.  */
18725b3c049e70834cf33790a28643ab058b507b35cBen Chengextern const char *ebl_object_note_type_name (Ebl *ebl, const char *name,
18825b3c049e70834cf33790a28643ab058b507b35cBen Cheng					      uint32_t type, char *buf,
18925b3c049e70834cf33790a28643ab058b507b35cBen Cheng					      size_t len);
19025b3c049e70834cf33790a28643ab058b507b35cBen Cheng
19125b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Print information about object note if available.  */
19225b3c049e70834cf33790a28643ab058b507b35cBen Chengextern void ebl_object_note (Ebl *ebl, const char *name, uint32_t type,
19325b3c049e70834cf33790a28643ab058b507b35cBen Cheng			     uint32_t descsz, const char *desc);
19425b3c049e70834cf33790a28643ab058b507b35cBen Cheng
19525b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Check whether an attribute in a .gnu_attributes section is recognized.
19625b3c049e70834cf33790a28643ab058b507b35cBen Cheng   Fills in *TAG_NAME with the name for this tag.
19725b3c049e70834cf33790a28643ab058b507b35cBen Cheng   If VALUE is a known value for that tag, also fills in *VALUE_NAME.  */
19825b3c049e70834cf33790a28643ab058b507b35cBen Chengextern bool ebl_check_object_attribute (Ebl *ebl, const char *vendor,
19925b3c049e70834cf33790a28643ab058b507b35cBen Cheng					int tag, uint64_t value,
20025b3c049e70834cf33790a28643ab058b507b35cBen Cheng					const char **tag_name,
20125b3c049e70834cf33790a28643ab058b507b35cBen Cheng					const char **value_name);
20225b3c049e70834cf33790a28643ab058b507b35cBen Cheng
20325b3c049e70834cf33790a28643ab058b507b35cBen Cheng
20425b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Check section name for being that of a debug informatino section.  */
20525b3c049e70834cf33790a28643ab058b507b35cBen Chengextern bool ebl_debugscn_p (Ebl *ebl, const char *name);
20625b3c049e70834cf33790a28643ab058b507b35cBen Cheng
20725b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Check whether given relocation is a copy relocation.  */
20825b3c049e70834cf33790a28643ab058b507b35cBen Chengextern bool ebl_copy_reloc_p (Ebl *ebl, int reloc);
20925b3c049e70834cf33790a28643ab058b507b35cBen Cheng
21025b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Check whether given relocation is a no-op relocation.  */
21125b3c049e70834cf33790a28643ab058b507b35cBen Chengextern bool ebl_none_reloc_p (Ebl *ebl, int reloc);
21225b3c049e70834cf33790a28643ab058b507b35cBen Cheng
21325b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Check whether given relocation is a relative relocation.  */
21425b3c049e70834cf33790a28643ab058b507b35cBen Chengextern bool ebl_relative_reloc_p (Ebl *ebl, int reloc);
21525b3c049e70834cf33790a28643ab058b507b35cBen Cheng
21625b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Check whether section should be stripped.  */
21725b3c049e70834cf33790a28643ab058b507b35cBen Chengextern bool ebl_section_strip_p (Ebl *ebl, const GElf_Ehdr *ehdr,
21825b3c049e70834cf33790a28643ab058b507b35cBen Cheng				 const GElf_Shdr *shdr, const char *name,
21925b3c049e70834cf33790a28643ab058b507b35cBen Cheng				 bool remove_comment, bool only_remove_debug);
22025b3c049e70834cf33790a28643ab058b507b35cBen Cheng
22125b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Check if backend uses a bss PLT in this file.  */
22225b3c049e70834cf33790a28643ab058b507b35cBen Chengextern bool ebl_bss_plt_p (Ebl *ebl, GElf_Ehdr *ehdr);
22325b3c049e70834cf33790a28643ab058b507b35cBen Cheng
22425b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Return size of entry in SysV-style hash table.  */
22525b3c049e70834cf33790a28643ab058b507b35cBen Chengextern int ebl_sysvhash_entrysize (Ebl *ebl);
22625b3c049e70834cf33790a28643ab058b507b35cBen Cheng
22725b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Return location expression to find return value given a
22825b3c049e70834cf33790a28643ab058b507b35cBen Cheng   DW_TAG_subprogram, DW_TAG_subroutine_type, or similar DIE describing
22925b3c049e70834cf33790a28643ab058b507b35cBen Cheng   function itself (whose DW_AT_type attribute describes its return type).
23025b3c049e70834cf33790a28643ab058b507b35cBen Cheng   Returns -1 for a libdw error (see dwarf_errno).
23125b3c049e70834cf33790a28643ab058b507b35cBen Cheng   Returns -2 for an unrecognized type formation.
23225b3c049e70834cf33790a28643ab058b507b35cBen Cheng   Returns zero if the function has no return value (e.g. "void" in C).
23325b3c049e70834cf33790a28643ab058b507b35cBen Cheng   Otherwise, *LOCOPS gets a location expression to find the return value,
23425b3c049e70834cf33790a28643ab058b507b35cBen Cheng   and returns the number of operations in the expression.  The pointer is
23525b3c049e70834cf33790a28643ab058b507b35cBen Cheng   permanently allocated at least as long as the Ebl handle is open.  */
23625b3c049e70834cf33790a28643ab058b507b35cBen Chengextern int ebl_return_value_location (Ebl *ebl,
23725b3c049e70834cf33790a28643ab058b507b35cBen Cheng				      Dwarf_Die *functypedie,
23825b3c049e70834cf33790a28643ab058b507b35cBen Cheng				      const Dwarf_Op **locops);
23925b3c049e70834cf33790a28643ab058b507b35cBen Cheng
24025b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Fill in register information given DWARF register numbers.
24125b3c049e70834cf33790a28643ab058b507b35cBen Cheng   If NAME is null, return the maximum REGNO + 1 that has a name.
24225b3c049e70834cf33790a28643ab058b507b35cBen Cheng   Otherwise, store in NAME the name for DWARF register number REGNO
24325b3c049e70834cf33790a28643ab058b507b35cBen Cheng   and return the number of bytes written (including '\0' terminator).
24425b3c049e70834cf33790a28643ab058b507b35cBen Cheng   Return -1 if NAMELEN is too short or REGNO is negative or too large.
24525b3c049e70834cf33790a28643ab058b507b35cBen Cheng   Return 0 if REGNO is unused (a gap in the DWARF number assignment).
24625b3c049e70834cf33790a28643ab058b507b35cBen Cheng   On success, set *SETNAME to a description like "integer" or "FPU"
24725b3c049e70834cf33790a28643ab058b507b35cBen Cheng   fit for "%s registers" title display, and *PREFIX to the string
24825b3c049e70834cf33790a28643ab058b507b35cBen Cheng   that precedes NAME in canonical assembler syntax (e.g. "%" or "$").
24925b3c049e70834cf33790a28643ab058b507b35cBen Cheng   The NAME string contains identifier characters only (maybe just digits).  */
25025b3c049e70834cf33790a28643ab058b507b35cBen Chengextern ssize_t ebl_register_info (Ebl *ebl,
25125b3c049e70834cf33790a28643ab058b507b35cBen Cheng				  int regno, char *name, size_t namelen,
25225b3c049e70834cf33790a28643ab058b507b35cBen Cheng				  const char **prefix, const char **setname,
25325b3c049e70834cf33790a28643ab058b507b35cBen Cheng				  int *bits, int *type);
25425b3c049e70834cf33790a28643ab058b507b35cBen Cheng
25525b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Fill in the DWARF register numbers for the registers used in system calls.
25625b3c049e70834cf33790a28643ab058b507b35cBen Cheng   The SP and PC are what kernel reports call the user stack pointer and PC.
25725b3c049e70834cf33790a28643ab058b507b35cBen Cheng   The CALLNO and ARGS are the system call number and incoming arguments.
25825b3c049e70834cf33790a28643ab058b507b35cBen Cheng   Each of these is filled with the DWARF register number corresponding,
25925b3c049e70834cf33790a28643ab058b507b35cBen Cheng   or -1 if there is none.  Returns zero when the information is available.  */
26025b3c049e70834cf33790a28643ab058b507b35cBen Chengextern int ebl_syscall_abi (Ebl *ebl, int *sp, int *pc,
26125b3c049e70834cf33790a28643ab058b507b35cBen Cheng			    int *callno, int args[6]);
26225b3c049e70834cf33790a28643ab058b507b35cBen Cheng
26325b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Supply the ABI-specified state of DWARF CFI before CIE initial programs.
26425b3c049e70834cf33790a28643ab058b507b35cBen Cheng
26525b3c049e70834cf33790a28643ab058b507b35cBen Cheng   The DWARF 3.0 spec says that the default initial states of all registers
26625b3c049e70834cf33790a28643ab058b507b35cBen Cheng   are "undefined", unless otherwise specified by the machine/compiler ABI.
26725b3c049e70834cf33790a28643ab058b507b35cBen Cheng
26825b3c049e70834cf33790a28643ab058b507b35cBen Cheng   This default is wrong for every machine with the CFI generated by GCC.
26925b3c049e70834cf33790a28643ab058b507b35cBen Cheng   The EH unwinder does not really distinguish "same_value" and "undefined",
27025b3c049e70834cf33790a28643ab058b507b35cBen Cheng   since it doesn't matter for unwinding (in either case there is no change
27125b3c049e70834cf33790a28643ab058b507b35cBen Cheng   to make for that register).  GCC generates CFI that says nothing at all
27225b3c049e70834cf33790a28643ab058b507b35cBen Cheng   about registers it hasn't spilled somewhere.  For our unwinder to give
27325b3c049e70834cf33790a28643ab058b507b35cBen Cheng   the true story, the backend must supply an initial state that uses
27425b3c049e70834cf33790a28643ab058b507b35cBen Cheng   "same_value" rules for all the callee-saves registers.
27525b3c049e70834cf33790a28643ab058b507b35cBen Cheng
27625b3c049e70834cf33790a28643ab058b507b35cBen Cheng   This can fill in the initial_instructions, initial_instructions_end
27725b3c049e70834cf33790a28643ab058b507b35cBen Cheng   members of *ABI_INFO to point at a CFI instruction stream to process
27825b3c049e70834cf33790a28643ab058b507b35cBen Cheng   before each CIE's initial instructions.  It should set the
27925b3c049e70834cf33790a28643ab058b507b35cBen Cheng   data_alignment_factor member if it affects the initial instructions.
28025b3c049e70834cf33790a28643ab058b507b35cBen Cheng
28125b3c049e70834cf33790a28643ab058b507b35cBen Cheng   As a shorthand for some common cases, for this instruction stream
28225b3c049e70834cf33790a28643ab058b507b35cBen Cheng   we overload some CFI instructions that cannot be used in a CIE:
28325b3c049e70834cf33790a28643ab058b507b35cBen Cheng
28425b3c049e70834cf33790a28643ab058b507b35cBen Cheng	DW_CFA_restore		-- Change default rule for all unmentioned
28525b3c049e70834cf33790a28643ab058b507b35cBen Cheng				   registers from undefined to same_value.
28625b3c049e70834cf33790a28643ab058b507b35cBen Cheng
28725b3c049e70834cf33790a28643ab058b507b35cBen Cheng   This function can also fill in ABI_INFO->return_address_register with the
28825b3c049e70834cf33790a28643ab058b507b35cBen Cheng   DWARF register number that identifies the actual PC in machine state.
28925b3c049e70834cf33790a28643ab058b507b35cBen Cheng   If there is no canonical DWARF register number with that meaning, it's
29025b3c049e70834cf33790a28643ab058b507b35cBen Cheng   left unchanged (callers usually initialize with (Dwarf_Word) -1).
29125b3c049e70834cf33790a28643ab058b507b35cBen Cheng   This value is not used by CFI per se.  */
29225b3c049e70834cf33790a28643ab058b507b35cBen Chengextern int ebl_abi_cfi (Ebl *ebl, Dwarf_CIE *abi_info)
29325b3c049e70834cf33790a28643ab058b507b35cBen Cheng  __nonnull_attribute__ (2);
29425b3c049e70834cf33790a28643ab058b507b35cBen Cheng
29525b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* ELF string table handling.  */
29625b3c049e70834cf33790a28643ab058b507b35cBen Chengstruct Ebl_Strtab;
29725b3c049e70834cf33790a28643ab058b507b35cBen Chengstruct Ebl_Strent;
29825b3c049e70834cf33790a28643ab058b507b35cBen Cheng
29925b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Create new ELF string table object in memory.  */
30025b3c049e70834cf33790a28643ab058b507b35cBen Chengextern struct Ebl_Strtab *ebl_strtabinit (bool nullstr);
30125b3c049e70834cf33790a28643ab058b507b35cBen Cheng
30225b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Free resources allocated for ELF string table ST.  */
30325b3c049e70834cf33790a28643ab058b507b35cBen Chengextern void ebl_strtabfree (struct Ebl_Strtab *st);
30425b3c049e70834cf33790a28643ab058b507b35cBen Cheng
30525b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Add string STR (length LEN is != 0) to ELF string table ST.  */
30625b3c049e70834cf33790a28643ab058b507b35cBen Chengextern struct Ebl_Strent *ebl_strtabadd (struct Ebl_Strtab *st,
30725b3c049e70834cf33790a28643ab058b507b35cBen Cheng					 const char *str, size_t len);
30825b3c049e70834cf33790a28643ab058b507b35cBen Cheng
30925b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Finalize string table ST and store size and memory location information
31025b3c049e70834cf33790a28643ab058b507b35cBen Cheng   in DATA.  */
31125b3c049e70834cf33790a28643ab058b507b35cBen Chengextern void ebl_strtabfinalize (struct Ebl_Strtab *st, Elf_Data *data);
31225b3c049e70834cf33790a28643ab058b507b35cBen Cheng
31325b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Get offset in string table for string associated with SE.  */
31425b3c049e70834cf33790a28643ab058b507b35cBen Chengextern size_t ebl_strtaboffset (struct Ebl_Strent *se);
31525b3c049e70834cf33790a28643ab058b507b35cBen Cheng
31625b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Return the string associated with SE.  */
31725b3c049e70834cf33790a28643ab058b507b35cBen Chengextern const char *ebl_string (struct Ebl_Strent *se);
31825b3c049e70834cf33790a28643ab058b507b35cBen Cheng
31925b3c049e70834cf33790a28643ab058b507b35cBen Cheng
32025b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* ELF wide char string table handling.  */
32125b3c049e70834cf33790a28643ab058b507b35cBen Chengstruct Ebl_WStrtab;
32225b3c049e70834cf33790a28643ab058b507b35cBen Chengstruct Ebl_WStrent;
32325b3c049e70834cf33790a28643ab058b507b35cBen Cheng
32425b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Create new ELF wide char string table object in memory.  */
32525b3c049e70834cf33790a28643ab058b507b35cBen Chengextern struct Ebl_WStrtab *ebl_wstrtabinit (bool nullstr);
32625b3c049e70834cf33790a28643ab058b507b35cBen Cheng
32725b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Free resources allocated for ELF wide char string table ST.  */
32825b3c049e70834cf33790a28643ab058b507b35cBen Chengextern void ebl_wstrtabfree (struct Ebl_WStrtab *st);
32925b3c049e70834cf33790a28643ab058b507b35cBen Cheng
33025b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Add string STR (length LEN is != 0) to ELF string table ST.  */
33125b3c049e70834cf33790a28643ab058b507b35cBen Chengextern struct Ebl_WStrent *ebl_wstrtabadd (struct Ebl_WStrtab *st,
33225b3c049e70834cf33790a28643ab058b507b35cBen Cheng					   const wchar_t *str, size_t len);
33325b3c049e70834cf33790a28643ab058b507b35cBen Cheng
33425b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Finalize string table ST and store size and memory location information
33525b3c049e70834cf33790a28643ab058b507b35cBen Cheng   in DATA.  */
33625b3c049e70834cf33790a28643ab058b507b35cBen Chengextern void ebl_wstrtabfinalize (struct Ebl_WStrtab *st, Elf_Data *data);
33725b3c049e70834cf33790a28643ab058b507b35cBen Cheng
33825b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Get offset in wide char string table for string associated with SE.  */
33925b3c049e70834cf33790a28643ab058b507b35cBen Chengextern size_t ebl_wstrtaboffset (struct Ebl_WStrent *se);
34025b3c049e70834cf33790a28643ab058b507b35cBen Cheng
34125b3c049e70834cf33790a28643ab058b507b35cBen Cheng
34225b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Generic string table handling.  */
34325b3c049e70834cf33790a28643ab058b507b35cBen Chengstruct Ebl_GStrtab;
34425b3c049e70834cf33790a28643ab058b507b35cBen Chengstruct Ebl_GStrent;
34525b3c049e70834cf33790a28643ab058b507b35cBen Cheng
34625b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Create new string table object in memory.  */
34725b3c049e70834cf33790a28643ab058b507b35cBen Chengextern struct Ebl_GStrtab *ebl_gstrtabinit (unsigned int width, bool nullstr);
34825b3c049e70834cf33790a28643ab058b507b35cBen Cheng
34925b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Free resources allocated for string table ST.  */
35025b3c049e70834cf33790a28643ab058b507b35cBen Chengextern void ebl_gstrtabfree (struct Ebl_GStrtab *st);
35125b3c049e70834cf33790a28643ab058b507b35cBen Cheng
35225b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Add string STR (length LEN is != 0) to string table ST.  */
35325b3c049e70834cf33790a28643ab058b507b35cBen Chengextern struct Ebl_GStrent *ebl_gstrtabadd (struct Ebl_GStrtab *st,
35425b3c049e70834cf33790a28643ab058b507b35cBen Cheng					   const char *str, size_t len);
35525b3c049e70834cf33790a28643ab058b507b35cBen Cheng
35625b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Finalize string table ST and store size and memory location information
35725b3c049e70834cf33790a28643ab058b507b35cBen Cheng   in DATA.  */
35825b3c049e70834cf33790a28643ab058b507b35cBen Chengextern void ebl_gstrtabfinalize (struct Ebl_GStrtab *st, Elf_Data *data);
35925b3c049e70834cf33790a28643ab058b507b35cBen Cheng
36025b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Get offset in wide char string table for string associated with SE.  */
36125b3c049e70834cf33790a28643ab058b507b35cBen Chengextern size_t ebl_gstrtaboffset (struct Ebl_GStrent *se);
36225b3c049e70834cf33790a28643ab058b507b35cBen Cheng
36325b3c049e70834cf33790a28643ab058b507b35cBen Cheng
36425b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Register map info. */
36525b3c049e70834cf33790a28643ab058b507b35cBen Chengtypedef struct
36625b3c049e70834cf33790a28643ab058b507b35cBen Cheng{
36725b3c049e70834cf33790a28643ab058b507b35cBen Cheng  Dwarf_Half offset;		/* Byte offset in register data block.  */
36825b3c049e70834cf33790a28643ab058b507b35cBen Cheng  Dwarf_Half regno;		/* DWARF register number.  */
36925b3c049e70834cf33790a28643ab058b507b35cBen Cheng  uint8_t bits;			/* Bits of data for one register.  */
37025b3c049e70834cf33790a28643ab058b507b35cBen Cheng  uint8_t pad;			/* Bytes of padding after register's data.  */
37125b3c049e70834cf33790a28643ab058b507b35cBen Cheng  Dwarf_Half count;		/* Consecutive register numbers here.  */
37225b3c049e70834cf33790a28643ab058b507b35cBen Cheng} Ebl_Register_Location;
37325b3c049e70834cf33790a28643ab058b507b35cBen Cheng
37425b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Non-register data items in core notes.  */
37525b3c049e70834cf33790a28643ab058b507b35cBen Chengtypedef struct
37625b3c049e70834cf33790a28643ab058b507b35cBen Cheng{
37725b3c049e70834cf33790a28643ab058b507b35cBen Cheng  const char *name;		/* Printable identifier.  */
37825b3c049e70834cf33790a28643ab058b507b35cBen Cheng  const char *group;		/* Identifier for category of related items.  */
37925b3c049e70834cf33790a28643ab058b507b35cBen Cheng  Dwarf_Half offset;		/* Byte offset in note data.  */
38025b3c049e70834cf33790a28643ab058b507b35cBen Cheng  Dwarf_Half count;
38125b3c049e70834cf33790a28643ab058b507b35cBen Cheng  Elf_Type type;
38225b3c049e70834cf33790a28643ab058b507b35cBen Cheng  char format;
38325b3c049e70834cf33790a28643ab058b507b35cBen Cheng  bool thread_identifier;
38425b3c049e70834cf33790a28643ab058b507b35cBen Cheng} Ebl_Core_Item;
38525b3c049e70834cf33790a28643ab058b507b35cBen Cheng
38625b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Describe the format of a core file note with the given header and NAME.
38725b3c049e70834cf33790a28643ab058b507b35cBen Cheng   NAME is not guaranteed terminated, it's NHDR->n_namesz raw bytes.  */
38825b3c049e70834cf33790a28643ab058b507b35cBen Chengextern int ebl_core_note (Ebl *ebl, const GElf_Nhdr *nhdr, const char *name,
38925b3c049e70834cf33790a28643ab058b507b35cBen Cheng			  GElf_Word *regs_offset, size_t *nregloc,
39025b3c049e70834cf33790a28643ab058b507b35cBen Cheng			  const Ebl_Register_Location **reglocs,
39125b3c049e70834cf33790a28643ab058b507b35cBen Cheng			  size_t *nitems, const Ebl_Core_Item **items)
39225b3c049e70834cf33790a28643ab058b507b35cBen Cheng  __nonnull_attribute__ (1, 2, 3, 4, 5, 6, 7, 8);
39325b3c049e70834cf33790a28643ab058b507b35cBen Cheng
39425b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Describe the auxv type number.  */
39525b3c049e70834cf33790a28643ab058b507b35cBen Chengextern int ebl_auxv_info (Ebl *ebl, GElf_Xword a_type,
39625b3c049e70834cf33790a28643ab058b507b35cBen Cheng			  const char **name, const char **format)
39725b3c049e70834cf33790a28643ab058b507b35cBen Cheng  __nonnull_attribute__ (1, 3, 4);
39825b3c049e70834cf33790a28643ab058b507b35cBen Cheng
39925b3c049e70834cf33790a28643ab058b507b35cBen Cheng
40025b3c049e70834cf33790a28643ab058b507b35cBen Cheng#ifdef __cplusplus
40125b3c049e70834cf33790a28643ab058b507b35cBen Cheng}
40225b3c049e70834cf33790a28643ab058b507b35cBen Cheng#endif
40325b3c049e70834cf33790a28643ab058b507b35cBen Cheng
40425b3c049e70834cf33790a28643ab058b507b35cBen Cheng#endif	/* libebl.h */
405