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