1*4d9fdb46SRobert Mustacchi /* Copyright (c) 2013-2019, David Anderson 2*4d9fdb46SRobert Mustacchi All rights reserved. 3*4d9fdb46SRobert Mustacchi 4*4d9fdb46SRobert Mustacchi Redistribution and use in source and binary forms, with 5*4d9fdb46SRobert Mustacchi or without modification, are permitted provided that the 6*4d9fdb46SRobert Mustacchi following conditions are met: 7*4d9fdb46SRobert Mustacchi 8*4d9fdb46SRobert Mustacchi Redistributions of source code must retain the above 9*4d9fdb46SRobert Mustacchi copyright notice, this list of conditions and the following 10*4d9fdb46SRobert Mustacchi disclaimer. 11*4d9fdb46SRobert Mustacchi 12*4d9fdb46SRobert Mustacchi Redistributions in binary form must reproduce the above 13*4d9fdb46SRobert Mustacchi copyright notice, this list of conditions and the following 14*4d9fdb46SRobert Mustacchi disclaimer in the documentation and/or other materials 15*4d9fdb46SRobert Mustacchi provided with the distribution. 16*4d9fdb46SRobert Mustacchi 17*4d9fdb46SRobert Mustacchi THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 18*4d9fdb46SRobert Mustacchi CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, 19*4d9fdb46SRobert Mustacchi INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 20*4d9fdb46SRobert Mustacchi OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 21*4d9fdb46SRobert Mustacchi ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR 22*4d9fdb46SRobert Mustacchi CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23*4d9fdb46SRobert Mustacchi SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 24*4d9fdb46SRobert Mustacchi NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 25*4d9fdb46SRobert Mustacchi LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 26*4d9fdb46SRobert Mustacchi HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27*4d9fdb46SRobert Mustacchi CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 28*4d9fdb46SRobert Mustacchi OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, 29*4d9fdb46SRobert Mustacchi EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30*4d9fdb46SRobert Mustacchi 31*4d9fdb46SRobert Mustacchi */ 32*4d9fdb46SRobert Mustacchi #ifndef READELFOBJ_H 33*4d9fdb46SRobert Mustacchi #define READELFOBJ_H 34*4d9fdb46SRobert Mustacchi 35*4d9fdb46SRobert Mustacchi #ifdef __cplusplus 36*4d9fdb46SRobert Mustacchi extern "C" { 37*4d9fdb46SRobert Mustacchi #endif /* __cplusplus */ 38*4d9fdb46SRobert Mustacchi 39*4d9fdb46SRobert Mustacchi 40*4d9fdb46SRobert Mustacchi /* Use this for .rel. too. */ 41*4d9fdb46SRobert Mustacchi struct generic_rela { 42*4d9fdb46SRobert Mustacchi Dwarf_Unsigned gr_offset; 43*4d9fdb46SRobert Mustacchi Dwarf_Unsigned gr_info; 44*4d9fdb46SRobert Mustacchi Dwarf_Unsigned gr_sym; /* From info */ 45*4d9fdb46SRobert Mustacchi Dwarf_Unsigned gr_type; /* From info */ 46*4d9fdb46SRobert Mustacchi Dwarf_Signed gr_addend; 47*4d9fdb46SRobert Mustacchi unsigned char gr_type2; /*MIPS64*/ 48*4d9fdb46SRobert Mustacchi unsigned char gr_type3; /*MIPS64*/ 49*4d9fdb46SRobert Mustacchi /* The following TRUE if .rela. and FALSE if .rel. 50*4d9fdb46SRobert Mustacchi if FALSE, gr_addend will be zero. */ 51*4d9fdb46SRobert Mustacchi int gr_is_rela; 52*4d9fdb46SRobert Mustacchi }; 53*4d9fdb46SRobert Mustacchi 54*4d9fdb46SRobert Mustacchi /* The following are generic to simplify handling 55*4d9fdb46SRobert Mustacchi Elf32 and Elf64. Some fields added where 56*4d9fdb46SRobert Mustacchi the two sizes have different extraction code. */ 57*4d9fdb46SRobert Mustacchi struct generic_ehdr { 58*4d9fdb46SRobert Mustacchi unsigned char ge_ident[EI_NIDENT]; 59*4d9fdb46SRobert Mustacchi Dwarf_Unsigned ge_type; 60*4d9fdb46SRobert Mustacchi Dwarf_Unsigned ge_machine; 61*4d9fdb46SRobert Mustacchi Dwarf_Unsigned ge_version; 62*4d9fdb46SRobert Mustacchi Dwarf_Unsigned ge_entry; 63*4d9fdb46SRobert Mustacchi Dwarf_Unsigned ge_phoff; 64*4d9fdb46SRobert Mustacchi Dwarf_Unsigned ge_shoff; 65*4d9fdb46SRobert Mustacchi Dwarf_Unsigned ge_flags; 66*4d9fdb46SRobert Mustacchi Dwarf_Unsigned ge_ehsize; 67*4d9fdb46SRobert Mustacchi Dwarf_Unsigned ge_phentsize; 68*4d9fdb46SRobert Mustacchi Dwarf_Unsigned ge_phnum; 69*4d9fdb46SRobert Mustacchi Dwarf_Unsigned ge_shentsize; 70*4d9fdb46SRobert Mustacchi Dwarf_Unsigned ge_shnum; 71*4d9fdb46SRobert Mustacchi Dwarf_Unsigned ge_shstrndx; 72*4d9fdb46SRobert Mustacchi }; 73*4d9fdb46SRobert Mustacchi struct generic_phdr { 74*4d9fdb46SRobert Mustacchi Dwarf_Unsigned gp_type; 75*4d9fdb46SRobert Mustacchi Dwarf_Unsigned gp_flags; 76*4d9fdb46SRobert Mustacchi Dwarf_Unsigned gp_offset; 77*4d9fdb46SRobert Mustacchi Dwarf_Unsigned gp_vaddr; 78*4d9fdb46SRobert Mustacchi Dwarf_Unsigned gp_paddr; 79*4d9fdb46SRobert Mustacchi Dwarf_Unsigned gp_filesz; 80*4d9fdb46SRobert Mustacchi Dwarf_Unsigned gp_memsz; 81*4d9fdb46SRobert Mustacchi Dwarf_Unsigned gp_align; 82*4d9fdb46SRobert Mustacchi }; 83*4d9fdb46SRobert Mustacchi struct generic_shdr { 84*4d9fdb46SRobert Mustacchi Dwarf_Unsigned gh_secnum; 85*4d9fdb46SRobert Mustacchi Dwarf_Unsigned gh_name; 86*4d9fdb46SRobert Mustacchi const char * gh_namestring; 87*4d9fdb46SRobert Mustacchi Dwarf_Unsigned gh_type; 88*4d9fdb46SRobert Mustacchi Dwarf_Unsigned gh_flags; 89*4d9fdb46SRobert Mustacchi Dwarf_Unsigned gh_addr; 90*4d9fdb46SRobert Mustacchi Dwarf_Unsigned gh_offset; 91*4d9fdb46SRobert Mustacchi Dwarf_Unsigned gh_size; 92*4d9fdb46SRobert Mustacchi Dwarf_Unsigned gh_link; 93*4d9fdb46SRobert Mustacchi /* Section index (in an SHT_REL or SHT_RELA section) 94*4d9fdb46SRobert Mustacchi of the target section from gh_link. Otherwise 0. */ 95*4d9fdb46SRobert Mustacchi Dwarf_Unsigned gh_reloc_target_secnum; 96*4d9fdb46SRobert Mustacchi Dwarf_Unsigned gh_info; 97*4d9fdb46SRobert Mustacchi Dwarf_Unsigned gh_addralign; 98*4d9fdb46SRobert Mustacchi Dwarf_Unsigned gh_entsize; 99*4d9fdb46SRobert Mustacchi 100*4d9fdb46SRobert Mustacchi /* Zero unless content read in. Malloc space 101*4d9fdb46SRobert Mustacchi of size gh_size, in bytes. For dwarf 102*4d9fdb46SRobert Mustacchi and strings mainly. free() this if not null*/ 103*4d9fdb46SRobert Mustacchi char * gh_content; 104*4d9fdb46SRobert Mustacchi 105*4d9fdb46SRobert Mustacchi /* If a .rel or .rela section this will point 106*4d9fdb46SRobert Mustacchi to generic relocation records if such 107*4d9fdb46SRobert Mustacchi have been loaded. 108*4d9fdb46SRobert Mustacchi free() this if not null. */ 109*4d9fdb46SRobert Mustacchi Dwarf_Unsigned gh_relcount; 110*4d9fdb46SRobert Mustacchi struct generic_rela * gh_rels; 111*4d9fdb46SRobert Mustacchi 112*4d9fdb46SRobert Mustacchi /* For SHT_GROUP based grouping, which 113*4d9fdb46SRobert Mustacchi group is this section in. 0 unknown, 114*4d9fdb46SRobert Mustacchi 1 DW_GROUP_NUMBER_BASE base DWARF, 115*4d9fdb46SRobert Mustacchi 2 DW_GROUPNUMBER_DWO dwo sections, 3+ 116*4d9fdb46SRobert Mustacchi are in an SHT_GROUP. GNU uses this. 117*4d9fdb46SRobert Mustacchi set with group number (3+) from SHT_GROUP 118*4d9fdb46SRobert Mustacchi and the flags should have SHF_GROUP set 119*4d9fdb46SRobert Mustacchi if in SHT_GROUP. Must only be in one group? */ 120*4d9fdb46SRobert Mustacchi Dwarf_Unsigned gh_section_group_number; 121*4d9fdb46SRobert Mustacchi 122*4d9fdb46SRobert Mustacchi /* Content of an SHT_GROUP section as an array 123*4d9fdb46SRobert Mustacchi of integers. [0] is the version, which 124*4d9fdb46SRobert Mustacchi can only be one(1) . */ 125*4d9fdb46SRobert Mustacchi Dwarf_Unsigned * gh_sht_group_array; 126*4d9fdb46SRobert Mustacchi /* Number of elements in the gh_sht_group_array. */ 127*4d9fdb46SRobert Mustacchi Dwarf_Unsigned gh_sht_group_array_count; 128*4d9fdb46SRobert Mustacchi 129*4d9fdb46SRobert Mustacchi /* TRUE if .debug_info .eh_frame etc. */ 130*4d9fdb46SRobert Mustacchi char gh_is_dwarf; 131*4d9fdb46SRobert Mustacchi }; 132*4d9fdb46SRobert Mustacchi 133*4d9fdb46SRobert Mustacchi struct generic_dynentry { 134*4d9fdb46SRobert Mustacchi Dwarf_Unsigned gd_tag; 135*4d9fdb46SRobert Mustacchi /* gd_val stands in for d_ptr and d_val union, 136*4d9fdb46SRobert Mustacchi the union adds nothing in practice since 137*4d9fdb46SRobert Mustacchi we expect ptrsize <= ulongest. */ 138*4d9fdb46SRobert Mustacchi Dwarf_Unsigned gd_val; 139*4d9fdb46SRobert Mustacchi Dwarf_Unsigned gd_dyn_file_offset; 140*4d9fdb46SRobert Mustacchi }; 141*4d9fdb46SRobert Mustacchi 142*4d9fdb46SRobert Mustacchi struct generic_symentry { 143*4d9fdb46SRobert Mustacchi Dwarf_Unsigned gs_name; 144*4d9fdb46SRobert Mustacchi Dwarf_Unsigned gs_value; 145*4d9fdb46SRobert Mustacchi Dwarf_Unsigned gs_size; 146*4d9fdb46SRobert Mustacchi Dwarf_Unsigned gs_info; 147*4d9fdb46SRobert Mustacchi Dwarf_Unsigned gs_other; 148*4d9fdb46SRobert Mustacchi Dwarf_Unsigned gs_shndx; 149*4d9fdb46SRobert Mustacchi /* derived */ 150*4d9fdb46SRobert Mustacchi Dwarf_Unsigned gs_bind; 151*4d9fdb46SRobert Mustacchi Dwarf_Unsigned gs_type; 152*4d9fdb46SRobert Mustacchi }; 153*4d9fdb46SRobert Mustacchi 154*4d9fdb46SRobert Mustacchi struct location { 155*4d9fdb46SRobert Mustacchi const char *g_name; 156*4d9fdb46SRobert Mustacchi Dwarf_Unsigned g_offset; 157*4d9fdb46SRobert Mustacchi Dwarf_Unsigned g_count; 158*4d9fdb46SRobert Mustacchi Dwarf_Unsigned g_entrysize; 159*4d9fdb46SRobert Mustacchi Dwarf_Unsigned g_totalsize; 160*4d9fdb46SRobert Mustacchi }; 161*4d9fdb46SRobert Mustacchi 162*4d9fdb46SRobert Mustacchi typedef struct elf_filedata_s { 163*4d9fdb46SRobert Mustacchi /* f_ident[0] == 'E' means it is elf and 164*4d9fdb46SRobert Mustacchi elf_filedata_s is the struct involved. 165*4d9fdb46SRobert Mustacchi Other means error/corruption of some kind. 166*4d9fdb46SRobert Mustacchi f_ident[1] is a version number. 167*4d9fdb46SRobert Mustacchi Only version 1 is defined. */ 168*4d9fdb46SRobert Mustacchi char f_ident[8]; 169*4d9fdb46SRobert Mustacchi char * f_path; /* non-null if known. Must be freed */ 170*4d9fdb46SRobert Mustacchi int f_fd; 171*4d9fdb46SRobert Mustacchi int f_machine; /* EM_* */ 172*4d9fdb46SRobert Mustacchi int f_destruct_close_fd; 173*4d9fdb46SRobert Mustacchi int f_is_64bit; 174*4d9fdb46SRobert Mustacchi unsigned f_endian; 175*4d9fdb46SRobert Mustacchi Dwarf_Unsigned f_filesize; 176*4d9fdb46SRobert Mustacchi /* Elf size, not DWARF. 32 or 64 */ 177*4d9fdb46SRobert Mustacchi Dwarf_Small f_offsetsize; 178*4d9fdb46SRobert Mustacchi Dwarf_Small f_pointersize; 179*4d9fdb46SRobert Mustacchi int f_ftype; 180*4d9fdb46SRobert Mustacchi 181*4d9fdb46SRobert Mustacchi Dwarf_Unsigned f_max_secdata_offset; 182*4d9fdb46SRobert Mustacchi Dwarf_Unsigned f_max_progdata_offset; 183*4d9fdb46SRobert Mustacchi 184*4d9fdb46SRobert Mustacchi void (*f_copy_word) (void *, const void *, unsigned long); 185*4d9fdb46SRobert Mustacchi 186*4d9fdb46SRobert Mustacchi struct location f_loc_ehdr; 187*4d9fdb46SRobert Mustacchi struct generic_ehdr* f_ehdr; 188*4d9fdb46SRobert Mustacchi 189*4d9fdb46SRobert Mustacchi struct location f_loc_shdr; 190*4d9fdb46SRobert Mustacchi struct generic_shdr* f_shdr; 191*4d9fdb46SRobert Mustacchi 192*4d9fdb46SRobert Mustacchi struct location f_loc_phdr; 193*4d9fdb46SRobert Mustacchi struct generic_phdr* f_phdr; 194*4d9fdb46SRobert Mustacchi 195*4d9fdb46SRobert Mustacchi char *f_elf_shstrings_data; /* section name strings */ 196*4d9fdb46SRobert Mustacchi /* length of currentsection. Might be zero..*/ 197*4d9fdb46SRobert Mustacchi Dwarf_Unsigned f_elf_shstrings_length; 198*4d9fdb46SRobert Mustacchi /* size of malloc-d space */ 199*4d9fdb46SRobert Mustacchi Dwarf_Unsigned f_elf_shstrings_max; 200*4d9fdb46SRobert Mustacchi 201*4d9fdb46SRobert Mustacchi /* This is the .dynamic section */ 202*4d9fdb46SRobert Mustacchi struct location f_loc_dynamic; 203*4d9fdb46SRobert Mustacchi struct generic_dynentry * f_dynamic; 204*4d9fdb46SRobert Mustacchi Dwarf_Unsigned f_dynamic_sect_index; 205*4d9fdb46SRobert Mustacchi 206*4d9fdb46SRobert Mustacchi /* .dynsym, .dynstr */ 207*4d9fdb46SRobert Mustacchi struct location f_loc_dynsym; 208*4d9fdb46SRobert Mustacchi struct generic_symentry* f_dynsym; 209*4d9fdb46SRobert Mustacchi char *f_dynsym_sect_strings; 210*4d9fdb46SRobert Mustacchi Dwarf_Unsigned f_dynsym_sect_strings_max; 211*4d9fdb46SRobert Mustacchi Dwarf_Unsigned f_dynsym_sect_strings_sect_index; 212*4d9fdb46SRobert Mustacchi Dwarf_Unsigned f_dynsym_sect_index; 213*4d9fdb46SRobert Mustacchi 214*4d9fdb46SRobert Mustacchi /* .symtab .strtab */ 215*4d9fdb46SRobert Mustacchi struct location f_loc_symtab; 216*4d9fdb46SRobert Mustacchi struct generic_symentry* f_symtab; 217*4d9fdb46SRobert Mustacchi char * f_symtab_sect_strings; 218*4d9fdb46SRobert Mustacchi Dwarf_Unsigned f_symtab_sect_strings_max; 219*4d9fdb46SRobert Mustacchi Dwarf_Unsigned f_symtab_sect_strings_sect_index; 220*4d9fdb46SRobert Mustacchi Dwarf_Unsigned f_symtab_sect_index; 221*4d9fdb46SRobert Mustacchi 222*4d9fdb46SRobert Mustacchi /* Starts at 3. 0,1,2 used specially. */ 223*4d9fdb46SRobert Mustacchi Dwarf_Unsigned f_sg_next_group_number; 224*4d9fdb46SRobert Mustacchi /* Both the following will be zero unless there 225*4d9fdb46SRobert Mustacchi are explicit Elf groups. */ 226*4d9fdb46SRobert Mustacchi Dwarf_Unsigned f_sht_group_type_section_count; 227*4d9fdb46SRobert Mustacchi Dwarf_Unsigned f_shf_group_flag_section_count; 228*4d9fdb46SRobert Mustacchi Dwarf_Unsigned f_dwo_group_section_count; 229*4d9fdb46SRobert Mustacchi } dwarf_elf_object_access_internals_t; 230*4d9fdb46SRobert Mustacchi 231*4d9fdb46SRobert Mustacchi int dwarf_construct_elf_access(int fd, 232*4d9fdb46SRobert Mustacchi const char *path, 233*4d9fdb46SRobert Mustacchi dwarf_elf_object_access_internals_t **ep,int *errcode); 234*4d9fdb46SRobert Mustacchi int dwarf_destruct_elf_access(dwarf_elf_object_access_internals_t *ep,int *errcode); 235*4d9fdb46SRobert Mustacchi int _dwarf_load_elf_header(dwarf_elf_object_access_internals_t *ep,int *errcode); 236*4d9fdb46SRobert Mustacchi int _dwarf_load_elf_sectheaders(dwarf_elf_object_access_internals_t* ep,int *errcode); 237*4d9fdb46SRobert Mustacchi 238*4d9fdb46SRobert Mustacchi int _dwarf_load_elf_symtab_symbols(dwarf_elf_object_access_internals_t *ep,int *errcode); 239*4d9fdb46SRobert Mustacchi int _dwarf_load_elf_symstr( dwarf_elf_object_access_internals_t *ep, int *errcode); 240*4d9fdb46SRobert Mustacchi 241*4d9fdb46SRobert Mustacchi /* These two enums used for type safety in passing 242*4d9fdb46SRobert Mustacchi values. */ 243*4d9fdb46SRobert Mustacchi enum RelocRela { 244*4d9fdb46SRobert Mustacchi RelocIsRela = 1, 245*4d9fdb46SRobert Mustacchi RelocIsRel = 2 246*4d9fdb46SRobert Mustacchi }; 247*4d9fdb46SRobert Mustacchi enum RelocOffsetSize { 248*4d9fdb46SRobert Mustacchi RelocOffset32 = 4, 249*4d9fdb46SRobert Mustacchi RelocOffset64 = 8 250*4d9fdb46SRobert Mustacchi }; 251*4d9fdb46SRobert Mustacchi 252*4d9fdb46SRobert Mustacchi int _dwarf_load_elf_relx(dwarf_elf_object_access_internals_t *ep, 253*4d9fdb46SRobert Mustacchi Dwarf_Unsigned secnum,enum RelocRela,int *errcode); 254*4d9fdb46SRobert Mustacchi 255*4d9fdb46SRobert Mustacchi #ifndef EI_NIDENT 256*4d9fdb46SRobert Mustacchi #define EI_NIDENT 16 257*4d9fdb46SRobert Mustacchi #endif /* EI_NIDENT */ 258*4d9fdb46SRobert Mustacchi 259*4d9fdb46SRobert Mustacchi #ifdef __cplusplus 260*4d9fdb46SRobert Mustacchi } 261*4d9fdb46SRobert Mustacchi #endif /* __cplusplus */ 262*4d9fdb46SRobert Mustacchi 263*4d9fdb46SRobert Mustacchi #endif /* READELFOBJ_H */ 264