1/* LTO routines for Mach-O object files. 2 Copyright 2010 Free Software Foundation, Inc. 3 Contributed by Steven Bosscher. 4 5This file is part of GCC. 6 7GCC is free software; you can redistribute it and/or modify it under 8the terms of the GNU General Public License as published by the Free 9Software Foundation; either version 3, or (at your option) any later 10version. 11 12GCC is distributed in the hope that it will be useful, but WITHOUT ANY 13WARRANTY; without even the implied warranty of MERCHANTABILITY or 14FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 15for more details. 16 17You should have received a copy of the GNU General Public License 18along with GCC; see the file COPYING3. If not see 19<http://www.gnu.org/licenses/>. */ 20 21#ifndef LTO_MACH_O_H 22#define LTO_MACH_O_H 23 24/* On-disk file structures. */ 25 26/* Mach-O header (32 bits version). */ 27struct mach_o_header_32 28{ 29 unsigned char magic[4]; /* Magic number. */ 30 unsigned char cputype[4]; /* CPU that this object is for. */ 31 unsigned char cpusubtype[4]; /* CPU subtype. */ 32 unsigned char filetype[4]; /* Type of file. */ 33 unsigned char ncmds[4]; /* Number of load commands. */ 34 unsigned char sizeofcmds[4]; /* Total size of load commands. */ 35 unsigned char flags[4]; /* Flags for special featues. */ 36}; 37typedef struct mach_o_header_32 mach_o_header_32; 38 39/* Mach-O header (64 bits version). */ 40struct mach_o_header_64 41{ 42 unsigned char magic[4]; /* Magic number. */ 43 unsigned char cputype[4]; /* CPU that this object is for. */ 44 unsigned char cpusubtype[4]; /* CPU subtype. */ 45 unsigned char filetype[4]; /* Type of file. */ 46 unsigned char ncmds[4]; /* Number of load commands. */ 47 unsigned char sizeofcmds[4]; /* Total size of load commands. */ 48 unsigned char flags[4]; /* Flags for special featues. */ 49 unsigned char reserved[4]; /* Reserved. Duh. */ 50}; 51typedef struct mach_o_header_64 mach_o_header_64; 52 53/* Magic number. */ 54#define MACH_O_MH_MAGIC 0xfeedface 55#define MACH_O_MH_CIGAM 0xcefaedfe 56#define MACH_O_MH_MAGIC_64 0xfeedfacf 57#define MACH_O_MH_CIGAM_64 0xcffaedfe 58 59/* Supported CPU types. */ 60#define MACH_O_CPU_TYPE_I386 7 61#define MACH_O_CPU_TYPE_X86_64 7 + 0x1000000 62#define MACH_O_CPU_TYPE_POWERPC 18 63#define MACH_O_CPU_TYPE_POWERPC_64 18 + 0x1000000 64 65/* Supported file types. */ 66#define MACH_O_MH_OBJECT 0x01 67 68/* Mach-O load command data structure. */ 69struct mach_o_load_command 70{ 71 unsigned char cmd[4]; /* The type of load command. */ 72 unsigned char cmdsize[4]; /* Size in bytes of load command data structure. */ 73}; 74typedef struct mach_o_load_command mach_o_load_command; 75 76/* Supported load commands. We support only the segment load commands. */ 77#define MACH_O_LC_SEGMENT 0x01 78#define MACH_O_LC_SEGMENT_64 0x19 79 80/* LC_SEGMENT load command. */ 81struct mach_o_segment_command_32 82{ 83 unsigned char cmd[4]; /* The type of load command (LC_SEGMENT). */ 84 unsigned char cmdsize[4]; /* Size in bytes of load command data structure. */ 85 unsigned char segname[16]; /* Name of this segment. */ 86 unsigned char vmaddr[4]; /* Virtual memory address of this segment. */ 87 unsigned char vmsize[4]; /* Size there, in bytes. */ 88 unsigned char fileoff[4]; /* Offset in bytes of the data to be mapped. */ 89 unsigned char filesize[4]; /* Size in bytes on disk. */ 90 unsigned char maxprot[4]; /* Maximum permitted vmem protection. */ 91 unsigned char initprot[4]; /* Initial vmem protection. */ 92 unsigned char nsects[4]; /* Number of sections in this segment. */ 93 unsigned char flags[4]; /* Flags that affect the loading. */ 94}; 95typedef struct mach_o_segment_command_32 mach_o_segment_command_32; 96 97/* LC_SEGMENT_64 load command. Only nsects matters for us, really. */ 98struct mach_o_segment_command_64 99{ 100 unsigned char cmd[4]; /* The type of load command (LC_SEGMENT_64). */ 101 unsigned char cmdsize[4]; /* Size in bytes of load command data structure. */ 102 unsigned char segname[16]; /* Name of this segment. */ 103 unsigned char vmaddr[8]; /* Virtual memory address of this segment. */ 104 unsigned char vmsize[8]; /* Size there, in bytes. */ 105 unsigned char fileoff[8]; /* Offset in bytes of the data to be mapped. */ 106 unsigned char filesize[8]; /* Size in bytes on disk. */ 107 unsigned char maxprot[4]; /* Maximum permitted vmem protection. */ 108 unsigned char initprot[4]; /* Initial vmem protection. */ 109 unsigned char nsects[4]; /* Number of sections in this segment. */ 110 unsigned char flags[4]; /* Flags that affect the loading. */ 111}; 112typedef struct mach_o_segment_command_64 mach_o_segment_command_64; 113 114/* A Mach-O 32-bits section. */ 115struct mach_o_section_32 116{ 117 unsigned char sectname[16]; /* Section name. */ 118 unsigned char segname[16]; /* Segment that the section belongs to. */ 119 unsigned char addr[4]; /* Address of this section in memory. */ 120 unsigned char size[4]; /* Size in bytes of this section. */ 121 unsigned char offset[4]; /* File offset of this section. */ 122 unsigned char align[4]; /* log2 of this section's alignment. */ 123 unsigned char reloff[4]; /* File offset of this section's relocs. */ 124 unsigned char nreloc[4]; /* Number of relocs for this section. */ 125 unsigned char flags[4]; /* Section flags/attributes. */ 126 unsigned char reserved1[4]; 127 unsigned char reserved2[4]; 128}; 129typedef struct mach_o_section_32 mach_o_section_32; 130 131/* A Mach-O 64-bits section. */ 132struct mach_o_section_64 133{ 134 unsigned char sectname[16]; /* Section name. */ 135 unsigned char segname[16]; /* Segment that the section belongs to. */ 136 unsigned char addr[8]; /* Address of this section in memory. */ 137 unsigned char size[8]; /* Size in bytes of this section. */ 138 unsigned char offset[4]; /* File offset of this section. */ 139 unsigned char align[4]; /* log2 of this section's alignment. */ 140 unsigned char reloff[4]; /* File offset of this section's relocs. */ 141 unsigned char nreloc[4]; /* Number of relocs for this section. */ 142 unsigned char flags[4]; /* Section flags/attributes. */ 143 unsigned char reserved1[4]; 144 unsigned char reserved2[4]; 145 unsigned char reserved3[4]; 146}; 147typedef struct mach_o_section_64 mach_o_section_64; 148 149/* Flags for Mach-O sections. LTO sections are marked with S_ATTR_DEBUG 150 to instruct the linker to ignore the sections. */ 151#define MACH_O_S_ATTR_DEBUG 0x02000000 152 153/* In-memory file structures. */ 154 155/* Section data in output files is made of these. */ 156struct lto_mach_o_data_d 157{ 158 /* Pointer to data block. */ 159 void *d_buf; 160 161 /* Size of data block. */ 162 ssize_t d_size; 163 164 /* Next data block for this section. */ 165 struct lto_mach_o_data_d *next; 166}; 167typedef struct lto_mach_o_data_d *lto_mach_o_data; 168 169/* This struct tracks the data for a section. */ 170struct lto_mach_o_section_d 171{ 172 /* Singly-linked list of section's data blocks. */ 173 lto_mach_o_data data_chain; 174 175 /* Offset in string table of the section name. */ 176 size_t strtab_offs; 177 178 /* Section name. */ 179 const char *name; 180 181 /* Number of trailing padding bytes needed. */ 182 ssize_t pad_needed; 183 184 /* Raw section header data. */ 185 size_t section_size; 186 union { 187 struct { 188 char sectname[16]; 189 char segname[16]; 190 } section; 191 mach_o_section_32 section_32; 192 mach_o_section_64 section_64; 193 } u; 194 195 /* Next section for this file. */ 196 struct lto_mach_o_section_d *next; 197}; 198typedef struct lto_mach_o_section_d *lto_mach_o_section; 199DEF_VEC_P (lto_mach_o_section); 200DEF_VEC_ALLOC_P (lto_mach_o_section, heap); 201 202/* A Mach-O file. */ 203struct lto_mach_o_file_d 204{ 205 /* The base information. */ 206 lto_file base; 207 208 /* Common file members: */ 209 210 /* The system file descriptor for the file. */ 211 int fd; 212 213 /* The file's overall header. */ 214 union { 215 /* We make use here of the fact that section_32 and section_64 216 have the same layout (except for section_64.reserved3). We 217 read the struct of proper size, but only address the first 218 member of this union. */ 219 mach_o_header_64 header; 220 mach_o_header_32 header_32; 221 mach_o_header_64 header_64; 222 } u; 223 224 /* All sections in a varray. */ 225 VEC(lto_mach_o_section, heap) *section_vec; 226 227 /* Readable file members: */ 228 229 /* File total size. */ 230 off_t file_size; 231 232 /* True if this file is open for writing. */ 233 bool writable; 234 235 /* Section containing the __section_names section. */ 236 lto_mach_o_section section_names_section; 237 238 /* Writable file members: */ 239 240 /* The currently active section. */ 241 lto_mach_o_section scn; 242 243 /* Linked list of data which must be freed *after* the file has been 244 closed. This is an annoying limitation of libelf. Which has been 245 faithfully reproduced here. */ 246 struct lto_char_ptr_base *data; 247}; 248typedef struct lto_mach_o_file_d lto_mach_o_file; 249 250#endif /* LTO_MACH_O_H */ 251 252