diff --git a/contrib/elftoolchain/libdwarf/libdwarf.h b/contrib/elftoolchain/libdwarf/libdwarf.h index 0aa1857e3285..e8419620755d 100644 --- a/contrib/elftoolchain/libdwarf/libdwarf.h +++ b/contrib/elftoolchain/libdwarf/libdwarf.h @@ -1,843 +1,844 @@ /*- * Copyright (c) 2007 John Birrell (jb@freebsd.org) * Copyright (c) 2009-2011,2014 Kai Wang * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * $Id: libdwarf.h 3578 2017-09-14 02:21:28Z emaste $ */ #ifndef _LIBDWARF_H_ #define _LIBDWARF_H_ #include typedef int Dwarf_Bool; typedef uint64_t Dwarf_Off; typedef uint64_t Dwarf_Unsigned; typedef uint16_t Dwarf_Half; typedef uint8_t Dwarf_Small; typedef int64_t Dwarf_Signed; typedef uint64_t Dwarf_Addr; typedef void *Dwarf_Ptr; typedef struct _Dwarf_Abbrev *Dwarf_Abbrev; typedef struct _Dwarf_Arange *Dwarf_Arange; typedef struct _Dwarf_ArangeSet *Dwarf_ArangeSet; typedef struct _Dwarf_Attribute *Dwarf_Attribute; typedef struct _Dwarf_Attribute *Dwarf_P_Attribute; typedef struct _Dwarf_AttrDef *Dwarf_AttrDef; typedef struct _Dwarf_Cie *Dwarf_Cie; typedef struct _Dwarf_Cie *Dwarf_P_Cie; typedef struct _Dwarf_Debug *Dwarf_Debug; typedef struct _Dwarf_Debug *Dwarf_P_Debug; typedef struct _Dwarf_Die *Dwarf_Die; typedef struct _Dwarf_Die *Dwarf_P_Die; typedef struct _Dwarf_Fde *Dwarf_Fde; typedef struct _Dwarf_Fde *Dwarf_P_Fde; typedef struct _Dwarf_FrameSec *Dwarf_FrameSec; typedef struct _Dwarf_Line *Dwarf_Line; typedef struct _Dwarf_LineFile *Dwarf_LineFile; typedef struct _Dwarf_LineInfo *Dwarf_LineInfo; typedef struct _Dwarf_MacroSet *Dwarf_MacroSet; typedef struct _Dwarf_NamePair *Dwarf_NamePair; typedef struct _Dwarf_NamePair *Dwarf_Func; typedef struct _Dwarf_NamePair *Dwarf_Global; typedef struct _Dwarf_NamePair *Dwarf_Type; typedef struct _Dwarf_NamePair *Dwarf_Var; typedef struct _Dwarf_NamePair *Dwarf_Weak; typedef struct _Dwarf_NameTbl *Dwarf_NameTbl; typedef struct _Dwarf_NameSec *Dwarf_NameSec; typedef struct _Dwarf_P_Expr *Dwarf_P_Expr; typedef struct _Dwarf_Rangelist *Dwarf_Rangelist; typedef enum { DW_OBJECT_MSB, DW_OBJECT_LSB } Dwarf_Endianness; typedef struct { Dwarf_Addr addr; Dwarf_Unsigned size; const char *name; } Dwarf_Obj_Access_Section; typedef struct { int (*get_section_info)(void *_obj, Dwarf_Half _index, Dwarf_Obj_Access_Section *_ret_section, int *_error); Dwarf_Endianness (*get_byte_order)(void *_obj); Dwarf_Small (*get_length_size)(void *_obj); Dwarf_Small (*get_pointer_size)(void *_obj); Dwarf_Unsigned (*get_section_count)(void *_obj); int (*load_section)(void *_obj, Dwarf_Half _index, Dwarf_Small **_ret_data, int *_error); } Dwarf_Obj_Access_Methods; typedef struct { void *object; const Dwarf_Obj_Access_Methods *methods; } Dwarf_Obj_Access_Interface; typedef int (*Dwarf_Callback_Func)(char *_name, int _size, Dwarf_Unsigned _type, Dwarf_Unsigned _flags, Dwarf_Unsigned _link, Dwarf_Unsigned _info, int *_index, int *_error); typedef int (*Dwarf_Callback_Func_b)(char *_name, int _size, Dwarf_Unsigned _type, Dwarf_Unsigned _flags, Dwarf_Unsigned _link, Dwarf_Unsigned _info, Dwarf_Unsigned *_index, int *_error); typedef Dwarf_Unsigned Dwarf_Tag; typedef struct { Dwarf_Small lr_atom; Dwarf_Unsigned lr_number; Dwarf_Unsigned lr_number2; Dwarf_Unsigned lr_offset; } Dwarf_Loc; typedef struct { Dwarf_Addr ld_lopc; Dwarf_Addr ld_hipc; Dwarf_Half ld_cents; Dwarf_Loc *ld_s; } Dwarf_Locdesc; typedef struct { char signature[8]; } Dwarf_Sig8; typedef struct { Dwarf_Unsigned bl_len; Dwarf_Ptr bl_data; } Dwarf_Block; enum Dwarf_Ranges_Entry_Type { DW_RANGES_ENTRY, DW_RANGES_ADDRESS_SELECTION, DW_RANGES_END }; typedef struct { Dwarf_Unsigned dwr_addr1; Dwarf_Unsigned dwr_addr2; enum Dwarf_Ranges_Entry_Type dwr_type; } Dwarf_Ranges; enum Dwarf_Form_Class { DW_FORM_CLASS_UNKNOWN, DW_FORM_CLASS_ADDRESS, DW_FORM_CLASS_BLOCK, DW_FORM_CLASS_CONSTANT, DW_FORM_CLASS_EXPRLOC, DW_FORM_CLASS_FLAG, DW_FORM_CLASS_LINEPTR, DW_FORM_CLASS_LOCLISTPTR, DW_FORM_CLASS_MACPTR, DW_FORM_CLASS_RANGELISTPTR, DW_FORM_CLASS_REFERENCE, DW_FORM_CLASS_STRING }; #ifndef DW_FRAME_HIGHEST_NORMAL_REGISTER #define DW_FRAME_HIGHEST_NORMAL_REGISTER 63 #endif #define DW_FRAME_RA_COL (DW_FRAME_HIGHEST_NORMAL_REGISTER + 1) #define DW_FRAME_STATIC_LINK (DW_FRAME_HIGHEST_NORMAL_REGISTER + 2) #ifndef DW_FRAME_LAST_REG_NUM #define DW_FRAME_LAST_REG_NUM (DW_FRAME_HIGHEST_NORMAL_REGISTER + 3) #endif #ifndef DW_FRAME_REG_INITIAL_VALUE #define DW_FRAME_REG_INITIAL_VALUE DW_FRAME_SAME_VAL #endif #define DW_FRAME_UNDEFINED_VAL 1034 #define DW_FRAME_SAME_VAL 1035 #define DW_FRAME_CFA_COL3 1436 #define DW_EXPR_OFFSET 0 #define DW_EXPR_VAL_OFFSET 1 #define DW_EXPR_EXPRESSION 2 #define DW_EXPR_VAL_EXPRESSION 3 /* * Frame operation only for DWARF 2. */ #define DW_FRAME_CFA_COL 0 typedef struct { Dwarf_Small fp_base_op; Dwarf_Small fp_extended_op; Dwarf_Half fp_register; Dwarf_Signed fp_offset; Dwarf_Off fp_instr_offset; } Dwarf_Frame_Op; #ifndef DW_REG_TABLE_SIZE #define DW_REG_TABLE_SIZE 66 #endif typedef struct { struct { Dwarf_Small dw_offset_relevant; Dwarf_Half dw_regnum; Dwarf_Addr dw_offset; } rules[DW_REG_TABLE_SIZE]; } Dwarf_Regtable; /* * Frame operation for DWARF 3 and DWARF 2. */ typedef struct { Dwarf_Small fp_base_op; Dwarf_Small fp_extended_op; Dwarf_Half fp_register; Dwarf_Unsigned fp_offset_or_block_len; Dwarf_Small *fp_expr_block; Dwarf_Off fp_instr_offset; } Dwarf_Frame_Op3; typedef struct { Dwarf_Small dw_offset_relevant; Dwarf_Small dw_value_type; Dwarf_Half dw_regnum; Dwarf_Unsigned dw_offset_or_block_len; Dwarf_Ptr dw_block_ptr; } Dwarf_Regtable_Entry3; typedef struct { Dwarf_Regtable_Entry3 rt3_cfa_rule; Dwarf_Half rt3_reg_table_size; Dwarf_Regtable_Entry3 *rt3_rules; } Dwarf_Regtable3; typedef struct { Dwarf_Off dmd_offset; Dwarf_Small dmd_type; Dwarf_Signed dmd_lineno; Dwarf_Signed dmd_fileindex; char *dmd_macro; } Dwarf_Macro_Details; /* * Symbols denoting allocation types, for use with dwarf_dealloc(3). */ enum Dwarf_Allocation_Type { DW_DLA_ABBREV, DW_DLA_ADDR, DW_DLA_ARANGE, DW_DLA_ATTR, DW_DLA_BLOCK, DW_DLA_BOUNDS, DW_DLA_CIE, DW_DLA_DEBUG, DW_DLA_DIE, DW_DLA_ELLIST, DW_DLA_ERROR, DW_DLA_FDE, DW_DLA_FRAME_BLOCK, DW_DLA_FRAME_OP, DW_DLA_FUNC, DW_DLA_GLOBAL, DW_DLA_LINE, DW_DLA_LINEBUF, DW_DLA_LIST, DW_DLA_LOC, DW_DLA_LOCDESC, DW_DLA_LOC_BLOCK, DW_DLA_RANGES, DW_DLA_STRING, DW_DLA_SUBSCR, DW_DLA_TYPE, DW_DLA_TYPENAME, DW_DLA_VAR, DW_DLA_WEAK }; /* * Relocation Type. */ enum Dwarf_Rel_Type { dwarf_drt_none = 0, dwarf_drt_data_reloc, dwarf_drt_segment_rel, dwarf_drt_first_of_length_pair, dwarf_drt_second_of_length_pair }; /* * Relocation Entry. */ typedef struct Dwarf_Relocation_Data_s { unsigned char drd_type; unsigned char drd_length; Dwarf_Unsigned drd_offset; Dwarf_Unsigned drd_symbol_index; } *Dwarf_Relocation_Data; #define DWARF_DRD_BUFFER_VERSION 2 /* * Error numbers which are specific to this implementation. */ enum { DW_DLE_NONE, /* No error. */ DW_DLE_ERROR, /* An error! */ DW_DLE_ARGUMENT, /* Invalid argument. */ DW_DLE_DEBUG_INFO_NULL, /* Debug info NULL. */ DW_DLE_NO_ENTRY, /* No entry. */ DW_DLE_MEMORY, /* Insufficient memory. */ DW_DLE_ELF, /* ELF error. */ DW_DLE_CU_LENGTH_ERROR, /* Invalid compilation unit data. */ DW_DLE_VERSION_STAMP_ERROR, /* Invalid version. */ DW_DLE_DEBUG_ABBREV_NULL, /* Abbrev not found. */ DW_DLE_DIE_NO_CU_CONTEXT, /* No current compilation unit. */ DW_DLE_LOC_EXPR_BAD, /* Invalid location expression. */ DW_DLE_EXPR_LENGTH_BAD, /* Invalid DWARF expression. */ DW_DLE_DEBUG_LOC_SECTION_SHORT, /* Loclist section too short. */ DW_DLE_ATTR_FORM_BAD, /* Invalid attribute form. */ DW_DLE_DEBUG_LINE_LENGTH_BAD, /* Line info section too short. */ DW_DLE_LINE_FILE_NUM_BAD, /* Invalid file number. */ DW_DLE_DIR_INDEX_BAD, /* Invalid dir index. */ DW_DLE_DEBUG_FRAME_LENGTH_BAD, /* Frame section too short. */ DW_DLE_NO_CIE_FOR_FDE, /* CIE not found for certain FDE. */ DW_DLE_FRAME_AUGMENTATION_UNKNOWN, /* Unknown CIE augmentation. */ DW_DLE_FRAME_INSTR_EXEC_ERROR, /* Frame instruction exec error. */ DW_DLE_FRAME_VERSION_BAD, /* Invalid frame section version. */ DW_DLE_FRAME_TABLE_COL_BAD, /* Invalid table column. */ DW_DLE_DF_REG_NUM_TOO_HIGH, /* Insufficient regtable space. */ DW_DLE_PC_NOT_IN_FDE_RANGE, /* PC requested not in the FDE range. */ DW_DLE_ARANGE_OFFSET_BAD, /* Invalid arange offset. */ DW_DLE_DEBUG_MACRO_INCONSISTENT,/* Invalid macinfo data. */ DW_DLE_ELF_SECT_ERR, /* Application callback failed. */ DW_DLE_COMPRESSION, /* Section decompression error. */ DW_DLE_NUM /* Max error number. */ }; /* * Mapping of SGI libdwarf error codes for comptibility. */ #define DW_DLE_DBG_ALLOC DW_DLE_MEMORY #define DW_DLE_ALLOC_FAIL DW_DLE_MEMORY #define DW_DLE_SECT_ALLOC DW_DLE_MEMORY #define DW_DLE_FILE_ENTRY_ALLOC DW_DLE_MEMORY #define DW_DLE_LINE_ALLOC DW_DLE_MEMORY #define DW_DLE_FPGM_ALLOC DW_DLE_MEMORY #define DW_DLE_INCDIR_ALLOC DW_DLE_MEMORY #define DW_DLE_STRING_ALLOC DW_DLE_MEMORY #define DW_DLE_CHUNK_ALLOC DW_DLE_MEMORY #define DW_DLE_CIE_ALLOC DW_DLE_MEMORY #define DW_DLE_FDE_ALLOC DW_DLE_MEMORY #define DW_DLE_CIE_OFFS_ALLOC DW_DLE_MEMORY #define DW_DLE_DIE_ALLOC DW_DLE_MEMORY #define DW_DLE_ATTR_ALLOC DW_DLE_MEMORY #define DW_DLE_ABBREV_ALLOC DW_DLE_MEMORY #define DW_DLE_ADDR_ALLOC DW_DLE_MEMORY #define DW_DLE_REL_ALLOC DW_DLE_MEMORY #define DW_DLE_MACINFO_MALLOC_FAIL DW_DLE_MEMORY #define DW_DLE_DEBUG_MACRO_MALLOC_SPACE DW_DLE_MEMORY #define DW_DLE_DF_ALLOC_FAIL DW_DLE_MEMORY #define DW_DLE_RELOC_SECTION_MALLOC_FAIL DW_DLE_MEMORY #define DW_DLE_DBG_NULL DW_DLE_ARGUMENT #define DW_DLE_DIE_NULL DW_DLE_ARGUMENT #define DW_DLE_FDE_NULL DW_DLE_ARGUMENT #define DW_DLE_CIE_NULL DW_DLE_ARGUMENT #define DW_DLE_ATTR_NULL DW_DLE_ARGUMENT #define DW_DLE_GLOBAL_NULL DW_DLE_ARGUMENT #define DW_DLE_ARANGES_NULL DW_DLE_ARGUMENT #define DW_DLE_ARANGE_NULL DW_DLE_ARGUMENT #define DW_DLE_EXPR_NULL DW_DLE_ARGUMENT #define DW_DLE_FUNC_NULL DW_DLE_ARGUMENT #define DW_DLE_TYPE_NULL DW_DLE_ARGUMENT #define DW_DLE_VAR_NULL DW_DLE_ARGUMENT #define DW_DLE_WEAK_NULL DW_DLE_ARGUMENT #define DW_DLE_ELF_BEGIN_ERROR DW_DLE_ELF #define DW_DLE_ELF_GETEHDR_ERROR DW_DLE_ELF #define DW_DLE_ELF_GETSHDR_ERROR DW_DLE_ELF #define DW_DLE_ELF_STRPTR_ERROR DW_DLE_ELF #define DW_DLE_ELF_SECT_ERROR DW_DLE_ELF #define DW_DLE_ELF_GETIDENT_ERROR DW_DLE_ELF typedef struct _Dwarf_Error { int err_error; /* DWARF error. */ int err_elferror; /* ELF error. */ const char *err_func; /* Function name where error occurred. */ int err_line; /* Line number where error occurred. */ char err_msg[1024]; /* Formatted error message. */ } Dwarf_Error; /* * Dwarf error handler. */ typedef void (*Dwarf_Handler)(Dwarf_Error, Dwarf_Ptr); #define dwarf_errno(error) error.err_error #define dwarf_errmsg(error) dwarf_errmsg_(&error) /* * Return values which have to be compatible with other * implementations of libdwarf. */ #define DW_DLV_NO_ENTRY -1 #define DW_DLV_OK 0 #define DW_DLV_ERROR 1 #define DW_DLV_BADADDR NULL #define DW_DLV_NOCOUNT ((Dwarf_Signed) -1) /* * Access modes. */ #define DW_DLC_READ 0x0001 #define DW_DLC_WRITE 0x0002 #define DW_DLC_RDWR 0x0004 /* * Flags used by libdwarf producer. */ #define DW_DLC_SIZE_64 0x40000000 #define DW_DLC_SIZE_32 0x20000000 #define DW_DLC_OFFSET_SIZE_64 0x10000000 #define DW_DLC_ISA_MIPS 0x80000000 #define DW_DLC_ISA_IA64 0x01000000 #define DW_DLC_STREAM_RELOCATIONS 0x02000000 #define DW_DLC_SYMBOLIC_RELOCATIONS 0x04000000 #define DW_DLC_TARGET_BIGENDIAN 0x08000000 #define DW_DLC_TARGET_LITTLEENDIAN 0x00100000 /* * Instruction set architectures supported by this implementation. */ enum Dwarf_ISA { DW_ISA_ARM, DW_ISA_IA64, DW_ISA_MIPS, DW_ISA_PPC, DW_ISA_SPARC, DW_ISA_X86, DW_ISA_X86_64, DW_ISA_AARCH64, DW_ISA_RISCV, + DW_ISA_LOONGARCH, DW_ISA_MAX }; /* Function prototype definitions. */ #ifdef __cplusplus extern "C" { #endif Dwarf_P_Attribute dwarf_add_AT_comp_dir(Dwarf_P_Die, char *, Dwarf_Error *); Dwarf_P_Attribute dwarf_add_AT_const_value_signedint(Dwarf_P_Die, Dwarf_Signed, Dwarf_Error *); Dwarf_P_Attribute dwarf_add_AT_const_value_string(Dwarf_P_Die, char *, Dwarf_Error *); Dwarf_P_Attribute dwarf_add_AT_const_value_unsignedint(Dwarf_P_Die, Dwarf_Unsigned, Dwarf_Error *); Dwarf_P_Attribute dwarf_add_AT_dataref(Dwarf_P_Debug, Dwarf_P_Die, Dwarf_Half, Dwarf_Unsigned, Dwarf_Unsigned, Dwarf_Error *); Dwarf_P_Attribute dwarf_add_AT_flag(Dwarf_P_Debug, Dwarf_P_Die, Dwarf_Half, Dwarf_Small, Dwarf_Error *); Dwarf_P_Attribute dwarf_add_AT_location_expr(Dwarf_P_Debug, Dwarf_P_Die, Dwarf_Half, Dwarf_P_Expr, Dwarf_Error *); Dwarf_P_Attribute dwarf_add_AT_name(Dwarf_P_Die, char *, Dwarf_Error *); Dwarf_P_Attribute dwarf_add_AT_producer(Dwarf_P_Die, char *, Dwarf_Error *); Dwarf_P_Attribute dwarf_add_AT_ref_address(Dwarf_P_Debug, Dwarf_P_Die, Dwarf_Half, Dwarf_Unsigned, Dwarf_Unsigned, Dwarf_Error *); Dwarf_P_Attribute dwarf_add_AT_reference(Dwarf_P_Debug, Dwarf_P_Die, Dwarf_Half, Dwarf_P_Die, Dwarf_Error *); Dwarf_P_Attribute dwarf_add_AT_signed_const(Dwarf_P_Debug, Dwarf_P_Die, Dwarf_Half, Dwarf_Signed, Dwarf_Error *); Dwarf_P_Attribute dwarf_add_AT_string(Dwarf_P_Debug, Dwarf_P_Die, Dwarf_Half, char *, Dwarf_Error *); Dwarf_P_Attribute dwarf_add_AT_targ_address(Dwarf_P_Debug, Dwarf_P_Die, Dwarf_Half, Dwarf_Unsigned, Dwarf_Signed, Dwarf_Error *); Dwarf_P_Attribute dwarf_add_AT_targ_address_b(Dwarf_P_Debug, Dwarf_P_Die, Dwarf_Half, Dwarf_Unsigned, Dwarf_Unsigned, Dwarf_Error *); Dwarf_P_Attribute dwarf_add_AT_unsigned_const(Dwarf_P_Debug, Dwarf_P_Die, Dwarf_Half, Dwarf_Unsigned, Dwarf_Error *); Dwarf_Unsigned dwarf_add_arange(Dwarf_P_Debug, Dwarf_Addr, Dwarf_Unsigned, Dwarf_Signed, Dwarf_Error *); Dwarf_Unsigned dwarf_add_arange_b(Dwarf_P_Debug, Dwarf_Addr, Dwarf_Unsigned, Dwarf_Unsigned, Dwarf_Unsigned, Dwarf_Addr, Dwarf_Error *); Dwarf_Unsigned dwarf_add_die_to_debug(Dwarf_P_Debug, Dwarf_P_Die, Dwarf_Error *); Dwarf_Unsigned dwarf_add_directory_decl(Dwarf_P_Debug, char *, Dwarf_Error *); Dwarf_Unsigned dwarf_add_expr_addr(Dwarf_P_Expr, Dwarf_Unsigned, Dwarf_Signed, Dwarf_Error *); Dwarf_Unsigned dwarf_add_expr_addr_b(Dwarf_P_Expr, Dwarf_Unsigned, Dwarf_Unsigned, Dwarf_Error *); Dwarf_Unsigned dwarf_add_expr_gen(Dwarf_P_Expr, Dwarf_Small, Dwarf_Unsigned, Dwarf_Unsigned, Dwarf_Error *); Dwarf_P_Fde dwarf_add_fde_inst(Dwarf_P_Fde, Dwarf_Small, Dwarf_Unsigned, Dwarf_Unsigned, Dwarf_Error *); Dwarf_Unsigned dwarf_add_file_decl(Dwarf_P_Debug, char *, Dwarf_Unsigned, Dwarf_Unsigned, Dwarf_Unsigned, Dwarf_Error *); Dwarf_Unsigned dwarf_add_frame_cie(Dwarf_P_Debug, char *, Dwarf_Small, Dwarf_Small, Dwarf_Small, Dwarf_Ptr, Dwarf_Unsigned, Dwarf_Error *); Dwarf_Unsigned dwarf_add_frame_fde(Dwarf_P_Debug, Dwarf_P_Fde, Dwarf_P_Die, Dwarf_Unsigned, Dwarf_Addr, Dwarf_Unsigned, Dwarf_Unsigned, Dwarf_Error *); Dwarf_Unsigned dwarf_add_frame_fde_b(Dwarf_P_Debug, Dwarf_P_Fde, Dwarf_P_Die, Dwarf_Unsigned, Dwarf_Addr, Dwarf_Unsigned, Dwarf_Unsigned, Dwarf_Unsigned, Dwarf_Addr, Dwarf_Error *); Dwarf_Unsigned dwarf_add_funcname(Dwarf_P_Debug, Dwarf_P_Die, char *, Dwarf_Error *); Dwarf_Unsigned dwarf_add_line_entry(Dwarf_P_Debug, Dwarf_Unsigned, Dwarf_Addr, Dwarf_Unsigned, Dwarf_Signed, Dwarf_Bool, Dwarf_Bool, Dwarf_Error *); Dwarf_Unsigned dwarf_add_pubname(Dwarf_P_Debug, Dwarf_P_Die, char *, Dwarf_Error *); Dwarf_Unsigned dwarf_add_typename(Dwarf_P_Debug, Dwarf_P_Die, char *, Dwarf_Error *); Dwarf_Unsigned dwarf_add_varname(Dwarf_P_Debug, Dwarf_P_Die, char *, Dwarf_Error *); Dwarf_Unsigned dwarf_add_weakname(Dwarf_P_Debug, Dwarf_P_Die, char *, Dwarf_Error *); int dwarf_arrayorder(Dwarf_Die, Dwarf_Unsigned *, Dwarf_Error *); int dwarf_attr(Dwarf_Die, Dwarf_Half, Dwarf_Attribute *, Dwarf_Error *); int dwarf_attrlist(Dwarf_Die, Dwarf_Attribute **, Dwarf_Signed *, Dwarf_Error *); int dwarf_attroffset(Dwarf_Attribute, Dwarf_Off *, Dwarf_Error *); int dwarf_attrval_flag(Dwarf_Die, Dwarf_Half, Dwarf_Bool *, Dwarf_Error *); int dwarf_attrval_signed(Dwarf_Die, Dwarf_Half, Dwarf_Signed *, Dwarf_Error *); int dwarf_attrval_string(Dwarf_Die, Dwarf_Half, const char **, Dwarf_Error *); int dwarf_attrval_unsigned(Dwarf_Die, Dwarf_Half, Dwarf_Unsigned *, Dwarf_Error *); int dwarf_bitoffset(Dwarf_Die, Dwarf_Unsigned *, Dwarf_Error *); int dwarf_bitsize(Dwarf_Die, Dwarf_Unsigned *, Dwarf_Error *); int dwarf_bytesize(Dwarf_Die, Dwarf_Unsigned *, Dwarf_Error *); int dwarf_child(Dwarf_Die, Dwarf_Die *, Dwarf_Error *); void dwarf_dealloc(Dwarf_Debug, Dwarf_Ptr, Dwarf_Unsigned); int dwarf_def_macro(Dwarf_P_Debug, Dwarf_Unsigned, char *, char *, Dwarf_Error *); int dwarf_die_CU_offset(Dwarf_Die, Dwarf_Off *, Dwarf_Error *); int dwarf_die_CU_offset_range(Dwarf_Die, Dwarf_Off *, Dwarf_Off *, Dwarf_Error *); int dwarf_die_abbrev_code(Dwarf_Die); Dwarf_P_Die dwarf_die_link(Dwarf_P_Die, Dwarf_P_Die, Dwarf_P_Die, Dwarf_P_Die, Dwarf_P_Die, Dwarf_Error *); int dwarf_diename(Dwarf_Die, char **, Dwarf_Error *); int dwarf_dieoffset(Dwarf_Die, Dwarf_Off *, Dwarf_Error *); int dwarf_elf_init(Elf *, int, Dwarf_Handler, Dwarf_Ptr, Dwarf_Debug *, Dwarf_Error *); int dwarf_end_macro_file(Dwarf_P_Debug, Dwarf_Error *); const char *dwarf_errmsg_(Dwarf_Error *); int dwarf_expand_frame_instructions(Dwarf_Cie, Dwarf_Ptr, Dwarf_Unsigned, Dwarf_Frame_Op **, Dwarf_Signed *, Dwarf_Error *); Dwarf_Unsigned dwarf_expr_current_offset(Dwarf_P_Expr, Dwarf_Error *); Dwarf_Addr dwarf_expr_into_block(Dwarf_P_Expr, Dwarf_Unsigned *, Dwarf_Error *); Dwarf_P_Fde dwarf_fde_cfa_offset(Dwarf_P_Fde, Dwarf_Unsigned, Dwarf_Signed, Dwarf_Error *); void dwarf_fde_cie_list_dealloc(Dwarf_Debug, Dwarf_Cie *, Dwarf_Signed, Dwarf_Fde *, Dwarf_Signed); char *dwarf_find_macro_value_start(char *); int dwarf_finish(Dwarf_Debug, Dwarf_Error *); int dwarf_formaddr(Dwarf_Attribute, Dwarf_Addr *, Dwarf_Error *); int dwarf_formblock(Dwarf_Attribute, Dwarf_Block **, Dwarf_Error *); int dwarf_formexprloc(Dwarf_Attribute, Dwarf_Unsigned *, Dwarf_Ptr *, Dwarf_Error *); int dwarf_formflag(Dwarf_Attribute, Dwarf_Bool *, Dwarf_Error *); int dwarf_formref(Dwarf_Attribute, Dwarf_Off *, Dwarf_Error *); int dwarf_formsdata(Dwarf_Attribute, Dwarf_Signed *, Dwarf_Error *); int dwarf_formsig8(Dwarf_Attribute, Dwarf_Sig8 *, Dwarf_Error *); int dwarf_formstring(Dwarf_Attribute, char **, Dwarf_Error *); int dwarf_formudata(Dwarf_Attribute, Dwarf_Unsigned *, Dwarf_Error *); int dwarf_func_cu_offset(Dwarf_Func, Dwarf_Off *, Dwarf_Error *); int dwarf_func_die_offset(Dwarf_Func, Dwarf_Off *, Dwarf_Error *); int dwarf_func_name_offsets(Dwarf_Func, char **, Dwarf_Off *, Dwarf_Off *, Dwarf_Error *); int dwarf_funcname(Dwarf_Func, char **, Dwarf_Error *); void dwarf_funcs_dealloc(Dwarf_Debug, Dwarf_Func *, Dwarf_Signed); int dwarf_get_ACCESS_name(unsigned, const char **); int dwarf_get_ATE_name(unsigned, const char **); int dwarf_get_AT_name(unsigned, const char **); int dwarf_get_CC_name(unsigned, const char **); int dwarf_get_CFA_name(unsigned, const char **); int dwarf_get_CHILDREN_name(unsigned, const char **); int dwarf_get_DSC_name(unsigned, const char **); int dwarf_get_DS_name(unsigned, const char **); int dwarf_get_EH_name(unsigned, const char **); int dwarf_get_END_name(unsigned, const char **); int dwarf_get_FORM_name(unsigned, const char **); int dwarf_get_ID_name(unsigned, const char **); int dwarf_get_INL_name(unsigned, const char **); int dwarf_get_LANG_name(unsigned, const char **); int dwarf_get_LNE_name(unsigned, const char **); int dwarf_get_LNS_name(unsigned, const char **); int dwarf_get_MACINFO_name(unsigned, const char **); int dwarf_get_OP_name(unsigned, const char **); int dwarf_get_ORD_name(unsigned, const char **); int dwarf_get_TAG_name(unsigned, const char **); int dwarf_get_UT_name(unsigned, const char **); int dwarf_get_VIRTUALITY_name(unsigned, const char **); int dwarf_get_VIS_name(unsigned, const char **); int dwarf_get_abbrev(Dwarf_Debug, Dwarf_Unsigned, Dwarf_Abbrev *, Dwarf_Unsigned *, Dwarf_Unsigned *, Dwarf_Error *); int dwarf_get_abbrev_children_flag(Dwarf_Abbrev, Dwarf_Signed *, Dwarf_Error *); int dwarf_get_abbrev_code(Dwarf_Abbrev, Dwarf_Unsigned *, Dwarf_Error *); int dwarf_get_abbrev_entry(Dwarf_Abbrev, Dwarf_Signed, Dwarf_Half *, Dwarf_Signed *, Dwarf_Off *, Dwarf_Error *); int dwarf_get_abbrev_tag(Dwarf_Abbrev, Dwarf_Half *, Dwarf_Error *); int dwarf_get_address_size(Dwarf_Debug, Dwarf_Half *, Dwarf_Error *); int dwarf_get_arange(Dwarf_Arange *, Dwarf_Unsigned, Dwarf_Addr, Dwarf_Arange *, Dwarf_Error *); int dwarf_get_arange_cu_header_offset(Dwarf_Arange, Dwarf_Off *, Dwarf_Error *); int dwarf_get_arange_info(Dwarf_Arange, Dwarf_Addr *, Dwarf_Unsigned *, Dwarf_Off *, Dwarf_Error *); int dwarf_get_aranges(Dwarf_Debug, Dwarf_Arange **, Dwarf_Signed *, Dwarf_Error *); int dwarf_get_cie_index(Dwarf_Cie, Dwarf_Signed *, Dwarf_Error *); int dwarf_get_cie_info(Dwarf_Cie, Dwarf_Unsigned *, Dwarf_Small *, char **, Dwarf_Unsigned *, Dwarf_Unsigned *, Dwarf_Half *, Dwarf_Ptr *, Dwarf_Unsigned *, Dwarf_Error *); int dwarf_get_cie_of_fde(Dwarf_Fde, Dwarf_Cie *, Dwarf_Error *); int dwarf_get_cu_die_offset(Dwarf_Arange, Dwarf_Off *, Dwarf_Error *); int dwarf_get_cu_die_offset_given_cu_header_offset(Dwarf_Debug, Dwarf_Off, Dwarf_Off *, Dwarf_Error *); int dwarf_get_cu_die_offset_given_cu_header_offset_b(Dwarf_Debug, Dwarf_Off, Dwarf_Bool, Dwarf_Off *, Dwarf_Error *); Dwarf_Bool dwarf_get_die_infotypes_flag(Dwarf_Die); int dwarf_get_elf(Dwarf_Debug, Elf **, Dwarf_Error *); int dwarf_get_fde_at_pc(Dwarf_Fde *, Dwarf_Addr, Dwarf_Fde *, Dwarf_Addr *, Dwarf_Addr *, Dwarf_Error *); int dwarf_get_fde_info_for_all_regs(Dwarf_Fde, Dwarf_Addr, Dwarf_Regtable *, Dwarf_Addr *, Dwarf_Error *); int dwarf_get_fde_info_for_all_regs3(Dwarf_Fde, Dwarf_Addr, Dwarf_Regtable3 *, Dwarf_Addr *, Dwarf_Error *); int dwarf_get_fde_info_for_cfa_reg3(Dwarf_Fde, Dwarf_Addr, Dwarf_Small *, Dwarf_Signed *, Dwarf_Signed *, Dwarf_Signed *, Dwarf_Ptr *, Dwarf_Addr *, Dwarf_Error *); int dwarf_get_fde_info_for_reg(Dwarf_Fde, Dwarf_Half, Dwarf_Addr, Dwarf_Signed *, Dwarf_Signed *, Dwarf_Signed *, Dwarf_Addr *, Dwarf_Error *); int dwarf_get_fde_info_for_reg3(Dwarf_Fde, Dwarf_Half, Dwarf_Addr, Dwarf_Small *, Dwarf_Signed *, Dwarf_Signed *, Dwarf_Signed *, Dwarf_Ptr *, Dwarf_Addr *, Dwarf_Error *); int dwarf_get_fde_instr_bytes(Dwarf_Fde, Dwarf_Ptr *, Dwarf_Unsigned *, Dwarf_Error *); int dwarf_get_fde_list(Dwarf_Debug, Dwarf_Cie **, Dwarf_Signed *, Dwarf_Fde **, Dwarf_Signed *, Dwarf_Error *); int dwarf_get_fde_list_eh(Dwarf_Debug, Dwarf_Cie **, Dwarf_Signed *, Dwarf_Fde **, Dwarf_Signed *, Dwarf_Error *); int dwarf_get_fde_n(Dwarf_Fde *, Dwarf_Unsigned, Dwarf_Fde *, Dwarf_Error *); int dwarf_get_fde_range(Dwarf_Fde, Dwarf_Addr *, Dwarf_Unsigned *, Dwarf_Ptr *, Dwarf_Unsigned *, Dwarf_Off *, Dwarf_Signed *, Dwarf_Off *, Dwarf_Error *); enum Dwarf_Form_Class dwarf_get_form_class(Dwarf_Half, Dwarf_Half, Dwarf_Half, Dwarf_Half); int dwarf_get_funcs(Dwarf_Debug, Dwarf_Func **, Dwarf_Signed *, Dwarf_Error *); int dwarf_get_globals(Dwarf_Debug, Dwarf_Global **, Dwarf_Signed *, Dwarf_Error *); int dwarf_get_loclist_entry(Dwarf_Debug, Dwarf_Unsigned, Dwarf_Addr *, Dwarf_Addr *, Dwarf_Ptr *, Dwarf_Unsigned *, Dwarf_Unsigned *, Dwarf_Error *); int dwarf_get_macro_details(Dwarf_Debug, Dwarf_Off, Dwarf_Unsigned, Dwarf_Signed *, Dwarf_Macro_Details **, Dwarf_Error *); int dwarf_get_pubtypes(Dwarf_Debug, Dwarf_Type **, Dwarf_Signed *, Dwarf_Error *); int dwarf_get_ranges(Dwarf_Debug, Dwarf_Off, Dwarf_Ranges **, Dwarf_Signed *, Dwarf_Unsigned *, Dwarf_Error *); int dwarf_get_ranges_a(Dwarf_Debug, Dwarf_Off, Dwarf_Die, Dwarf_Ranges **, Dwarf_Signed *, Dwarf_Unsigned *, Dwarf_Error *); int dwarf_get_relocation_info(Dwarf_P_Debug, Dwarf_Signed *, Dwarf_Signed *, Dwarf_Unsigned *, Dwarf_Relocation_Data *, Dwarf_Error *); int dwarf_get_relocation_info_count(Dwarf_P_Debug, Dwarf_Unsigned *, int *, Dwarf_Error *); Dwarf_Ptr dwarf_get_section_bytes(Dwarf_P_Debug, Dwarf_Signed, Dwarf_Signed *, Dwarf_Unsigned *, Dwarf_Error *); int dwarf_get_section_max_offsets(Dwarf_Debug, Dwarf_Unsigned *, Dwarf_Unsigned *, Dwarf_Unsigned *, Dwarf_Unsigned *, Dwarf_Unsigned *, Dwarf_Unsigned *, Dwarf_Unsigned *, Dwarf_Unsigned *, Dwarf_Unsigned *, Dwarf_Unsigned *, Dwarf_Unsigned *); int dwarf_get_section_max_offsets_b(Dwarf_Debug, Dwarf_Unsigned *, Dwarf_Unsigned *, Dwarf_Unsigned *, Dwarf_Unsigned *, Dwarf_Unsigned *, Dwarf_Unsigned *, Dwarf_Unsigned *, Dwarf_Unsigned *, Dwarf_Unsigned *, Dwarf_Unsigned *, Dwarf_Unsigned *, Dwarf_Unsigned *); int dwarf_get_str(Dwarf_Debug, Dwarf_Off, char **, Dwarf_Signed *, Dwarf_Error *); int dwarf_get_types(Dwarf_Debug, Dwarf_Type **, Dwarf_Signed *, Dwarf_Error *); int dwarf_get_vars(Dwarf_Debug, Dwarf_Var **, Dwarf_Signed *, Dwarf_Error *); int dwarf_get_weaks(Dwarf_Debug, Dwarf_Weak **, Dwarf_Signed *, Dwarf_Error *); int dwarf_global_cu_offset(Dwarf_Global, Dwarf_Off *, Dwarf_Error *); int dwarf_global_die_offset(Dwarf_Global, Dwarf_Off *, Dwarf_Error *); int dwarf_global_formref(Dwarf_Attribute, Dwarf_Off *, Dwarf_Error *); int dwarf_global_name_offsets(Dwarf_Global, char **, Dwarf_Off *, Dwarf_Off *, Dwarf_Error *); void dwarf_globals_dealloc(Dwarf_Debug, Dwarf_Global *, Dwarf_Signed); int dwarf_globname(Dwarf_Global, char **, Dwarf_Error *); int dwarf_hasattr(Dwarf_Die, Dwarf_Half, Dwarf_Bool *, Dwarf_Error *); int dwarf_hasform(Dwarf_Attribute, Dwarf_Half, Dwarf_Bool *, Dwarf_Error *); int dwarf_highpc(Dwarf_Die, Dwarf_Addr *, Dwarf_Error *); int dwarf_highpc_b(Dwarf_Die, Dwarf_Addr *, Dwarf_Half *, enum Dwarf_Form_Class *, Dwarf_Error *); int dwarf_init(int, int, Dwarf_Handler, Dwarf_Ptr, Dwarf_Debug *, Dwarf_Error *); int dwarf_line_srcfileno(Dwarf_Line, Dwarf_Unsigned *, Dwarf_Error *); int dwarf_lineaddr(Dwarf_Line, Dwarf_Addr *, Dwarf_Error *); int dwarf_linebeginstatement(Dwarf_Line, Dwarf_Bool *, Dwarf_Error *); int dwarf_lineblock(Dwarf_Line, Dwarf_Bool *, Dwarf_Error *); int dwarf_lineendsequence(Dwarf_Line, Dwarf_Bool *, Dwarf_Error *); int dwarf_lineno(Dwarf_Line, Dwarf_Unsigned *, Dwarf_Error *); int dwarf_lineoff(Dwarf_Line, Dwarf_Signed *, Dwarf_Error *); int dwarf_linesrc(Dwarf_Line, char **, Dwarf_Error *); Dwarf_Unsigned dwarf_lne_end_sequence(Dwarf_P_Debug, Dwarf_Addr, Dwarf_Error *); Dwarf_Unsigned dwarf_lne_set_address(Dwarf_P_Debug, Dwarf_Addr, Dwarf_Unsigned, Dwarf_Error *); int dwarf_loclist(Dwarf_Attribute, Dwarf_Locdesc **, Dwarf_Signed *, Dwarf_Error *); int dwarf_loclist_from_expr(Dwarf_Debug, Dwarf_Ptr, Dwarf_Unsigned, Dwarf_Locdesc **, Dwarf_Signed *, Dwarf_Error *); int dwarf_loclist_from_expr_a(Dwarf_Debug, Dwarf_Ptr, Dwarf_Unsigned, Dwarf_Half, Dwarf_Locdesc **, Dwarf_Signed *, Dwarf_Error *); int dwarf_loclist_from_expr_b(Dwarf_Debug, Dwarf_Ptr, Dwarf_Unsigned, Dwarf_Half, Dwarf_Half, Dwarf_Small, Dwarf_Locdesc **, Dwarf_Signed *, Dwarf_Error *); int dwarf_loclist_n(Dwarf_Attribute, Dwarf_Locdesc ***, Dwarf_Signed *, Dwarf_Error *); int dwarf_lowpc(Dwarf_Die, Dwarf_Addr *, Dwarf_Error *); Dwarf_P_Die dwarf_new_die(Dwarf_P_Debug, Dwarf_Tag, Dwarf_P_Die, Dwarf_P_Die, Dwarf_P_Die, Dwarf_P_Die, Dwarf_Error *); Dwarf_P_Expr dwarf_new_expr(Dwarf_P_Debug, Dwarf_Error *); Dwarf_P_Fde dwarf_new_fde(Dwarf_P_Debug, Dwarf_Error *); int dwarf_next_cu_header(Dwarf_Debug, Dwarf_Unsigned *, Dwarf_Half *, Dwarf_Off *, Dwarf_Half *, Dwarf_Unsigned *, Dwarf_Error *); int dwarf_next_cu_header_b(Dwarf_Debug, Dwarf_Unsigned *, Dwarf_Half *, Dwarf_Off *, Dwarf_Half *, Dwarf_Half *, Dwarf_Half *, Dwarf_Unsigned *, Dwarf_Error *); int dwarf_next_cu_header_c(Dwarf_Debug, Dwarf_Bool, Dwarf_Unsigned *, Dwarf_Half *, Dwarf_Off *, Dwarf_Half *, Dwarf_Half *, Dwarf_Half *, Dwarf_Sig8 *, Dwarf_Unsigned *, Dwarf_Unsigned *, Dwarf_Error *); int dwarf_next_types_section(Dwarf_Debug, Dwarf_Error *); int dwarf_object_finish(Dwarf_Debug, Dwarf_Error *); int dwarf_object_init(Dwarf_Obj_Access_Interface *, Dwarf_Handler, Dwarf_Ptr, Dwarf_Debug *, Dwarf_Error *); int dwarf_offdie(Dwarf_Debug, Dwarf_Off, Dwarf_Die *, Dwarf_Error *); int dwarf_offdie_b(Dwarf_Debug, Dwarf_Off, Dwarf_Bool, Dwarf_Die *, Dwarf_Error *); Dwarf_Unsigned dwarf_producer_finish(Dwarf_P_Debug, Dwarf_Error *); Dwarf_P_Debug dwarf_producer_init(Dwarf_Unsigned, Dwarf_Callback_Func, Dwarf_Handler, Dwarf_Ptr, Dwarf_Error *); Dwarf_P_Debug dwarf_producer_init_b(Dwarf_Unsigned, Dwarf_Callback_Func_b, Dwarf_Handler, Dwarf_Ptr, Dwarf_Error *); int dwarf_producer_set_isa(Dwarf_P_Debug, enum Dwarf_ISA, Dwarf_Error *); int dwarf_pubtype_cu_offset(Dwarf_Type, Dwarf_Off *, Dwarf_Error *); int dwarf_pubtype_die_offset(Dwarf_Type, Dwarf_Off *, Dwarf_Error *); int dwarf_pubtype_name_offsets(Dwarf_Type, char **, Dwarf_Off *, Dwarf_Off *, Dwarf_Error *); int dwarf_pubtypename(Dwarf_Type, char **, Dwarf_Error *); void dwarf_pubtypes_dealloc(Dwarf_Debug, Dwarf_Type *, Dwarf_Signed); void dwarf_ranges_dealloc(Dwarf_Debug, Dwarf_Ranges *, Dwarf_Signed); void dwarf_reset_section_bytes(Dwarf_P_Debug); Dwarf_Half dwarf_set_frame_cfa_value(Dwarf_Debug, Dwarf_Half); Dwarf_Half dwarf_set_frame_rule_initial_value(Dwarf_Debug, Dwarf_Half); Dwarf_Half dwarf_set_frame_rule_table_size(Dwarf_Debug, Dwarf_Half); Dwarf_Half dwarf_set_frame_same_value(Dwarf_Debug, Dwarf_Half); Dwarf_Half dwarf_set_frame_undefined_value(Dwarf_Debug, Dwarf_Half); int dwarf_set_reloc_application(int); Dwarf_Ptr dwarf_seterrarg(Dwarf_Debug, Dwarf_Ptr); Dwarf_Handler dwarf_seterrhand(Dwarf_Debug, Dwarf_Handler); int dwarf_siblingof(Dwarf_Debug, Dwarf_Die, Dwarf_Die *, Dwarf_Error *); int dwarf_siblingof_b(Dwarf_Debug, Dwarf_Die, Dwarf_Die *, Dwarf_Bool, Dwarf_Error *); int dwarf_srcfiles(Dwarf_Die, char ***, Dwarf_Signed *, Dwarf_Error *); int dwarf_srclang(Dwarf_Die, Dwarf_Unsigned *, Dwarf_Error *); int dwarf_srclines(Dwarf_Die, Dwarf_Line **, Dwarf_Signed *, Dwarf_Error *); void dwarf_srclines_dealloc(Dwarf_Debug, Dwarf_Line *, Dwarf_Signed); int dwarf_start_macro_file(Dwarf_P_Debug, Dwarf_Unsigned, Dwarf_Unsigned, Dwarf_Error *); int dwarf_tag(Dwarf_Die, Dwarf_Half *, Dwarf_Error *); Dwarf_Signed dwarf_transform_to_disk_form(Dwarf_P_Debug, Dwarf_Error *); int dwarf_type_cu_offset(Dwarf_Type, Dwarf_Off *, Dwarf_Error *); int dwarf_type_die_offset(Dwarf_Type, Dwarf_Off *, Dwarf_Error *); int dwarf_type_name_offsets(Dwarf_Type, char **, Dwarf_Off *, Dwarf_Off *, Dwarf_Error *); int dwarf_typename(Dwarf_Type, char **, Dwarf_Error *); void dwarf_types_dealloc(Dwarf_Debug, Dwarf_Type *, Dwarf_Signed); int dwarf_undef_macro(Dwarf_P_Debug, Dwarf_Unsigned, char *, Dwarf_Error *); int dwarf_var_cu_offset(Dwarf_Var, Dwarf_Off *, Dwarf_Error *); int dwarf_var_die_offset(Dwarf_Var, Dwarf_Off *, Dwarf_Error *); int dwarf_var_name_offsets(Dwarf_Var, char **, Dwarf_Off *, Dwarf_Off *, Dwarf_Error *); int dwarf_varname(Dwarf_Var, char **, Dwarf_Error *); void dwarf_vars_dealloc(Dwarf_Debug, Dwarf_Var *, Dwarf_Signed); int dwarf_vendor_ext(Dwarf_P_Debug, Dwarf_Unsigned, char *, Dwarf_Error *); int dwarf_weak_cu_offset(Dwarf_Weak, Dwarf_Off *, Dwarf_Error *); int dwarf_weak_die_offset(Dwarf_Weak, Dwarf_Off *, Dwarf_Error *); int dwarf_weak_name_offsets(Dwarf_Weak, char **, Dwarf_Off *, Dwarf_Off *, Dwarf_Error *); int dwarf_weakname(Dwarf_Weak, char **, Dwarf_Error *); void dwarf_weaks_dealloc(Dwarf_Debug, Dwarf_Weak *, Dwarf_Signed); int dwarf_whatattr(Dwarf_Attribute, Dwarf_Half *, Dwarf_Error *); int dwarf_whatform(Dwarf_Attribute, Dwarf_Half *, Dwarf_Error *); int dwarf_whatform_direct(Dwarf_Attribute, Dwarf_Half *, Dwarf_Error *); #ifdef __cplusplus } #endif #endif /* !_LIBDWARF_H_ */ diff --git a/contrib/elftoolchain/libdwarf/libdwarf_reloc.c b/contrib/elftoolchain/libdwarf/libdwarf_reloc.c index e76675838e41..d8ea4e36d29d 100644 --- a/contrib/elftoolchain/libdwarf/libdwarf_reloc.c +++ b/contrib/elftoolchain/libdwarf/libdwarf_reloc.c @@ -1,499 +1,507 @@ /*- * Copyright (c) 2010 Kai Wang * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #include "_libdwarf.h" ELFTC_VCSID("$Id: libdwarf_reloc.c 3741 2019-06-07 06:32:01Z jkoshy $"); Dwarf_Unsigned _dwarf_get_reloc_type(Dwarf_P_Debug dbg, int is64) { assert(dbg != NULL); switch (dbg->dbgp_isa) { case DW_ISA_AARCH64: return (is64 ? R_AARCH64_ABS64 : R_AARCH64_ABS32); case DW_ISA_X86: return (R_386_32); case DW_ISA_X86_64: return (is64 ? R_X86_64_64 : R_X86_64_32); case DW_ISA_SPARC: return (is64 ? R_SPARC_UA64 : R_SPARC_UA32); case DW_ISA_PPC: return (is64 ? R_PPC64_ADDR64 : R_PPC_ADDR32); case DW_ISA_ARM: return (R_ARM_ABS32); case DW_ISA_MIPS: return (is64 ? R_MIPS_64 : R_MIPS_32); case DW_ISA_RISCV: return (is64 ? R_RISCV_64 : R_RISCV_32); + case DW_ISA_LOONGARCH: + return (is64 ? R_LARCH_64 : R_LARCH_32); case DW_ISA_IA64: return (is64 ? R_IA_64_DIR64LSB : R_IA_64_DIR32LSB); default: break; } return (0); /* NOT REACHED */ } int _dwarf_get_reloc_size(Dwarf_Debug dbg, Dwarf_Unsigned rel_type) { switch (dbg->dbg_machine) { case EM_NONE: break; case EM_AARCH64: if (rel_type == R_AARCH64_ABS32) return (4); else if (rel_type == R_AARCH64_ABS64) return (8); break; case EM_ARM: if (rel_type == R_ARM_ABS32) return (4); break; case EM_386: case EM_IAMCU: if (rel_type == R_386_32) return (4); break; case EM_X86_64: if (rel_type == R_X86_64_32) return (4); else if (rel_type == R_X86_64_64) return (8); break; case EM_SPARC: if (rel_type == R_SPARC_UA32) return (4); else if (rel_type == R_SPARC_UA64) return (8); break; case EM_PPC: if (rel_type == R_PPC_ADDR32) return (4); break; case EM_PPC64: if (rel_type == R_PPC_ADDR32) return (4); else if (rel_type == R_PPC64_ADDR64) return (8); break; case EM_MIPS: if (rel_type == R_MIPS_32) return (4); else if (rel_type == R_MIPS_64) return (8); break; case EM_RISCV: if (rel_type == R_RISCV_32) return (4); else if (rel_type == R_RISCV_64) return (8); break; + case EM_LOONGARCH: + if (rel_type == R_LARCH_32) + return (4); + else if (rel_type == R_LARCH_64) + return (8); + break; case EM_IA_64: if (rel_type == R_IA_64_SECREL32LSB) return (4); else if (rel_type == R_IA_64_DIR64LSB) return (8); break; default: break; } /* unknown relocation. */ return (0); } int _dwarf_reloc_section_init(Dwarf_P_Debug dbg, Dwarf_Rel_Section *drsp, Dwarf_P_Section ref, Dwarf_Error *error) { Dwarf_Rel_Section drs; char name[128]; int pseudo; assert(dbg != NULL && drsp != NULL && ref != NULL); if ((drs = calloc(1, sizeof(struct _Dwarf_Rel_Section))) == NULL) { DWARF_SET_ERROR(dbg, error, DW_DLE_MEMORY); return (DW_DLE_MEMORY); } drs->drs_ref = ref; /* * FIXME The logic here is most likely wrong. It should * be the ISA that determines relocation type. */ if (dbg->dbgp_flags & DW_DLC_SIZE_64) drs->drs_addend = 1; else drs->drs_addend = 0; if (dbg->dbgp_flags & DW_DLC_SYMBOLIC_RELOCATIONS) pseudo = 1; else pseudo = 0; snprintf(name, sizeof(name), "%s%s", drs->drs_addend ? ".rela" : ".rel", ref->ds_name); if (_dwarf_section_init(dbg, &drs->drs_ds, name, pseudo, error) != DW_DLE_NONE) { free(drs); DWARF_SET_ERROR(dbg, error, DW_DLE_MEMORY); return (DW_DLE_MEMORY); } STAILQ_INIT(&drs->drs_dre); STAILQ_INSERT_TAIL(&dbg->dbgp_drslist, drs, drs_next); dbg->dbgp_drscnt++; *drsp = drs; return (DW_DLE_NONE); } void _dwarf_reloc_section_free(Dwarf_P_Debug dbg, Dwarf_Rel_Section *drsp) { Dwarf_Rel_Section drs, tdrs; Dwarf_Rel_Entry dre, tdre; assert(dbg != NULL && drsp != NULL); if (*drsp == NULL) return; STAILQ_FOREACH_SAFE(drs, &dbg->dbgp_drslist, drs_next, tdrs) { if (drs != *drsp) continue; STAILQ_REMOVE(&dbg->dbgp_drslist, drs, _Dwarf_Rel_Section, drs_next); STAILQ_FOREACH_SAFE(dre, &drs->drs_dre, dre_next, tdre) { STAILQ_REMOVE(&drs->drs_dre, dre, _Dwarf_Rel_Entry, dre_next); free(dre); } if ((dbg->dbgp_flags & DW_DLC_SYMBOLIC_RELOCATIONS) == 0) _dwarf_section_free(dbg, &drs->drs_ds); else { if (drs->drs_ds->ds_name) free(drs->drs_ds->ds_name); free(drs->drs_ds); } free(drs); *drsp = NULL; dbg->dbgp_drscnt--; break; } } int _dwarf_reloc_entry_add(Dwarf_P_Debug dbg, Dwarf_Rel_Section drs, Dwarf_P_Section ds, unsigned char type, unsigned char length, Dwarf_Unsigned offset, Dwarf_Unsigned symndx, Dwarf_Unsigned addend, const char *secname, Dwarf_Error *error) { Dwarf_Rel_Entry dre; Dwarf_Unsigned reloff; int ret; assert(drs != NULL); assert(offset <= ds->ds_size); reloff = offset; /* * If the DW_DLC_SYMBOLIC_RELOCATIONS flag is set or ElfXX_Rel * is used instead of ELfXX_Rela, we need to write the addend * in the storage unit to be relocated. Otherwise write 0 in the * storage unit and the addend will be written into relocation * section later. */ if ((dbg->dbgp_flags & DW_DLC_SYMBOLIC_RELOCATIONS) || drs->drs_addend == 0) ret = dbg->write_alloc(&ds->ds_data, &ds->ds_cap, &offset, addend, length, error); else ret = dbg->write_alloc(&ds->ds_data, &ds->ds_cap, &offset, 0, length, error); if (ret != DW_DLE_NONE) return (ret); if (offset > ds->ds_size) ds->ds_size = offset; if ((dre = calloc(1, sizeof(struct _Dwarf_Rel_Entry))) == NULL) { DWARF_SET_ERROR(dbg, error, DW_DLE_MEMORY); return (DW_DLE_MEMORY); } STAILQ_INSERT_TAIL(&drs->drs_dre, dre, dre_next); dre->dre_type = type; dre->dre_length = length; dre->dre_offset = reloff; dre->dre_symndx = symndx; dre->dre_addend = addend; dre->dre_secname = secname; drs->drs_drecnt++; return (DW_DLE_NONE); } int _dwarf_reloc_entry_add_pair(Dwarf_P_Debug dbg, Dwarf_Rel_Section drs, Dwarf_P_Section ds, unsigned char length, Dwarf_Unsigned offset, Dwarf_Unsigned symndx, Dwarf_Unsigned esymndx, Dwarf_Unsigned symoff, Dwarf_Unsigned esymoff, Dwarf_Error *error) { Dwarf_Rel_Entry dre; Dwarf_Unsigned reloff; int ret; assert(drs != NULL); assert(offset <= ds->ds_size); assert(dbg->dbgp_flags & DW_DLC_SYMBOLIC_RELOCATIONS); reloff = offset; /* Write net offset into section stream. */ ret = dbg->write_alloc(&ds->ds_data, &ds->ds_cap, &offset, esymoff - symoff, length, error); if (ret != DW_DLE_NONE) return (ret); if (offset > ds->ds_size) ds->ds_size = offset; if ((dre = calloc(2, sizeof(struct _Dwarf_Rel_Entry))) == NULL) { DWARF_SET_ERROR(dbg, error, DW_DLE_MEMORY); return (DW_DLE_MEMORY); } STAILQ_INSERT_TAIL(&drs->drs_dre, &dre[0], dre_next); STAILQ_INSERT_TAIL(&drs->drs_dre, &dre[1], dre_next); dre[0].dre_type = dwarf_drt_first_of_length_pair; dre[0].dre_length = length; dre[0].dre_offset = reloff; dre[0].dre_symndx = symndx; dre[0].dre_addend = 0; dre[0].dre_secname = NULL; dre[1].dre_type = dwarf_drt_second_of_length_pair; dre[1].dre_length = length; dre[1].dre_offset = reloff; dre[1].dre_symndx = esymndx; dre[1].dre_addend = 0; dre[1].dre_secname = NULL; drs->drs_drecnt += 2; return (DW_DLE_NONE); } int _dwarf_reloc_section_finalize(Dwarf_P_Debug dbg, Dwarf_Rel_Section drs, Dwarf_Error *error) { Dwarf_P_Section ds; Dwarf_Unsigned unit; int ret, size; assert(dbg != NULL && drs != NULL && drs->drs_ds != NULL && drs->drs_ref != NULL); ds = drs->drs_ds; /* * Calculate the size (in bytes) of the relocation section. */ if (dbg->dbgp_flags & DW_DLC_SIZE_64) unit = drs->drs_addend ? sizeof(Elf64_Rela) : sizeof(Elf64_Rel); else unit = drs->drs_addend ? sizeof(Elf32_Rela) : sizeof(Elf32_Rel); assert(ds->ds_size == 0); size = drs->drs_drecnt * unit; /* * Discard this relocation section if there is no entry in it. */ if (size == 0) { _dwarf_reloc_section_free(dbg, &drs); return (DW_DLE_NONE); } /* * If we are under stream mode, realloc the section data block to * this size. */ if ((dbg->dbgp_flags & DW_DLC_SYMBOLIC_RELOCATIONS) == 0) { ds->ds_cap = size; if ((ds->ds_data = realloc(ds->ds_data, (size_t) ds->ds_cap)) == NULL) { DWARF_SET_ERROR(dbg, error, DW_DLE_MEMORY); return (DW_DLE_MEMORY); } } /* * Notify the application the creation of this relocation section. * Note that the section link here should point to the .symtab * section, we set it to 0 since we have no way to know .symtab * section index. */ ret = _dwarf_pro_callback(dbg, ds->ds_name, size, drs->drs_addend ? SHT_RELA : SHT_REL, 0, 0, drs->drs_ref->ds_ndx, &ds->ds_symndx, NULL); if (ret < 0) { DWARF_SET_ERROR(dbg, error, DW_DLE_ELF_SECT_ERR); return (DW_DLE_ELF_SECT_ERR); } ds->ds_ndx = ret; return (DW_DLE_NONE); } int _dwarf_reloc_section_gen(Dwarf_P_Debug dbg, Dwarf_Rel_Section drs, Dwarf_Error *error) { Dwarf_Rel_Entry dre; Dwarf_P_Section ds; Dwarf_Unsigned type; int ret; assert((dbg->dbgp_flags & DW_DLC_SYMBOLIC_RELOCATIONS) == 0); assert(drs->drs_ds != NULL && drs->drs_ds->ds_size == 0); assert(!STAILQ_EMPTY(&drs->drs_dre)); ds = drs->drs_ds; STAILQ_FOREACH(dre, &drs->drs_dre, dre_next) { assert(dre->dre_length == 4 || dre->dre_length == 8); type = _dwarf_get_reloc_type(dbg, dre->dre_length == 8); if (dbg->dbgp_flags & DW_DLC_SIZE_64) { /* Write r_offset (8 bytes) */ ret = dbg->write_alloc(&ds->ds_data, &ds->ds_cap, &ds->ds_size, dre->dre_offset, 8, error); if (ret != DW_DLE_NONE) return (ret); /* Write r_info (8 bytes) */ ret = dbg->write_alloc(&ds->ds_data, &ds->ds_cap, &ds->ds_size, ELF64_R_INFO(dre->dre_symndx, type), 8, error); if (ret != DW_DLE_NONE) return (ret); /* Write r_addend (8 bytes) */ if (drs->drs_addend) { ret = dbg->write_alloc(&ds->ds_data, &ds->ds_cap, &ds->ds_size, dre->dre_addend, 8, error); if (ret != DW_DLE_NONE) return (ret); } } else { /* Write r_offset (4 bytes) */ ret = dbg->write_alloc(&ds->ds_data, &ds->ds_cap, &ds->ds_size, dre->dre_offset, 4, error); if (ret != DW_DLE_NONE) return (ret); /* Write r_info (4 bytes) */ ret = dbg->write_alloc(&ds->ds_data, &ds->ds_cap, &ds->ds_size, ELF32_R_INFO(dre->dre_symndx, type), 4, error); if (ret != DW_DLE_NONE) return (ret); /* Write r_addend (4 bytes) */ if (drs->drs_addend) { ret = dbg->write_alloc(&ds->ds_data, &ds->ds_cap, &ds->ds_size, dre->dre_addend, 4, error); if (ret != DW_DLE_NONE) return (ret); } } } assert(ds->ds_size == ds->ds_cap); return (DW_DLE_NONE); } int _dwarf_reloc_gen(Dwarf_P_Debug dbg, Dwarf_Error *error) { Dwarf_Rel_Section drs; Dwarf_Rel_Entry dre; Dwarf_P_Section ds; int ret; STAILQ_FOREACH(drs, &dbg->dbgp_drslist, drs_next) { /* * Update relocation entries: translate any section name * reference to section symbol index. */ STAILQ_FOREACH(dre, &drs->drs_dre, dre_next) { if (dre->dre_secname == NULL) continue; ds = _dwarf_pro_find_section(dbg, dre->dre_secname); assert(ds != NULL && ds->ds_symndx != 0); dre->dre_symndx = ds->ds_symndx; } /* * Generate ELF relocation section if we are under stream * mode. */ if ((dbg->dbgp_flags & DW_DLC_SYMBOLIC_RELOCATIONS) == 0) { ret = _dwarf_reloc_section_gen(dbg, drs, error); if (ret != DW_DLE_NONE) return (ret); } } return (DW_DLE_NONE); } void _dwarf_reloc_cleanup(Dwarf_P_Debug dbg) { Dwarf_Rel_Section drs, tdrs; Dwarf_Rel_Entry dre, tdre; assert(dbg != NULL && dbg->dbg_mode == DW_DLC_WRITE); STAILQ_FOREACH_SAFE(drs, &dbg->dbgp_drslist, drs_next, tdrs) { STAILQ_REMOVE(&dbg->dbgp_drslist, drs, _Dwarf_Rel_Section, drs_next); free(drs->drs_drd); STAILQ_FOREACH_SAFE(dre, &drs->drs_dre, dre_next, tdre) { STAILQ_REMOVE(&drs->drs_dre, dre, _Dwarf_Rel_Entry, dre_next); free(dre); } if (dbg->dbgp_flags & DW_DLC_SYMBOLIC_RELOCATIONS) { if (drs->drs_ds) { if (drs->drs_ds->ds_name) free(drs->drs_ds->ds_name); free(drs->drs_ds); } } free(drs); } dbg->dbgp_drscnt = 0; dbg->dbgp_drspos = NULL; } diff --git a/contrib/elftoolchain/libelf/_libelf_config.h b/contrib/elftoolchain/libelf/_libelf_config.h index 0f16f3aefde5..df33e974a94b 100644 --- a/contrib/elftoolchain/libelf/_libelf_config.h +++ b/contrib/elftoolchain/libelf/_libelf_config.h @@ -1,191 +1,197 @@ /*- * Copyright (c) 2008-2011 Joseph Koshy * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * $Id: _libelf_config.h 3764 2019-06-28 21:44:46Z emaste $ */ #if defined(__APPLE__) || defined(__DragonFly__) || defined(__FreeBSD__) /* * Define LIBELF_{ARCH,BYTEORDER,CLASS} based on the machine architecture. * See also: on FreeBSD. */ #if defined(__amd64__) #define LIBELF_ARCH EM_X86_64 #define LIBELF_BYTEORDER ELFDATA2LSB #define LIBELF_CLASS ELFCLASS64 #elif defined(__aarch64__) #define LIBELF_ARCH EM_AARCH64 #define LIBELF_BYTEORDER ELFDATA2LSB #define LIBELF_CLASS ELFCLASS64 #elif defined(__arm__) #define LIBELF_ARCH EM_ARM #if defined(__ARMEB__) /* Big-endian ARM. */ #define LIBELF_BYTEORDER ELFDATA2MSB #else #define LIBELF_BYTEORDER ELFDATA2LSB #endif #define LIBELF_CLASS ELFCLASS32 #elif defined(__i386__) #define LIBELF_ARCH EM_386 #define LIBELF_BYTEORDER ELFDATA2LSB #define LIBELF_CLASS ELFCLASS32 #elif defined(__ia64__) #define LIBELF_ARCH EM_IA_64 #define LIBELF_BYTEORDER ELFDATA2LSB #define LIBELF_CLASS ELFCLASS64 #elif defined(__mips__) #define LIBELF_ARCH EM_MIPS #if defined(__MIPSEB__) #define LIBELF_BYTEORDER ELFDATA2MSB #else #define LIBELF_BYTEORDER ELFDATA2LSB #endif #define LIBELF_CLASS ELFCLASS32 #elif defined(__powerpc64__) #define LIBELF_ARCH EM_PPC64 #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ #define LIBELF_BYTEORDER ELFDATA2LSB #else #define LIBELF_BYTEORDER ELFDATA2MSB #endif #define LIBELF_CLASS ELFCLASS64 #elif defined(__powerpc__) #define LIBELF_ARCH EM_PPC #define LIBELF_BYTEORDER ELFDATA2MSB #define LIBELF_CLASS ELFCLASS32 #elif defined(__riscv) && (__riscv_xlen == 64) #define LIBELF_ARCH EM_RISCV #define LIBELF_BYTEORDER ELFDATA2LSB #define LIBELF_CLASS ELFCLASS64 #elif defined(__riscv64) #define LIBELF_ARCH EM_RISCV #define LIBELF_BYTEORDER ELFDATA2LSB #define LIBELF_CLASS ELFCLASS64 +#elif defined(__loongarch64) + +#define LIBELF_ARCH EM_LOONGARCH +#define LIBELF_BYTEORDER ELFDATA2LSB +#define LIBELF_CLASS ELFCLASS64 + #elif defined(__sparc__) #define LIBELF_ARCH EM_SPARCV9 #define LIBELF_BYTEORDER ELFDATA2MSB #define LIBELF_CLASS ELFCLASS64 #else #error Unknown architecture. #endif #endif /* defined(__APPLE__) || defined(__DragonFly__) || defined(__FreeBSD__) */ /* * Definitions for Minix3. */ #ifdef __minix #define LIBELF_ARCH EM_386 #define LIBELF_BYTEORDER ELFDATA2LSB #define LIBELF_CLASS ELFCLASS32 #endif /* __minix */ #ifdef __NetBSD__ #include #if !defined(ARCH_ELFSIZE) #error ARCH_ELFSIZE is not defined. #endif #if ARCH_ELFSIZE == 32 #define LIBELF_ARCH ELF32_MACHDEP_ID #define LIBELF_BYTEORDER ELF32_MACHDEP_ENDIANNESS #define LIBELF_CLASS ELFCLASS32 #define Elf_Note Elf32_Nhdr #else #define LIBELF_ARCH ELF64_MACHDEP_ID #define LIBELF_BYTEORDER ELF64_MACHDEP_ENDIANNESS #define LIBELF_CLASS ELFCLASS64 #define Elf_Note Elf64_Nhdr #endif #endif /* __NetBSD__ */ #if defined(__OpenBSD__) #include #define LIBELF_ARCH ELF_TARG_MACH #define LIBELF_BYTEORDER ELF_TARG_DATA #define LIBELF_CLASS ELF_TARG_CLASS #endif /* * GNU & Linux compatibility. * * `__linux__' is defined in an environment runs the Linux kernel and glibc. * `__GNU__' is defined in an environment runs a GNU kernel (Hurd) and glibc. * `__GLIBC__' is defined for an environment that runs glibc over a non-GNU * kernel such as GNU/kFreeBSD. */ #if defined(__linux__) || defined(__GNU__) || defined(__GLIBC__) #if defined(__linux__) #include "native-elf-format.h" #define LIBELF_CLASS ELFTC_CLASS #define LIBELF_ARCH ELFTC_ARCH #define LIBELF_BYTEORDER ELFTC_BYTEORDER #endif /* defined(__linux__) */ #if LIBELF_CLASS == ELFCLASS32 #define Elf_Note Elf32_Nhdr #elif LIBELF_CLASS == ELFCLASS64 #define Elf_Note Elf64_Nhdr #else #error LIBELF_CLASS needs to be one of ELFCLASS32 or ELFCLASS64 #endif #endif /* defined(__linux__) || defined(__GNU__) || defined(__GLIBC__) */ diff --git a/contrib/elftoolchain/libelftc/elftc_reloc_type_str.c b/contrib/elftoolchain/libelftc/elftc_reloc_type_str.c index bc8ff6c0d2c6..48970714c7d4 100644 --- a/contrib/elftoolchain/libelftc/elftc_reloc_type_str.c +++ b/contrib/elftoolchain/libelftc/elftc_reloc_type_str.c @@ -1,838 +1,957 @@ /*- * Copyright (c) 2009-2015 Kai Wang * Copyright (c) 2016 The FreeBSD Foundation * All rights reserved. * * Portions of this software were developed by Ed Maste under sponsorship * of the FreeBSD Foundation. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #include #include const char * elftc_reloc_type_str(unsigned int mach, unsigned int type) { static char s_type[32]; switch(mach) { case EM_386: case EM_IAMCU: switch(type) { case 0: return "R_386_NONE"; case 1: return "R_386_32"; case 2: return "R_386_PC32"; case 3: return "R_386_GOT32"; case 4: return "R_386_PLT32"; case 5: return "R_386_COPY"; case 6: return "R_386_GLOB_DAT"; case 7: return "R_386_JUMP_SLOT"; case 8: return "R_386_RELATIVE"; case 9: return "R_386_GOTOFF"; case 10: return "R_386_GOTPC"; case 11: return "R_386_32PLT"; /* Not in psabi */ case 14: return "R_386_TLS_TPOFF"; case 15: return "R_386_TLS_IE"; case 16: return "R_386_TLS_GOTIE"; case 17: return "R_386_TLS_LE"; case 18: return "R_386_TLS_GD"; case 19: return "R_386_TLS_LDM"; case 20: return "R_386_16"; case 21: return "R_386_PC16"; case 22: return "R_386_8"; case 23: return "R_386_PC8"; case 24: return "R_386_TLS_GD_32"; case 25: return "R_386_TLS_GD_PUSH"; case 26: return "R_386_TLS_GD_CALL"; case 27: return "R_386_TLS_GD_POP"; case 28: return "R_386_TLS_LDM_32"; case 29: return "R_386_TLS_LDM_PUSH"; case 30: return "R_386_TLS_LDM_CALL"; case 31: return "R_386_TLS_LDM_POP"; case 32: return "R_386_TLS_LDO_32"; case 33: return "R_386_TLS_IE_32"; case 34: return "R_386_TLS_LE_32"; case 35: return "R_386_TLS_DTPMOD32"; case 36: return "R_386_TLS_DTPOFF32"; case 37: return "R_386_TLS_TPOFF32"; case 38: return "R_386_SIZE32"; case 39: return "R_386_TLS_GOTDESC"; case 40: return "R_386_TLS_DESC_CALL"; case 41: return "R_386_TLS_DESC"; case 42: return "R_386_IRELATIVE"; case 43: return "R_386_GOT32X"; } break; case EM_AARCH64: switch(type) { case 0: return "R_AARCH64_NONE"; case 257: return "R_AARCH64_ABS64"; case 258: return "R_AARCH64_ABS32"; case 259: return "R_AARCH64_ABS16"; case 260: return "R_AARCH64_PREL64"; case 261: return "R_AARCH64_PREL32"; case 262: return "R_AARCH64_PREL16"; case 263: return "R_AARCH64_MOVW_UABS_G0"; case 264: return "R_AARCH64_MOVW_UABS_G0_NC"; case 265: return "R_AARCH64_MOVW_UABS_G1"; case 266: return "R_AARCH64_MOVW_UABS_G1_NC"; case 267: return "R_AARCH64_MOVW_UABS_G2"; case 268: return "R_AARCH64_MOVW_UABS_G2_NC"; case 269: return "R_AARCH64_MOVW_UABS_G3"; case 270: return "R_AARCH64_MOVW_SABS_G0"; case 271: return "R_AARCH64_MOVW_SABS_G1"; case 272: return "R_AARCH64_MOVW_SABS_G2"; case 273: return "R_AARCH64_LD_PREL_LO19"; case 274: return "R_AARCH64_ADR_PREL_LO21"; case 275: return "R_AARCH64_ADR_PREL_PG_HI21"; case 276: return "R_AARCH64_ADR_PREL_PG_HI21_NC"; case 277: return "R_AARCH64_ADD_ABS_LO12_NC"; case 278: return "R_AARCH64_LDST8_ABS_LO12_NC"; case 279: return "R_AARCH64_TSTBR14"; case 280: return "R_AARCH64_CONDBR19"; case 282: return "R_AARCH64_JUMP26"; case 283: return "R_AARCH64_CALL26"; case 284: return "R_AARCH64_LDST16_ABS_LO12_NC"; case 285: return "R_AARCH64_LDST32_ABS_LO12_NC"; case 286: return "R_AARCH64_LDST64_ABS_LO12_NC"; case 287: return "R_AARCH64_MOVW_PREL_G0"; case 288: return "R_AARCH64_MOVW_PREL_G0_NC"; case 289: return "R_AARCH64_MOVW_PREL_G1"; case 290: return "R_AARCH64_MOVW_PREL_G1_NC"; case 291: return "R_AARCH64_MOVW_PREL_G2"; case 292: return "R_AARCH64_MOVW_PREL_G2_NC"; case 293: return "R_AARCH64_MOVW_PREL_G3"; case 299: return "R_AARCH64_LDST128_ABS_LO12_NC"; case 300: return "R_AARCH64_MOVW_GOTOFF_G0"; case 301: return "R_AARCH64_MOVW_GOTOFF_G0_NC"; case 302: return "R_AARCH64_MOVW_GOTOFF_G1"; case 303: return "R_AARCH64_MOVW_GOTOFF_G1_NC"; case 304: return "R_AARCH64_MOVW_GOTOFF_G2"; case 305: return "R_AARCH64_MOVW_GOTOFF_G2_NC"; case 306: return "R_AARCH64_MOVW_GOTOFF_G3"; case 307: return "R_AARCH64_GOTREL64"; case 308: return "R_AARCH64_GOTREL32"; case 309: return "R_AARCH64_GOT_LD_PREL19"; case 310: return "R_AARCH64_LD64_GOTOFF_LO15"; case 311: return "R_AARCH64_ADR_GOT_PAGE"; case 312: return "R_AARCH64_LD64_GOT_LO12_NC"; case 313: return "R_AARCH64_LD64_GOTPAGE_LO15"; case 560: return "R_AARCH64_TLSDESC_LD_PREL19"; case 561: return "R_AARCH64_TLSDESC_ADR_PREL21"; case 562: return "R_AARCH64_TLSDESC_ADR_PAGE21"; case 563: return "R_AARCH64_TLSDESC_LD64_LO12"; case 564: return "R_AARCH64_TLSDESC_ADD_LO12"; case 565: return "R_AARCH64_TLSDESC_OFF_G1"; case 566: return "R_AARCH64_TLSDESC_OFF_G0_NC"; case 567: return "R_AARCH64_TLSDESC_LDR"; case 568: return "R_AARCH64_TLSDESC_ADD"; case 569: return "R_AARCH64_TLSDESC_CALL"; case 1024: return "R_AARCH64_COPY"; case 1025: return "R_AARCH64_GLOB_DAT"; case 1026: return "R_AARCH64_JUMP_SLOT"; case 1027: return "R_AARCH64_RELATIVE"; case 1028: return "R_AARCH64_TLS_DTPREL64"; case 1029: return "R_AARCH64_TLS_DTPMOD64"; case 1030: return "R_AARCH64_TLS_TPREL64"; case 1031: return "R_AARCH64_TLSDESC"; case 1032: return "R_AARCH64_IRELATIVE"; } break; case EM_ARM: switch(type) { case 0: return "R_ARM_NONE"; case 1: return "R_ARM_PC24"; /* Deprecated */ case 2: return "R_ARM_ABS32"; case 3: return "R_ARM_REL32"; case 4: return "R_ARM_LDR_PC_G0"; /* Also R_ARM_PC13 */ case 5: return "R_ARM_ABS16"; case 6: return "R_ARM_ABS12"; case 7: return "R_ARM_THM_ABS5"; case 8: return "R_ARM_ABS8"; case 9: return "R_ARM_SBREL32"; case 10: return "R_ARM_THM_CALL"; /* Also R_ARM_THM_PC22 */ case 11: return "R_ARM_THM_PC8"; case 12: return "R_ARM_BREL_ADJ"; /* Also R_ARM_AMP_VCALL9 */ case 13: return "R_ARM_TLS_DESC"; /* Also R_ARM_SWI24 */ case 14: return "R_ARM_THM_SWI8"; /* Obsolete */ case 15: return "R_ARM_XPC25"; /* Obsolete */ case 16: return "R_ARM_THM_XPC22"; /* Obsolete */ case 17: return "R_ARM_TLS_DTPMOD32"; case 18: return "R_ARM_TLS_DTPOFF32"; case 19: return "R_ARM_TLS_TPOFF32"; case 20: return "R_ARM_COPY"; case 21: return "R_ARM_GLOB_DAT"; case 22: return "R_ARM_JUMP_SLOT"; case 23: return "R_ARM_RELATIVE"; case 24: return "R_ARM_GOTOFF32"; /* Also R_ARM_GOTOFF */ case 25: return "R_ARM_BASE_PREL"; /* GNU R_ARM_GOTPC */ case 26: return "R_ARM_GOT_BREL"; /* GNU R_ARM_GOT32 */ case 27: return "R_ARM_PLT32"; /* Deprecated */ case 28: return "R_ARM_CALL"; case 29: return "R_ARM_JUMP24"; case 30: return "R_ARM_THM_JUMP24"; case 31: return "R_ARM_BASE_ABS"; case 32: return "R_ARM_ALU_PCREL_7_0"; /* Obsolete */ case 33: return "R_ARM_ALU_PCREL_15_8"; /* Obsolete */ case 34: return "R_ARM_ALU_PCREL_23_15"; /* Obsolete */ case 35: return "R_ARM_LDR_SBREL_11_0_NC"; /* Deprecated */ case 36: return "R_ARM_ALU_SBREL_19_12_NC"; /* Deprecated */ case 37: return "R_ARM_ALU_SBREL_27_20_CK"; /* Deprecated */ case 38: return "R_ARM_TARGET1"; case 39: return "R_ARM_SBREL31"; /* Deprecated. */ case 40: return "R_ARM_V4BX"; case 41: return "R_ARM_TARGET2"; case 42: return "R_ARM_PREL31"; case 43: return "R_ARM_MOVW_ABS_NC"; case 44: return "R_ARM_MOVT_ABS"; case 45: return "R_ARM_MOVW_PREL_NC"; case 46: return "R_ARM_MOVT_PREL"; case 47: return "R_ARM_THM_MOVW_ABS_NC"; case 48: return "R_ARM_THM_MOVT_ABS"; case 49: return "R_ARM_THM_MOVW_PREL_NC"; case 50: return "R_ARM_THM_MOVT_PREL"; case 51: return "R_ARM_THM_JUMP19"; case 52: return "R_ARM_THM_JUMP6"; case 53: return "R_ARM_THM_ALU_PREL_11_0"; case 54: return "R_ARM_THM_PC12"; case 55: return "R_ARM_ABS32_NOI"; case 56: return "R_ARM_REL32_NOI"; case 57: return "R_ARM_ALU_PC_G0_NC"; case 58: return "R_ARM_ALU_PC_G0"; case 59: return "R_ARM_ALU_PC_G1_NC"; case 60: return "R_ARM_ALU_PC_G1"; case 61: return "R_ARM_ALU_PC_G2"; case 62: return "R_ARM_LDR_PC_G1"; case 63: return "R_ARM_LDR_PC_G2"; case 64: return "R_ARM_LDRS_PC_G0"; case 65: return "R_ARM_LDRS_PC_G1"; case 66: return "R_ARM_LDRS_PC_G2"; case 67: return "R_ARM_LDC_PC_G0"; case 68: return "R_ARM_LDC_PC_G1"; case 69: return "R_ARM_LDC_PC_G2"; case 70: return "R_ARM_ALU_SB_G0_NC"; case 71: return "R_ARM_ALU_SB_G0"; case 72: return "R_ARM_ALU_SB_G1_NC"; case 73: return "R_ARM_ALU_SB_G1"; case 74: return "R_ARM_ALU_SB_G2"; case 75: return "R_ARM_LDR_SB_G0"; case 76: return "R_ARM_LDR_SB_G1"; case 77: return "R_ARM_LDR_SB_G2"; case 78: return "R_ARM_LDRS_SB_G0"; case 79: return "R_ARM_LDRS_SB_G1"; case 80: return "R_ARM_LDRS_SB_G2"; case 81: return "R_ARM_LDC_SB_G0"; case 82: return "R_ARM_LDC_SB_G1"; case 83: return "R_ARM_LDC_SB_G2"; case 84: return "R_ARM_MOVW_BREL_NC"; case 85: return "R_ARM_MOVT_BREL"; case 86: return "R_ARM_MOVW_BREL"; case 87: return "R_ARM_THM_MOVW_BREL_NC"; case 88: return "R_ARM_THM_MOVT_BREL"; case 89: return "R_ARM_THM_MOVW_BREL"; case 90: return "R_ARM_TLS_GOTDESC"; case 91: return "R_ARM_TLS_CALL"; case 92: return "R_ARM_TLS_DESCSEQ"; case 93: return "R_ARM_THM_TLS_CALL"; case 94: return "R_ARM_PLT32_ABS"; case 95: return "R_ARM_GOT_ABS"; case 96: return "R_ARM_GOT_PREL"; case 97: return "R_ARM_GOT_BREL12"; case 98: return "R_ARM_GOTOFF12"; case 99: return "R_ARM_GOTRELAX"; case 100: return "R_ARM_GNU_VTENTRY"; case 101: return "R_ARM_GNU_VTINHERIT"; case 102: return "R_ARM_THM_JUMP11"; /* Also R_ARM_THM_PC11 */ case 103: return "R_ARM_THM_JUMP8"; /* Also R_ARM_THM_PC9 */ case 104: return "R_ARM_TLS_GD32"; case 105: return "R_ARM_TLS_LDM32"; case 106: return "R_ARM_TLS_LDO32"; case 107: return "R_ARM_TLS_IE32"; case 108: return "R_ARM_TLS_LE32"; case 109: return "R_ARM_TLS_LDO12"; case 110: return "R_ARM_TLS_LE12"; case 111: return "R_ARM_TLS_IE12GP"; /* 112-127 R_ARM_PRIVATE_ */ case 128: return "R_ARM_ME_TOO"; /* Obsolete */ case 129: return "R_ARM_THM_TLS_DESCSEQ16"; case 130: return "R_ARM_THM_TLS_DESCSEQ32"; case 131: return "R_ARM_THM_GOT_BREL12"; case 132: return "R_ARM_THM_ALU_ABS_G0_NC"; case 133: return "R_ARM_THM_ALU_ABS_G1_NC"; case 134: return "R_ARM_THM_ALU_ABS_G2_NC"; case 135: return "R_ARM_THM_ALU_ABS_G3"; /* 136-159 Reserved for future allocation. */ case 160: return "R_ARM_IRELATIVE"; /* 161-255 Reserved for future allocation. */ case 249: return "R_ARM_RXPC25"; case 250: return "R_ARM_RSBREL32"; case 251: return "R_ARM_THM_RPC22"; case 252: return "R_ARM_RREL32"; case 253: return "R_ARM_RABS32"; case 254: return "R_ARM_RPC24"; case 255: return "R_ARM_RBASE"; } break; case EM_IA_64: switch(type) { case 0: return "R_IA_64_NONE"; case 33: return "R_IA_64_IMM14"; case 34: return "R_IA_64_IMM22"; case 35: return "R_IA_64_IMM64"; case 36: return "R_IA_64_DIR32MSB"; case 37: return "R_IA_64_DIR32LSB"; case 38: return "R_IA_64_DIR64MSB"; case 39: return "R_IA_64_DIR64LSB"; case 42: return "R_IA_64_GPREL22"; case 43: return "R_IA_64_GPREL64I"; case 44: return "R_IA_64_GPREL32MSB"; case 45: return "R_IA_64_GPREL32LSB"; case 46: return "R_IA_64_GPREL64MSB"; case 47: return "R_IA_64_GPREL64LSB"; case 50: return "R_IA_64_LTOFF22"; case 51: return "R_IA_64_LTOFF64I"; case 58: return "R_IA_64_PLTOFF22"; case 59: return "R_IA_64_PLTOFF64I"; case 62: return "R_IA_64_PLTOFF64MSB"; case 63: return "R_IA_64_PLTOFF64LSB"; case 67: return "R_IA_64_FPTR64I"; case 68: return "R_IA_64_FPTR32MSB"; case 69: return "R_IA_64_FPTR32LSB"; case 70: return "R_IA_64_FPTR64MSB"; case 71: return "R_IA_64_FPTR64LSB"; case 72: return "R_IA_64_PCREL60B"; case 73: return "R_IA_64_PCREL21B"; case 74: return "R_IA_64_PCREL21M"; case 75: return "R_IA_64_PCREL21F"; case 76: return "R_IA_64_PCREL32MSB"; case 77: return "R_IA_64_PCREL32LSB"; case 78: return "R_IA_64_PCREL64MSB"; case 79: return "R_IA_64_PCREL64LSB"; case 82: return "R_IA_64_LTOFF_FPTR22"; case 83: return "R_IA_64_LTOFF_FPTR64I"; case 84: return "R_IA_64_LTOFF_FPTR32MSB"; case 85: return "R_IA_64_LTOFF_FPTR32LSB"; case 86: return "R_IA_64_LTOFF_FPTR64MSB"; case 87: return "R_IA_64_LTOFF_FPTR64LSB"; case 92: return "R_IA_64_SEGREL32MSB"; case 93: return "R_IA_64_SEGREL32LSB"; case 94: return "R_IA_64_SEGREL64MSB"; case 95: return "R_IA_64_SEGREL64LSB"; case 100: return "R_IA_64_SECREL32MSB"; case 101: return "R_IA_64_SECREL32LSB"; case 102: return "R_IA_64_SECREL64MSB"; case 103: return "R_IA_64_SECREL64LSB"; case 108: return "R_IA_64_REL32MSB"; case 109: return "R_IA_64_REL32LSB"; case 110: return "R_IA_64_REL64MSB"; case 111: return "R_IA_64_REL64LSB"; case 116: return "R_IA_64_LTV32MSB"; case 117: return "R_IA_64_LTV32LSB"; case 118: return "R_IA_64_LTV64MSB"; case 119: return "R_IA_64_LTV64LSB"; case 121: return "R_IA_64_PCREL21BI"; case 122: return "R_IA_64_PCREL22"; case 123: return "R_IA_64_PCREL64I"; case 128: return "R_IA_64_IPLTMSB"; case 129: return "R_IA_64_IPLTLSB"; case 133: return "R_IA_64_SUB"; case 134: return "R_IA_64_LTOFF22X"; case 135: return "R_IA_64_LDXMOV"; case 145: return "R_IA_64_TPREL14"; case 146: return "R_IA_64_TPREL22"; case 147: return "R_IA_64_TPREL64I"; case 150: return "R_IA_64_TPREL64MSB"; case 151: return "R_IA_64_TPREL64LSB"; case 154: return "R_IA_64_LTOFF_TPREL22"; case 166: return "R_IA_64_DTPMOD64MSB"; case 167: return "R_IA_64_DTPMOD64LSB"; case 170: return "R_IA_64_LTOFF_DTPMOD22"; case 177: return "R_IA_64_DTPREL14"; case 178: return "R_IA_64_DTPREL22"; case 179: return "R_IA_64_DTPREL64I"; case 180: return "R_IA_64_DTPREL32MSB"; case 181: return "R_IA_64_DTPREL32LSB"; case 182: return "R_IA_64_DTPREL64MSB"; case 183: return "R_IA_64_DTPREL64LSB"; case 186: return "R_IA_64_LTOFF_DTPREL22"; } break; case EM_MIPS: switch(type) { case 0: return "R_MIPS_NONE"; case 1: return "R_MIPS_16"; case 2: return "R_MIPS_32"; case 3: return "R_MIPS_REL32"; case 4: return "R_MIPS_26"; case 5: return "R_MIPS_HI16"; case 6: return "R_MIPS_LO16"; case 7: return "R_MIPS_GPREL16"; case 8: return "R_MIPS_LITERAL"; case 9: return "R_MIPS_GOT16"; case 10: return "R_MIPS_PC16"; case 11: return "R_MIPS_CALL16"; case 12: return "R_MIPS_GPREL32"; case 16: return "R_MIPS_SHIFT5"; case 17: return "R_MIPS_SHIFT6"; case 18: return "R_MIPS_64"; case 19: return "R_MIPS_GOT_DISP"; case 20: return "R_MIPS_GOT_PAGE"; case 21: return "R_MIPS_GOT_OFST"; case 22: return "R_MIPS_GOT_HI16"; case 23: return "R_MIPS_GOT_LO16"; case 24: return "R_MIPS_SUB"; case 28: return "R_MIPS_HIGHER"; case 29: return "R_MIPS_HIGHEST"; case 30: return "R_MIPS_CALLHI16"; case 31: return "R_MIPS_CALLLO16"; case 37: return "R_MIPS_JALR"; case 38: return "R_MIPS_TLS_DTPMOD32"; case 39: return "R_MIPS_TLS_DTPREL32"; case 40: return "R_MIPS_TLS_DTPMOD64"; case 41: return "R_MIPS_TLS_DTPREL64"; case 42: return "R_MIPS_TLS_GD"; case 43: return "R_MIPS_TLS_LDM"; case 44: return "R_MIPS_TLS_DTPREL_HI16"; case 45: return "R_MIPS_TLS_DTPREL_LO16"; case 46: return "R_MIPS_TLS_GOTTPREL"; case 47: return "R_MIPS_TLS_TPREL32"; case 48: return "R_MIPS_TLS_TPREL64"; case 49: return "R_MIPS_TLS_TPREL_HI16"; case 50: return "R_MIPS_TLS_TPREL_LO16"; } break; case EM_PPC: switch(type) { case 0: return "R_PPC_NONE"; case 1: return "R_PPC_ADDR32"; case 2: return "R_PPC_ADDR24"; case 3: return "R_PPC_ADDR16"; case 4: return "R_PPC_ADDR16_LO"; case 5: return "R_PPC_ADDR16_HI"; case 6: return "R_PPC_ADDR16_HA"; case 7: return "R_PPC_ADDR14"; case 8: return "R_PPC_ADDR14_BRTAKEN"; case 9: return "R_PPC_ADDR14_BRNTAKEN"; case 10: return "R_PPC_REL24"; case 11: return "R_PPC_REL14"; case 12: return "R_PPC_REL14_BRTAKEN"; case 13: return "R_PPC_REL14_BRNTAKEN"; case 14: return "R_PPC_GOT16"; case 15: return "R_PPC_GOT16_LO"; case 16: return "R_PPC_GOT16_HI"; case 17: return "R_PPC_GOT16_HA"; case 18: return "R_PPC_PLTREL24"; case 19: return "R_PPC_COPY"; case 20: return "R_PPC_GLOB_DAT"; case 21: return "R_PPC_JMP_SLOT"; case 22: return "R_PPC_RELATIVE"; case 23: return "R_PPC_LOCAL24PC"; case 24: return "R_PPC_UADDR32"; case 25: return "R_PPC_UADDR16"; case 26: return "R_PPC_REL32"; case 27: return "R_PPC_PLT32"; case 28: return "R_PPC_PLTREL32"; case 29: return "R_PPC_PLT16_LO"; case 30: return "R_PPC_PLT16_HI"; case 31: return "R_PPC_PLT16_HA"; case 32: return "R_PPC_SDAREL16"; case 33: return "R_PPC_SECTOFF"; case 34: return "R_PPC_SECTOFF_LO"; case 35: return "R_PPC_SECTOFF_HI"; case 36: return "R_PPC_SECTOFF_HA"; case 67: return "R_PPC_TLS"; case 68: return "R_PPC_DTPMOD32"; case 69: return "R_PPC_TPREL16"; case 70: return "R_PPC_TPREL16_LO"; case 71: return "R_PPC_TPREL16_HI"; case 72: return "R_PPC_TPREL16_HA"; case 73: return "R_PPC_TPREL32"; case 74: return "R_PPC_DTPREL16"; case 75: return "R_PPC_DTPREL16_LO"; case 76: return "R_PPC_DTPREL16_HI"; case 77: return "R_PPC_DTPREL16_HA"; case 78: return "R_PPC_DTPREL32"; case 79: return "R_PPC_GOT_TLSGD16"; case 80: return "R_PPC_GOT_TLSGD16_LO"; case 81: return "R_PPC_GOT_TLSGD16_HI"; case 82: return "R_PPC_GOT_TLSGD16_HA"; case 83: return "R_PPC_GOT_TLSLD16"; case 84: return "R_PPC_GOT_TLSLD16_LO"; case 85: return "R_PPC_GOT_TLSLD16_HI"; case 86: return "R_PPC_GOT_TLSLD16_HA"; case 87: return "R_PPC_GOT_TPREL16"; case 88: return "R_PPC_GOT_TPREL16_LO"; case 89: return "R_PPC_GOT_TPREL16_HI"; case 90: return "R_PPC_GOT_TPREL16_HA"; case 101: return "R_PPC_EMB_NADDR32"; case 102: return "R_PPC_EMB_NADDR16"; case 103: return "R_PPC_EMB_NADDR16_LO"; case 104: return "R_PPC_EMB_NADDR16_HI"; case 105: return "R_PPC_EMB_NADDR16_HA"; case 106: return "R_PPC_EMB_SDAI16"; case 107: return "R_PPC_EMB_SDA2I16"; case 108: return "R_PPC_EMB_SDA2REL"; case 109: return "R_PPC_EMB_SDA21"; case 110: return "R_PPC_EMB_MRKREF"; case 111: return "R_PPC_EMB_RELSEC16"; case 112: return "R_PPC_EMB_RELST_LO"; case 113: return "R_PPC_EMB_RELST_HI"; case 114: return "R_PPC_EMB_RELST_HA"; case 115: return "R_PPC_EMB_BIT_FLD"; case 116: return "R_PPC_EMB_RELSDA"; } break; case EM_PPC64: switch(type) { case 0: return "R_PPC64_NONE"; case 1: return "R_PPC64_ADDR32"; case 2: return "R_PPC64_ADDR24"; case 3: return "R_PPC64_ADDR16"; case 4: return "R_PPC64_ADDR16_LO"; case 5: return "R_PPC64_ADDR16_HI"; case 6: return "R_PPC64_ADDR16_HA"; case 7: return "R_PPC64_ADDR14"; case 8: return "R_PPC64_ADDR14_BRTAKEN"; case 9: return "R_PPC64_ADDR14_BRNTAKEN"; case 10: return "R_PPC64_REL24"; case 11: return "R_PPC64_REL14"; case 12: return "R_PPC64_REL14_BRTAKEN"; case 13: return "R_PPC64_REL14_BRNTAKEN"; case 14: return "R_PPC64_GOT16"; case 15: return "R_PPC64_GOT16_LO"; case 16: return "R_PPC64_GOT16_HI"; case 17: return "R_PPC64_GOT16_HA"; case 19: return "R_PPC64_COPY"; case 20: return "R_PPC64_GLOB_DAT"; case 21: return "R_PPC64_JMP_SLOT"; case 22: return "R_PPC64_RELATIVE"; case 24: return "R_PPC64_UADDR32"; case 25: return "R_PPC64_UADDR16"; case 26: return "R_PPC64_REL32"; case 27: return "R_PPC64_PLT32"; case 28: return "R_PPC64_PLTREL32"; case 29: return "R_PPC64_PLT16_LO"; case 30: return "R_PPC64_PLT16_HI"; case 31: return "R_PPC64_PLT16_HA"; case 33: return "R_PPC64_SECTOFF"; case 34: return "R_PPC64_SECTOFF_LO"; case 35: return "R_PPC64_SECTOFF_HI"; case 36: return "R_PPC64_SECTOFF_HA"; case 37: return "R_PPC64_ADDR30"; case 38: return "R_PPC64_ADDR64"; case 39: return "R_PPC64_ADDR16_HIGHER"; case 40: return "R_PPC64_ADDR16_HIGHERA"; case 41: return "R_PPC64_ADDR16_HIGHEST"; case 42: return "R_PPC64_ADDR16_HIGHESTA"; case 43: return "R_PPC64_UADDR64"; case 44: return "R_PPC64_REL64"; case 45: return "R_PPC64_PLT64"; case 46: return "R_PPC64_PLTREL64"; case 47: return "R_PPC64_TOC16"; case 48: return "R_PPC64_TOC16_LO"; case 49: return "R_PPC64_TOC16_HI"; case 50: return "R_PPC64_TOC16_HA"; case 51: return "R_PPC64_TOC"; case 52: return "R_PPC64_PLTGOT16"; case 53: return "R_PPC64_PLTGOT16_LO"; case 54: return "R_PPC64_PLTGOT16_HI"; case 55: return "R_PPC64_PLTGOT16_HA"; case 56: return "R_PPC64_ADDR16_DS"; case 57: return "R_PPC64_ADDR16_LO_DS"; case 58: return "R_PPC64_GOT16_DS"; case 59: return "R_PPC64_GOT16_LO_DS"; case 60: return "R_PPC64_PLT16_LO_DS"; case 61: return "R_PPC64_SECTOFF_DS"; case 62: return "R_PPC64_SECTOFF_LO_DS"; case 63: return "R_PPC64_TOC16_DS"; case 64: return "R_PPC64_TOC16_LO_DS"; case 65: return "R_PPC64_PLTGOT16_DS"; case 66: return "R_PPC64_PLTGOT16_LO_DS"; case 67: return "R_PPC64_TLS"; case 68: return "R_PPC64_DTPMOD64"; case 69: return "R_PPC64_TPREL16"; case 70: return "R_PPC64_TPREL16_LO"; case 71: return "R_PPC64_TPREL16_HI"; case 72: return "R_PPC64_TPREL16_HA"; case 73: return "R_PPC64_TPREL64"; case 74: return "R_PPC64_DTPREL16"; case 75: return "R_PPC64_DTPREL16_LO"; case 76: return "R_PPC64_DTPREL16_HI"; case 77: return "R_PPC64_DTPREL16_HA"; case 78: return "R_PPC64_DTPREL64"; case 79: return "R_PPC64_GOT_TLSGD16"; case 80: return "R_PPC64_GOT_TLSGD16_LO"; case 81: return "R_PPC64_GOT_TLSGD16_HI"; case 82: return "R_PPC64_GOT_TLSGD16_HA"; case 83: return "R_PPC64_GOT_TLSLD16"; case 84: return "R_PPC64_GOT_TLSLD16_LO"; case 85: return "R_PPC64_GOT_TLSLD16_HI"; case 86: return "R_PPC64_GOT_TLSLD16_HA"; case 87: return "R_PPC64_GOT_TPREL16_DS"; case 88: return "R_PPC64_GOT_TPREL16_LO_DS"; case 89: return "R_PPC64_GOT_TPREL16_HI"; case 90: return "R_PPC64_GOT_TPREL16_HA"; case 91: return "R_PPC64_GOT_DTPREL16_DS"; case 92: return "R_PPC64_GOT_DTPREL16_LO_DS"; case 93: return "R_PPC64_GOT_DTPREL16_HI"; case 94: return "R_PPC64_GOT_DTPREL16_HA"; case 95: return "R_PPC64_TPREL16_DS"; case 96: return "R_PPC64_TPREL16_LO_DS"; case 97: return "R_PPC64_TPREL16_HIGHER"; case 98: return "R_PPC64_TPREL16_HIGHERA"; case 99: return "R_PPC64_TPREL16_HIGHEST"; case 100: return "R_PPC64_TPREL16_HIGHESTA"; case 101: return "R_PPC64_DTPREL16_DS"; case 102: return "R_PPC64_DTPREL16_LO_DS"; case 103: return "R_PPC64_DTPREL16_HIGHER"; case 104: return "R_PPC64_DTPREL16_HIGHERA"; case 105: return "R_PPC64_DTPREL16_HIGHEST"; case 106: return "R_PPC64_DTPREL16_HIGHESTA"; case 107: return "R_PPC64_TLSGD"; case 108: return "R_PPC64_TLSLD"; case 249: return "R_PPC64_REL16"; case 250: return "R_PPC64_REL16_LO"; case 251: return "R_PPC64_REL16_HI"; case 252: return "R_PPC64_REL16_HA"; } break; case EM_RISCV: switch(type) { case 0: return "R_RISCV_NONE"; case 1: return "R_RISCV_32"; case 2: return "R_RISCV_64"; case 3: return "R_RISCV_RELATIVE"; case 4: return "R_RISCV_COPY"; case 5: return "R_RISCV_JUMP_SLOT"; case 6: return "R_RISCV_TLS_DTPMOD32"; case 7: return "R_RISCV_TLS_DTPMOD64"; case 8: return "R_RISCV_TLS_DTPREL32"; case 9: return "R_RISCV_TLS_DTPREL64"; case 10: return "R_RISCV_TLS_TPREL32"; case 11: return "R_RISCV_TLS_TPREL64"; case 16: return "R_RISCV_BRANCH"; case 17: return "R_RISCV_JAL"; case 18: return "R_RISCV_CALL"; case 19: return "R_RISCV_CALL_PLT"; case 20: return "R_RISCV_GOT_HI20"; case 21: return "R_RISCV_TLS_GOT_HI20"; case 22: return "R_RISCV_TLS_GD_HI20"; case 23: return "R_RISCV_PCREL_HI20"; case 24: return "R_RISCV_PCREL_LO12_I"; case 25: return "R_RISCV_PCREL_LO12_S"; case 26: return "R_RISCV_HI20"; case 27: return "R_RISCV_LO12_I"; case 28: return "R_RISCV_LO12_S"; case 29: return "R_RISCV_TPREL_HI20"; case 30: return "R_RISCV_TPREL_LO12_I"; case 31: return "R_RISCV_TPREL_LO12_S"; case 32: return "R_RISCV_TPREL_ADD"; case 33: return "R_RISCV_ADD8"; case 34: return "R_RISCV_ADD16"; case 35: return "R_RISCV_ADD32"; case 36: return "R_RISCV_ADD64"; case 37: return "R_RISCV_SUB8"; case 38: return "R_RISCV_SUB16"; case 39: return "R_RISCV_SUB32"; case 40: return "R_RISCV_SUB64"; case 43: return "R_RISCV_ALIGN"; case 44: return "R_RISCV_RVC_BRANCH"; case 45: return "R_RISCV_RVC_JUMP"; case 46: return "R_RISCV_RVC_LUI"; case 51: return "R_RISCV_RELAX"; case 52: return "R_RISCV_SUB6"; case 53: return "R_RISCV_SET6"; case 54: return "R_RISCV_SET8"; case 55: return "R_RISCV_SET16"; case 56: return "R_RISCV_SET32"; case 57: return "R_RISCV_32_PCREL"; case 58: return "R_RISCV_IRELATIVE"; } break; + case EM_LOONGARCH: + switch (type) { + case 0: return "R_LARCH_NONE"; + case 1: return "R_LARCH_32"; + case 2: return "R_LARCH_64"; + case 3: return "R_LARCH_RELATIVE"; + case 4: return "R_LARCH_COPY"; + case 5: return "R_LARCH_JUMP_SLOT"; + case 6: return "R_LARCH_TLS_DTPMOD32"; + case 7: return "R_LARCH_TLS_DTPMOD64"; + case 8: return "R_LARCH_TLS_DTPREL32"; + case 9: return "R_LARCH_TLS_DTPREL64"; + case 10: return "R_LARCH_TLS_TPREL32"; + case 11: return "R_LARCH_TLS_TPREL64"; + case 12: return "R_LARCH_IRELATIVE"; + case 13: return "R_LARCH_TLS_DESC32"; + case 14: return "R_LARCH_TLS_DESC64"; + case 20: return "R_LARCH_MARK_LA"; + case 21: return "R_LARCH_MARK_PCREL"; + case 22: return "R_LARCH_SOP_PUSH_PCREL"; + case 23: return "R_LARCH_SOP_PUSH_ABSOLUTE"; + case 24: return "R_LARCH_SOP_PUSH_DUP"; + case 25: return "R_LARCH_SOP_PUSH_GPREL"; + case 26: return "R_LARCH_SOP_PUSH_TLS_TPREL"; + case 27: return "R_LARCH_SOP_PUSH_TLS_GOT"; + case 28: return "R_LARCH_SOP_PUSH_TLS_GD"; + case 29: return "R_LARCH_SOP_PUSH_PLT_PCREL"; + case 30: return "R_LARCH_SOP_ASSERT"; + case 31: return "R_LARCH_SOP_NOT"; + case 32: return "R_LARCH_SOP_SUB"; + case 33: return "R_LARCH_SOP_SL"; + case 34: return "R_LARCH_SOP_SR"; + case 35: return "R_LARCH_SOP_ADD"; + case 36: return "R_LARCH_SOP_AND"; + case 37: return "R_LARCH_SOP_IF_ELSE"; + case 38: return "R_LARCH_SOP_POP_32_S_10_5"; + case 39: return "R_LARCH_SOP_POP_32_U_10_12"; + case 40: return "R_LARCH_SOP_POP_32_S_10_12"; + case 41: return "R_LARCH_SOP_POP_32_S_10_16"; + case 42: return "R_LARCH_SOP_POP_32_S_10_16_S2"; + case 43: return "R_LARCH_SOP_POP_32_S_5_20"; + case 44: return "R_LARCH_SOP_POP_32_S_0_5_10_16_S2"; + case 45: return "R_LARCH_SOP_POP_32_S_0_10_10_16_S2"; + case 46: return "R_LARCH_SOP_POP_32_U"; + case 47: return "R_LARCH_ADD8"; + case 48: return "R_LARCH_ADD16"; + case 49: return "R_LARCH_ADD24"; + case 50: return "R_LARCH_ADD32"; + case 51: return "R_LARCH_ADD64"; + case 52: return "R_LARCH_SUB8"; + case 53: return "R_LARCH_SUB16"; + case 54: return "R_LARCH_SUB24"; + case 55: return "R_LARCH_SUB32"; + case 56: return "R_LARCH_SUB64"; + case 57: return "R_LARCH_GNU_VTINHERIT"; + case 58: return "R_LARCH_GNU_VTENTRY"; + case 64: return "R_LARCH_B16"; + case 65: return "R_LARCH_B21"; + case 66: return "R_LARCH_B26"; + case 67: return "R_LARCH_ABS_HI20"; + case 68: return "R_LARCH_ABS_LO12"; + case 69: return "R_LARCH_ABS64_LO20"; + case 70: return "R_LARCH_ABS64_HI12"; + case 71: return "R_LARCH_PCALA_HI20"; + case 72: return "R_LARCH_PCALA_LO12"; + case 73: return "R_LARCH_PCALA64_LO20"; + case 74: return "R_LARCH_PCALA64_HI12"; + case 75: return "R_LARCH_GOT_PC_HI20"; + case 76: return "R_LARCH_GOT_PC_LO12"; + case 77: return "R_LARCH_GOT64_PC_LO20"; + case 78: return "R_LARCH_GOT64_PC_HI12"; + case 79: return "R_LARCH_GOT_HI20"; + case 80: return "R_LARCH_GOT_LO12"; + case 81: return "R_LARCH_GOT64_LO20"; + case 82: return "R_LARCH_GOT64_HI12"; + case 83: return "R_LARCH_TLS_LE_HI20"; + case 84: return "R_LARCH_TLS_LE_LO12"; + case 85: return "R_LARCH_TLS_LE64_LO20"; + case 86: return "R_LARCH_TLS_LE64_HI12"; + case 87: return "R_LARCH_TLS_IE_PC_HI20"; + case 88: return "R_LARCH_TLS_IE_PC_LO12"; + case 89: return "R_LARCH_TLS_IE64_PC_LO20"; + case 90: return "R_LARCH_TLS_IE64_PC_HI12"; + case 91: return "R_LARCH_TLS_IE_HI20"; + case 92: return "R_LARCH_TLS_IE_LO12"; + case 93: return "R_LARCH_TLS_IE64_LO20"; + case 94: return "R_LARCH_TLS_IE64_HI12"; + case 95: return "R_LARCH_TLS_LD_PC_HI20"; + case 96: return "R_LARCH_TLS_LD_HI20"; + case 97: return "R_LARCH_TLS_GD_PC_HI20"; + case 98: return "R_LARCH_TLS_GD_HI20"; + case 99: return "R_LARCH_32_PCREL"; + case 100: return "R_LARCH_RELAX"; + case 102: return "R_LARCH_ALIGN"; + case 103: return "R_LARCH_PCREL20_S2"; + case 105: return "R_LARCH_ADD6"; + case 106: return "R_LARCH_SUB6"; + case 107: return "R_LARCH_ADD_ULEB128"; + case 108: return "R_LARCH_SUB_ULEB128"; + case 109: return "R_LARCH_64_PCREL"; + case 110: return "R_LARCH_CALL36"; + case 111: return "R_LARCH_TLS_DESC_PC_HI20"; + case 112: return "R_LARCH_TLS_DESC_PC_LO12"; + case 113: return "R_LARCH_TLS_DESC64_PC_LO20"; + case 114: return "R_LARCH_TLS_DESC64_PC_HI12"; + case 115: return "R_LARCH_TLS_DESC_HI20"; + case 116: return "R_LARCH_TLS_DESC_LO12"; + case 117: return "R_LARCH_TLS_DESC64_LO20"; + case 118: return "R_LARCH_TLS_DESC64_HI12"; + case 119: return "R_LARCH_TLS_DESC_LD"; + case 120: return "R_LARCH_TLS_DESC_CALL"; + case 121: return "R_LARCH_TLS_LE_HI20_R"; + case 122: return "R_LARCH_TLS_LE_ADD_R"; + case 123: return "R_LARCH_TLS_LE_LO12_R"; + case 124: return "R_LARCH_TLS_LD_PCREL20_S2"; + case 125: return "R_LARCH_TLS_GD_PCREL20_S2"; + case 126: return "R_LARCH_TLS_DESC_PCREL20_S2"; + } + break; case EM_S390: switch (type) { case 0: return "R_390_NONE"; case 1: return "R_390_8"; case 2: return "R_390_12"; case 3: return "R_390_16"; case 4: return "R_390_32"; case 5: return "R_390_PC32"; case 6: return "R_390_GOT12"; case 7: return "R_390_GOT32"; case 8: return "R_390_PLT32"; case 9: return "R_390_COPY"; case 10: return "R_390_GLOB_DAT"; case 11: return "R_390_JMP_SLOT"; case 12: return "R_390_RELATIVE"; case 13: return "R_390_GOTOFF"; case 14: return "R_390_GOTPC"; case 15: return "R_390_GOT16"; case 16: return "R_390_PC16"; case 17: return "R_390_PC16DBL"; case 18: return "R_390_PLT16DBL"; case 19: return "R_390_PC32DBL"; case 20: return "R_390_PLT32DBL"; case 21: return "R_390_GOTPCDBL"; case 22: return "R_390_64"; case 23: return "R_390_PC64"; case 24: return "R_390_GOT64"; case 25: return "R_390_PLT64"; case 26: return "R_390_GOTENT"; } break; case EM_SPARC: case EM_SPARCV9: switch(type) { case 0: return "R_SPARC_NONE"; case 1: return "R_SPARC_8"; case 2: return "R_SPARC_16"; case 3: return "R_SPARC_32"; case 4: return "R_SPARC_DISP8"; case 5: return "R_SPARC_DISP16"; case 6: return "R_SPARC_DISP32"; case 7: return "R_SPARC_WDISP30"; case 8: return "R_SPARC_WDISP22"; case 9: return "R_SPARC_HI22"; case 10: return "R_SPARC_22"; case 11: return "R_SPARC_13"; case 12: return "R_SPARC_LO10"; case 13: return "R_SPARC_GOT10"; case 14: return "R_SPARC_GOT13"; case 15: return "R_SPARC_GOT22"; case 16: return "R_SPARC_PC10"; case 17: return "R_SPARC_PC22"; case 18: return "R_SPARC_WPLT30"; case 19: return "R_SPARC_COPY"; case 20: return "R_SPARC_GLOB_DAT"; case 21: return "R_SPARC_JMP_SLOT"; case 22: return "R_SPARC_RELATIVE"; case 23: return "R_SPARC_UA32"; case 24: return "R_SPARC_PLT32"; case 25: return "R_SPARC_HIPLT22"; case 26: return "R_SPARC_LOPLT10"; case 27: return "R_SPARC_PCPLT32"; case 28: return "R_SPARC_PCPLT22"; case 29: return "R_SPARC_PCPLT10"; case 30: return "R_SPARC_10"; case 31: return "R_SPARC_11"; case 32: return "R_SPARC_64"; case 33: return "R_SPARC_OLO10"; case 34: return "R_SPARC_HH22"; case 35: return "R_SPARC_HM10"; case 36: return "R_SPARC_LM22"; case 37: return "R_SPARC_PC_HH22"; case 38: return "R_SPARC_PC_HM10"; case 39: return "R_SPARC_PC_LM22"; case 40: return "R_SPARC_WDISP16"; case 41: return "R_SPARC_WDISP19"; case 42: return "R_SPARC_GLOB_JMP"; case 43: return "R_SPARC_7"; case 44: return "R_SPARC_5"; case 45: return "R_SPARC_6"; case 46: return "R_SPARC_DISP64"; case 47: return "R_SPARC_PLT64"; case 48: return "R_SPARC_HIX22"; case 49: return "R_SPARC_LOX10"; case 50: return "R_SPARC_H44"; case 51: return "R_SPARC_M44"; case 52: return "R_SPARC_L44"; case 53: return "R_SPARC_REGISTER"; case 54: return "R_SPARC_UA64"; case 55: return "R_SPARC_UA16"; case 56: return "R_SPARC_TLS_GD_HI22"; case 57: return "R_SPARC_TLS_GD_LO10"; case 58: return "R_SPARC_TLS_GD_ADD"; case 59: return "R_SPARC_TLS_GD_CALL"; case 60: return "R_SPARC_TLS_LDM_HI22"; case 61: return "R_SPARC_TLS_LDM_LO10"; case 62: return "R_SPARC_TLS_LDM_ADD"; case 63: return "R_SPARC_TLS_LDM_CALL"; case 64: return "R_SPARC_TLS_LDO_HIX22"; case 65: return "R_SPARC_TLS_LDO_LOX10"; case 66: return "R_SPARC_TLS_LDO_ADD"; case 67: return "R_SPARC_TLS_IE_HI22"; case 68: return "R_SPARC_TLS_IE_LO10"; case 69: return "R_SPARC_TLS_IE_LD"; case 70: return "R_SPARC_TLS_IE_LDX"; case 71: return "R_SPARC_TLS_IE_ADD"; case 72: return "R_SPARC_TLS_LE_HIX22"; case 73: return "R_SPARC_TLS_LE_LOX10"; case 74: return "R_SPARC_TLS_DTPMOD32"; case 75: return "R_SPARC_TLS_DTPMOD64"; case 76: return "R_SPARC_TLS_DTPOFF32"; case 77: return "R_SPARC_TLS_DTPOFF64"; case 78: return "R_SPARC_TLS_TPOFF32"; case 79: return "R_SPARC_TLS_TPOFF64"; } break; case EM_X86_64: switch(type) { case 0: return "R_X86_64_NONE"; case 1: return "R_X86_64_64"; case 2: return "R_X86_64_PC32"; case 3: return "R_X86_64_GOT32"; case 4: return "R_X86_64_PLT32"; case 5: return "R_X86_64_COPY"; case 6: return "R_X86_64_GLOB_DAT"; case 7: return "R_X86_64_JUMP_SLOT"; case 8: return "R_X86_64_RELATIVE"; case 9: return "R_X86_64_GOTPCREL"; case 10: return "R_X86_64_32"; case 11: return "R_X86_64_32S"; case 12: return "R_X86_64_16"; case 13: return "R_X86_64_PC16"; case 14: return "R_X86_64_8"; case 15: return "R_X86_64_PC8"; case 16: return "R_X86_64_DTPMOD64"; case 17: return "R_X86_64_DTPOFF64"; case 18: return "R_X86_64_TPOFF64"; case 19: return "R_X86_64_TLSGD"; case 20: return "R_X86_64_TLSLD"; case 21: return "R_X86_64_DTPOFF32"; case 22: return "R_X86_64_GOTTPOFF"; case 23: return "R_X86_64_TPOFF32"; case 24: return "R_X86_64_PC64"; case 25: return "R_X86_64_GOTOFF64"; case 26: return "R_X86_64_GOTPC32"; case 27: return "R_X86_64_GOT64"; case 28: return "R_X86_64_GOTPCREL64"; case 29: return "R_X86_64_GOTPC64"; case 30: return "R_X86_64_GOTPLT64"; case 31: return "R_X86_64_PLTOFF64"; case 32: return "R_X86_64_SIZE32"; case 33: return "R_X86_64_SIZE64"; case 34: return "R_X86_64_GOTPC32_TLSDESC"; case 35: return "R_X86_64_TLSDESC_CALL"; case 36: return "R_X86_64_TLSDESC"; case 37: return "R_X86_64_IRELATIVE"; case 38: return "R_X86_64_RELATIVE64"; case 41: return "R_X86_64_GOTPCRELX"; case 42: return "R_X86_64_REX_GOTPCRELX"; } break; } snprintf(s_type, sizeof(s_type), "", type); return (s_type); } diff --git a/contrib/elftoolchain/libelftc/libelftc_bfdtarget.c b/contrib/elftoolchain/libelftc/libelftc_bfdtarget.c index 3f2c23708549..8aa9e1f90f44 100644 --- a/contrib/elftoolchain/libelftc/libelftc_bfdtarget.c +++ b/contrib/elftoolchain/libelftc/libelftc_bfdtarget.c @@ -1,488 +1,519 @@ /*- * Copyright (c) 2008,2009 Kai Wang * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer * in this position and unchanged. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include "_libelftc.h" ELFTC_VCSID("$Id: libelftc_bfdtarget.c 3752 2019-06-28 01:12:53Z emaste $"); struct _Elftc_Bfd_Target _libelftc_targets[] = { { .bt_name = "binary", .bt_type = ETF_BINARY, }, { .bt_name = "elf32-avr", .bt_type = ETF_ELF, .bt_byteorder = ELFDATA2LSB, .bt_elfclass = ELFCLASS32, .bt_machine = EM_AVR, }, { .bt_name = "elf32-big", .bt_type = ETF_ELF, .bt_byteorder = ELFDATA2MSB, .bt_elfclass = ELFCLASS32, }, { .bt_name = "elf32-bigarm", .bt_type = ETF_ELF, .bt_byteorder = ELFDATA2MSB, .bt_elfclass = ELFCLASS32, .bt_machine = EM_ARM, }, { .bt_name = "elf32-bigmips", .bt_type = ETF_ELF, .bt_byteorder = ELFDATA2MSB, .bt_elfclass = ELFCLASS32, .bt_machine = EM_MIPS, }, { .bt_name = "elf32-i386", .bt_type = ETF_ELF, .bt_byteorder = ELFDATA2LSB, .bt_elfclass = ELFCLASS32, .bt_machine = EM_386, }, { .bt_name = "elf32-i386-freebsd", .bt_type = ETF_ELF, .bt_byteorder = ELFDATA2LSB, .bt_elfclass = ELFCLASS32, .bt_machine = EM_386, .bt_osabi = ELFOSABI_FREEBSD, }, { .bt_name = "elf32-ia64-big", .bt_type = ETF_ELF, .bt_byteorder = ELFDATA2MSB, .bt_elfclass = ELFCLASS32, .bt_machine = EM_IA_64, }, { .bt_name = "elf32-little", .bt_type = ETF_ELF, .bt_byteorder = ELFDATA2LSB, .bt_elfclass = ELFCLASS32, }, { .bt_name = "elf32-littlearm", .bt_type = ETF_ELF, .bt_byteorder = ELFDATA2LSB, .bt_elfclass = ELFCLASS32, .bt_machine = EM_ARM, }, { .bt_name = "elf32-littlemips", .bt_type = ETF_ELF, .bt_byteorder = ELFDATA2LSB, .bt_elfclass = ELFCLASS32, .bt_machine = EM_MIPS, }, { .bt_name = "elf32-powerpc", .bt_type = ETF_ELF, .bt_byteorder = ELFDATA2MSB, .bt_elfclass = ELFCLASS32, .bt_machine = EM_PPC, }, { .bt_name = "elf32-powerpc-freebsd", .bt_type = ETF_ELF, .bt_byteorder = ELFDATA2MSB, .bt_elfclass = ELFCLASS32, .bt_machine = EM_PPC, .bt_osabi = ELFOSABI_FREEBSD, }, { .bt_name = "elf32-powerpcle", .bt_type = ETF_ELF, .bt_byteorder = ELFDATA2LSB, .bt_elfclass = ELFCLASS32, .bt_machine = EM_PPC, }, { .bt_name = "elf32-sh", .bt_type = ETF_ELF, .bt_byteorder = ELFDATA2MSB, .bt_elfclass = ELFCLASS32, .bt_machine = EM_SH, }, { .bt_name = "elf32-shl", .bt_type = ETF_ELF, .bt_byteorder = ELFDATA2LSB, .bt_elfclass = ELFCLASS32, .bt_machine = EM_SH, }, { .bt_name = "elf32-sh-nbsd", .bt_type = ETF_ELF, .bt_byteorder = ELFDATA2MSB, .bt_elfclass = ELFCLASS32, .bt_machine = EM_SH, .bt_osabi = ELFOSABI_NETBSD, }, { .bt_name = "elf32-shl-nbsd", .bt_type = ETF_ELF, .bt_byteorder = ELFDATA2LSB, .bt_elfclass = ELFCLASS32, .bt_machine = EM_SH, .bt_osabi = ELFOSABI_NETBSD, }, { .bt_name = "elf32-shbig-linux", .bt_type = ETF_ELF, .bt_byteorder = ELFDATA2MSB, .bt_elfclass = ELFCLASS32, .bt_machine = EM_SH, .bt_osabi = ELFOSABI_LINUX, }, { .bt_name = "elf32-sh-linux", .bt_type = ETF_ELF, .bt_byteorder = ELFDATA2LSB, .bt_elfclass = ELFCLASS32, .bt_machine = EM_SH, .bt_osabi = ELFOSABI_LINUX, }, { .bt_name = "elf32-sparc", .bt_type = ETF_ELF, .bt_byteorder = ELFDATA2MSB, .bt_elfclass = ELFCLASS32, .bt_machine = EM_SPARC, }, { .bt_name = "elf32-tradbigmips", .bt_type = ETF_ELF, .bt_byteorder = ELFDATA2MSB, .bt_elfclass = ELFCLASS32, .bt_machine = EM_MIPS, }, { .bt_name = "elf32-tradlittlemips", .bt_type = ETF_ELF, .bt_byteorder = ELFDATA2LSB, .bt_elfclass = ELFCLASS32, .bt_machine = EM_MIPS, }, { .bt_name = "elf64-alpha", .bt_type = ETF_ELF, .bt_byteorder = ELFDATA2LSB, .bt_elfclass = ELFCLASS64, .bt_machine = EM_ALPHA, }, { .bt_name = "elf64-alpha-freebsd", .bt_type = ETF_ELF, .bt_byteorder = ELFDATA2LSB, .bt_elfclass = ELFCLASS64, .bt_machine = EM_ALPHA, .bt_osabi = ELFOSABI_FREEBSD }, { .bt_name = "elf64-big", .bt_type = ETF_ELF, .bt_byteorder = ELFDATA2MSB, .bt_elfclass = ELFCLASS64, }, { .bt_name = "elf64-bigmips", .bt_type = ETF_ELF, .bt_byteorder = ELFDATA2MSB, .bt_elfclass = ELFCLASS64, .bt_machine = EM_MIPS, }, { .bt_name = "elf64-ia64-big", .bt_type = ETF_ELF, .bt_byteorder = ELFDATA2MSB, .bt_elfclass = ELFCLASS64, .bt_machine = EM_IA_64, }, { .bt_name = "elf64-ia64-little", .bt_type = ETF_ELF, .bt_byteorder = ELFDATA2LSB, .bt_elfclass = ELFCLASS64, .bt_machine = EM_IA_64, }, { .bt_name = "elf64-little", .bt_type = ETF_ELF, .bt_byteorder = ELFDATA2LSB, .bt_elfclass = ELFCLASS64, }, { .bt_name = "elf64-littleaarch64", .bt_type = ETF_ELF, .bt_byteorder = ELFDATA2LSB, .bt_elfclass = ELFCLASS64, .bt_machine = EM_AARCH64, }, { .bt_name = "elf64-littlemips", .bt_type = ETF_ELF, .bt_byteorder = ELFDATA2LSB, .bt_elfclass = ELFCLASS64, .bt_machine = EM_MIPS, }, { .bt_name = "elf64-powerpc", .bt_type = ETF_ELF, .bt_byteorder = ELFDATA2MSB, .bt_elfclass = ELFCLASS64, .bt_machine = EM_PPC64, }, { .bt_name = "elf64-powerpc-freebsd", .bt_type = ETF_ELF, .bt_byteorder = ELFDATA2MSB, .bt_elfclass = ELFCLASS64, .bt_machine = EM_PPC64, .bt_osabi = ELFOSABI_FREEBSD, }, { .bt_name = "elf64-powerpcle", .bt_type = ETF_ELF, .bt_byteorder = ELFDATA2LSB, .bt_elfclass = ELFCLASS64, .bt_machine = EM_PPC64, }, { .bt_name = "elf32-riscv", .bt_type = ETF_ELF, .bt_byteorder = ELFDATA2LSB, .bt_elfclass = ELFCLASS32, .bt_machine = EM_RISCV, }, { .bt_name = "elf64-riscv", .bt_type = ETF_ELF, .bt_byteorder = ELFDATA2LSB, .bt_elfclass = ELFCLASS64, .bt_machine = EM_RISCV, }, { .bt_name = "elf64-riscv-freebsd", .bt_type = ETF_ELF, .bt_byteorder = ELFDATA2LSB, .bt_elfclass = ELFCLASS64, .bt_machine = EM_RISCV, .bt_osabi = ELFOSABI_FREEBSD, }, + { + .bt_name = "elf32-loongarch", + .bt_type = ETF_ELF, + .bt_byteorder = ELFDATA2LSB, + .bt_elfclass = ELFCLASS32, + .bt_machine = EM_LOONGARCH, + }, + + { + .bt_name = "elf64-loongarch", + .bt_type = ETF_ELF, + .bt_byteorder = ELFDATA2LSB, + .bt_elfclass = ELFCLASS64, + .bt_machine = EM_LOONGARCH, + }, + + { + .bt_name = "elf64-loongarch-freebsd", + .bt_type = ETF_ELF, + .bt_byteorder = ELFDATA2LSB, + .bt_elfclass = ELFCLASS64, + .bt_machine = EM_LOONGARCH, + .bt_osabi = ELFOSABI_FREEBSD, + }, + { .bt_name = "elf64-sh64", .bt_type = ETF_ELF, .bt_byteorder = ELFDATA2MSB, .bt_elfclass = ELFCLASS64, .bt_machine = EM_SH, }, { .bt_name = "elf64-sh64l", .bt_type = ETF_ELF, .bt_byteorder = ELFDATA2LSB, .bt_elfclass = ELFCLASS64, .bt_machine = EM_SH, }, { .bt_name = "elf64-sh64-nbsd", .bt_type = ETF_ELF, .bt_byteorder = ELFDATA2MSB, .bt_elfclass = ELFCLASS64, .bt_machine = EM_SH, .bt_osabi = ELFOSABI_NETBSD, }, { .bt_name = "elf64-sh64l-nbsd", .bt_type = ETF_ELF, .bt_byteorder = ELFDATA2LSB, .bt_elfclass = ELFCLASS64, .bt_machine = EM_SH, .bt_osabi = ELFOSABI_NETBSD, }, { .bt_name = "elf64-sh64big-linux", .bt_type = ETF_ELF, .bt_byteorder = ELFDATA2MSB, .bt_elfclass = ELFCLASS64, .bt_machine = EM_SH, .bt_osabi = ELFOSABI_LINUX, }, { .bt_name = "elf64-sh64-linux", .bt_type = ETF_ELF, .bt_byteorder = ELFDATA2LSB, .bt_elfclass = ELFCLASS64, .bt_machine = EM_SH, .bt_osabi = ELFOSABI_LINUX, }, { .bt_name = "elf64-sparc", .bt_type = ETF_ELF, .bt_byteorder = ELFDATA2MSB, .bt_elfclass = ELFCLASS64, .bt_machine = EM_SPARCV9, }, { .bt_name = "elf64-sparc-freebsd", .bt_type = ETF_ELF, .bt_byteorder = ELFDATA2MSB, .bt_elfclass = ELFCLASS64, .bt_machine = EM_SPARCV9, .bt_osabi = ELFOSABI_FREEBSD }, { .bt_name = "elf64-tradbigmips", .bt_type = ETF_ELF, .bt_byteorder = ELFDATA2MSB, .bt_elfclass = ELFCLASS64, .bt_machine = EM_MIPS, }, { .bt_name = "elf64-tradlittlemips", .bt_type = ETF_ELF, .bt_byteorder = ELFDATA2LSB, .bt_elfclass = ELFCLASS64, .bt_machine = EM_MIPS, }, { .bt_name = "elf64-x86-64", .bt_type = ETF_ELF, .bt_byteorder = ELFDATA2LSB, .bt_elfclass = ELFCLASS64, .bt_machine = EM_X86_64, }, { .bt_name = "elf64-x86-64-freebsd", .bt_type = ETF_ELF, .bt_byteorder = ELFDATA2LSB, .bt_elfclass = ELFCLASS64, .bt_machine = EM_X86_64, .bt_osabi = ELFOSABI_FREEBSD }, { .bt_name = "ihex", .bt_type = ETF_IHEX, }, { .bt_name = "srec", .bt_type = ETF_SREC, }, { .bt_name = "symbolsrec", .bt_type = ETF_SREC, }, { .bt_name = "efi-app-ia32", .bt_type = ETF_EFI, .bt_machine = EM_386, }, { .bt_name = "efi-app-x86_64", .bt_type = ETF_EFI, .bt_machine = EM_X86_64, }, + { + .bt_name = "efi-app-loongarch64", + .bt_type = ETF_EFI, + .bt_machine = EM_LOONGARCH, + }, + { .bt_name = "pei-i386", .bt_type = ETF_PE, .bt_machine = EM_386, }, { .bt_name = "pei-x86-64", .bt_type = ETF_PE, .bt_machine = EM_X86_64, }, { .bt_name = NULL, .bt_type = ETF_NONE, }, }; diff --git a/contrib/elftoolchain/libpe/pe.h b/contrib/elftoolchain/libpe/pe.h index 33969ed8a3e1..b2719d403518 100644 --- a/contrib/elftoolchain/libpe/pe.h +++ b/contrib/elftoolchain/libpe/pe.h @@ -1,295 +1,297 @@ /*- * Copyright (c) 2015 Kai Wang * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * $Id: pe.h 3441 2016-04-07 15:04:20Z emaste $ */ #ifndef _PE_H_ #define _PE_H_ #include /* * MS-DOS header. */ typedef struct _PE_DosHdr { char dh_magic[2]; uint16_t dh_lastsize; uint16_t dh_nblock; uint16_t dh_nreloc; uint16_t dh_hdrsize; uint16_t dh_minalloc; uint16_t dh_maxalloc; uint16_t dh_ss; uint16_t dh_sp; uint16_t dh_checksum; uint16_t dh_ip; uint16_t dh_cs; uint16_t dh_relocpos; uint16_t dh_noverlay; uint16_t dh_reserved1[4]; uint16_t dh_oemid; uint16_t dh_oeminfo; uint16_t dh_reserved2[10]; uint32_t dh_lfanew; } PE_DosHdr; /* * Rich header. */ typedef struct _PE_RichHdr { uint32_t rh_xor; uint32_t rh_total; uint32_t *rh_compid; uint32_t *rh_cnt; } PE_RichHdr; /* * COFF header: Machine Types. */ #define IMAGE_FILE_MACHINE_UNKNOWN 0x0 /* not specified */ #define IMAGE_FILE_MACHINE_AM33 0x1d3 /* Matsushita AM33 */ #define IMAGE_FILE_MACHINE_AMD64 0x8664 /* x86-64 */ #define IMAGE_FILE_MACHINE_ARM 0x1c0 /* ARM LE */ #define IMAGE_FILE_MACHINE_ARMNT 0x1c4 /* ARMv7(or higher) Thumb */ #define IMAGE_FILE_MACHINE_ARM64 0xaa64 /* ARMv8 64-bit */ #define IMAGE_FILE_MACHINE_EBC 0xebc /* EFI byte code */ #define IMAGE_FILE_MACHINE_I386 0x14c /* x86 */ #define IMAGE_FILE_MACHINE_IA64 0x200 /* IA64 */ +#define IMAGE_FILE_MACHINE_LOONGARCH32 0x6232 /* LoongArch 32-bit */ +#define IMAGE_FILE_MACHINE_LOONGARCH64 0x6264 /* LoongArch 64-bit */ #define IMAGE_FILE_MACHINE_M32R 0x9041 /* Mitsubishi M32R LE */ #define IMAGE_FILE_MACHINE_MIPS16 0x266 /* MIPS16 */ #define IMAGE_FILE_MACHINE_MIPSFPU 0x366 /* MIPS with FPU */ #define IMAGE_FILE_MACHINE_MIPSFPU16 0x466 /* MIPS16 with FPU */ #define IMAGE_FILE_MACHINE_POWERPC 0x1f0 /* Power PC LE */ #define IMAGE_FILE_MACHINE_POWERPCFP 0x1f1 /* Power PC floating point */ #define IMAGE_FILE_MACHINE_R4000 0x166 /* MIPS R4000 LE */ #define IMAGE_FILE_MACHINE_RISCV32 0x5032 /* RISC-V 32-bit */ #define IMAGE_FILE_MACHINE_RISCV64 0x5064 /* RISC-V 64-bit */ #define IMAGE_FILE_MACHINE_RISCV128 0x5128 /* RISC-V 128-bit */ #define IMAGE_FILE_MACHINE_SH3 0x1a2 /* Hitachi SH3 */ #define IMAGE_FILE_MACHINE_SH3DSP 0x1a3 /* Hitachi SH3 DSP */ #define IMAGE_FILE_MACHINE_SH4 0x1a6 /* Hitachi SH4 */ #define IMAGE_FILE_MACHINE_SH5 0x1a8 /* Hitachi SH5 */ #define IMAGE_FILE_MACHINE_THUMB 0x1c2 /* ARM or Thumb interworking */ #define IMAGE_FILE_MACHINE_WCEMIPSV2 0x169 /* MIPS LE WCE v2 */ /* * COFF header: Characteristics */ #define IMAGE_FILE_RELOCS_STRIPPED 0x0001 #define IMAGE_FILE_EXECUTABLE_IMAGE 0x0002 #define IMAGE_FILE_LINE_NUMS_STRIPPED 0x0004 #define IMAGE_FILE_LOCAL_SYMS_STRIPPED 0x0008 #define IMAGE_FILE_AGGRESSIVE_WS_TRIM 0x0010 #define IMAGE_FILE_LARGE_ADDRESS_AWARE 0x0020 #define IMAGE_FILE_BYTES_REVERSED_LO 0x0080 #define IMAGE_FILE_32BIT_MACHINE 0x0100 #define IMAGE_FILE_DEBUG_STRIPPED 0x0200 #define IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP 0x0400 #define IMAGE_FILE_NET_RUN_FROM_SWAP 0x0800 #define IMAGE_FILE_SYSTEM 0x1000 #define IMAGE_FILE_DLL 0x2000 #define IMAGE_FILE_UP_SYSTEM_ONLY 0x4000 #define IMAGE_FILE_BYTES_REVERSED_HI 0x8000 /* * COFF Header. */ typedef struct _PE_CoffHdr { uint16_t ch_machine; uint16_t ch_nsec; uint32_t ch_timestamp; uint32_t ch_symptr; uint32_t ch_nsym; uint16_t ch_optsize; uint16_t ch_char; } PE_CoffHdr; /* * Optional Header: Subsystem. */ #define IMAGE_SUBSYSTEM_UNKNOWN 0 #define IMAGE_SUBSYSTEM_NATIVE 1 #define IMAGE_SUBSYSTEM_WINDOWS_GUI 2 #define IMAGE_SUBSYSTEM_WINDOWS_CUI 3 #define IMAGE_SUBSYSTEM_POSIX_CUI 7 #define IMAGE_SUBSYSTEM_WINDOWS_CE_GUI 9 #define IMAGE_SUBSYSTEM_EFI_APPLICATION 10 #define IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER 11 #define IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER 12 #define IMAGE_SUBSYSTEM_EFI_ROM 13 #define IMAGE_SUBSYSTEM_XBOX 14 /* * Optional Header: DLL Characteristics */ #define IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE 0x0040 #define IMAGE_DLL_CHARACTERISTICS_FORCE_INTEGRITY 0x0080 #define IMAGE_DLL_CHARACTERISTICS_NX_COMPAT 0x0100 #define IMAGE_DLL_CHARACTERISTICS_NO_ISOLATION 0x0200 #define IMAGE_DLL_CHARACTERISTICS_NO_SEH 0x0400 #define IMAGE_DLL_CHARACTERISTICS_NO_BIND 0x0800 #define IMAGE_DLL_CHARACTERISTICS_WDM_DRIVER 0x2000 #define IMAGE_DLL_CHARACTERISTICS_TERMINAL_SERVER_AWARE 0x8000 /* * Optional Header. */ #define PE_FORMAT_ROM 0x107 #define PE_FORMAT_32 0x10b #define PE_FORMAT_32P 0x20b typedef struct _PE_OptHdr { uint16_t oh_magic; uint8_t oh_ldvermajor; uint8_t oh_ldverminor; uint32_t oh_textsize; uint32_t oh_datasize; uint32_t oh_bsssize; uint32_t oh_entry; uint32_t oh_textbase; uint32_t oh_database; uint64_t oh_imgbase; uint32_t oh_secalign; uint32_t oh_filealign; uint16_t oh_osvermajor; uint16_t oh_osverminor; uint16_t oh_imgvermajor; uint16_t oh_imgverminor; uint16_t oh_subvermajor; uint16_t oh_subverminor; uint32_t oh_win32ver; uint32_t oh_imgsize; uint32_t oh_hdrsize; uint32_t oh_checksum; uint16_t oh_subsystem; uint16_t oh_dllchar; uint64_t oh_stacksizer; uint64_t oh_stacksizec; uint64_t oh_heapsizer; uint64_t oh_heapsizec; uint32_t oh_ldrflags; uint32_t oh_ndatadir; } PE_OptHdr; /* * Optional Header: Data Directories. */ #define PE_DD_EXPORT 0 #define PE_DD_IMPORT 1 #define PE_DD_RESROUCE 2 #define PE_DD_EXCEPTION 3 #define PE_DD_CERTIFICATE 4 #define PE_DD_BASERELOC 5 #define PE_DD_DEBUG 6 #define PE_DD_ARCH 7 #define PE_DD_GLOBALPTR 8 #define PE_DD_TLS 9 #define PE_DD_LOADCONFIG 10 #define PE_DD_BOUNDIMPORT 11 #define PE_DD_IAT 12 #define PE_DD_DELAYIMPORT 13 #define PE_DD_CLRRUNTIME 14 #define PE_DD_RESERVED 15 #define PE_DD_MAX 16 typedef struct _PE_DataDirEntry { uint32_t de_addr; uint32_t de_size; } PE_DataDirEntry; typedef struct _PE_DataDir { PE_DataDirEntry dd_e[PE_DD_MAX]; uint32_t dd_total; } PE_DataDir; /* * Section Headers: Section flags. */ #define IMAGE_SCN_TYPE_NO_PAD 0x00000008 #define IMAGE_SCN_CNT_CODE 0x00000020 #define IMAGE_SCN_CNT_INITIALIZED_DATA 0x00000040 #define IMAGE_SCN_CNT_UNINITIALIZED_DATA 0x00000080 #define IMAGE_SCN_LNK_OTHER 0x00000100 #define IMAGE_SCN_LNK_INFO 0x00000200 #define IMAGE_SCN_LNK_REMOVE 0x00000800 #define IMAGE_SCN_LNK_COMDAT 0x00001000 #define IMAGE_SCN_GPREL 0x00008000 #define IMAGE_SCN_MEM_PURGEABLE 0x00020000 #define IMAGE_SCN_MEM_16BIT 0x00020000 #define IMAGE_SCN_MEM_LOCKED 0x00040000 #define IMAGE_SCN_MEM_PRELOAD 0x00080000 #define IMAGE_SCN_ALIGN_1BYTES 0x00100000 #define IMAGE_SCN_ALIGN_2BYTES 0x00200000 #define IMAGE_SCN_ALIGN_4BYTES 0x00300000 #define IMAGE_SCN_ALIGN_8BYTES 0x00400000 #define IMAGE_SCN_ALIGN_16BYTES 0x00500000 #define IMAGE_SCN_ALIGN_32BYTES 0x00600000 #define IMAGE_SCN_ALIGN_64BYTES 0x00700000 #define IMAGE_SCN_ALIGN_128BYTES 0x00800000 #define IMAGE_SCN_ALIGN_256BYTES 0x00900000 #define IMAGE_SCN_ALIGN_512BYTES 0x00A00000 #define IMAGE_SCN_ALIGN_1024BYTES 0x00B00000 #define IMAGE_SCN_ALIGN_2048BYTES 0x00C00000 #define IMAGE_SCN_ALIGN_4096BYTES 0x00D00000 #define IMAGE_SCN_ALIGN_8192BYTES 0x00E00000 #define IMAGE_SCN_LNK_NRELOC_OVFL 0x01000000 #define IMAGE_SCN_MEM_DISCARDABLE 0x02000000 #define IMAGE_SCN_MEM_NOT_CACHED 0x04000000 #define IMAGE_SCN_MEM_NOT_PAGED 0x08000000 #define IMAGE_SCN_MEM_SHARED 0x10000000 #define IMAGE_SCN_MEM_EXECUTE 0x20000000 #define IMAGE_SCN_MEM_READ 0x40000000 #define IMAGE_SCN_MEM_WRITE 0x80000000 /* * Section Headers. */ typedef struct _PE_SecHdr { char sh_name[8]; uint32_t sh_virtsize; uint32_t sh_addr; uint32_t sh_rawsize; uint32_t sh_rawptr; uint32_t sh_relocptr; uint32_t sh_lineptr; uint16_t sh_nreloc; uint16_t sh_nline; uint32_t sh_char; } PE_SecHdr; #endif /* !_PE_H_ */