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