Home | History | Annotate | Download | only in libebl
      1 /* Interface for libebl.
      2    Copyright (C) 2000-2010, 2013, 2014 Red Hat, Inc.
      3    This file is part of elfutils.
      4 
      5    This file is free software; you can redistribute it and/or modify
      6    it under the terms of either
      7 
      8      * the GNU Lesser General Public License as published by the Free
      9        Software Foundation; either version 3 of the License, or (at
     10        your option) any later version
     11 
     12    or
     13 
     14      * the GNU General Public License as published by the Free
     15        Software Foundation; either version 2 of the License, or (at
     16        your option) any later version
     17 
     18    or both in parallel, as here.
     19 
     20    elfutils is distributed in the hope that it will be useful, but
     21    WITHOUT ANY WARRANTY; without even the implied warranty of
     22    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     23    General Public License for more details.
     24 
     25    You should have received copies of the GNU General Public License and
     26    the GNU Lesser General Public License along with this program.  If
     27    not, see <http://www.gnu.org/licenses/>.  */
     28 
     29 #ifndef _LIBEBL_H
     30 #define _LIBEBL_H 1
     31 
     32 #include <gelf.h>
     33 #include "libdw.h"
     34 #include <stdbool.h>
     35 #include <stddef.h>
     36 #include <stdint.h>
     37 
     38 #include "elf-knowledge.h"
     39 
     40 
     41 /* Opaque type for the handle.  */
     42 typedef struct ebl Ebl;
     43 
     44 
     45 #ifdef __cplusplus
     46 extern "C" {
     47 #endif
     48 
     49 /* Get backend handle for object associated with ELF handle.  */
     50 extern Ebl *ebl_openbackend (Elf *elf);
     51 /* Similar but without underlying ELF file.  */
     52 extern Ebl *ebl_openbackend_machine (GElf_Half machine);
     53 /* Similar but with emulation name given.  */
     54 extern Ebl *ebl_openbackend_emulation (const char *emulation);
     55 
     56 /* Free resources allocated for backend handle.  */
     57 extern void ebl_closebackend (Ebl *bh);
     58 
     59 
     60 /* Information about the descriptor.  */
     61 
     62 /* Get ELF machine.  */
     63 extern int ebl_get_elfmachine (Ebl *ebl) __attribute__ ((__pure__));
     64 
     65 /* Get ELF class.  */
     66 extern int ebl_get_elfclass (Ebl *ebl) __attribute__ ((__pure__));
     67 
     68 /* Get ELF data encoding.  */
     69 extern int ebl_get_elfdata (Ebl *ebl) __attribute__ ((__pure__));
     70 
     71 
     72 /* Function to call the callback functions including default ELF
     73    handling.  */
     74 
     75 /* Return backend name.  */
     76 extern const char *ebl_backend_name (Ebl *ebl);
     77 
     78 /* Return relocation type name.  */
     79 extern const char *ebl_object_type_name (Ebl *ebl, int object,
     80 					 char *buf, size_t len);
     81 
     82 /* Return relocation type name.  */
     83 extern const char *ebl_reloc_type_name (Ebl *ebl, int reloc,
     84 					char *buf, size_t len);
     85 
     86 /* Check relocation type.  */
     87 extern bool ebl_reloc_type_check (Ebl *ebl, int reloc);
     88 
     89 /* Check relocation type use.  */
     90 extern bool ebl_reloc_valid_use (Ebl *ebl, int reloc);
     91 
     92 /* Check if relocation type is for simple absolute relocations.
     93    Return ELF_T_{BYTE,HALF,SWORD,SXWORD} for a simple type, else ELF_T_NUM.  */
     94 extern Elf_Type ebl_reloc_simple_type (Ebl *ebl, int reloc);
     95 
     96 /* Return true if the symbol type is that referencing the GOT.  E.g.,
     97    R_386_GOTPC.  */
     98 extern bool ebl_gotpc_reloc_check (Ebl *ebl, int reloc);
     99 
    100 /* Return segment type name.  */
    101 extern const char *ebl_segment_type_name (Ebl *ebl, int segment,
    102 					  char *buf, size_t len);
    103 
    104 /* Return section type name.  */
    105 extern const char *ebl_section_type_name (Ebl *ebl, int section,
    106 					  char *buf, size_t len);
    107 
    108 /* Return section name.  */
    109 extern const char *ebl_section_name (Ebl *ebl, int section, int xsection,
    110 				     char *buf, size_t len,
    111 				     const char *scnnames[], size_t shnum);
    112 
    113 /* Return machine flag names.  */
    114 extern const char *ebl_machine_flag_name (Ebl *ebl, GElf_Word flags,
    115 					  char *buf, size_t len);
    116 
    117 /* Check whether machine flag is valid.  */
    118 extern bool ebl_machine_flag_check (Ebl *ebl, GElf_Word flags);
    119 
    120 /* Check whether SHF_MASKPROC flags are valid.  */
    121 extern bool ebl_machine_section_flag_check (Ebl *ebl, GElf_Xword flags);
    122 
    123 /* Check whether the section with the given index, header, and name
    124    is a special machine section that is valid despite a combination
    125    of flags or other details that are not generically valid.  */
    126 extern bool ebl_check_special_section (Ebl *ebl, int ndx,
    127 				       const GElf_Shdr *shdr, const char *name);
    128 
    129 /* Return symbol type name.  */
    130 extern const char *ebl_symbol_type_name (Ebl *ebl, int symbol,
    131 					 char *buf, size_t len);
    132 
    133 /* Return symbol binding name.  */
    134 extern const char *ebl_symbol_binding_name (Ebl *ebl, int binding,
    135 					    char *buf, size_t len);
    136 
    137 /* Return dynamic tag name.  */
    138 extern const char *ebl_dynamic_tag_name (Ebl *ebl, int64_t tag,
    139 					 char *buf, size_t len);
    140 
    141 /* Check dynamic tag.  */
    142 extern bool ebl_dynamic_tag_check (Ebl *ebl, int64_t tag);
    143 
    144 /* Check whether given symbol's st_value and st_size are OK despite failing
    145    normal checks.  */
    146 extern bool ebl_check_special_symbol (Ebl *ebl, GElf_Ehdr *ehdr,
    147 				      const GElf_Sym *sym, const char *name,
    148 				      const GElf_Shdr *destshdr);
    149 
    150 /* Check whether only valid bits are set on the st_other symbol flag.  */
    151 extern bool ebl_check_st_other_bits (Ebl *ebl, unsigned char st_other);
    152 
    153 /* Return combined section header flags value.  */
    154 extern GElf_Word ebl_sh_flags_combine (Ebl *ebl, GElf_Word flags1,
    155 				       GElf_Word flags2);
    156 
    157 /* Return symbolic representation of OS ABI.  */
    158 extern const char *ebl_osabi_name (Ebl *ebl, int osabi, char *buf, size_t len);
    159 
    160 
    161 /* Return name of the note section type for a core file.  */
    162 extern const char *ebl_core_note_type_name (Ebl *ebl, uint32_t type, char *buf,
    163 					    size_t len);
    164 
    165 /* Return name of the note section type for an object file.  */
    166 extern const char *ebl_object_note_type_name (Ebl *ebl, const char *name,
    167 					      uint32_t type, char *buf,
    168 					      size_t len);
    169 
    170 /* Print information about object note if available.  */
    171 extern void ebl_object_note (Ebl *ebl, const char *name, uint32_t type,
    172 			     uint32_t descsz, const char *desc);
    173 
    174 /* Check whether an attribute in a .gnu_attributes section is recognized.
    175    Fills in *TAG_NAME with the name for this tag.
    176    If VALUE is a known value for that tag, also fills in *VALUE_NAME.  */
    177 extern bool ebl_check_object_attribute (Ebl *ebl, const char *vendor,
    178 					int tag, uint64_t value,
    179 					const char **tag_name,
    180 					const char **value_name);
    181 
    182 /* Check whether a section type is a valid reloc target.  */
    183 extern bool ebl_check_reloc_target_type (Ebl *ebl, Elf64_Word sh_type);
    184 
    185 
    186 /* Check section name for being that of a debug informatino section.  */
    187 extern bool ebl_debugscn_p (Ebl *ebl, const char *name);
    188 
    189 /* Check whether given relocation is a copy relocation.  */
    190 extern bool ebl_copy_reloc_p (Ebl *ebl, int reloc);
    191 
    192 /* Check whether given relocation is a no-op relocation.  */
    193 extern bool ebl_none_reloc_p (Ebl *ebl, int reloc);
    194 
    195 /* Check whether given relocation is a relative relocation.  */
    196 extern bool ebl_relative_reloc_p (Ebl *ebl, int reloc);
    197 
    198 /* Check whether section should be stripped.  */
    199 extern bool ebl_section_strip_p (Ebl *ebl, const GElf_Ehdr *ehdr,
    200 				 const GElf_Shdr *shdr, const char *name,
    201 				 bool remove_comment, bool only_remove_debug);
    202 
    203 /* Check if backend uses a bss PLT in this file.  */
    204 extern bool ebl_bss_plt_p (Ebl *ebl);
    205 
    206 /* Return size of entry in SysV-style hash table.  */
    207 extern int ebl_sysvhash_entrysize (Ebl *ebl);
    208 
    209 /* Return location expression to find return value given a
    210    DW_TAG_subprogram, DW_TAG_subroutine_type, or similar DIE describing
    211    function itself (whose DW_AT_type attribute describes its return type).
    212    Returns -1 for a libdw error (see dwarf_errno).
    213    Returns -2 for an unrecognized type formation.
    214    Returns zero if the function has no return value (e.g. "void" in C).
    215    Otherwise, *LOCOPS gets a location expression to find the return value,
    216    and returns the number of operations in the expression.  The pointer is
    217    permanently allocated at least as long as the Ebl handle is open.  */
    218 extern int ebl_return_value_location (Ebl *ebl,
    219 				      Dwarf_Die *functypedie,
    220 				      const Dwarf_Op **locops);
    221 
    222 /* Fill in register information given DWARF register numbers.
    223    If NAME is null, return the maximum REGNO + 1 that has a name.
    224    Otherwise, store in NAME the name for DWARF register number REGNO
    225    and return the number of bytes written (including '\0' terminator).
    226    Return -1 if NAMELEN is too short or REGNO is negative or too large.
    227    Return 0 if REGNO is unused (a gap in the DWARF number assignment).
    228    On success, set *SETNAME to a description like "integer" or "FPU"
    229    fit for "%s registers" title display, and *PREFIX to the string
    230    that precedes NAME in canonical assembler syntax (e.g. "%" or "$").
    231    The NAME string contains identifier characters only (maybe just digits).  */
    232 extern ssize_t ebl_register_info (Ebl *ebl,
    233 				  int regno, char *name, size_t namelen,
    234 				  const char **prefix, const char **setname,
    235 				  int *bits, int *type);
    236 
    237 /* Fill in the DWARF register numbers for the registers used in system calls.
    238    The SP and PC are what kernel reports call the user stack pointer and PC.
    239    The CALLNO and ARGS are the system call number and incoming arguments.
    240    Each of these is filled with the DWARF register number corresponding,
    241    or -1 if there is none.  Returns zero when the information is available.  */
    242 extern int ebl_syscall_abi (Ebl *ebl, int *sp, int *pc,
    243 			    int *callno, int args[6]);
    244 
    245 /* Supply the ABI-specified state of DWARF CFI before CIE initial programs.
    246 
    247    The DWARF 3.0 spec says that the default initial states of all registers
    248    are "undefined", unless otherwise specified by the machine/compiler ABI.
    249 
    250    This default is wrong for every machine with the CFI generated by GCC.
    251    The EH unwinder does not really distinguish "same_value" and "undefined",
    252    since it doesn't matter for unwinding (in either case there is no change
    253    to make for that register).  GCC generates CFI that says nothing at all
    254    about registers it hasn't spilled somewhere.  For our unwinder to give
    255    the true story, the backend must supply an initial state that uses
    256    "same_value" rules for all the callee-saves registers.
    257 
    258    This can fill in the initial_instructions, initial_instructions_end
    259    members of *ABI_INFO to point at a CFI instruction stream to process
    260    before each CIE's initial instructions.  It should set the
    261    data_alignment_factor member if it affects the initial instructions.
    262 
    263    The callback should not use the register rules DW_CFA_expression or
    264    DW_CFA_val_expression.  Defining the CFA using DW_CFA_def_cfa_expression
    265    is allowed.  This is an implementation detail since register rules
    266    store expressions as offsets from the .eh_frame or .debug_frame data.
    267 
    268    As a shorthand for some common cases, for this instruction stream
    269    we overload some CFI instructions that cannot be used in a CIE:
    270 
    271 	DW_CFA_restore		-- Change default rule for all unmentioned
    272 				   registers from undefined to same_value.
    273 
    274    This function can also fill in ABI_INFO->return_address_register with the
    275    DWARF register number that identifies the actual PC in machine state.
    276    If there is no canonical DWARF register number with that meaning, it's
    277    left unchanged (callers usually initialize with (Dwarf_Word) -1).
    278    This value is not used by CFI per se.
    279 
    280    Function returns 0 on success and -1 for error or unsupported by the
    281    backend.  */
    282 extern int ebl_abi_cfi (Ebl *ebl, Dwarf_CIE *abi_info)
    283   __nonnull_attribute__ (2);
    284 
    285 /* ELF string table handling.  */
    286 struct Ebl_Strtab;
    287 struct Ebl_Strent;
    288 
    289 /* Create new ELF string table object in memory.  */
    290 extern struct Ebl_Strtab *ebl_strtabinit (bool nullstr);
    291 
    292 /* Free resources allocated for ELF string table ST.  */
    293 extern void ebl_strtabfree (struct Ebl_Strtab *st);
    294 
    295 /* Add string STR (length LEN is != 0) to ELF string table ST.  */
    296 extern struct Ebl_Strent *ebl_strtabadd (struct Ebl_Strtab *st,
    297 					 const char *str, size_t len);
    298 
    299 /* Finalize string table ST and store size and memory location information
    300    in DATA.  */
    301 extern void ebl_strtabfinalize (struct Ebl_Strtab *st, Elf_Data *data);
    302 
    303 /* Get offset in string table for string associated with SE.  */
    304 extern size_t ebl_strtaboffset (struct Ebl_Strent *se);
    305 
    306 /* Return the string associated with SE.  */
    307 extern const char *ebl_string (struct Ebl_Strent *se);
    308 
    309 
    310 /* ELF wide char string table handling.  */
    311 struct Ebl_WStrtab;
    312 struct Ebl_WStrent;
    313 
    314 /* Create new ELF wide char string table object in memory.  */
    315 extern struct Ebl_WStrtab *ebl_wstrtabinit (bool nullstr);
    316 
    317 /* Free resources allocated for ELF wide char string table ST.  */
    318 extern void ebl_wstrtabfree (struct Ebl_WStrtab *st);
    319 
    320 /* Add string STR (length LEN is != 0) to ELF string table ST.  */
    321 extern struct Ebl_WStrent *ebl_wstrtabadd (struct Ebl_WStrtab *st,
    322 					   const wchar_t *str, size_t len);
    323 
    324 /* Finalize string table ST and store size and memory location information
    325    in DATA.  */
    326 extern void ebl_wstrtabfinalize (struct Ebl_WStrtab *st, Elf_Data *data);
    327 
    328 /* Get offset in wide char string table for string associated with SE.  */
    329 extern size_t ebl_wstrtaboffset (struct Ebl_WStrent *se);
    330 
    331 
    332 /* Generic string table handling.  */
    333 struct Ebl_GStrtab;
    334 struct Ebl_GStrent;
    335 
    336 /* Create new string table object in memory.  */
    337 extern struct Ebl_GStrtab *ebl_gstrtabinit (unsigned int width, bool nullstr);
    338 
    339 /* Free resources allocated for string table ST.  */
    340 extern void ebl_gstrtabfree (struct Ebl_GStrtab *st);
    341 
    342 /* Add string STR (length LEN is != 0) to string table ST.  */
    343 extern struct Ebl_GStrent *ebl_gstrtabadd (struct Ebl_GStrtab *st,
    344 					   const char *str, size_t len);
    345 
    346 /* Finalize string table ST and store size and memory location information
    347    in DATA.  */
    348 extern void ebl_gstrtabfinalize (struct Ebl_GStrtab *st, Elf_Data *data);
    349 
    350 /* Get offset in wide char string table for string associated with SE.  */
    351 extern size_t ebl_gstrtaboffset (struct Ebl_GStrent *se);
    352 
    353 
    354 /* Register map info. */
    355 typedef struct
    356 {
    357   Dwarf_Half offset;		/* Byte offset in register data block.  */
    358   Dwarf_Half regno;		/* DWARF register number.  */
    359   uint8_t bits;			/* Bits of data for one register.  */
    360   uint8_t pad;			/* Bytes of padding after register's data.  */
    361   Dwarf_Half count;		/* Consecutive register numbers here.  */
    362   bool pc_register;
    363 } Ebl_Register_Location;
    364 
    365 /* Non-register data items in core notes.  */
    366 typedef struct
    367 {
    368   const char *name;		/* Printable identifier.  */
    369   const char *group;		/* Identifier for category of related items.  */
    370   Dwarf_Half offset;		/* Byte offset in note data.  */
    371   Dwarf_Half count;
    372   Elf_Type type;
    373   char format;
    374   bool thread_identifier;
    375   bool pc_register;
    376 } Ebl_Core_Item;
    377 
    378 /* Describe the format of a core file note with the given header and NAME.
    379    NAME is not guaranteed terminated, it's NHDR->n_namesz raw bytes.  */
    380 extern int ebl_core_note (Ebl *ebl, const GElf_Nhdr *nhdr, const char *name,
    381 			  GElf_Word *regs_offset, size_t *nregloc,
    382 			  const Ebl_Register_Location **reglocs,
    383 			  size_t *nitems, const Ebl_Core_Item **items)
    384   __nonnull_attribute__ (1, 2, 3, 4, 5, 6, 7, 8);
    385 
    386 /* Describe the auxv type number.  */
    387 extern int ebl_auxv_info (Ebl *ebl, GElf_Xword a_type,
    388 			  const char **name, const char **format)
    389   __nonnull_attribute__ (1, 3, 4);
    390 
    391 /* Callback type for ebl_set_initial_registers_tid.
    392    Register -1 is mapped to PC (if arch PC has no DWARF number).
    393    If FIRSTREG is -1 then NREGS has to be 1.  */
    394 typedef bool (ebl_tid_registers_t) (int firstreg, unsigned nregs,
    395 				    const Dwarf_Word *regs, void *arg)
    396   __nonnull_attribute__ (3);
    397 
    398 /* Callback to fetch process data from live TID.
    399    EBL architecture has to have EBL_FRAME_NREGS > 0, otherwise the
    400    backend doesn't support unwinding and this function call may crash.  */
    401 extern bool ebl_set_initial_registers_tid (Ebl *ebl,
    402 					   pid_t tid,
    403 					   ebl_tid_registers_t *setfunc,
    404 					   void *arg)
    405   __nonnull_attribute__ (1, 3);
    406 
    407 /* Number of registers to allocate for ebl_set_initial_registers_tid.
    408    EBL architecture can unwind iff EBL_FRAME_NREGS > 0.  */
    409 extern size_t ebl_frame_nregs (Ebl *ebl)
    410   __nonnull_attribute__ (1);
    411 
    412 /* Mask to use for function symbol or unwind return addresses in case
    413    the architecture adds some extra non-address bits to it.  This is
    414    different from ebl_resolve_sym_value which only works for actual
    415    symbol addresses (in non-ET_REL files) that might resolve to an
    416    address in a different section.  ebl_func_addr_mask is called to
    417    turn a given function value into the a real address or offset (the
    418    original value might not be a real address).  This works for all
    419    cases where an actual function address (or offset in ET_REL symbol
    420    tables) is needed.  */
    421 extern GElf_Addr ebl_func_addr_mask (Ebl *ebl);
    422 
    423 /* Convert *REGNO as is in DWARF to a lower range suitable for
    424    Dwarf_Frame->REGS indexing.  */
    425 extern bool ebl_dwarf_to_regno (Ebl *ebl, unsigned *regno)
    426   __nonnull_attribute__ (1, 2);
    427 
    428 /* Modify PC as fetched from inferior data into valid PC.  */
    429 extern void ebl_normalize_pc (Ebl *ebl, Dwarf_Addr *pc)
    430   __nonnull_attribute__ (1, 2);
    431 
    432 /* Callback type for ebl_unwind's parameter getfunc.  */
    433 typedef bool (ebl_tid_registers_get_t) (int firstreg, unsigned nregs,
    434 					Dwarf_Word *regs, void *arg)
    435   __nonnull_attribute__ (3);
    436 
    437 /* Callback type for ebl_unwind's parameter readfunc.  */
    438 typedef bool (ebl_pid_memory_read_t) (Dwarf_Addr addr, Dwarf_Word *data,
    439 				      void *arg)
    440   __nonnull_attribute__ (3);
    441 
    442 /* Get previous frame state for an existing frame state.  Method is called only
    443    if unwinder could not find CFI for current PC.  PC is for the
    444    existing frame.  SETFUNC sets register in the previous frame.  GETFUNC gets
    445    register from the existing frame.  Note that GETFUNC vs. SETFUNC act on
    446    a disjunct set of registers.  READFUNC reads memory.  ARG has to be passed
    447    for SETFUNC, GETFUNC and READFUNC.  *SIGNAL_FRAMEP is initialized to false,
    448    it can be set to true if existing frame is a signal frame.  SIGNAL_FRAMEP is
    449    never NULL.  */
    450 extern bool ebl_unwind (Ebl *ebl, Dwarf_Addr pc, ebl_tid_registers_t *setfunc,
    451 			ebl_tid_registers_get_t *getfunc,
    452 			ebl_pid_memory_read_t *readfunc, void *arg,
    453 			bool *signal_framep)
    454   __nonnull_attribute__ (1, 3, 4, 5, 7);
    455 
    456 /* Returns true if the value can be resolved to an address in an
    457    allocated section, which will be returned in *ADDR
    458    (e.g. function descriptor resolving)  */
    459 extern bool ebl_resolve_sym_value (Ebl *ebl, GElf_Addr *addr)
    460    __nonnull_attribute__ (2);
    461 
    462 #ifdef __cplusplus
    463 }
    464 #endif
    465 
    466 #endif	/* libebl.h */
    467