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