1*4d9fdb46SRobert Mustacchi /*
2*4d9fdb46SRobert Mustacchi Copyright (c) 2018, David Anderson
3*4d9fdb46SRobert Mustacchi All rights reserved.
4*4d9fdb46SRobert Mustacchi 
5*4d9fdb46SRobert Mustacchi Redistribution and use in source and binary forms, with
6*4d9fdb46SRobert Mustacchi or without modification, are permitted provided that the
7*4d9fdb46SRobert Mustacchi following conditions are met:
8*4d9fdb46SRobert Mustacchi 
9*4d9fdb46SRobert Mustacchi     Redistributions of source code must retain the above
10*4d9fdb46SRobert Mustacchi     copyright notice, this list of conditions and the following
11*4d9fdb46SRobert Mustacchi     disclaimer.
12*4d9fdb46SRobert Mustacchi 
13*4d9fdb46SRobert Mustacchi     Redistributions in binary form must reproduce the above
14*4d9fdb46SRobert Mustacchi     copyright notice, this list of conditions and the following
15*4d9fdb46SRobert Mustacchi     disclaimer in the documentation and/or other materials
16*4d9fdb46SRobert Mustacchi     provided with the distribution.
17*4d9fdb46SRobert Mustacchi 
18*4d9fdb46SRobert Mustacchi THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
19*4d9fdb46SRobert Mustacchi CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
20*4d9fdb46SRobert Mustacchi INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
21*4d9fdb46SRobert Mustacchi OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22*4d9fdb46SRobert Mustacchi ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
23*4d9fdb46SRobert Mustacchi CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24*4d9fdb46SRobert Mustacchi SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
25*4d9fdb46SRobert Mustacchi NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
26*4d9fdb46SRobert Mustacchi LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27*4d9fdb46SRobert Mustacchi HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28*4d9fdb46SRobert Mustacchi CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
29*4d9fdb46SRobert Mustacchi OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
30*4d9fdb46SRobert Mustacchi EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31*4d9fdb46SRobert Mustacchi 
32*4d9fdb46SRobert Mustacchi */
33*4d9fdb46SRobert Mustacchi #ifndef DWARF_MACHOREAD_H
34*4d9fdb46SRobert Mustacchi #define DWARF_MACHOREAD_H
35*4d9fdb46SRobert Mustacchi 
36*4d9fdb46SRobert Mustacchi #ifdef __cplusplus
37*4d9fdb46SRobert Mustacchi extern "C" {
38*4d9fdb46SRobert Mustacchi #endif /* __cplusplus */
39*4d9fdb46SRobert Mustacchi 
40*4d9fdb46SRobert Mustacchi struct generic_macho_header {
41*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned   magic;
42*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned   cputype;
43*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned   cpusubtype;
44*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned   filetype;
45*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned   ncmds;      /* number of load commands */
46*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned   sizeofcmds; /* the size of all the load commands */
47*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned   flags;
48*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned   reserved;
49*4d9fdb46SRobert Mustacchi };
50*4d9fdb46SRobert Mustacchi struct generic_macho_command {
51*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned   cmd;
52*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned   cmdsize;
53*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned   offset_this_command;
54*4d9fdb46SRobert Mustacchi };
55*4d9fdb46SRobert Mustacchi 
56*4d9fdb46SRobert Mustacchi struct generic_macho_segment_command {
57*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned   cmd;
58*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned   cmdsize;
59*4d9fdb46SRobert Mustacchi     char             segname[24];
60*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned   vmaddr;
61*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned   vmsize;
62*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned   fileoff;
63*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned   filesize;
64*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned   maxprot;
65*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned   initprot;
66*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned   nsects;
67*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned   flags;
68*4d9fdb46SRobert Mustacchi 
69*4d9fdb46SRobert Mustacchi     /* our index into mo_commands */
70*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned   macho_command_index;
71*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned   sectionsoffset;
72*4d9fdb46SRobert Mustacchi };
73*4d9fdb46SRobert Mustacchi 
74*4d9fdb46SRobert Mustacchi struct generic_macho_section {
75*4d9fdb46SRobert Mustacchi     /* Larger than in file, room for NUL guaranteed */
76*4d9fdb46SRobert Mustacchi     char          sectname[24];
77*4d9fdb46SRobert Mustacchi     char          segname[24];
78*4d9fdb46SRobert Mustacchi     const char *  dwarfsectname;
79*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned  addr;
80*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned  size;
81*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned  offset;
82*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned  align;
83*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned  reloff;
84*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned  nreloc;
85*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned  flags;
86*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned  reserved1;
87*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned  reserved2;
88*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned  reserved3;
89*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned  generic_segment_num;
90*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned  offset_of_sec_rec;
91*4d9fdb46SRobert Mustacchi     Dwarf_Small*  loaded_data;
92*4d9fdb46SRobert Mustacchi };
93*4d9fdb46SRobert Mustacchi 
94*4d9fdb46SRobert Mustacchi 
95*4d9fdb46SRobert Mustacchi /*  ident[0] == 'M' means this is a macho header.
96*4d9fdb46SRobert Mustacchi     ident[1] will be 1 indicating version 1.
97*4d9fdb46SRobert Mustacchi     Other bytes in ident not defined, should be zero. */
98*4d9fdb46SRobert Mustacchi typedef struct dwarf_macho_filedata_s {
99*4d9fdb46SRobert Mustacchi     char             mo_ident[8];
100*4d9fdb46SRobert Mustacchi     const char *     mo_path; /* libdwarf must free.*/
101*4d9fdb46SRobert Mustacchi     int              mo_fd;
102*4d9fdb46SRobert Mustacchi     int              mo_destruct_close_fd; /*aka: lib owns fd */
103*4d9fdb46SRobert Mustacchi     int              mo_is_64bit;
104*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned   mo_filesize;
105*4d9fdb46SRobert Mustacchi     Dwarf_Small      mo_offsetsize; /* 32 or 64 section data */
106*4d9fdb46SRobert Mustacchi     Dwarf_Small      mo_pointersize;
107*4d9fdb46SRobert Mustacchi     int              mo_ftype;
108*4d9fdb46SRobert Mustacchi     Dwarf_Endianness mo_endian;
109*4d9fdb46SRobert Mustacchi     /*Dwarf_Small      mo_machine; */
110*4d9fdb46SRobert Mustacchi     void (*mo_copy_word) (void *, const void *, unsigned long);
111*4d9fdb46SRobert Mustacchi 
112*4d9fdb46SRobert Mustacchi     /* Used to hold 32 and 64 header data */
113*4d9fdb46SRobert Mustacchi     struct generic_macho_header mo_header;
114*4d9fdb46SRobert Mustacchi 
115*4d9fdb46SRobert Mustacchi     unsigned mo_command_count;
116*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned  mo_command_start_offset;
117*4d9fdb46SRobert Mustacchi     struct generic_macho_command *mo_commands;
118*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned  mo_offset_after_commands;
119*4d9fdb46SRobert Mustacchi 
120*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned mo_segment_count;
121*4d9fdb46SRobert Mustacchi     struct generic_macho_segment_command *mo_segment_commands;
122*4d9fdb46SRobert Mustacchi 
123*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned mo_dwarf_sectioncount;
124*4d9fdb46SRobert Mustacchi     struct generic_macho_section *mo_dwarf_sections;
125*4d9fdb46SRobert Mustacchi } dwarf_macho_object_access_internals_t;
126*4d9fdb46SRobert Mustacchi 
127*4d9fdb46SRobert Mustacchi int dwarf_load_macho_header(dwarf_macho_object_access_internals_t * mfp,
128*4d9fdb46SRobert Mustacchi     int *errcode);
129*4d9fdb46SRobert Mustacchi int dwarf_load_macho_commands(dwarf_macho_object_access_internals_t * mfp,
130*4d9fdb46SRobert Mustacchi     int *errcode);
131*4d9fdb46SRobert Mustacchi 
132*4d9fdb46SRobert Mustacchi #ifdef __cplusplus
133*4d9fdb46SRobert Mustacchi }
134*4d9fdb46SRobert Mustacchi #endif /* __cplusplus */
135*4d9fdb46SRobert Mustacchi #endif /* DWARF_MACHOREAD_H */
136