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