1 /* Mach-O support for BFD.
2 Copyright 1999-2013 Free Software Foundation, Inc.
4 This file is part of BFD, the Binary File Descriptor library.
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
19 MA 02110-1301, USA. */
25 #include "libiberty.h"
26 #include "aout/stab_gnu.h"
27 #include "mach-o/reloc.h"
28 #include "mach-o/external.h"
33 #define bfd_mach_o_object_p bfd_mach_o_gen_object_p
34 #define bfd_mach_o_core_p bfd_mach_o_gen_core_p
35 #define bfd_mach_o_mkobject bfd_mach_o_gen_mkobject
37 #define FILE_ALIGN(off, algn) \
38 (((off) + ((file_ptr) 1 << (algn)) - 1) & ((file_ptr) -1 << (algn)))
41 bfd_mach_o_version (bfd *abfd)
43 bfd_mach_o_data_struct *mdata = NULL;
45 BFD_ASSERT (bfd_mach_o_valid (abfd));
46 mdata = bfd_mach_o_get_data (abfd);
48 return mdata->header.version;
52 bfd_mach_o_valid (bfd *abfd)
54 if (abfd == NULL || abfd->xvec == NULL)
57 if (abfd->xvec->flavour != bfd_target_mach_o_flavour)
60 if (bfd_mach_o_get_data (abfd) == NULL)
65 static INLINE bfd_boolean
66 mach_o_wide_p (bfd_mach_o_header *header)
68 switch (header->version)
80 static INLINE bfd_boolean
81 bfd_mach_o_wide_p (bfd *abfd)
83 return mach_o_wide_p (&bfd_mach_o_get_data (abfd)->header);
86 /* Tables to translate well known Mach-O segment/section names to bfd
87 names. Use of canonical names (such as .text or .debug_frame) is required
91 static const mach_o_section_name_xlat text_section_names_xlat[] =
94 SEC_CODE | SEC_LOAD, BFD_MACH_O_S_REGULAR,
95 BFD_MACH_O_S_ATTR_PURE_INSTRUCTIONS, 0},
96 { ".const", "__const",
97 SEC_READONLY | SEC_DATA | SEC_LOAD, BFD_MACH_O_S_REGULAR,
98 BFD_MACH_O_S_ATTR_NONE, 0},
99 { ".static_const", "__static_const",
100 SEC_READONLY | SEC_DATA | SEC_LOAD, BFD_MACH_O_S_REGULAR,
101 BFD_MACH_O_S_ATTR_NONE, 0},
102 { ".cstring", "__cstring",
103 SEC_READONLY | SEC_DATA | SEC_LOAD | SEC_MERGE | SEC_STRINGS,
104 BFD_MACH_O_S_CSTRING_LITERALS,
105 BFD_MACH_O_S_ATTR_NONE, 0},
106 { ".literal4", "__literal4",
107 SEC_READONLY | SEC_DATA | SEC_LOAD, BFD_MACH_O_S_4BYTE_LITERALS,
108 BFD_MACH_O_S_ATTR_NONE, 2},
109 { ".literal8", "__literal8",
110 SEC_READONLY | SEC_DATA | SEC_LOAD, BFD_MACH_O_S_8BYTE_LITERALS,
111 BFD_MACH_O_S_ATTR_NONE, 3},
112 { ".literal16", "__literal16",
113 SEC_READONLY | SEC_DATA | SEC_LOAD, BFD_MACH_O_S_16BYTE_LITERALS,
114 BFD_MACH_O_S_ATTR_NONE, 4},
115 { ".constructor", "__constructor",
116 SEC_CODE | SEC_LOAD, BFD_MACH_O_S_REGULAR,
117 BFD_MACH_O_S_ATTR_NONE, 0},
118 { ".destructor", "__destructor",
119 SEC_CODE | SEC_LOAD, BFD_MACH_O_S_REGULAR,
120 BFD_MACH_O_S_ATTR_NONE, 0},
121 { ".eh_frame", "__eh_frame",
122 SEC_READONLY | SEC_DATA | SEC_LOAD, BFD_MACH_O_S_COALESCED,
123 BFD_MACH_O_S_ATTR_LIVE_SUPPORT
124 | BFD_MACH_O_S_ATTR_STRIP_STATIC_SYMS
125 | BFD_MACH_O_S_ATTR_NO_TOC, 2},
126 { NULL, NULL, 0, 0, 0, 0}
129 /* __DATA Segment. */
130 static const mach_o_section_name_xlat data_section_names_xlat[] =
133 SEC_DATA | SEC_LOAD, BFD_MACH_O_S_REGULAR,
134 BFD_MACH_O_S_ATTR_NONE, 0},
136 SEC_NO_FLAGS, BFD_MACH_O_S_ZEROFILL,
137 BFD_MACH_O_S_ATTR_NONE, 0},
138 { ".const_data", "__const",
139 SEC_DATA | SEC_LOAD, BFD_MACH_O_S_REGULAR,
140 BFD_MACH_O_S_ATTR_NONE, 0},
141 { ".static_data", "__static_data",
142 SEC_DATA | SEC_LOAD, BFD_MACH_O_S_REGULAR,
143 BFD_MACH_O_S_ATTR_NONE, 0},
144 { ".mod_init_func", "__mod_init_func",
145 SEC_DATA | SEC_LOAD, BFD_MACH_O_S_MOD_INIT_FUNC_POINTERS,
146 BFD_MACH_O_S_ATTR_NONE, 2},
147 { ".mod_term_func", "__mod_term_func",
148 SEC_DATA | SEC_LOAD, BFD_MACH_O_S_MOD_FINI_FUNC_POINTERS,
149 BFD_MACH_O_S_ATTR_NONE, 2},
151 SEC_DATA | SEC_LOAD, BFD_MACH_O_S_REGULAR,
152 BFD_MACH_O_S_ATTR_NONE, 0},
153 { ".cfstring", "__cfstring",
154 SEC_DATA | SEC_LOAD, BFD_MACH_O_S_REGULAR,
155 BFD_MACH_O_S_ATTR_NONE, 2},
156 { NULL, NULL, 0, 0, 0, 0}
159 /* __DWARF Segment. */
160 static const mach_o_section_name_xlat dwarf_section_names_xlat[] =
162 { ".debug_frame", "__debug_frame",
163 SEC_DEBUGGING, BFD_MACH_O_S_REGULAR,
164 BFD_MACH_O_S_ATTR_DEBUG, 0},
165 { ".debug_info", "__debug_info",
166 SEC_DEBUGGING, BFD_MACH_O_S_REGULAR,
167 BFD_MACH_O_S_ATTR_DEBUG, 0},
168 { ".debug_abbrev", "__debug_abbrev",
169 SEC_DEBUGGING, BFD_MACH_O_S_REGULAR,
170 BFD_MACH_O_S_ATTR_DEBUG, 0},
171 { ".debug_aranges", "__debug_aranges",
172 SEC_DEBUGGING, BFD_MACH_O_S_REGULAR,
173 BFD_MACH_O_S_ATTR_DEBUG, 0},
174 { ".debug_macinfo", "__debug_macinfo",
175 SEC_DEBUGGING, BFD_MACH_O_S_REGULAR,
176 BFD_MACH_O_S_ATTR_DEBUG, 0},
177 { ".debug_line", "__debug_line",
178 SEC_DEBUGGING, BFD_MACH_O_S_REGULAR,
179 BFD_MACH_O_S_ATTR_DEBUG, 0},
180 { ".debug_loc", "__debug_loc",
181 SEC_DEBUGGING, BFD_MACH_O_S_REGULAR,
182 BFD_MACH_O_S_ATTR_DEBUG, 0},
183 { ".debug_pubnames", "__debug_pubnames",
184 SEC_DEBUGGING, BFD_MACH_O_S_REGULAR,
185 BFD_MACH_O_S_ATTR_DEBUG, 0},
186 { ".debug_pubtypes", "__debug_pubtypes",
187 SEC_DEBUGGING, BFD_MACH_O_S_REGULAR,
188 BFD_MACH_O_S_ATTR_DEBUG, 0},
189 { ".debug_str", "__debug_str",
190 SEC_DEBUGGING, BFD_MACH_O_S_REGULAR,
191 BFD_MACH_O_S_ATTR_DEBUG, 0},
192 { ".debug_ranges", "__debug_ranges",
193 SEC_DEBUGGING, BFD_MACH_O_S_REGULAR,
194 BFD_MACH_O_S_ATTR_DEBUG, 0},
195 { ".debug_macro", "__debug_macro",
196 SEC_DEBUGGING, BFD_MACH_O_S_REGULAR,
197 BFD_MACH_O_S_ATTR_DEBUG, 0},
198 { NULL, NULL, 0, 0, 0, 0}
201 /* __OBJC Segment. */
202 static const mach_o_section_name_xlat objc_section_names_xlat[] =
204 { ".objc_class", "__class",
205 SEC_DATA | SEC_LOAD, BFD_MACH_O_S_REGULAR,
206 BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
207 { ".objc_meta_class", "__meta_class",
208 SEC_DATA | SEC_LOAD, BFD_MACH_O_S_REGULAR,
209 BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
210 { ".objc_cat_cls_meth", "__cat_cls_meth",
211 SEC_DATA | SEC_LOAD, BFD_MACH_O_S_REGULAR,
212 BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
213 { ".objc_cat_inst_meth", "__cat_inst_meth",
214 SEC_DATA | SEC_LOAD, BFD_MACH_O_S_REGULAR,
215 BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
216 { ".objc_protocol", "__protocol",
217 SEC_DATA | SEC_LOAD, BFD_MACH_O_S_REGULAR,
218 BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
219 { ".objc_string_object", "__string_object",
220 SEC_DATA | SEC_LOAD, BFD_MACH_O_S_REGULAR,
221 BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
222 { ".objc_cls_meth", "__cls_meth",
223 SEC_DATA | SEC_LOAD, BFD_MACH_O_S_REGULAR,
224 BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
225 { ".objc_inst_meth", "__inst_meth",
226 SEC_DATA | SEC_LOAD, BFD_MACH_O_S_REGULAR,
227 BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
228 { ".objc_cls_refs", "__cls_refs",
229 SEC_DATA | SEC_LOAD, BFD_MACH_O_S_LITERAL_POINTERS,
230 BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
231 { ".objc_message_refs", "__message_refs",
232 SEC_DATA | SEC_LOAD, BFD_MACH_O_S_LITERAL_POINTERS,
233 BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
234 { ".objc_symbols", "__symbols",
235 SEC_DATA | SEC_LOAD, BFD_MACH_O_S_REGULAR,
236 BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
237 { ".objc_category", "__category",
238 SEC_DATA | SEC_LOAD, BFD_MACH_O_S_REGULAR,
239 BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
240 { ".objc_class_vars", "__class_vars",
241 SEC_DATA | SEC_LOAD, BFD_MACH_O_S_REGULAR,
242 BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
243 { ".objc_instance_vars", "__instance_vars",
244 SEC_DATA | SEC_LOAD, BFD_MACH_O_S_REGULAR,
245 BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
246 { ".objc_module_info", "__module_info",
247 SEC_DATA | SEC_LOAD, BFD_MACH_O_S_REGULAR,
248 BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
249 { ".objc_selector_strs", "__selector_strs",
250 SEC_DATA | SEC_LOAD, BFD_MACH_O_S_CSTRING_LITERALS,
251 BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
252 { ".objc_image_info", "__image_info",
253 SEC_DATA | SEC_LOAD, BFD_MACH_O_S_REGULAR,
254 BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
255 { ".objc_selector_fixup", "__sel_fixup",
256 SEC_DATA | SEC_LOAD, BFD_MACH_O_S_REGULAR,
257 BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
259 { ".objc1_class_ext", "__class_ext",
260 SEC_DATA | SEC_LOAD, BFD_MACH_O_S_REGULAR,
261 BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
262 { ".objc1_property_list", "__property",
263 SEC_DATA | SEC_LOAD, BFD_MACH_O_S_REGULAR,
264 BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
265 { ".objc1_protocol_ext", "__protocol_ext",
266 SEC_DATA | SEC_LOAD, BFD_MACH_O_S_REGULAR,
267 BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
268 { NULL, NULL, 0, 0, 0, 0}
271 static const mach_o_segment_name_xlat segsec_names_xlat[] =
273 { "__TEXT", text_section_names_xlat },
274 { "__DATA", data_section_names_xlat },
275 { "__DWARF", dwarf_section_names_xlat },
276 { "__OBJC", objc_section_names_xlat },
280 static const char dsym_subdir[] = ".dSYM/Contents/Resources/DWARF";
282 /* For both cases bfd-name => mach-o name and vice versa, the specific target
283 is checked before the generic. This allows a target (e.g. ppc for cstring)
284 to override the generic definition with a more specific one. */
286 /* Fetch the translation from a Mach-O section designation (segment, section)
287 as a bfd short name, if one exists. Otherwise return NULL.
289 Allow the segment and section names to be unterminated 16 byte arrays. */
291 const mach_o_section_name_xlat *
292 bfd_mach_o_section_data_for_mach_sect (bfd *abfd, const char *segname,
293 const char *sectname)
295 const struct mach_o_segment_name_xlat *seg;
296 const mach_o_section_name_xlat *sec;
297 bfd_mach_o_backend_data *bed = bfd_mach_o_get_backend_data (abfd);
299 /* First try any target-specific translations defined... */
300 if (bed->segsec_names_xlat)
301 for (seg = bed->segsec_names_xlat; seg->segname; seg++)
302 if (strncmp (seg->segname, segname, BFD_MACH_O_SEGNAME_SIZE) == 0)
303 for (sec = seg->sections; sec->mach_o_name; sec++)
304 if (strncmp (sec->mach_o_name, sectname,
305 BFD_MACH_O_SECTNAME_SIZE) == 0)
308 /* ... and then the Mach-O generic ones. */
309 for (seg = segsec_names_xlat; seg->segname; seg++)
310 if (strncmp (seg->segname, segname, BFD_MACH_O_SEGNAME_SIZE) == 0)
311 for (sec = seg->sections; sec->mach_o_name; sec++)
312 if (strncmp (sec->mach_o_name, sectname,
313 BFD_MACH_O_SECTNAME_SIZE) == 0)
319 /* If the bfd_name for this section is a 'canonical' form for which we
320 know the Mach-O data, return the segment name and the data for the
321 Mach-O equivalent. Otherwise return NULL. */
323 const mach_o_section_name_xlat *
324 bfd_mach_o_section_data_for_bfd_name (bfd *abfd, const char *bfd_name,
325 const char **segname)
327 const struct mach_o_segment_name_xlat *seg;
328 const mach_o_section_name_xlat *sec;
329 bfd_mach_o_backend_data *bed = bfd_mach_o_get_backend_data (abfd);
332 if (bfd_name[0] != '.')
335 /* First try any target-specific translations defined... */
336 if (bed->segsec_names_xlat)
337 for (seg = bed->segsec_names_xlat; seg->segname; seg++)
338 for (sec = seg->sections; sec->bfd_name; sec++)
339 if (strcmp (bfd_name, sec->bfd_name) == 0)
341 *segname = seg->segname;
345 /* ... and then the Mach-O generic ones. */
346 for (seg = segsec_names_xlat; seg->segname; seg++)
347 for (sec = seg->sections; sec->bfd_name; sec++)
348 if (strcmp (bfd_name, sec->bfd_name) == 0)
350 *segname = seg->segname;
357 /* Convert Mach-O section name to BFD.
359 Try to use standard/canonical names, for which we have tables including
360 default flag settings - which are returned. Otherwise forge a new name
361 in the form "<segmentname>.<sectionname>" this will be prefixed with
362 LC_SEGMENT. if the segment name does not begin with an underscore.
364 SEGNAME and SECTNAME are 16 byte arrays (they do not need to be NUL-
365 terminated if the name length is exactly 16 bytes - but must be if the name
366 length is less than 16 characters). */
369 bfd_mach_o_convert_section_name_to_bfd (bfd *abfd, const char *segname,
370 const char *secname, const char **name,
373 const mach_o_section_name_xlat *xlat;
376 const char *pfx = "";
379 *flags = SEC_NO_FLAGS;
381 /* First search for a canonical name...
382 xlat will be non-null if there is an entry for segname, secname. */
383 xlat = bfd_mach_o_section_data_for_mach_sect (abfd, segname, secname);
386 len = strlen (xlat->bfd_name);
387 res = bfd_alloc (abfd, len+1);
390 memcpy (res, xlat->bfd_name, len+1);
392 *flags = xlat->bfd_flags;
396 /* ... else we make up a bfd name from the segment concatenated with the
399 len = 16 + 1 + 16 + 1;
401 /* Put "LC_SEGMENT." prefix if the segment name is weird (ie doesn't start
402 with an underscore. */
403 if (segname[0] != '_')
405 static const char seg_pfx[] = "LC_SEGMENT.";
408 len += sizeof (seg_pfx) - 1;
411 res = bfd_alloc (abfd, len);
414 snprintf (res, len, "%s%.16s.%.16s", pfx, segname, secname);
418 /* Convert a bfd section name to a Mach-O segment + section name.
420 If the name is a canonical one for which we have a Darwin match
421 return the translation table - which contains defaults for flags,
422 type, attribute and default alignment data.
424 Otherwise, expand the bfd_name (assumed to be in the form
425 "[LC_SEGMENT.]<segmentname>.<sectionname>") and return NULL. */
427 static const mach_o_section_name_xlat *
428 bfd_mach_o_convert_section_name_to_mach_o (bfd *abfd ATTRIBUTE_UNUSED,
430 bfd_mach_o_section *section)
432 const mach_o_section_name_xlat *xlat;
433 const char *name = bfd_get_section_name (abfd, sect);
440 memset (section->segname, 0, BFD_MACH_O_SEGNAME_SIZE + 1);
441 memset (section->sectname, 0, BFD_MACH_O_SECTNAME_SIZE + 1);
443 /* See if is a canonical name ... */
444 xlat = bfd_mach_o_section_data_for_bfd_name (abfd, name, &segname);
447 strcpy (section->segname, segname);
448 strcpy (section->sectname, xlat->mach_o_name);
452 /* .. else we convert our constructed one back to Mach-O.
453 Strip LC_SEGMENT. prefix, if present. */
454 if (strncmp (name, "LC_SEGMENT.", 11) == 0)
458 dot = strchr (name, '.');
461 /* Try to split name into segment and section names. */
462 if (dot && dot != name)
465 seclen = len - (dot + 1 - name);
467 if (seglen < 16 && seclen < 16)
469 memcpy (section->segname, name, seglen);
470 section->segname[seglen] = 0;
471 memcpy (section->sectname, dot + 1, seclen);
472 section->sectname[seclen] = 0;
477 /* The segment and section names are both missing - don't make them
479 if (dot && dot == name)
482 /* Just duplicate the name into both segment and section. */
485 memcpy (section->segname, name, len);
486 section->segname[len] = 0;
487 memcpy (section->sectname, name, len);
488 section->sectname[len] = 0;
492 /* Return the size of an entry for section SEC.
493 Must be called only for symbol pointer section and symbol stubs
497 bfd_mach_o_section_get_entry_size (bfd *abfd, bfd_mach_o_section *sec)
499 switch (sec->flags & BFD_MACH_O_SECTION_TYPE_MASK)
501 case BFD_MACH_O_S_NON_LAZY_SYMBOL_POINTERS:
502 case BFD_MACH_O_S_LAZY_SYMBOL_POINTERS:
503 return bfd_mach_o_wide_p (abfd) ? 8 : 4;
504 case BFD_MACH_O_S_SYMBOL_STUBS:
505 return sec->reserved2;
512 /* Return the number of indirect symbols for a section.
513 Must be called only for symbol pointer section and symbol stubs
517 bfd_mach_o_section_get_nbr_indirect (bfd *abfd, bfd_mach_o_section *sec)
521 elsz = bfd_mach_o_section_get_entry_size (abfd, sec);
525 return sec->size / elsz;
529 /* Copy any private info we understand from the input symbol
530 to the output symbol. */
533 bfd_mach_o_bfd_copy_private_symbol_data (bfd *ibfd ATTRIBUTE_UNUSED,
535 bfd *obfd ATTRIBUTE_UNUSED,
538 bfd_mach_o_asymbol *os, *is;
539 os = (bfd_mach_o_asymbol *)osymbol;
540 is = (bfd_mach_o_asymbol *)isymbol;
541 os->n_type = is->n_type;
542 os->n_sect = is->n_sect;
543 os->n_desc = is->n_desc;
544 os->symbol.udata.i = is->symbol.udata.i;
548 /* Copy any private info we understand from the input section
549 to the output section. */
552 bfd_mach_o_bfd_copy_private_section_data (bfd *ibfd ATTRIBUTE_UNUSED,
554 bfd *obfd ATTRIBUTE_UNUSED,
557 if (osection->used_by_bfd == NULL)
558 osection->used_by_bfd = isection->used_by_bfd;
560 if (isection->used_by_bfd != NULL)
561 memcpy (osection->used_by_bfd, isection->used_by_bfd,
562 sizeof (bfd_mach_o_section));
564 if (osection->used_by_bfd != NULL)
565 ((bfd_mach_o_section *)osection->used_by_bfd)->bfdsection = osection;
570 /* Copy any private info we understand from the input bfd
571 to the output bfd. */
574 bfd_mach_o_bfd_copy_private_bfd_data (bfd *ibfd, bfd *obfd)
576 if (bfd_get_flavour (ibfd) != bfd_target_mach_o_flavour
577 || bfd_get_flavour (obfd) != bfd_target_mach_o_flavour)
580 BFD_ASSERT (bfd_mach_o_valid (ibfd));
581 BFD_ASSERT (bfd_mach_o_valid (obfd));
583 /* FIXME: copy commands. */
588 /* This allows us to set up to 32 bits of flags (unless we invent some
589 fiendish scheme to subdivide). For now, we'll just set the file flags
590 without error checking - just overwrite. */
593 bfd_mach_o_bfd_set_private_flags (bfd *abfd, flagword flags)
595 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
600 mdata->header.flags = flags;
604 /* Count the total number of symbols. */
607 bfd_mach_o_count_symbols (bfd *abfd)
609 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
611 if (mdata->symtab == NULL)
613 return mdata->symtab->nsyms;
617 bfd_mach_o_get_symtab_upper_bound (bfd *abfd)
619 long nsyms = bfd_mach_o_count_symbols (abfd);
621 return ((nsyms + 1) * sizeof (asymbol *));
625 bfd_mach_o_canonicalize_symtab (bfd *abfd, asymbol **alocation)
627 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
628 long nsyms = bfd_mach_o_count_symbols (abfd);
629 bfd_mach_o_symtab_command *sym = mdata->symtab;
637 /* Do not try to read symbols if there are none. */
642 if (!bfd_mach_o_read_symtab_symbols (abfd))
644 (*_bfd_error_handler)
645 (_("bfd_mach_o_canonicalize_symtab: unable to load symbols"));
649 BFD_ASSERT (sym->symbols != NULL);
651 for (j = 0; j < sym->nsyms; j++)
652 alocation[j] = &sym->symbols[j].symbol;
659 /* Create synthetic symbols for indirect symbols. */
662 bfd_mach_o_get_synthetic_symtab (bfd *abfd,
663 long symcount ATTRIBUTE_UNUSED,
664 asymbol **syms ATTRIBUTE_UNUSED,
665 long dynsymcount ATTRIBUTE_UNUSED,
666 asymbol **dynsyms ATTRIBUTE_UNUSED,
669 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
670 bfd_mach_o_dysymtab_command *dysymtab = mdata->dysymtab;
671 bfd_mach_o_symtab_command *symtab = mdata->symtab;
673 unsigned long count, i, j, n;
680 /* Stop now if no symbols or no indirect symbols. */
681 if (dysymtab == NULL || symtab == NULL || symtab->symbols == NULL)
684 if (dysymtab->nindirectsyms == 0)
687 /* We need to allocate a bfd symbol for every indirect symbol and to
688 allocate the memory for its name. */
689 count = dysymtab->nindirectsyms;
690 size = count * sizeof (asymbol) + 1;
692 for (j = 0; j < count; j++)
694 unsigned int isym = dysymtab->indirect_syms[j];
696 /* Some indirect symbols are anonymous. */
697 if (isym < symtab->nsyms && symtab->symbols[isym].symbol.name)
698 size += strlen (symtab->symbols[isym].symbol.name) + sizeof ("$stub");
701 s = *ret = (asymbol *) bfd_malloc (size);
704 names = (char *) (s + count);
709 for (i = 0; i < mdata->nsects; i++)
711 bfd_mach_o_section *sec = mdata->sections[i];
712 unsigned int first, last;
716 switch (sec->flags & BFD_MACH_O_SECTION_TYPE_MASK)
718 case BFD_MACH_O_S_NON_LAZY_SYMBOL_POINTERS:
719 case BFD_MACH_O_S_LAZY_SYMBOL_POINTERS:
720 case BFD_MACH_O_S_SYMBOL_STUBS:
721 /* Only these sections have indirect symbols. */
722 first = sec->reserved1;
723 last = first + bfd_mach_o_section_get_nbr_indirect (abfd, sec);
725 entry_size = bfd_mach_o_section_get_entry_size (abfd, sec);
726 for (j = first; j < last; j++)
728 unsigned int isym = dysymtab->indirect_syms[j];
730 s->flags = BSF_GLOBAL | BSF_SYNTHETIC;
731 s->section = sec->bfdsection;
732 s->value = addr - sec->addr;
735 if (isym < symtab->nsyms
736 && symtab->symbols[isym].symbol.name)
738 const char *sym = symtab->symbols[isym].symbol.name;
743 memcpy (names, sym, len);
745 memcpy (names, "$stub", sizeof ("$stub"));
746 names += sizeof ("$stub");
765 bfd_mach_o_get_symbol_info (bfd *abfd ATTRIBUTE_UNUSED,
769 bfd_symbol_info (symbol, ret);
773 bfd_mach_o_print_symbol (bfd *abfd,
776 bfd_print_symbol_type how)
778 FILE *file = (FILE *) afile;
780 bfd_mach_o_asymbol *asym = (bfd_mach_o_asymbol *)symbol;
784 case bfd_print_symbol_name:
785 fprintf (file, "%s", symbol->name);
788 bfd_print_symbol_vandf (abfd, (void *) file, symbol);
789 if (asym->n_type & BFD_MACH_O_N_STAB)
790 name = bfd_get_stab_name (asym->n_type);
792 switch (asym->n_type & BFD_MACH_O_N_TYPE)
794 case BFD_MACH_O_N_UNDF:
795 if (symbol->value == 0)
800 case BFD_MACH_O_N_ABS:
803 case BFD_MACH_O_N_INDR:
806 case BFD_MACH_O_N_PBUD:
809 case BFD_MACH_O_N_SECT:
818 fprintf (file, " %02x %-6s %02x %04x",
819 asym->n_type, name, asym->n_sect, asym->n_desc);
820 if ((asym->n_type & BFD_MACH_O_N_STAB) == 0
821 && (asym->n_type & BFD_MACH_O_N_TYPE) == BFD_MACH_O_N_SECT)
822 fprintf (file, " [%s]", symbol->section->name);
823 fprintf (file, " %s", symbol->name);
828 bfd_mach_o_convert_architecture (bfd_mach_o_cpu_type mtype,
829 bfd_mach_o_cpu_subtype msubtype,
830 enum bfd_architecture *type,
831 unsigned long *subtype)
833 *subtype = bfd_arch_unknown;
837 case BFD_MACH_O_CPU_TYPE_VAX:
838 *type = bfd_arch_vax;
840 case BFD_MACH_O_CPU_TYPE_MC680x0:
841 *type = bfd_arch_m68k;
843 case BFD_MACH_O_CPU_TYPE_I386:
844 *type = bfd_arch_i386;
845 *subtype = bfd_mach_i386_i386;
847 case BFD_MACH_O_CPU_TYPE_X86_64:
848 *type = bfd_arch_i386;
849 *subtype = bfd_mach_x86_64;
851 case BFD_MACH_O_CPU_TYPE_MIPS:
852 *type = bfd_arch_mips;
854 case BFD_MACH_O_CPU_TYPE_MC98000:
855 *type = bfd_arch_m98k;
857 case BFD_MACH_O_CPU_TYPE_HPPA:
858 *type = bfd_arch_hppa;
860 case BFD_MACH_O_CPU_TYPE_ARM:
861 *type = bfd_arch_arm;
864 case BFD_MACH_O_CPU_SUBTYPE_ARM_V4T:
865 *subtype = bfd_mach_arm_4T;
867 case BFD_MACH_O_CPU_SUBTYPE_ARM_V6:
868 *subtype = bfd_mach_arm_4T; /* Best fit ? */
870 case BFD_MACH_O_CPU_SUBTYPE_ARM_V5TEJ:
871 *subtype = bfd_mach_arm_5TE;
873 case BFD_MACH_O_CPU_SUBTYPE_ARM_XSCALE:
874 *subtype = bfd_mach_arm_XScale;
876 case BFD_MACH_O_CPU_SUBTYPE_ARM_V7:
877 *subtype = bfd_mach_arm_5TE; /* Best fit ? */
879 case BFD_MACH_O_CPU_SUBTYPE_ARM_ALL:
884 case BFD_MACH_O_CPU_TYPE_MC88000:
885 *type = bfd_arch_m88k;
887 case BFD_MACH_O_CPU_TYPE_SPARC:
888 *type = bfd_arch_sparc;
889 *subtype = bfd_mach_sparc;
891 case BFD_MACH_O_CPU_TYPE_I860:
892 *type = bfd_arch_i860;
894 case BFD_MACH_O_CPU_TYPE_ALPHA:
895 *type = bfd_arch_alpha;
897 case BFD_MACH_O_CPU_TYPE_POWERPC:
898 *type = bfd_arch_powerpc;
899 *subtype = bfd_mach_ppc;
901 case BFD_MACH_O_CPU_TYPE_POWERPC_64:
902 *type = bfd_arch_powerpc;
903 *subtype = bfd_mach_ppc64;
906 *type = bfd_arch_unknown;
912 bfd_mach_o_write_header (bfd *abfd, bfd_mach_o_header *header)
914 struct mach_o_header_external raw;
917 size = mach_o_wide_p (header) ?
918 BFD_MACH_O_HEADER_64_SIZE : BFD_MACH_O_HEADER_SIZE;
920 bfd_h_put_32 (abfd, header->magic, raw.magic);
921 bfd_h_put_32 (abfd, header->cputype, raw.cputype);
922 bfd_h_put_32 (abfd, header->cpusubtype, raw.cpusubtype);
923 bfd_h_put_32 (abfd, header->filetype, raw.filetype);
924 bfd_h_put_32 (abfd, header->ncmds, raw.ncmds);
925 bfd_h_put_32 (abfd, header->sizeofcmds, raw.sizeofcmds);
926 bfd_h_put_32 (abfd, header->flags, raw.flags);
928 if (mach_o_wide_p (header))
929 bfd_h_put_32 (abfd, header->reserved, raw.reserved);
931 if (bfd_seek (abfd, 0, SEEK_SET) != 0
932 || bfd_bwrite (&raw, size, abfd) != size)
939 bfd_mach_o_write_thread (bfd *abfd, bfd_mach_o_load_command *command)
941 bfd_mach_o_thread_command *cmd = &command->command.thread;
943 struct mach_o_thread_command_external raw;
946 BFD_ASSERT ((command->type == BFD_MACH_O_LC_THREAD)
947 || (command->type == BFD_MACH_O_LC_UNIXTHREAD));
950 for (i = 0; i < cmd->nflavours; i++)
952 BFD_ASSERT ((cmd->flavours[i].size % 4) == 0);
953 BFD_ASSERT (cmd->flavours[i].offset ==
954 (command->offset + offset + BFD_MACH_O_LC_SIZE));
956 bfd_h_put_32 (abfd, cmd->flavours[i].flavour, raw.flavour);
957 bfd_h_put_32 (abfd, (cmd->flavours[i].size / 4), raw.count);
959 if (bfd_seek (abfd, command->offset + offset, SEEK_SET) != 0
960 || bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw))
963 offset += cmd->flavours[i].size + sizeof (raw);
970 bfd_mach_o_get_reloc_upper_bound (bfd *abfd ATTRIBUTE_UNUSED,
973 return (asect->reloc_count + 1) * sizeof (arelent *);
976 /* In addition to the need to byte-swap the symbol number, the bit positions
977 of the fields in the relocation information vary per target endian-ness. */
980 bfd_mach_o_swap_in_non_scattered_reloc (bfd *abfd, bfd_mach_o_reloc_info *rel,
981 unsigned char *fields)
983 unsigned char info = fields[3];
985 if (bfd_big_endian (abfd))
987 rel->r_value = (fields[0] << 16) | (fields[1] << 8) | fields[2];
988 rel->r_type = (info >> BFD_MACH_O_BE_TYPE_SHIFT) & BFD_MACH_O_TYPE_MASK;
989 rel->r_pcrel = (info & BFD_MACH_O_BE_PCREL) ? 1 : 0;
990 rel->r_length = (info >> BFD_MACH_O_BE_LENGTH_SHIFT)
991 & BFD_MACH_O_LENGTH_MASK;
992 rel->r_extern = (info & BFD_MACH_O_BE_EXTERN) ? 1 : 0;
996 rel->r_value = (fields[2] << 16) | (fields[1] << 8) | fields[0];
997 rel->r_type = (info >> BFD_MACH_O_LE_TYPE_SHIFT) & BFD_MACH_O_TYPE_MASK;
998 rel->r_pcrel = (info & BFD_MACH_O_LE_PCREL) ? 1 : 0;
999 rel->r_length = (info >> BFD_MACH_O_LE_LENGTH_SHIFT)
1000 & BFD_MACH_O_LENGTH_MASK;
1001 rel->r_extern = (info & BFD_MACH_O_LE_EXTERN) ? 1 : 0;
1006 bfd_mach_o_canonicalize_one_reloc (bfd *abfd,
1007 struct mach_o_reloc_info_external *raw,
1008 arelent *res, asymbol **syms)
1010 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
1011 bfd_mach_o_backend_data *bed = bfd_mach_o_get_backend_data (abfd);
1012 bfd_mach_o_reloc_info reloc;
1016 addr = bfd_get_32 (abfd, raw->r_address);
1017 res->sym_ptr_ptr = NULL;
1020 if (addr & BFD_MACH_O_SR_SCATTERED)
1023 bfd_vma symnum = bfd_get_32 (abfd, raw->r_symbolnum);
1025 /* Scattered relocation, can't be extern. */
1026 reloc.r_scattered = 1;
1029 /* Extract section and offset from r_value (symnum). */
1030 reloc.r_value = symnum;
1031 /* FIXME: This breaks when a symbol in a reloc exactly follows the
1032 end of the data for the section (e.g. in a calculation of section
1033 data length). At present, the symbol will end up associated with
1034 the following section or, if it falls within alignment padding, as
1035 null - which will assert later. */
1036 for (j = 0; j < mdata->nsects; j++)
1038 bfd_mach_o_section *sect = mdata->sections[j];
1039 if (symnum >= sect->addr && symnum < sect->addr + sect->size)
1041 res->sym_ptr_ptr = sect->bfdsection->symbol_ptr_ptr;
1042 res->addend = symnum - sect->addr;
1047 /* Extract the info and address fields from r_address. */
1048 reloc.r_type = BFD_MACH_O_GET_SR_TYPE (addr);
1049 reloc.r_length = BFD_MACH_O_GET_SR_LENGTH (addr);
1050 reloc.r_pcrel = addr & BFD_MACH_O_SR_PCREL;
1051 reloc.r_address = BFD_MACH_O_GET_SR_TYPE (addr);
1052 res->address = BFD_MACH_O_GET_SR_ADDRESS (addr);
1058 /* Non-scattered relocation. */
1059 reloc.r_scattered = 0;
1061 /* The value and info fields have to be extracted dependent on target
1063 bfd_mach_o_swap_in_non_scattered_reloc (abfd, &reloc, raw->r_symbolnum);
1064 num = reloc.r_value;
1068 /* An external symbol number. */
1071 else if (num == 0x00ffffff)
1073 /* The 'symnum' in a non-scattered PAIR is 0x00ffffff. But as this
1074 is generic code, we don't know wether this is really a PAIR.
1075 This value is almost certainly not a valid section number, hence
1076 this specific case to avoid an assertion failure.
1077 Target specific swap_reloc_in routine should adjust that. */
1078 sym = bfd_abs_section_ptr->symbol_ptr_ptr;
1082 /* A section number. */
1083 BFD_ASSERT (num != 0);
1084 BFD_ASSERT (num <= mdata->nsects);
1086 sym = mdata->sections[num - 1]->bfdsection->symbol_ptr_ptr;
1087 /* For a symbol defined in section S, the addend (stored in the
1088 binary) contains the address of the section. To comply with
1089 bfd convention, subtract the section address.
1090 Use the address from the header, so that the user can modify
1091 the vma of the section. */
1092 res->addend = -mdata->sections[num - 1]->addr;
1094 /* Note: Pairs for PPC LO/HI/HA are not scattered, but contain the offset
1095 in the lower 16bits of the address value. So we have to find the
1096 'symbol' from the preceding reloc. We do this even though the
1097 section symbol is probably not needed here, because NULL symbol
1098 values cause an assert in generic BFD code. This must be done in
1099 the PPC swap_reloc_in routine. */
1100 res->sym_ptr_ptr = sym;
1102 /* The 'address' is just r_address.
1103 ??? maybe this should be masked with 0xffffff for safety. */
1104 res->address = addr;
1105 reloc.r_address = addr;
1108 /* We have set up a reloc with all the information present, so the swapper
1109 can modify address, value and addend fields, if necessary, to convey
1110 information in the generic BFD reloc that is mach-o specific. */
1112 if (!(*bed->_bfd_mach_o_swap_reloc_in)(res, &reloc))
1118 bfd_mach_o_canonicalize_relocs (bfd *abfd, unsigned long filepos,
1119 unsigned long count,
1120 arelent *res, asymbol **syms)
1123 struct mach_o_reloc_info_external *native_relocs;
1124 bfd_size_type native_size;
1126 /* Allocate and read relocs. */
1127 native_size = count * BFD_MACH_O_RELENT_SIZE;
1129 (struct mach_o_reloc_info_external *) bfd_malloc (native_size);
1130 if (native_relocs == NULL)
1133 if (bfd_seek (abfd, filepos, SEEK_SET) != 0
1134 || bfd_bread (native_relocs, native_size, abfd) != native_size)
1137 for (i = 0; i < count; i++)
1139 if (bfd_mach_o_canonicalize_one_reloc (abfd, &native_relocs[i],
1143 free (native_relocs);
1146 free (native_relocs);
1151 bfd_mach_o_canonicalize_reloc (bfd *abfd, asection *asect,
1152 arelent **rels, asymbol **syms)
1154 bfd_mach_o_backend_data *bed = bfd_mach_o_get_backend_data (abfd);
1158 if (asect->reloc_count == 0)
1161 /* No need to go further if we don't know how to read relocs. */
1162 if (bed->_bfd_mach_o_swap_reloc_in == NULL)
1165 if (asect->relocation == NULL)
1167 res = bfd_malloc (asect->reloc_count * sizeof (arelent));
1171 if (bfd_mach_o_canonicalize_relocs (abfd, asect->rel_filepos,
1172 asect->reloc_count, res, syms) < 0)
1177 asect->relocation = res;
1180 res = asect->relocation;
1181 for (i = 0; i < asect->reloc_count; i++)
1189 bfd_mach_o_get_dynamic_reloc_upper_bound (bfd *abfd)
1191 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
1193 if (mdata->dysymtab == NULL)
1195 return (mdata->dysymtab->nextrel + mdata->dysymtab->nlocrel + 1)
1196 * sizeof (arelent *);
1200 bfd_mach_o_canonicalize_dynamic_reloc (bfd *abfd, arelent **rels,
1201 struct bfd_symbol **syms)
1203 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
1204 bfd_mach_o_dysymtab_command *dysymtab = mdata->dysymtab;
1205 bfd_mach_o_backend_data *bed = bfd_mach_o_get_backend_data (abfd);
1209 if (dysymtab == NULL)
1211 if (dysymtab->nextrel == 0 && dysymtab->nlocrel == 0)
1214 /* No need to go further if we don't know how to read relocs. */
1215 if (bed->_bfd_mach_o_swap_reloc_in == NULL)
1218 if (mdata->dyn_reloc_cache == NULL)
1220 res = bfd_malloc ((dysymtab->nextrel + dysymtab->nlocrel)
1221 * sizeof (arelent));
1225 if (bfd_mach_o_canonicalize_relocs (abfd, dysymtab->extreloff,
1226 dysymtab->nextrel, res, syms) < 0)
1232 if (bfd_mach_o_canonicalize_relocs (abfd, dysymtab->locreloff,
1234 res + dysymtab->nextrel, syms) < 0)
1240 mdata->dyn_reloc_cache = res;
1243 res = mdata->dyn_reloc_cache;
1244 for (i = 0; i < dysymtab->nextrel + dysymtab->nlocrel; i++)
1250 /* In addition to the need to byte-swap the symbol number, the bit positions
1251 of the fields in the relocation information vary per target endian-ness. */
1254 bfd_mach_o_swap_out_non_scattered_reloc (bfd *abfd, unsigned char *fields,
1255 bfd_mach_o_reloc_info *rel)
1257 unsigned char info = 0;
1259 BFD_ASSERT (rel->r_type <= 15);
1260 BFD_ASSERT (rel->r_length <= 3);
1262 if (bfd_big_endian (abfd))
1264 fields[0] = (rel->r_value >> 16) & 0xff;
1265 fields[1] = (rel->r_value >> 8) & 0xff;
1266 fields[2] = rel->r_value & 0xff;
1267 info |= rel->r_type << BFD_MACH_O_BE_TYPE_SHIFT;
1268 info |= rel->r_pcrel ? BFD_MACH_O_BE_PCREL : 0;
1269 info |= rel->r_length << BFD_MACH_O_BE_LENGTH_SHIFT;
1270 info |= rel->r_extern ? BFD_MACH_O_BE_EXTERN : 0;
1274 fields[2] = (rel->r_value >> 16) & 0xff;
1275 fields[1] = (rel->r_value >> 8) & 0xff;
1276 fields[0] = rel->r_value & 0xff;
1277 info |= rel->r_type << BFD_MACH_O_LE_TYPE_SHIFT;
1278 info |= rel->r_pcrel ? BFD_MACH_O_LE_PCREL : 0;
1279 info |= rel->r_length << BFD_MACH_O_LE_LENGTH_SHIFT;
1280 info |= rel->r_extern ? BFD_MACH_O_LE_EXTERN : 0;
1286 bfd_mach_o_write_relocs (bfd *abfd, bfd_mach_o_section *section)
1291 bfd_mach_o_backend_data *bed = bfd_mach_o_get_backend_data (abfd);
1293 sec = section->bfdsection;
1294 if (sec->reloc_count == 0)
1297 if (bed->_bfd_mach_o_swap_reloc_out == NULL)
1300 if (bfd_seek (abfd, section->reloff, SEEK_SET) != 0)
1303 /* Convert and write. */
1304 entries = section->bfdsection->orelocation;
1305 for (i = 0; i < section->nreloc; i++)
1307 arelent *rel = entries[i];
1308 struct mach_o_reloc_info_external raw;
1309 bfd_mach_o_reloc_info info, *pinfo = &info;
1311 /* Convert relocation to an intermediate representation. */
1312 if (!(*bed->_bfd_mach_o_swap_reloc_out) (rel, pinfo))
1315 /* Lower the relocation info. */
1316 if (pinfo->r_scattered)
1320 v = BFD_MACH_O_SR_SCATTERED
1321 | (pinfo->r_pcrel ? BFD_MACH_O_SR_PCREL : 0)
1322 | BFD_MACH_O_SET_SR_LENGTH(pinfo->r_length)
1323 | BFD_MACH_O_SET_SR_TYPE(pinfo->r_type)
1324 | BFD_MACH_O_SET_SR_ADDRESS(pinfo->r_address);
1325 /* Note: scattered relocs have field in reverse order... */
1326 bfd_put_32 (abfd, v, raw.r_address);
1327 bfd_put_32 (abfd, pinfo->r_value, raw.r_symbolnum);
1331 bfd_put_32 (abfd, pinfo->r_address, raw.r_address);
1332 bfd_mach_o_swap_out_non_scattered_reloc (abfd, raw.r_symbolnum,
1336 if (bfd_bwrite (&raw, BFD_MACH_O_RELENT_SIZE, abfd)
1337 != BFD_MACH_O_RELENT_SIZE)
1344 bfd_mach_o_write_section_32 (bfd *abfd, bfd_mach_o_section *section)
1346 struct mach_o_section_32_external raw;
1348 memcpy (raw.sectname, section->sectname, 16);
1349 memcpy (raw.segname, section->segname, 16);
1350 bfd_h_put_32 (abfd, section->addr, raw.addr);
1351 bfd_h_put_32 (abfd, section->size, raw.size);
1352 bfd_h_put_32 (abfd, section->offset, raw.offset);
1353 bfd_h_put_32 (abfd, section->align, raw.align);
1354 bfd_h_put_32 (abfd, section->reloff, raw.reloff);
1355 bfd_h_put_32 (abfd, section->nreloc, raw.nreloc);
1356 bfd_h_put_32 (abfd, section->flags, raw.flags);
1357 bfd_h_put_32 (abfd, section->reserved1, raw.reserved1);
1358 bfd_h_put_32 (abfd, section->reserved2, raw.reserved2);
1360 if (bfd_bwrite (&raw, BFD_MACH_O_SECTION_SIZE, abfd)
1361 != BFD_MACH_O_SECTION_SIZE)
1368 bfd_mach_o_write_section_64 (bfd *abfd, bfd_mach_o_section *section)
1370 struct mach_o_section_64_external raw;
1372 memcpy (raw.sectname, section->sectname, 16);
1373 memcpy (raw.segname, section->segname, 16);
1374 bfd_h_put_64 (abfd, section->addr, raw.addr);
1375 bfd_h_put_64 (abfd, section->size, raw.size);
1376 bfd_h_put_32 (abfd, section->offset, raw.offset);
1377 bfd_h_put_32 (abfd, section->align, raw.align);
1378 bfd_h_put_32 (abfd, section->reloff, raw.reloff);
1379 bfd_h_put_32 (abfd, section->nreloc, raw.nreloc);
1380 bfd_h_put_32 (abfd, section->flags, raw.flags);
1381 bfd_h_put_32 (abfd, section->reserved1, raw.reserved1);
1382 bfd_h_put_32 (abfd, section->reserved2, raw.reserved2);
1383 bfd_h_put_32 (abfd, section->reserved3, raw.reserved3);
1385 if (bfd_bwrite (&raw, BFD_MACH_O_SECTION_64_SIZE, abfd)
1386 != BFD_MACH_O_SECTION_64_SIZE)
1393 bfd_mach_o_write_segment_32 (bfd *abfd, bfd_mach_o_load_command *command)
1395 struct mach_o_segment_command_32_external raw;
1396 bfd_mach_o_segment_command *seg = &command->command.segment;
1397 bfd_mach_o_section *sec;
1399 BFD_ASSERT (command->type == BFD_MACH_O_LC_SEGMENT);
1401 for (sec = seg->sect_head; sec != NULL; sec = sec->next)
1402 if (!bfd_mach_o_write_relocs (abfd, sec))
1405 memcpy (raw.segname, seg->segname, 16);
1406 bfd_h_put_32 (abfd, seg->vmaddr, raw.vmaddr);
1407 bfd_h_put_32 (abfd, seg->vmsize, raw.vmsize);
1408 bfd_h_put_32 (abfd, seg->fileoff, raw.fileoff);
1409 bfd_h_put_32 (abfd, seg->filesize, raw.filesize);
1410 bfd_h_put_32 (abfd, seg->maxprot, raw.maxprot);
1411 bfd_h_put_32 (abfd, seg->initprot, raw.initprot);
1412 bfd_h_put_32 (abfd, seg->nsects, raw.nsects);
1413 bfd_h_put_32 (abfd, seg->flags, raw.flags);
1415 if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
1416 || bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw))
1419 for (sec = seg->sect_head; sec != NULL; sec = sec->next)
1420 if (bfd_mach_o_write_section_32 (abfd, sec))
1427 bfd_mach_o_write_segment_64 (bfd *abfd, bfd_mach_o_load_command *command)
1429 struct mach_o_segment_command_64_external raw;
1430 bfd_mach_o_segment_command *seg = &command->command.segment;
1431 bfd_mach_o_section *sec;
1433 BFD_ASSERT (command->type == BFD_MACH_O_LC_SEGMENT_64);
1435 for (sec = seg->sect_head; sec != NULL; sec = sec->next)
1436 if (!bfd_mach_o_write_relocs (abfd, sec))
1439 memcpy (raw.segname, seg->segname, 16);
1440 bfd_h_put_64 (abfd, seg->vmaddr, raw.vmaddr);
1441 bfd_h_put_64 (abfd, seg->vmsize, raw.vmsize);
1442 bfd_h_put_64 (abfd, seg->fileoff, raw.fileoff);
1443 bfd_h_put_64 (abfd, seg->filesize, raw.filesize);
1444 bfd_h_put_32 (abfd, seg->maxprot, raw.maxprot);
1445 bfd_h_put_32 (abfd, seg->initprot, raw.initprot);
1446 bfd_h_put_32 (abfd, seg->nsects, raw.nsects);
1447 bfd_h_put_32 (abfd, seg->flags, raw.flags);
1449 if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
1450 || bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw))
1453 for (sec = seg->sect_head; sec != NULL; sec = sec->next)
1454 if (bfd_mach_o_write_section_64 (abfd, sec))
1461 bfd_mach_o_write_symtab (bfd *abfd, bfd_mach_o_load_command *command)
1463 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
1464 bfd_mach_o_symtab_command *sym = &command->command.symtab;
1466 unsigned int wide = bfd_mach_o_wide_p (abfd);
1467 unsigned int symlen = wide ? BFD_MACH_O_NLIST_64_SIZE : BFD_MACH_O_NLIST_SIZE;
1468 struct bfd_strtab_hash *strtab;
1469 asymbol **symbols = bfd_get_outsymbols (abfd);
1471 BFD_ASSERT (command->type == BFD_MACH_O_LC_SYMTAB);
1473 /* Write the symbols first. */
1474 mdata->filelen = FILE_ALIGN(mdata->filelen, wide ? 3 : 2);
1475 sym->symoff = mdata->filelen;
1476 if (bfd_seek (abfd, sym->symoff, SEEK_SET) != 0)
1479 sym->nsyms = bfd_get_symcount (abfd);
1480 mdata->filelen += sym->nsyms * symlen;
1482 strtab = _bfd_stringtab_init ();
1487 /* Although we don't strictly need to do this, for compatibility with
1488 Darwin system tools, actually output an empty string for the index
1490 _bfd_stringtab_add (strtab, "", TRUE, FALSE);
1492 for (i = 0; i < sym->nsyms; i++)
1494 bfd_size_type str_index;
1495 bfd_mach_o_asymbol *s = (bfd_mach_o_asymbol *)symbols[i];
1497 if (s->symbol.name == 0 || s->symbol.name[0] == '\0')
1498 /* An index of 0 always means the empty string. */
1502 str_index = _bfd_stringtab_add (strtab, s->symbol.name, TRUE, FALSE);
1504 if (str_index == (bfd_size_type) -1)
1510 struct mach_o_nlist_64_external raw;
1512 bfd_h_put_32 (abfd, str_index, raw.n_strx);
1513 bfd_h_put_8 (abfd, s->n_type, raw.n_type);
1514 bfd_h_put_8 (abfd, s->n_sect, raw.n_sect);
1515 bfd_h_put_16 (abfd, s->n_desc, raw.n_desc);
1516 bfd_h_put_64 (abfd, s->symbol.section->vma + s->symbol.value,
1519 if (bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw))
1524 struct mach_o_nlist_external raw;
1526 bfd_h_put_32 (abfd, str_index, raw.n_strx);
1527 bfd_h_put_8 (abfd, s->n_type, raw.n_type);
1528 bfd_h_put_8 (abfd, s->n_sect, raw.n_sect);
1529 bfd_h_put_16 (abfd, s->n_desc, raw.n_desc);
1530 bfd_h_put_32 (abfd, s->symbol.section->vma + s->symbol.value,
1533 if (bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw))
1537 sym->strsize = _bfd_stringtab_size (strtab);
1538 sym->stroff = mdata->filelen;
1539 mdata->filelen += sym->strsize;
1541 if (_bfd_stringtab_emit (abfd, strtab) != TRUE)
1543 _bfd_stringtab_free (strtab);
1547 struct mach_o_symtab_command_external raw;
1549 bfd_h_put_32 (abfd, sym->symoff, raw.symoff);
1550 bfd_h_put_32 (abfd, sym->nsyms, raw.nsyms);
1551 bfd_h_put_32 (abfd, sym->stroff, raw.stroff);
1552 bfd_h_put_32 (abfd, sym->strsize, raw.strsize);
1554 if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
1555 || bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw))
1562 _bfd_stringtab_free (strtab);
1566 /* Write a dysymtab command.
1567 TODO: Possibly coalesce writes of smaller objects. */
1570 bfd_mach_o_write_dysymtab (bfd *abfd, bfd_mach_o_load_command *command)
1572 bfd_mach_o_dysymtab_command *cmd = &command->command.dysymtab;
1574 BFD_ASSERT (command->type == BFD_MACH_O_LC_DYSYMTAB);
1576 if (cmd->nmodtab != 0)
1580 if (bfd_seek (abfd, cmd->modtaboff, SEEK_SET) != 0)
1583 for (i = 0; i < cmd->nmodtab; i++)
1585 bfd_mach_o_dylib_module *module = &cmd->dylib_module[i];
1589 iinit = module->iinit & 0xffff;
1590 iinit |= ((module->iterm & 0xffff) << 16);
1592 ninit = module->ninit & 0xffff;
1593 ninit |= ((module->nterm & 0xffff) << 16);
1595 if (bfd_mach_o_wide_p (abfd))
1597 struct mach_o_dylib_module_64_external w;
1599 bfd_h_put_32 (abfd, module->module_name_idx, &w.module_name);
1600 bfd_h_put_32 (abfd, module->iextdefsym, &w.iextdefsym);
1601 bfd_h_put_32 (abfd, module->nextdefsym, &w.nextdefsym);
1602 bfd_h_put_32 (abfd, module->irefsym, &w.irefsym);
1603 bfd_h_put_32 (abfd, module->nrefsym, &w.nrefsym);
1604 bfd_h_put_32 (abfd, module->ilocalsym, &w.ilocalsym);
1605 bfd_h_put_32 (abfd, module->nlocalsym, &w.nlocalsym);
1606 bfd_h_put_32 (abfd, module->iextrel, &w.iextrel);
1607 bfd_h_put_32 (abfd, module->nextrel, &w.nextrel);
1608 bfd_h_put_32 (abfd, iinit, &w.iinit_iterm);
1609 bfd_h_put_32 (abfd, ninit, &w.ninit_nterm);
1610 bfd_h_put_64 (abfd, module->objc_module_info_addr,
1611 &w.objc_module_info_addr);
1612 bfd_h_put_32 (abfd, module->objc_module_info_size,
1613 &w.objc_module_info_size);
1615 if (bfd_bwrite ((void *) &w, sizeof (w), abfd) != sizeof (w))
1620 struct mach_o_dylib_module_external n;
1622 bfd_h_put_32 (abfd, module->module_name_idx, &n.module_name);
1623 bfd_h_put_32 (abfd, module->iextdefsym, &n.iextdefsym);
1624 bfd_h_put_32 (abfd, module->nextdefsym, &n.nextdefsym);
1625 bfd_h_put_32 (abfd, module->irefsym, &n.irefsym);
1626 bfd_h_put_32 (abfd, module->nrefsym, &n.nrefsym);
1627 bfd_h_put_32 (abfd, module->ilocalsym, &n.ilocalsym);
1628 bfd_h_put_32 (abfd, module->nlocalsym, &n.nlocalsym);
1629 bfd_h_put_32 (abfd, module->iextrel, &n.iextrel);
1630 bfd_h_put_32 (abfd, module->nextrel, &n.nextrel);
1631 bfd_h_put_32 (abfd, iinit, &n.iinit_iterm);
1632 bfd_h_put_32 (abfd, ninit, &n.ninit_nterm);
1633 bfd_h_put_32 (abfd, module->objc_module_info_addr,
1634 &n.objc_module_info_addr);
1635 bfd_h_put_32 (abfd, module->objc_module_info_size,
1636 &n.objc_module_info_size);
1638 if (bfd_bwrite ((void *) &n, sizeof (n), abfd) != sizeof (n))
1648 if (bfd_seek (abfd, cmd->tocoff, SEEK_SET) != 0)
1651 for (i = 0; i < cmd->ntoc; i++)
1653 struct mach_o_dylib_table_of_contents_external raw;
1654 bfd_mach_o_dylib_table_of_content *toc = &cmd->dylib_toc[i];
1656 bfd_h_put_32 (abfd, toc->symbol_index, &raw.symbol_index);
1657 bfd_h_put_32 (abfd, toc->module_index, &raw.module_index);
1659 if (bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw))
1664 if (cmd->nindirectsyms > 0)
1668 if (bfd_seek (abfd, cmd->indirectsymoff, SEEK_SET) != 0)
1671 for (i = 0; i < cmd->nindirectsyms; ++i)
1673 unsigned char raw[4];
1675 bfd_h_put_32 (abfd, cmd->indirect_syms[i], &raw);
1676 if (bfd_bwrite (raw, sizeof (raw), abfd) != sizeof (raw))
1681 if (cmd->nextrefsyms != 0)
1685 if (bfd_seek (abfd, cmd->extrefsymoff, SEEK_SET) != 0)
1688 for (i = 0; i < cmd->nextrefsyms; i++)
1691 unsigned char raw[4];
1692 bfd_mach_o_dylib_reference *ref = &cmd->ext_refs[i];
1694 /* Fields isym and flags are written as bit-fields, thus we need
1695 a specific processing for endianness. */
1697 if (bfd_big_endian (abfd))
1699 v = ((ref->isym & 0xffffff) << 8);
1700 v |= ref->flags & 0xff;
1704 v = ref->isym & 0xffffff;
1705 v |= ((ref->flags & 0xff) << 24);
1708 bfd_h_put_32 (abfd, v, raw);
1709 if (bfd_bwrite (raw, sizeof (raw), abfd) != sizeof (raw))
1715 if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0)
1719 struct mach_o_dysymtab_command_external raw;
1721 bfd_h_put_32 (abfd, cmd->ilocalsym, &raw.ilocalsym);
1722 bfd_h_put_32 (abfd, cmd->nlocalsym, &raw.nlocalsym);
1723 bfd_h_put_32 (abfd, cmd->iextdefsym, &raw.iextdefsym);
1724 bfd_h_put_32 (abfd, cmd->nextdefsym, &raw.nextdefsym);
1725 bfd_h_put_32 (abfd, cmd->iundefsym, &raw.iundefsym);
1726 bfd_h_put_32 (abfd, cmd->nundefsym, &raw.nundefsym);
1727 bfd_h_put_32 (abfd, cmd->tocoff, &raw.tocoff);
1728 bfd_h_put_32 (abfd, cmd->ntoc, &raw.ntoc);
1729 bfd_h_put_32 (abfd, cmd->modtaboff, &raw.modtaboff);
1730 bfd_h_put_32 (abfd, cmd->nmodtab, &raw.nmodtab);
1731 bfd_h_put_32 (abfd, cmd->extrefsymoff, &raw.extrefsymoff);
1732 bfd_h_put_32 (abfd, cmd->nextrefsyms, &raw.nextrefsyms);
1733 bfd_h_put_32 (abfd, cmd->indirectsymoff, &raw.indirectsymoff);
1734 bfd_h_put_32 (abfd, cmd->nindirectsyms, &raw.nindirectsyms);
1735 bfd_h_put_32 (abfd, cmd->extreloff, &raw.extreloff);
1736 bfd_h_put_32 (abfd, cmd->nextrel, &raw.nextrel);
1737 bfd_h_put_32 (abfd, cmd->locreloff, &raw.locreloff);
1738 bfd_h_put_32 (abfd, cmd->nlocrel, &raw.nlocrel);
1740 if (bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw))
1748 bfd_mach_o_primary_symbol_sort_key (bfd_mach_o_asymbol *s)
1750 unsigned mtyp = s->n_type & BFD_MACH_O_N_TYPE;
1752 /* Just leave debug symbols where they are (pretend they are local, and
1753 then they will just be sorted on position). */
1754 if (s->n_type & BFD_MACH_O_N_STAB)
1757 /* Local (we should never see an undefined local AFAICT). */
1758 if (! (s->n_type & (BFD_MACH_O_N_EXT | BFD_MACH_O_N_PEXT)))
1761 /* Common symbols look like undefined externs. */
1762 if (mtyp == BFD_MACH_O_N_UNDF)
1765 /* A defined non-local, non-debug symbol. */
1770 bfd_mach_o_cf_symbols (const void *a, const void *b)
1772 bfd_mach_o_asymbol *sa = *(bfd_mach_o_asymbol **) a;
1773 bfd_mach_o_asymbol *sb = *(bfd_mach_o_asymbol **) b;
1774 unsigned int soa, sob;
1776 soa = bfd_mach_o_primary_symbol_sort_key (sa);
1777 sob = bfd_mach_o_primary_symbol_sort_key (sb);
1784 /* If it's local or stab, just preserve the input order. */
1787 if (sa->symbol.udata.i < sb->symbol.udata.i)
1789 if (sa->symbol.udata.i > sb->symbol.udata.i)
1792 /* This is probably an error. */
1796 /* The second sort key is name. */
1797 return strcmp (sa->symbol.name, sb->symbol.name);
1800 /* Process the symbols.
1802 This should be OK for single-module files - but it is not likely to work
1803 for multi-module shared libraries.
1805 (a) If the application has not filled in the relevant mach-o fields, make
1808 (b) Order them, like this:
1811 ( ii) external defined
1813 (iii) external undefined/common
1820 bfd_mach_o_mangle_symbols (bfd *abfd)
1823 asymbol **symbols = bfd_get_outsymbols (abfd);
1825 if (symbols == NULL || bfd_get_symcount (abfd) == 0)
1828 for (i = 0; i < bfd_get_symcount (abfd); i++)
1830 bfd_mach_o_asymbol *s = (bfd_mach_o_asymbol *)symbols[i];
1832 /* We use this value, which is out-of-range as a symbol index, to signal
1833 that the mach-o-specific data are not filled in and need to be created
1834 from the bfd values. It is much preferable for the application to do
1835 this, since more meaningful diagnostics can be made that way. */
1837 if (s->symbol.udata.i == SYM_MACHO_FIELDS_UNSET)
1839 /* No symbol information has been set - therefore determine
1840 it from the bfd symbol flags/info. */
1841 if (s->symbol.section == bfd_abs_section_ptr)
1842 s->n_type = BFD_MACH_O_N_ABS;
1843 else if (s->symbol.section == bfd_und_section_ptr)
1845 s->n_type = BFD_MACH_O_N_UNDF;
1846 if (s->symbol.flags & BSF_WEAK)
1847 s->n_desc |= BFD_MACH_O_N_WEAK_REF;
1848 /* mach-o automatically makes undefined symbols extern. */
1849 s->n_type |= BFD_MACH_O_N_EXT;
1850 s->symbol.flags |= BSF_GLOBAL;
1852 else if (s->symbol.section == bfd_com_section_ptr)
1854 s->n_type = BFD_MACH_O_N_UNDF | BFD_MACH_O_N_EXT;
1855 s->symbol.flags |= BSF_GLOBAL;
1858 s->n_type = BFD_MACH_O_N_SECT;
1860 if (s->symbol.flags & BSF_GLOBAL)
1861 s->n_type |= BFD_MACH_O_N_EXT;
1864 /* Put the section index in, where required. */
1865 if ((s->symbol.section != bfd_abs_section_ptr
1866 && s->symbol.section != bfd_und_section_ptr
1867 && s->symbol.section != bfd_com_section_ptr)
1868 || ((s->n_type & BFD_MACH_O_N_STAB) != 0
1869 && s->symbol.name == NULL))
1870 s->n_sect = s->symbol.section->target_index;
1872 /* Number to preserve order for local and debug syms. */
1873 s->symbol.udata.i = i;
1876 /* Sort the symbols. */
1877 qsort ((void *) symbols, (size_t) bfd_get_symcount (abfd),
1878 sizeof (asymbol *), bfd_mach_o_cf_symbols);
1880 for (i = 0; i < bfd_get_symcount (abfd); ++i)
1882 bfd_mach_o_asymbol *s = (bfd_mach_o_asymbol *)symbols[i];
1883 s->symbol.udata.i = i; /* renumber. */
1889 /* We build a flat table of sections, which can be re-ordered if necessary.
1890 Fill in the section number and other mach-o-specific data. */
1893 bfd_mach_o_mangle_sections (bfd *abfd, bfd_mach_o_data_struct *mdata)
1896 unsigned target_index;
1899 nsect = bfd_count_sections (abfd);
1901 /* Don't do it if it's already set - assume the application knows what it's
1903 if (mdata->nsects == nsect
1904 && (mdata->nsects == 0 || mdata->sections != NULL))
1907 mdata->nsects = nsect;
1908 mdata->sections = bfd_alloc (abfd,
1909 mdata->nsects * sizeof (bfd_mach_o_section *));
1910 if (mdata->sections == NULL)
1913 /* We need to check that this can be done... */
1915 (*_bfd_error_handler) (_("mach-o: there are too many sections (%d)"
1916 " maximum is 255,\n"), nsect);
1918 /* Create Mach-O sections.
1919 Section type, attribute and align should have been set when the
1920 section was created - either read in or specified. */
1922 for (sec = abfd->sections; sec; sec = sec->next)
1924 unsigned bfd_align = bfd_get_section_alignment (abfd, sec);
1925 bfd_mach_o_section *msect = bfd_mach_o_get_mach_o_section (sec);
1927 mdata->sections[target_index] = msect;
1929 msect->addr = bfd_get_section_vma (abfd, sec);
1930 msect->size = bfd_get_section_size (sec);
1932 /* Use the largest alignment set, in case it was bumped after the
1933 section was created. */
1934 msect->align = msect->align > bfd_align ? msect->align : bfd_align;
1937 sec->target_index = ++target_index;
1944 bfd_mach_o_write_contents (bfd *abfd)
1947 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
1949 /* Make the commands, if not already present. */
1950 if (mdata->header.ncmds == 0)
1951 if (!bfd_mach_o_build_commands (abfd))
1954 if (!bfd_mach_o_write_header (abfd, &mdata->header))
1957 for (i = 0; i < mdata->header.ncmds; i++)
1959 struct mach_o_load_command_external raw;
1960 bfd_mach_o_load_command *cur = &mdata->commands[i];
1961 unsigned long typeflag;
1963 typeflag = cur->type | (cur->type_required ? BFD_MACH_O_LC_REQ_DYLD : 0);
1965 bfd_h_put_32 (abfd, typeflag, raw.cmd);
1966 bfd_h_put_32 (abfd, cur->len, raw.cmdsize);
1968 if (bfd_seek (abfd, cur->offset, SEEK_SET) != 0
1969 || bfd_bwrite (&raw, BFD_MACH_O_LC_SIZE, abfd) != 8)
1974 case BFD_MACH_O_LC_SEGMENT:
1975 if (bfd_mach_o_write_segment_32 (abfd, cur) != 0)
1978 case BFD_MACH_O_LC_SEGMENT_64:
1979 if (bfd_mach_o_write_segment_64 (abfd, cur) != 0)
1982 case BFD_MACH_O_LC_SYMTAB:
1983 if (!bfd_mach_o_write_symtab (abfd, cur))
1986 case BFD_MACH_O_LC_DYSYMTAB:
1987 if (!bfd_mach_o_write_dysymtab (abfd, cur))
1990 case BFD_MACH_O_LC_SYMSEG:
1992 case BFD_MACH_O_LC_THREAD:
1993 case BFD_MACH_O_LC_UNIXTHREAD:
1994 if (bfd_mach_o_write_thread (abfd, cur) != 0)
1997 case BFD_MACH_O_LC_LOADFVMLIB:
1998 case BFD_MACH_O_LC_IDFVMLIB:
1999 case BFD_MACH_O_LC_IDENT:
2000 case BFD_MACH_O_LC_FVMFILE:
2001 case BFD_MACH_O_LC_PREPAGE:
2002 case BFD_MACH_O_LC_LOAD_DYLIB:
2003 case BFD_MACH_O_LC_LOAD_WEAK_DYLIB:
2004 case BFD_MACH_O_LC_ID_DYLIB:
2005 case BFD_MACH_O_LC_REEXPORT_DYLIB:
2006 case BFD_MACH_O_LC_LOAD_UPWARD_DYLIB:
2007 case BFD_MACH_O_LC_LOAD_DYLINKER:
2008 case BFD_MACH_O_LC_ID_DYLINKER:
2009 case BFD_MACH_O_LC_PREBOUND_DYLIB:
2010 case BFD_MACH_O_LC_ROUTINES:
2011 case BFD_MACH_O_LC_SUB_FRAMEWORK:
2014 (*_bfd_error_handler) (_("unable to write unknown load command 0x%lx"),
2015 (unsigned long) cur->type);
2024 bfd_mach_o_append_section_to_segment (bfd_mach_o_segment_command *seg,
2027 bfd_mach_o_section *s = (bfd_mach_o_section *)sec->used_by_bfd;
2028 if (seg->sect_head == NULL)
2031 seg->sect_tail->next = s;
2035 /* Create section Mach-O flags from BFD flags. */
2038 bfd_mach_o_set_section_flags_from_bfd (bfd *abfd ATTRIBUTE_UNUSED, asection *sec)
2041 bfd_mach_o_section *s = bfd_mach_o_get_mach_o_section (sec);
2043 /* Create default flags. */
2044 bfd_flags = bfd_get_section_flags (abfd, sec);
2045 if ((bfd_flags & SEC_CODE) == SEC_CODE)
2046 s->flags = BFD_MACH_O_S_ATTR_PURE_INSTRUCTIONS
2047 | BFD_MACH_O_S_ATTR_SOME_INSTRUCTIONS
2048 | BFD_MACH_O_S_REGULAR;
2049 else if ((bfd_flags & (SEC_ALLOC | SEC_LOAD)) == SEC_ALLOC)
2050 s->flags = BFD_MACH_O_S_ZEROFILL;
2051 else if (bfd_flags & SEC_DEBUGGING)
2052 s->flags = BFD_MACH_O_S_REGULAR | BFD_MACH_O_S_ATTR_DEBUG;
2054 s->flags = BFD_MACH_O_S_REGULAR;
2057 /* Count the number of sections in the list for the segment named.
2059 The special case of NULL or "" for the segment name is valid for
2060 an MH_OBJECT file and means 'all sections available'.
2062 Requires that the sections table in mdata be filled in.
2064 Returns the number of sections (0 is valid).
2065 Any number > 255 signals an invalid section count, although we will,
2066 perhaps, allow the file to be written (in line with Darwin tools up
2069 A section count of (unsigned long) -1 signals a definite error. */
2071 static unsigned long
2072 bfd_mach_o_count_sections_for_seg (const char *segment,
2073 bfd_mach_o_data_struct *mdata)
2076 if (mdata == NULL || mdata->sections == NULL)
2077 return (unsigned long) -1;
2079 /* The MH_OBJECT case, all sections are considered; Although nsects is
2080 is an unsigned long, the maximum valid section count is 255 and this
2081 will have been checked already by mangle_sections. */
2082 if (segment == NULL || segment[0] == '\0')
2083 return mdata->nsects;
2085 /* Count the number of sections we see in this segment. */
2087 for (i = 0; i < mdata->nsects; ++i)
2089 bfd_mach_o_section *s = mdata->sections[i];
2090 if (strncmp (segment, s->segname, BFD_MACH_O_SEGNAME_SIZE) == 0)
2097 bfd_mach_o_build_seg_command (const char *segment,
2098 bfd_mach_o_data_struct *mdata,
2099 bfd_mach_o_segment_command *seg)
2102 int is_mho = (segment == NULL || segment[0] == '\0');
2104 /* Fill segment command. */
2106 memset (seg->segname, 0, sizeof (seg->segname));
2108 strncpy (seg->segname, segment, sizeof (seg->segname));
2110 /* TODO: fix this up for non-MH_OBJECT cases. */
2114 seg->fileoff = mdata->filelen;
2116 seg->maxprot = BFD_MACH_O_PROT_READ | BFD_MACH_O_PROT_WRITE
2117 | BFD_MACH_O_PROT_EXECUTE;
2118 seg->initprot = seg->maxprot;
2120 seg->sect_head = NULL;
2121 seg->sect_tail = NULL;
2123 /* Append sections to the segment.
2125 This is a little tedious, we have to honor the need to account zerofill
2126 sections after all the rest. This forces us to do the calculation of
2127 total vmsize in three passes so that any alignment increments are
2128 properly accounted. */
2130 for (i = 0; i < mdata->nsects; ++i)
2132 bfd_mach_o_section *s = mdata->sections[i];
2133 asection *sec = s->bfdsection;
2135 /* If we're not making an MH_OBJECT, check whether this section is from
2136 our segment, and skip if not. Otherwise, just add all sections. */
2138 && strncmp (segment, s->segname, BFD_MACH_O_SEGNAME_SIZE) != 0)
2141 /* Although we account for zerofill section sizes in vm order, they are
2142 placed in the file in source sequence. */
2143 bfd_mach_o_append_section_to_segment (seg, sec);
2146 /* Zerofill sections have zero file size & offset,
2147 and are not written. */
2148 if ((s->flags & BFD_MACH_O_SECTION_TYPE_MASK) == BFD_MACH_O_S_ZEROFILL
2149 || (s->flags & BFD_MACH_O_SECTION_TYPE_MASK)
2150 == BFD_MACH_O_S_GB_ZEROFILL)
2155 seg->vmsize = FILE_ALIGN (seg->vmsize, s->align);
2156 seg->vmsize += s->size;
2158 seg->filesize = FILE_ALIGN (seg->filesize, s->align);
2159 seg->filesize += s->size;
2161 mdata->filelen = FILE_ALIGN (mdata->filelen, s->align);
2162 s->offset = mdata->filelen;
2165 sec->filepos = s->offset;
2166 mdata->filelen += s->size;
2169 /* Now pass through again, for zerofill, only now we just update the vmsize. */
2170 for (i = 0; i < mdata->nsects; ++i)
2172 bfd_mach_o_section *s = mdata->sections[i];
2174 if ((s->flags & BFD_MACH_O_SECTION_TYPE_MASK) != BFD_MACH_O_S_ZEROFILL)
2178 && strncmp (segment, s->segname, BFD_MACH_O_SEGNAME_SIZE) != 0)
2183 seg->vmsize = FILE_ALIGN (seg->vmsize, s->align);
2184 seg->vmsize += s->size;
2188 /* Now pass through again, for zerofill_GB. */
2189 for (i = 0; i < mdata->nsects; ++i)
2191 bfd_mach_o_section *s = mdata->sections[i];
2193 if ((s->flags & BFD_MACH_O_SECTION_TYPE_MASK) != BFD_MACH_O_S_GB_ZEROFILL)
2197 && strncmp (segment, s->segname, BFD_MACH_O_SEGNAME_SIZE) != 0)
2202 seg->vmsize = FILE_ALIGN (seg->vmsize, s->align);
2203 seg->vmsize += s->size;
2207 /* Allocate space for the relocations. */
2208 mdata->filelen = FILE_ALIGN(mdata->filelen, 2);
2210 for (i = 0; i < mdata->nsects; ++i)
2212 bfd_mach_o_section *ms = mdata->sections[i];
2213 asection *sec = ms->bfdsection;
2215 if ((ms->nreloc = sec->reloc_count) == 0)
2220 sec->rel_filepos = mdata->filelen;
2221 ms->reloff = sec->rel_filepos;
2222 mdata->filelen += sec->reloc_count * BFD_MACH_O_RELENT_SIZE;
2228 /* Count the number of indirect symbols in the image.
2229 Requires that the sections are in their final order. */
2232 bfd_mach_o_count_indirect_symbols (bfd *abfd, bfd_mach_o_data_struct *mdata)
2235 unsigned int nisyms = 0;
2237 for (i = 0; i < mdata->nsects; ++i)
2239 bfd_mach_o_section *sec = mdata->sections[i];
2241 switch (sec->flags & BFD_MACH_O_SECTION_TYPE_MASK)
2243 case BFD_MACH_O_S_NON_LAZY_SYMBOL_POINTERS:
2244 case BFD_MACH_O_S_LAZY_SYMBOL_POINTERS:
2245 case BFD_MACH_O_S_SYMBOL_STUBS:
2246 nisyms += bfd_mach_o_section_get_nbr_indirect (abfd, sec);
2256 bfd_mach_o_build_dysymtab_command (bfd *abfd,
2257 bfd_mach_o_data_struct *mdata,
2258 bfd_mach_o_load_command *cmd)
2260 bfd_mach_o_dysymtab_command *dsym = &cmd->command.dysymtab;
2263 We are not going to try and fill these in yet and, moreover, we are
2264 going to bail if they are already set. */
2265 if (dsym->nmodtab != 0
2267 || dsym->nextrefsyms != 0)
2269 (*_bfd_error_handler) (_("sorry: modtab, toc and extrefsyms are not yet"
2270 " implemented for dysymtab commands."));
2274 dsym->ilocalsym = 0;
2276 if (bfd_get_symcount (abfd) > 0)
2278 asymbol **symbols = bfd_get_outsymbols (abfd);
2281 /* Count the number of each kind of symbol. */
2282 for (i = 0; i < bfd_get_symcount (abfd); ++i)
2284 bfd_mach_o_asymbol *s = (bfd_mach_o_asymbol *)symbols[i];
2285 if (s->n_type & (BFD_MACH_O_N_EXT | BFD_MACH_O_N_PEXT))
2288 dsym->nlocalsym = i;
2289 dsym->iextdefsym = i;
2290 for (; i < bfd_get_symcount (abfd); ++i)
2292 bfd_mach_o_asymbol *s = (bfd_mach_o_asymbol *)symbols[i];
2293 if ((s->n_type & BFD_MACH_O_N_TYPE) == BFD_MACH_O_N_UNDF)
2296 dsym->nextdefsym = i - dsym->nlocalsym;
2297 dsym->iundefsym = dsym->nextdefsym + dsym->iextdefsym;
2298 dsym->nundefsym = bfd_get_symcount (abfd)
2304 dsym->nlocalsym = 0;
2305 dsym->iextdefsym = 0;
2306 dsym->nextdefsym = 0;
2307 dsym->iundefsym = 0;
2308 dsym->nundefsym = 0;
2311 dsym->nindirectsyms = bfd_mach_o_count_indirect_symbols (abfd, mdata);
2312 if (dsym->nindirectsyms > 0)
2317 mdata->filelen = FILE_ALIGN (mdata->filelen, 2);
2318 dsym->indirectsymoff = mdata->filelen;
2319 mdata->filelen += dsym->nindirectsyms * 4;
2321 dsym->indirect_syms = bfd_zalloc (abfd, dsym->nindirectsyms * 4);
2322 if (dsym->indirect_syms == NULL)
2326 for (i = 0; i < mdata->nsects; ++i)
2328 bfd_mach_o_section *sec = mdata->sections[i];
2330 switch (sec->flags & BFD_MACH_O_SECTION_TYPE_MASK)
2332 case BFD_MACH_O_S_NON_LAZY_SYMBOL_POINTERS:
2333 case BFD_MACH_O_S_LAZY_SYMBOL_POINTERS:
2334 case BFD_MACH_O_S_SYMBOL_STUBS:
2337 bfd_mach_o_asymbol **isyms = sec->indirect_syms;
2339 num = bfd_mach_o_section_get_nbr_indirect (abfd, sec);
2340 if (isyms == NULL || num == 0)
2342 /* Record the starting index in the reserved1 field. */
2344 for (j = 0; j < num; j++, n++)
2346 if (isyms[j] == NULL)
2347 dsym->indirect_syms[n] = BFD_MACH_O_INDIRECT_SYM_LOCAL;
2348 else if (isyms[j]->symbol.section == bfd_abs_section_ptr
2349 && ! (isyms[j]->n_type & BFD_MACH_O_N_EXT))
2350 dsym->indirect_syms[n] = BFD_MACH_O_INDIRECT_SYM_LOCAL
2351 | BFD_MACH_O_INDIRECT_SYM_ABS;
2353 dsym->indirect_syms[n] = isyms[j]->symbol.udata.i;
2366 /* Build Mach-O load commands (currently assuming an MH_OBJECT file).
2367 TODO: Other file formats, rebuilding symtab/dysymtab commands for strip
2368 and copy functionality. */
2371 bfd_mach_o_build_commands (bfd *abfd)
2373 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
2374 unsigned wide = mach_o_wide_p (&mdata->header);
2375 int segcmd_idx = -1;
2376 int symtab_idx = -1;
2377 int dysymtab_idx = -1;
2378 unsigned long base_offset = 0;
2380 /* Return now if commands are already present. */
2381 if (mdata->header.ncmds)
2384 /* Fill in the file type, if not already set. */
2386 if (mdata->header.filetype == 0)
2388 if (abfd->flags & EXEC_P)
2389 mdata->header.filetype = BFD_MACH_O_MH_EXECUTE;
2390 else if (abfd->flags & DYNAMIC)
2391 mdata->header.filetype = BFD_MACH_O_MH_DYLIB;
2393 mdata->header.filetype = BFD_MACH_O_MH_OBJECT;
2396 /* If hasn't already been done, flatten sections list, and sort
2397 if/when required. Must be done before the symbol table is adjusted,
2398 since that depends on properly numbered sections. */
2399 if (mdata->nsects == 0 || mdata->sections == NULL)
2400 if (! bfd_mach_o_mangle_sections (abfd, mdata))
2403 /* Order the symbol table, fill-in/check mach-o specific fields and
2404 partition out any indirect symbols. */
2405 if (!bfd_mach_o_mangle_symbols (abfd))
2408 /* Very simple command set (only really applicable to MH_OBJECTs):
2409 All the commands are optional - present only when there is suitable data.
2410 (i.e. it is valid to have an empty file)
2412 a command (segment) to contain all the sections,
2413 command for the symbol table,
2414 a command for the dysymtab.
2416 ??? maybe we should assert that this is an MH_OBJECT? */
2418 if (mdata->nsects > 0)
2421 mdata->header.ncmds = 1;
2424 if (bfd_get_symcount (abfd) > 0)
2426 mdata->header.ncmds++;
2427 symtab_idx = segcmd_idx + 1; /* 0 if the seg command is absent. */
2431 This is a rather crude test for whether we should build a dysymtab. */
2432 if (bfd_mach_o_should_emit_dysymtab ()
2433 && bfd_get_symcount (abfd))
2435 mdata->header.ncmds++;
2436 /* If there should be a case where a dysymtab could be emitted without
2437 a symtab (seems improbable), this would need amending. */
2438 dysymtab_idx = symtab_idx + 1;
2442 base_offset = BFD_MACH_O_HEADER_64_SIZE;
2444 base_offset = BFD_MACH_O_HEADER_SIZE;
2446 /* Well, we must have a header, at least. */
2447 mdata->filelen = base_offset;
2449 /* A bit unusual, but no content is valid;
2450 as -n empty.s -o empty.o */
2451 if (mdata->header.ncmds == 0)
2454 mdata->commands = bfd_zalloc (abfd, mdata->header.ncmds
2455 * sizeof (bfd_mach_o_load_command));
2456 if (mdata->commands == NULL)
2459 if (segcmd_idx >= 0)
2461 bfd_mach_o_load_command *cmd = &mdata->commands[segcmd_idx];
2462 bfd_mach_o_segment_command *seg = &cmd->command.segment;
2464 /* Count the segctions in the special blank segment used for MH_OBJECT. */
2465 seg->nsects = bfd_mach_o_count_sections_for_seg (NULL, mdata);
2466 if (seg->nsects == (unsigned long) -1)
2469 /* Init segment command. */
2470 cmd->offset = base_offset;
2473 cmd->type = BFD_MACH_O_LC_SEGMENT_64;
2474 cmd->len = BFD_MACH_O_LC_SEGMENT_64_SIZE
2475 + BFD_MACH_O_SECTION_64_SIZE * seg->nsects;
2479 cmd->type = BFD_MACH_O_LC_SEGMENT;
2480 cmd->len = BFD_MACH_O_LC_SEGMENT_SIZE
2481 + BFD_MACH_O_SECTION_SIZE * seg->nsects;
2484 cmd->type_required = FALSE;
2485 mdata->header.sizeofcmds = cmd->len;
2486 mdata->filelen += cmd->len;
2489 if (symtab_idx >= 0)
2491 /* Init symtab command. */
2492 bfd_mach_o_load_command *cmd = &mdata->commands[symtab_idx];
2494 cmd->type = BFD_MACH_O_LC_SYMTAB;
2495 cmd->offset = base_offset;
2496 if (segcmd_idx >= 0)
2497 cmd->offset += mdata->commands[segcmd_idx].len;
2499 cmd->len = sizeof (struct mach_o_symtab_command_external)
2500 + BFD_MACH_O_LC_SIZE;
2501 cmd->type_required = FALSE;
2502 mdata->header.sizeofcmds += cmd->len;
2503 mdata->filelen += cmd->len;
2506 /* If required, setup symtab command, see comment above about the quality
2508 if (dysymtab_idx >= 0)
2510 bfd_mach_o_load_command *cmd = &mdata->commands[dysymtab_idx];
2512 cmd->type = BFD_MACH_O_LC_DYSYMTAB;
2513 if (symtab_idx >= 0)
2514 cmd->offset = mdata->commands[symtab_idx].offset
2515 + mdata->commands[symtab_idx].len;
2516 else if (segcmd_idx >= 0)
2517 cmd->offset = mdata->commands[segcmd_idx].offset
2518 + mdata->commands[segcmd_idx].len;
2520 cmd->offset = base_offset;
2522 cmd->type_required = FALSE;
2523 cmd->len = sizeof (struct mach_o_dysymtab_command_external)
2524 + BFD_MACH_O_LC_SIZE;
2526 mdata->header.sizeofcmds += cmd->len;
2527 mdata->filelen += cmd->len;
2530 /* So, now we have sized the commands and the filelen set to that.
2531 Now we can build the segment command and set the section file offsets. */
2533 && ! bfd_mach_o_build_seg_command
2534 (NULL, mdata, &mdata->commands[segcmd_idx].command.segment))
2537 /* If we're doing a dysymtab, cmd points to its load command. */
2538 if (dysymtab_idx >= 0
2539 && ! bfd_mach_o_build_dysymtab_command (abfd, mdata,
2540 &mdata->commands[dysymtab_idx]))
2543 /* The symtab command is filled in when the symtab is written. */
2547 /* Set the contents of a section. */
2550 bfd_mach_o_set_section_contents (bfd *abfd,
2552 const void * location,
2554 bfd_size_type count)
2558 /* Trying to write the first section contents will trigger the creation of
2559 the load commands if they are not already present. */
2560 if (! abfd->output_has_begun && ! bfd_mach_o_build_commands (abfd))
2566 pos = section->filepos + offset;
2567 if (bfd_seek (abfd, pos, SEEK_SET) != 0
2568 || bfd_bwrite (location, count, abfd) != count)
2575 bfd_mach_o_sizeof_headers (bfd *a ATTRIBUTE_UNUSED,
2576 struct bfd_link_info *info ATTRIBUTE_UNUSED)
2581 /* Make an empty symbol. This is required only because
2582 bfd_make_section_anyway wants to create a symbol for the section. */
2585 bfd_mach_o_make_empty_symbol (bfd *abfd)
2587 asymbol *new_symbol;
2589 new_symbol = bfd_zalloc (abfd, sizeof (bfd_mach_o_asymbol));
2590 if (new_symbol == NULL)
2592 new_symbol->the_bfd = abfd;
2593 new_symbol->udata.i = SYM_MACHO_FIELDS_UNSET;
2598 bfd_mach_o_read_header (bfd *abfd, bfd_mach_o_header *header)
2600 struct mach_o_header_external raw;
2602 bfd_vma (*get32) (const void *) = NULL;
2604 /* Just read the magic number. */
2605 if (bfd_seek (abfd, 0, SEEK_SET) != 0
2606 || bfd_bread (raw.magic, sizeof (raw.magic), abfd) != 4)
2609 if (bfd_getb32 (raw.magic) == BFD_MACH_O_MH_MAGIC)
2611 header->byteorder = BFD_ENDIAN_BIG;
2612 header->magic = BFD_MACH_O_MH_MAGIC;
2613 header->version = 1;
2616 else if (bfd_getl32 (raw.magic) == BFD_MACH_O_MH_MAGIC)
2618 header->byteorder = BFD_ENDIAN_LITTLE;
2619 header->magic = BFD_MACH_O_MH_MAGIC;
2620 header->version = 1;
2623 else if (bfd_getb32 (raw.magic) == BFD_MACH_O_MH_MAGIC_64)
2625 header->byteorder = BFD_ENDIAN_BIG;
2626 header->magic = BFD_MACH_O_MH_MAGIC_64;
2627 header->version = 2;
2630 else if (bfd_getl32 (raw.magic) == BFD_MACH_O_MH_MAGIC_64)
2632 header->byteorder = BFD_ENDIAN_LITTLE;
2633 header->magic = BFD_MACH_O_MH_MAGIC_64;
2634 header->version = 2;
2639 header->byteorder = BFD_ENDIAN_UNKNOWN;
2643 /* Once the size of the header is known, read the full header. */
2644 size = mach_o_wide_p (header) ?
2645 BFD_MACH_O_HEADER_64_SIZE : BFD_MACH_O_HEADER_SIZE;
2647 if (bfd_seek (abfd, 0, SEEK_SET) != 0
2648 || bfd_bread (&raw, size, abfd) != size)
2651 header->cputype = (*get32) (raw.cputype);
2652 header->cpusubtype = (*get32) (raw.cpusubtype);
2653 header->filetype = (*get32) (raw.filetype);
2654 header->ncmds = (*get32) (raw.ncmds);
2655 header->sizeofcmds = (*get32) (raw.sizeofcmds);
2656 header->flags = (*get32) (raw.flags);
2658 if (mach_o_wide_p (header))
2659 header->reserved = (*get32) (raw.reserved);
2661 header->reserved = 0;
2667 bfd_mach_o_new_section_hook (bfd *abfd, asection *sec)
2669 bfd_mach_o_section *s;
2670 unsigned bfdalign = bfd_get_section_alignment (abfd, sec);
2672 s = bfd_mach_o_get_mach_o_section (sec);
2676 static const mach_o_section_name_xlat * xlat;
2678 s = (bfd_mach_o_section *) bfd_zalloc (abfd, sizeof (*s));
2681 sec->used_by_bfd = s;
2682 s->bfdsection = sec;
2684 /* Create the Darwin seg/sect name pair from the bfd name.
2685 If this is a canonical name for which a specific paiting exists
2686 there will also be defined flags, type, attribute and alignment
2688 xlat = bfd_mach_o_convert_section_name_to_mach_o (abfd, sec, s);
2691 s->flags = xlat->macho_sectype | xlat->macho_secattr;
2692 s->align = xlat->sectalign > bfdalign ? xlat->sectalign
2694 (void) bfd_set_section_alignment (abfd, sec, s->align);
2695 bfd_flags = bfd_get_section_flags (abfd, sec);
2696 if (bfd_flags == SEC_NO_FLAGS)
2697 bfd_set_section_flags (abfd, sec, xlat->bfd_flags);
2700 /* Create default flags. */
2701 bfd_mach_o_set_section_flags_from_bfd (abfd, sec);
2704 return _bfd_generic_new_section_hook (abfd, sec);
2708 bfd_mach_o_init_section_from_mach_o (bfd *abfd, asection *sec,
2712 bfd_mach_o_section *section;
2714 flags = bfd_get_section_flags (abfd, sec);
2715 section = bfd_mach_o_get_mach_o_section (sec);
2717 /* TODO: see if we should use the xlat system for doing this by
2718 preference and fall back to this for unknown sections. */
2720 if (flags == SEC_NO_FLAGS)
2722 /* Try to guess flags. */
2723 if (section->flags & BFD_MACH_O_S_ATTR_DEBUG)
2724 flags = SEC_DEBUGGING;
2728 if ((section->flags & BFD_MACH_O_SECTION_TYPE_MASK)
2729 != BFD_MACH_O_S_ZEROFILL)
2732 if (prot & BFD_MACH_O_PROT_EXECUTE)
2734 if (prot & BFD_MACH_O_PROT_WRITE)
2736 else if (prot & BFD_MACH_O_PROT_READ)
2737 flags |= SEC_READONLY;
2743 if ((flags & SEC_DEBUGGING) == 0)
2747 if (section->offset != 0)
2748 flags |= SEC_HAS_CONTENTS;
2749 if (section->nreloc != 0)
2752 bfd_set_section_flags (abfd, sec, flags);
2754 sec->vma = section->addr;
2755 sec->lma = section->addr;
2756 sec->size = section->size;
2757 sec->filepos = section->offset;
2758 sec->alignment_power = section->align;
2759 sec->segment_mark = 0;
2760 sec->reloc_count = section->nreloc;
2761 sec->rel_filepos = section->reloff;
2765 bfd_mach_o_make_bfd_section (bfd *abfd,
2766 const unsigned char *segname,
2767 const unsigned char *sectname)
2772 bfd_mach_o_convert_section_name_to_bfd
2773 (abfd, (const char *)segname, (const char *)sectname, &sname, &flags);
2777 return bfd_make_section_anyway_with_flags (abfd, sname, flags);
2781 bfd_mach_o_read_section_32 (bfd *abfd,
2782 unsigned int offset,
2785 struct mach_o_section_32_external raw;
2787 bfd_mach_o_section *section;
2789 if (bfd_seek (abfd, offset, SEEK_SET) != 0
2790 || (bfd_bread (&raw, BFD_MACH_O_SECTION_SIZE, abfd)
2791 != BFD_MACH_O_SECTION_SIZE))
2794 sec = bfd_mach_o_make_bfd_section (abfd, raw.segname, raw.sectname);
2798 section = bfd_mach_o_get_mach_o_section (sec);
2799 memcpy (section->segname, raw.segname, sizeof (raw.segname));
2800 section->segname[BFD_MACH_O_SEGNAME_SIZE] = 0;
2801 memcpy (section->sectname, raw.sectname, sizeof (raw.sectname));
2802 section->sectname[BFD_MACH_O_SECTNAME_SIZE] = 0;
2803 section->addr = bfd_h_get_32 (abfd, raw.addr);
2804 section->size = bfd_h_get_32 (abfd, raw.size);
2805 section->offset = bfd_h_get_32 (abfd, raw.offset);
2806 section->align = bfd_h_get_32 (abfd, raw.align);
2807 section->reloff = bfd_h_get_32 (abfd, raw.reloff);
2808 section->nreloc = bfd_h_get_32 (abfd, raw.nreloc);
2809 section->flags = bfd_h_get_32 (abfd, raw.flags);
2810 section->reserved1 = bfd_h_get_32 (abfd, raw.reserved1);
2811 section->reserved2 = bfd_h_get_32 (abfd, raw.reserved2);
2812 section->reserved3 = 0;
2814 bfd_mach_o_init_section_from_mach_o (abfd, sec, prot);
2820 bfd_mach_o_read_section_64 (bfd *abfd,
2821 unsigned int offset,
2824 struct mach_o_section_64_external raw;
2826 bfd_mach_o_section *section;
2828 if (bfd_seek (abfd, offset, SEEK_SET) != 0
2829 || (bfd_bread (&raw, BFD_MACH_O_SECTION_64_SIZE, abfd)
2830 != BFD_MACH_O_SECTION_64_SIZE))
2833 sec = bfd_mach_o_make_bfd_section (abfd, raw.segname, raw.sectname);
2837 section = bfd_mach_o_get_mach_o_section (sec);
2838 memcpy (section->segname, raw.segname, sizeof (raw.segname));
2839 section->segname[BFD_MACH_O_SEGNAME_SIZE] = 0;
2840 memcpy (section->sectname, raw.sectname, sizeof (raw.sectname));
2841 section->sectname[BFD_MACH_O_SECTNAME_SIZE] = 0;
2842 section->addr = bfd_h_get_64 (abfd, raw.addr);
2843 section->size = bfd_h_get_64 (abfd, raw.size);
2844 section->offset = bfd_h_get_32 (abfd, raw.offset);
2845 section->align = bfd_h_get_32 (abfd, raw.align);
2846 section->reloff = bfd_h_get_32 (abfd, raw.reloff);
2847 section->nreloc = bfd_h_get_32 (abfd, raw.nreloc);
2848 section->flags = bfd_h_get_32 (abfd, raw.flags);
2849 section->reserved1 = bfd_h_get_32 (abfd, raw.reserved1);
2850 section->reserved2 = bfd_h_get_32 (abfd, raw.reserved2);
2851 section->reserved3 = bfd_h_get_32 (abfd, raw.reserved3);
2853 bfd_mach_o_init_section_from_mach_o (abfd, sec, prot);
2859 bfd_mach_o_read_section (bfd *abfd,
2860 unsigned int offset,
2865 return bfd_mach_o_read_section_64 (abfd, offset, prot);
2867 return bfd_mach_o_read_section_32 (abfd, offset, prot);
2871 bfd_mach_o_read_symtab_symbol (bfd *abfd,
2872 bfd_mach_o_symtab_command *sym,
2873 bfd_mach_o_asymbol *s,
2876 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
2877 unsigned int wide = mach_o_wide_p (&mdata->header);
2878 unsigned int symwidth =
2879 wide ? BFD_MACH_O_NLIST_64_SIZE : BFD_MACH_O_NLIST_SIZE;
2880 unsigned int symoff = sym->symoff + (i * symwidth);
2881 struct mach_o_nlist_64_external raw;
2882 unsigned char type = -1;
2883 unsigned char section = -1;
2885 symvalue value = -1;
2886 unsigned long stroff = -1;
2887 unsigned int symtype = -1;
2889 BFD_ASSERT (sym->strtab != NULL);
2891 if (bfd_seek (abfd, symoff, SEEK_SET) != 0
2892 || bfd_bread (&raw, symwidth, abfd) != symwidth)
2894 (*_bfd_error_handler)
2895 (_("bfd_mach_o_read_symtab_symbol: unable to read %d bytes at %lu"),
2896 symwidth, (unsigned long) symoff);
2900 stroff = bfd_h_get_32 (abfd, raw.n_strx);
2901 type = bfd_h_get_8 (abfd, raw.n_type);
2902 symtype = type & BFD_MACH_O_N_TYPE;
2903 section = bfd_h_get_8 (abfd, raw.n_sect);
2904 desc = bfd_h_get_16 (abfd, raw.n_desc);
2906 value = bfd_h_get_64 (abfd, raw.n_value);
2908 value = bfd_h_get_32 (abfd, raw.n_value);
2910 if (stroff >= sym->strsize)
2912 (*_bfd_error_handler)
2913 (_("bfd_mach_o_read_symtab_symbol: name out of range (%lu >= %lu)"),
2914 (unsigned long) stroff,
2915 (unsigned long) sym->strsize);
2919 s->symbol.the_bfd = abfd;
2920 s->symbol.name = sym->strtab + stroff;
2921 s->symbol.value = value;
2922 s->symbol.flags = 0x0;
2923 s->symbol.udata.i = i;
2925 s->n_sect = section;
2928 if (type & BFD_MACH_O_N_STAB)
2930 s->symbol.flags |= BSF_DEBUGGING;
2931 s->symbol.section = bfd_und_section_ptr;
2943 if ((section > 0) && (section <= mdata->nsects))
2945 s->symbol.section = mdata->sections[section - 1]->bfdsection;
2947 s->symbol.value - mdata->sections[section - 1]->addr;
2954 if (type & (BFD_MACH_O_N_PEXT | BFD_MACH_O_N_EXT))
2955 s->symbol.flags |= BSF_GLOBAL;
2957 s->symbol.flags |= BSF_LOCAL;
2961 case BFD_MACH_O_N_UNDF:
2962 if (type == (BFD_MACH_O_N_UNDF | BFD_MACH_O_N_EXT)
2963 && s->symbol.value != 0)
2965 /* A common symbol. */
2966 s->symbol.section = bfd_com_section_ptr;
2967 s->symbol.flags = BSF_NO_FLAGS;
2971 s->symbol.section = bfd_und_section_ptr;
2972 if (s->n_desc & BFD_MACH_O_N_WEAK_REF)
2973 s->symbol.flags |= BSF_WEAK;
2976 case BFD_MACH_O_N_PBUD:
2977 s->symbol.section = bfd_und_section_ptr;
2979 case BFD_MACH_O_N_ABS:
2980 s->symbol.section = bfd_abs_section_ptr;
2982 case BFD_MACH_O_N_SECT:
2983 if ((section > 0) && (section <= mdata->nsects))
2985 s->symbol.section = mdata->sections[section - 1]->bfdsection;
2987 s->symbol.value - mdata->sections[section - 1]->addr;
2991 /* Mach-O uses 0 to mean "no section"; not an error. */
2994 (*_bfd_error_handler) (_("bfd_mach_o_read_symtab_symbol: "
2995 "symbol \"%s\" specified invalid section %d (max %lu): setting to undefined"),
2996 s->symbol.name, section, mdata->nsects);
2998 s->symbol.section = bfd_und_section_ptr;
3001 case BFD_MACH_O_N_INDR:
3002 /* FIXME: we don't follow the BFD convention as this indirect symbol
3003 won't be followed by the referenced one. This looks harmless
3004 unless we start using the linker. */
3005 s->symbol.flags |= BSF_INDIRECT;
3006 s->symbol.section = bfd_ind_section_ptr;
3007 s->symbol.value = 0;
3010 (*_bfd_error_handler) (_("bfd_mach_o_read_symtab_symbol: "
3011 "symbol \"%s\" specified invalid type field 0x%x: setting to undefined"),
3012 s->symbol.name, symtype);
3013 s->symbol.section = bfd_und_section_ptr;
3022 bfd_mach_o_read_symtab_strtab (bfd *abfd)
3024 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
3025 bfd_mach_o_symtab_command *sym = mdata->symtab;
3027 /* Fail if there is no symtab. */
3031 /* Success if already loaded. */
3035 if (abfd->flags & BFD_IN_MEMORY)
3037 struct bfd_in_memory *b;
3039 b = (struct bfd_in_memory *) abfd->iostream;
3041 if ((sym->stroff + sym->strsize) > b->size)
3043 bfd_set_error (bfd_error_file_truncated);
3046 sym->strtab = (char *) b->buffer + sym->stroff;
3050 sym->strtab = bfd_alloc (abfd, sym->strsize);
3051 if (sym->strtab == NULL)
3054 if (bfd_seek (abfd, sym->stroff, SEEK_SET) != 0
3055 || bfd_bread (sym->strtab, sym->strsize, abfd) != sym->strsize)
3057 bfd_set_error (bfd_error_file_truncated);
3066 bfd_mach_o_read_symtab_symbols (bfd *abfd)
3068 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
3069 bfd_mach_o_symtab_command *sym = mdata->symtab;
3072 if (sym == NULL || sym->symbols)
3074 /* Return now if there are no symbols or if already loaded. */
3078 sym->symbols = bfd_alloc (abfd, sym->nsyms * sizeof (bfd_mach_o_asymbol));
3080 if (sym->symbols == NULL)
3082 (*_bfd_error_handler) (_("bfd_mach_o_read_symtab_symbols: unable to allocate memory for symbols"));
3086 if (!bfd_mach_o_read_symtab_strtab (abfd))
3089 for (i = 0; i < sym->nsyms; i++)
3091 if (!bfd_mach_o_read_symtab_symbol (abfd, sym, &sym->symbols[i], i))
3099 bfd_mach_o_i386_flavour_string (unsigned int flavour)
3101 switch ((int) flavour)
3103 case BFD_MACH_O_x86_THREAD_STATE32: return "x86_THREAD_STATE32";
3104 case BFD_MACH_O_x86_FLOAT_STATE32: return "x86_FLOAT_STATE32";
3105 case BFD_MACH_O_x86_EXCEPTION_STATE32: return "x86_EXCEPTION_STATE32";
3106 case BFD_MACH_O_x86_THREAD_STATE64: return "x86_THREAD_STATE64";
3107 case BFD_MACH_O_x86_FLOAT_STATE64: return "x86_FLOAT_STATE64";
3108 case BFD_MACH_O_x86_EXCEPTION_STATE64: return "x86_EXCEPTION_STATE64";
3109 case BFD_MACH_O_x86_THREAD_STATE: return "x86_THREAD_STATE";
3110 case BFD_MACH_O_x86_FLOAT_STATE: return "x86_FLOAT_STATE";
3111 case BFD_MACH_O_x86_EXCEPTION_STATE: return "x86_EXCEPTION_STATE";
3112 case BFD_MACH_O_x86_DEBUG_STATE32: return "x86_DEBUG_STATE32";
3113 case BFD_MACH_O_x86_DEBUG_STATE64: return "x86_DEBUG_STATE64";
3114 case BFD_MACH_O_x86_DEBUG_STATE: return "x86_DEBUG_STATE";
3115 case BFD_MACH_O_x86_THREAD_STATE_NONE: return "x86_THREAD_STATE_NONE";
3116 default: return "UNKNOWN";
3121 bfd_mach_o_ppc_flavour_string (unsigned int flavour)
3123 switch ((int) flavour)
3125 case BFD_MACH_O_PPC_THREAD_STATE: return "PPC_THREAD_STATE";
3126 case BFD_MACH_O_PPC_FLOAT_STATE: return "PPC_FLOAT_STATE";
3127 case BFD_MACH_O_PPC_EXCEPTION_STATE: return "PPC_EXCEPTION_STATE";
3128 case BFD_MACH_O_PPC_VECTOR_STATE: return "PPC_VECTOR_STATE";
3129 case BFD_MACH_O_PPC_THREAD_STATE64: return "PPC_THREAD_STATE64";
3130 case BFD_MACH_O_PPC_EXCEPTION_STATE64: return "PPC_EXCEPTION_STATE64";
3131 default: return "UNKNOWN";
3136 bfd_mach_o_read_dylinker (bfd *abfd, bfd_mach_o_load_command *command)
3138 bfd_mach_o_dylinker_command *cmd = &command->command.dylinker;
3139 struct mach_o_str_command_external raw;
3140 unsigned int nameoff;
3142 BFD_ASSERT ((command->type == BFD_MACH_O_LC_ID_DYLINKER)
3143 || (command->type == BFD_MACH_O_LC_LOAD_DYLINKER));
3145 if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
3146 || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
3149 nameoff = bfd_h_get_32 (abfd, raw.str);
3151 cmd->name_offset = command->offset + nameoff;
3152 cmd->name_len = command->len - nameoff;
3153 cmd->name_str = bfd_alloc (abfd, cmd->name_len);
3154 if (cmd->name_str == NULL)
3156 if (bfd_seek (abfd, cmd->name_offset, SEEK_SET) != 0
3157 || bfd_bread (cmd->name_str, cmd->name_len, abfd) != cmd->name_len)
3163 bfd_mach_o_read_dylib (bfd *abfd, bfd_mach_o_load_command *command)
3165 bfd_mach_o_dylib_command *cmd = &command->command.dylib;
3166 struct mach_o_dylib_command_external raw;
3167 unsigned int nameoff;
3169 switch (command->type)
3171 case BFD_MACH_O_LC_LOAD_DYLIB:
3172 case BFD_MACH_O_LC_LOAD_WEAK_DYLIB:
3173 case BFD_MACH_O_LC_ID_DYLIB:
3174 case BFD_MACH_O_LC_REEXPORT_DYLIB:
3175 case BFD_MACH_O_LC_LOAD_UPWARD_DYLIB:
3182 if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
3183 || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
3186 nameoff = bfd_h_get_32 (abfd, raw.name);
3187 cmd->timestamp = bfd_h_get_32 (abfd, raw.timestamp);
3188 cmd->current_version = bfd_h_get_32 (abfd, raw.current_version);
3189 cmd->compatibility_version = bfd_h_get_32 (abfd, raw.compatibility_version);
3191 cmd->name_offset = command->offset + nameoff;
3192 cmd->name_len = command->len - nameoff;
3193 cmd->name_str = bfd_alloc (abfd, cmd->name_len);
3194 if (cmd->name_str == NULL)
3196 if (bfd_seek (abfd, cmd->name_offset, SEEK_SET) != 0
3197 || bfd_bread (cmd->name_str, cmd->name_len, abfd) != cmd->name_len)
3203 bfd_mach_o_read_prebound_dylib (bfd *abfd ATTRIBUTE_UNUSED,
3204 bfd_mach_o_load_command *command ATTRIBUTE_UNUSED)
3206 /* bfd_mach_o_prebound_dylib_command *cmd = &command->command.prebound_dylib; */
3208 BFD_ASSERT (command->type == BFD_MACH_O_LC_PREBOUND_DYLIB);
3213 bfd_mach_o_read_fvmlib (bfd *abfd, bfd_mach_o_load_command *command)
3215 bfd_mach_o_fvmlib_command *fvm = &command->command.fvmlib;
3216 struct mach_o_fvmlib_command_external raw;
3217 unsigned int nameoff;
3219 if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
3220 || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
3223 nameoff = bfd_h_get_32 (abfd, raw.name);
3224 fvm->minor_version = bfd_h_get_32 (abfd, raw.minor_version);
3225 fvm->header_addr = bfd_h_get_32 (abfd, raw.header_addr);
3227 fvm->name_offset = command->offset + nameoff;
3228 fvm->name_len = command->len - nameoff;
3229 fvm->name_str = bfd_alloc (abfd, fvm->name_len);
3230 if (fvm->name_str == NULL)
3232 if (bfd_seek (abfd, fvm->name_offset, SEEK_SET) != 0
3233 || bfd_bread (fvm->name_str, fvm->name_len, abfd) != fvm->name_len)
3239 bfd_mach_o_read_thread (bfd *abfd, bfd_mach_o_load_command *command)
3241 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
3242 bfd_mach_o_thread_command *cmd = &command->command.thread;
3243 unsigned int offset;
3244 unsigned int nflavours;
3247 BFD_ASSERT ((command->type == BFD_MACH_O_LC_THREAD)
3248 || (command->type == BFD_MACH_O_LC_UNIXTHREAD));
3250 /* Count the number of threads. */
3253 while (offset != command->len)
3255 struct mach_o_thread_command_external raw;
3257 if (offset >= command->len)
3260 if (bfd_seek (abfd, command->offset + offset, SEEK_SET) != 0
3261 || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
3264 offset += sizeof (raw) + bfd_h_get_32 (abfd, raw.count) * 4;
3268 /* Allocate threads. */
3269 cmd->flavours = bfd_alloc
3270 (abfd, nflavours * sizeof (bfd_mach_o_thread_flavour));
3271 if (cmd->flavours == NULL)
3273 cmd->nflavours = nflavours;
3277 while (offset != command->len)
3279 struct mach_o_thread_command_external raw;
3281 if (offset >= command->len)
3284 if (nflavours >= cmd->nflavours)
3287 if (bfd_seek (abfd, command->offset + offset, SEEK_SET) != 0
3288 || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
3291 cmd->flavours[nflavours].flavour = bfd_h_get_32 (abfd, raw.flavour);
3292 cmd->flavours[nflavours].offset = command->offset + offset + sizeof (raw);
3293 cmd->flavours[nflavours].size = bfd_h_get_32 (abfd, raw.count) * 4;
3294 offset += cmd->flavours[nflavours].size + sizeof (raw);
3298 for (i = 0; i < nflavours; i++)
3301 unsigned int snamelen;
3303 const char *flavourstr;
3304 const char *prefix = "LC_THREAD";
3307 switch (mdata->header.cputype)
3309 case BFD_MACH_O_CPU_TYPE_POWERPC:
3310 case BFD_MACH_O_CPU_TYPE_POWERPC_64:
3311 flavourstr = bfd_mach_o_ppc_flavour_string (cmd->flavours[i].flavour);
3313 case BFD_MACH_O_CPU_TYPE_I386:
3314 case BFD_MACH_O_CPU_TYPE_X86_64:
3315 flavourstr = bfd_mach_o_i386_flavour_string (cmd->flavours[i].flavour);
3318 flavourstr = "UNKNOWN_ARCHITECTURE";
3322 snamelen = strlen (prefix) + 1 + 20 + 1 + strlen (flavourstr) + 1;
3323 sname = bfd_alloc (abfd, snamelen);
3329 sprintf (sname, "%s.%s.%u", prefix, flavourstr, j);
3330 if (bfd_get_section_by_name (abfd, sname) == NULL)
3335 bfdsec = bfd_make_section_with_flags (abfd, sname, SEC_HAS_CONTENTS);
3339 bfdsec->size = cmd->flavours[i].size;
3340 bfdsec->filepos = cmd->flavours[i].offset;
3341 bfdsec->alignment_power = 0x0;
3343 cmd->section = bfdsec;
3350 bfd_mach_o_read_dysymtab (bfd *abfd, bfd_mach_o_load_command *command)
3352 bfd_mach_o_dysymtab_command *cmd = &command->command.dysymtab;
3353 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
3355 BFD_ASSERT (command->type == BFD_MACH_O_LC_DYSYMTAB);
3358 struct mach_o_dysymtab_command_external raw;
3360 if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
3361 || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
3364 cmd->ilocalsym = bfd_h_get_32 (abfd, raw.ilocalsym);
3365 cmd->nlocalsym = bfd_h_get_32 (abfd, raw.nlocalsym);
3366 cmd->iextdefsym = bfd_h_get_32 (abfd, raw.iextdefsym);
3367 cmd->nextdefsym = bfd_h_get_32 (abfd, raw.nextdefsym);
3368 cmd->iundefsym = bfd_h_get_32 (abfd, raw.iundefsym);
3369 cmd->nundefsym = bfd_h_get_32 (abfd, raw.nundefsym);
3370 cmd->tocoff = bfd_h_get_32 (abfd, raw.tocoff);
3371 cmd->ntoc = bfd_h_get_32 (abfd, raw.ntoc);
3372 cmd->modtaboff = bfd_h_get_32 (abfd, raw.modtaboff);
3373 cmd->nmodtab = bfd_h_get_32 (abfd, raw.nmodtab);
3374 cmd->extrefsymoff = bfd_h_get_32 (abfd, raw.extrefsymoff);
3375 cmd->nextrefsyms = bfd_h_get_32 (abfd, raw.nextrefsyms);
3376 cmd->indirectsymoff = bfd_h_get_32 (abfd, raw.indirectsymoff);
3377 cmd->nindirectsyms = bfd_h_get_32 (abfd, raw.nindirectsyms);
3378 cmd->extreloff = bfd_h_get_32 (abfd, raw.extreloff);
3379 cmd->nextrel = bfd_h_get_32 (abfd, raw.nextrel);
3380 cmd->locreloff = bfd_h_get_32 (abfd, raw.locreloff);
3381 cmd->nlocrel = bfd_h_get_32 (abfd, raw.nlocrel);
3384 if (cmd->nmodtab != 0)
3387 int wide = bfd_mach_o_wide_p (abfd);
3388 unsigned int module_len = wide ? 56 : 52;
3391 bfd_alloc (abfd, cmd->nmodtab * sizeof (bfd_mach_o_dylib_module));
3392 if (cmd->dylib_module == NULL)
3395 if (bfd_seek (abfd, cmd->modtaboff, SEEK_SET) != 0)
3398 for (i = 0; i < cmd->nmodtab; i++)
3400 bfd_mach_o_dylib_module *module = &cmd->dylib_module[i];
3402 unsigned char buf[56];
3404 if (bfd_bread ((void *) buf, module_len, abfd) != module_len)
3407 module->module_name_idx = bfd_h_get_32 (abfd, buf + 0);
3408 module->iextdefsym = bfd_h_get_32 (abfd, buf + 4);
3409 module->nextdefsym = bfd_h_get_32 (abfd, buf + 8);
3410 module->irefsym = bfd_h_get_32 (abfd, buf + 12);
3411 module->nrefsym = bfd_h_get_32 (abfd, buf + 16);
3412 module->ilocalsym = bfd_h_get_32 (abfd, buf + 20);
3413 module->nlocalsym = bfd_h_get_32 (abfd, buf + 24);
3414 module->iextrel = bfd_h_get_32 (abfd, buf + 28);
3415 module->nextrel = bfd_h_get_32 (abfd, buf + 32);
3416 v = bfd_h_get_32 (abfd, buf +36);
3417 module->iinit = v & 0xffff;
3418 module->iterm = (v >> 16) & 0xffff;
3419 v = bfd_h_get_32 (abfd, buf + 40);
3420 module->ninit = v & 0xffff;
3421 module->nterm = (v >> 16) & 0xffff;
3424 module->objc_module_info_size = bfd_h_get_32 (abfd, buf + 44);
3425 module->objc_module_info_addr = bfd_h_get_64 (abfd, buf + 48);
3429 module->objc_module_info_addr = bfd_h_get_32 (abfd, buf + 44);
3430 module->objc_module_info_size = bfd_h_get_32 (abfd, buf + 48);
3439 cmd->dylib_toc = bfd_alloc
3440 (abfd, cmd->ntoc * sizeof (bfd_mach_o_dylib_table_of_content));
3441 if (cmd->dylib_toc == NULL)
3444 if (bfd_seek (abfd, cmd->tocoff, SEEK_SET) != 0)
3447 for (i = 0; i < cmd->ntoc; i++)
3449 struct mach_o_dylib_table_of_contents_external raw;
3450 bfd_mach_o_dylib_table_of_content *toc = &cmd->dylib_toc[i];
3452 if (bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
3455 toc->symbol_index = bfd_h_get_32 (abfd, raw.symbol_index);
3456 toc->module_index = bfd_h_get_32 (abfd, raw.module_index);
3460 if (cmd->nindirectsyms != 0)
3464 cmd->indirect_syms = bfd_alloc
3465 (abfd, cmd->nindirectsyms * sizeof (unsigned int));
3466 if (cmd->indirect_syms == NULL)
3469 if (bfd_seek (abfd, cmd->indirectsymoff, SEEK_SET) != 0)
3472 for (i = 0; i < cmd->nindirectsyms; i++)
3474 unsigned char raw[4];
3475 unsigned int *is = &cmd->indirect_syms[i];
3477 if (bfd_bread (raw, sizeof (raw), abfd) != sizeof (raw))
3480 *is = bfd_h_get_32 (abfd, raw);
3484 if (cmd->nextrefsyms != 0)
3489 cmd->ext_refs = bfd_alloc
3490 (abfd, cmd->nextrefsyms * sizeof (bfd_mach_o_dylib_reference));
3491 if (cmd->ext_refs == NULL)
3494 if (bfd_seek (abfd, cmd->extrefsymoff, SEEK_SET) != 0)
3497 for (i = 0; i < cmd->nextrefsyms; i++)
3499 unsigned char raw[4];
3500 bfd_mach_o_dylib_reference *ref = &cmd->ext_refs[i];
3502 if (bfd_bread (raw, sizeof (raw), abfd) != sizeof (raw))
3505 /* Fields isym and flags are written as bit-fields, thus we need
3506 a specific processing for endianness. */
3507 v = bfd_h_get_32 (abfd, raw);
3508 if (bfd_big_endian (abfd))
3510 ref->isym = (v >> 8) & 0xffffff;
3511 ref->flags = v & 0xff;
3515 ref->isym = v & 0xffffff;
3516 ref->flags = (v >> 24) & 0xff;
3521 if (mdata->dysymtab)
3523 mdata->dysymtab = cmd;
3529 bfd_mach_o_read_symtab (bfd *abfd, bfd_mach_o_load_command *command)
3531 bfd_mach_o_symtab_command *symtab = &command->command.symtab;
3532 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
3533 struct mach_o_symtab_command_external raw;
3535 BFD_ASSERT (command->type == BFD_MACH_O_LC_SYMTAB);
3537 if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
3538 || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
3541 symtab->symoff = bfd_h_get_32 (abfd, raw.symoff);
3542 symtab->nsyms = bfd_h_get_32 (abfd, raw.nsyms);
3543 symtab->stroff = bfd_h_get_32 (abfd, raw.stroff);
3544 symtab->strsize = bfd_h_get_32 (abfd, raw.strsize);
3545 symtab->symbols = NULL;
3546 symtab->strtab = NULL;
3548 if (symtab->nsyms != 0)
3549 abfd->flags |= HAS_SYMS;
3553 mdata->symtab = symtab;
3558 bfd_mach_o_read_uuid (bfd *abfd, bfd_mach_o_load_command *command)
3560 bfd_mach_o_uuid_command *cmd = &command->command.uuid;
3562 BFD_ASSERT (command->type == BFD_MACH_O_LC_UUID);
3564 if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
3565 || bfd_bread (cmd->uuid, 16, abfd) != 16)
3572 bfd_mach_o_read_linkedit (bfd *abfd, bfd_mach_o_load_command *command)
3574 bfd_mach_o_linkedit_command *cmd = &command->command.linkedit;
3575 struct mach_o_linkedit_data_command_external raw;
3577 if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
3578 || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
3581 cmd->dataoff = bfd_get_32 (abfd, raw.dataoff);
3582 cmd->datasize = bfd_get_32 (abfd, raw.datasize);
3587 bfd_mach_o_read_str (bfd *abfd, bfd_mach_o_load_command *command)
3589 bfd_mach_o_str_command *cmd = &command->command.str;
3590 struct mach_o_str_command_external raw;
3593 if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
3594 || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
3597 off = bfd_get_32 (abfd, raw.str);
3598 cmd->stroff = command->offset + off;
3599 cmd->str_len = command->len - off;
3600 cmd->str = bfd_alloc (abfd, cmd->str_len);
3601 if (cmd->str == NULL)
3603 if (bfd_seek (abfd, cmd->stroff, SEEK_SET) != 0
3604 || bfd_bread ((void *) cmd->str, cmd->str_len, abfd) != cmd->str_len)
3610 bfd_mach_o_read_dyld_info (bfd *abfd, bfd_mach_o_load_command *command)
3612 bfd_mach_o_dyld_info_command *cmd = &command->command.dyld_info;
3613 struct mach_o_dyld_info_command_external raw;
3615 if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
3616 || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
3619 cmd->rebase_off = bfd_get_32 (abfd, raw.rebase_off);
3620 cmd->rebase_size = bfd_get_32 (abfd, raw.rebase_size);
3621 cmd->bind_off = bfd_get_32 (abfd, raw.bind_off);
3622 cmd->bind_size = bfd_get_32 (abfd, raw.bind_size);
3623 cmd->weak_bind_off = bfd_get_32 (abfd, raw.weak_bind_off);
3624 cmd->weak_bind_size = bfd_get_32 (abfd, raw.weak_bind_size);
3625 cmd->lazy_bind_off = bfd_get_32 (abfd, raw.lazy_bind_off);
3626 cmd->lazy_bind_size = bfd_get_32 (abfd, raw.lazy_bind_size);
3627 cmd->export_off = bfd_get_32 (abfd, raw.export_off);
3628 cmd->export_size = bfd_get_32 (abfd, raw.export_size);
3633 bfd_mach_o_read_version_min (bfd *abfd, bfd_mach_o_load_command *command)
3635 bfd_mach_o_version_min_command *cmd = &command->command.version_min;
3636 struct mach_o_version_min_command_external raw;
3639 if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
3640 || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
3643 ver = bfd_get_32 (abfd, raw.version);
3644 cmd->rel = ver >> 16;
3645 cmd->maj = ver >> 8;
3647 cmd->reserved = bfd_get_32 (abfd, raw.reserved);
3652 bfd_mach_o_read_encryption_info (bfd *abfd, bfd_mach_o_load_command *command)
3654 bfd_mach_o_encryption_info_command *cmd = &command->command.encryption_info;
3655 struct mach_o_encryption_info_command_external raw;
3657 if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
3658 || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
3661 cmd->cryptoff = bfd_get_32 (abfd, raw.cryptoff);
3662 cmd->cryptsize = bfd_get_32 (abfd, raw.cryptsize);
3663 cmd->cryptid = bfd_get_32 (abfd, raw.cryptid);
3668 bfd_mach_o_read_main (bfd *abfd, bfd_mach_o_load_command *command)
3670 bfd_mach_o_main_command *cmd = &command->command.main;
3671 struct mach_o_entry_point_command_external raw;
3673 if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
3674 || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
3677 cmd->entryoff = bfd_get_64 (abfd, raw.entryoff);
3678 cmd->stacksize = bfd_get_64 (abfd, raw.stacksize);
3683 bfd_mach_o_read_source_version (bfd *abfd, bfd_mach_o_load_command *command)
3685 bfd_mach_o_source_version_command *cmd = &command->command.source_version;
3686 struct mach_o_source_version_command_external raw;
3689 if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
3690 || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
3693 ver = bfd_get_64 (abfd, raw.version);
3694 /* Note: we use a serie of shift to avoid shift > 32 (for which gcc
3695 generates warnings) in case of the host doesn't support 64 bit
3697 cmd->e = ver & 0x3ff;
3699 cmd->d = ver & 0x3ff;
3701 cmd->c = ver & 0x3ff;
3703 cmd->b = ver & 0x3ff;
3705 cmd->a = ver & 0xffffff;
3710 bfd_mach_o_read_segment (bfd *abfd,
3711 bfd_mach_o_load_command *command,
3714 bfd_mach_o_segment_command *seg = &command->command.segment;
3719 struct mach_o_segment_command_64_external raw;
3721 BFD_ASSERT (command->type == BFD_MACH_O_LC_SEGMENT_64);
3723 if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
3724 || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
3727 memcpy (seg->segname, raw.segname, 16);
3728 seg->segname[16] = '\0';
3730 seg->vmaddr = bfd_h_get_64 (abfd, raw.vmaddr);
3731 seg->vmsize = bfd_h_get_64 (abfd, raw.vmsize);
3732 seg->fileoff = bfd_h_get_64 (abfd, raw.fileoff);
3733 seg->filesize = bfd_h_get_64 (abfd, raw.filesize);
3734 seg->maxprot = bfd_h_get_32 (abfd, raw.maxprot);
3735 seg->initprot = bfd_h_get_32 (abfd, raw.initprot);
3736 seg->nsects = bfd_h_get_32 (abfd, raw.nsects);
3737 seg->flags = bfd_h_get_32 (abfd, raw.flags);
3741 struct mach_o_segment_command_32_external raw;
3743 BFD_ASSERT (command->type == BFD_MACH_O_LC_SEGMENT);
3745 if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
3746 || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
3749 memcpy (seg->segname, raw.segname, 16);
3750 seg->segname[16] = '\0';
3752 seg->vmaddr = bfd_h_get_32 (abfd, raw.vmaddr);
3753 seg->vmsize = bfd_h_get_32 (abfd, raw.vmsize);
3754 seg->fileoff = bfd_h_get_32 (abfd, raw.fileoff);
3755 seg->filesize = bfd_h_get_32 (abfd, raw.filesize);
3756 seg->maxprot = bfd_h_get_32 (abfd, raw.maxprot);
3757 seg->initprot = bfd_h_get_32 (abfd, raw.initprot);
3758 seg->nsects = bfd_h_get_32 (abfd, raw.nsects);
3759 seg->flags = bfd_h_get_32 (abfd, raw.flags);
3761 seg->sect_head = NULL;
3762 seg->sect_tail = NULL;
3764 for (i = 0; i < seg->nsects; i++)
3770 segoff = command->offset + BFD_MACH_O_LC_SEGMENT_64_SIZE
3771 + (i * BFD_MACH_O_SECTION_64_SIZE);
3773 segoff = command->offset + BFD_MACH_O_LC_SEGMENT_SIZE
3774 + (i * BFD_MACH_O_SECTION_SIZE);
3776 sec = bfd_mach_o_read_section (abfd, segoff, seg->initprot, wide);
3780 bfd_mach_o_append_section_to_segment (seg, sec);
3787 bfd_mach_o_read_segment_32 (bfd *abfd, bfd_mach_o_load_command *command)
3789 return bfd_mach_o_read_segment (abfd, command, 0);
3793 bfd_mach_o_read_segment_64 (bfd *abfd, bfd_mach_o_load_command *command)
3795 return bfd_mach_o_read_segment (abfd, command, 1);
3799 bfd_mach_o_read_command (bfd *abfd, bfd_mach_o_load_command *command)
3801 struct mach_o_load_command_external raw;
3804 /* Read command type and length. */
3805 if (bfd_seek (abfd, command->offset, SEEK_SET) != 0
3806 || bfd_bread (&raw, BFD_MACH_O_LC_SIZE, abfd) != BFD_MACH_O_LC_SIZE)
3809 cmd = bfd_h_get_32 (abfd, raw.cmd);
3810 command->type = cmd & ~BFD_MACH_O_LC_REQ_DYLD;
3811 command->type_required = cmd & BFD_MACH_O_LC_REQ_DYLD ? TRUE : FALSE;
3812 command->len = bfd_h_get_32 (abfd, raw.cmdsize);
3814 switch (command->type)
3816 case BFD_MACH_O_LC_SEGMENT:
3817 if (bfd_mach_o_read_segment_32 (abfd, command) != 0)
3820 case BFD_MACH_O_LC_SEGMENT_64:
3821 if (bfd_mach_o_read_segment_64 (abfd, command) != 0)
3824 case BFD_MACH_O_LC_SYMTAB:
3825 if (bfd_mach_o_read_symtab (abfd, command) != 0)
3828 case BFD_MACH_O_LC_SYMSEG:
3830 case BFD_MACH_O_LC_THREAD:
3831 case BFD_MACH_O_LC_UNIXTHREAD:
3832 if (bfd_mach_o_read_thread (abfd, command) != 0)
3835 case BFD_MACH_O_LC_LOAD_DYLINKER:
3836 case BFD_MACH_O_LC_ID_DYLINKER:
3837 if (bfd_mach_o_read_dylinker (abfd, command) != 0)
3840 case BFD_MACH_O_LC_LOAD_DYLIB:
3841 case BFD_MACH_O_LC_ID_DYLIB:
3842 case BFD_MACH_O_LC_LOAD_WEAK_DYLIB:
3843 case BFD_MACH_O_LC_REEXPORT_DYLIB:
3844 case BFD_MACH_O_LC_LOAD_UPWARD_DYLIB:
3845 if (bfd_mach_o_read_dylib (abfd, command) != 0)
3848 case BFD_MACH_O_LC_PREBOUND_DYLIB:
3849 if (bfd_mach_o_read_prebound_dylib (abfd, command) != 0)
3852 case BFD_MACH_O_LC_LOADFVMLIB:
3853 case BFD_MACH_O_LC_IDFVMLIB:
3854 if (bfd_mach_o_read_fvmlib (abfd, command) != 0)
3857 case BFD_MACH_O_LC_IDENT:
3858 case BFD_MACH_O_LC_FVMFILE:
3859 case BFD_MACH_O_LC_PREPAGE:
3860 case BFD_MACH_O_LC_ROUTINES:
3861 case BFD_MACH_O_LC_ROUTINES_64:
3863 case BFD_MACH_O_LC_SUB_FRAMEWORK:
3864 case BFD_MACH_O_LC_SUB_UMBRELLA:
3865 case BFD_MACH_O_LC_SUB_LIBRARY:
3866 case BFD_MACH_O_LC_SUB_CLIENT:
3867 case BFD_MACH_O_LC_RPATH:
3868 if (bfd_mach_o_read_str (abfd, command) != 0)
3871 case BFD_MACH_O_LC_DYSYMTAB:
3872 if (bfd_mach_o_read_dysymtab (abfd, command) != 0)
3875 case BFD_MACH_O_LC_TWOLEVEL_HINTS:
3876 case BFD_MACH_O_LC_PREBIND_CKSUM:
3878 case BFD_MACH_O_LC_UUID:
3879 if (bfd_mach_o_read_uuid (abfd, command) != 0)
3882 case BFD_MACH_O_LC_CODE_SIGNATURE:
3883 case BFD_MACH_O_LC_SEGMENT_SPLIT_INFO:
3884 case BFD_MACH_O_LC_FUNCTION_STARTS:
3885 case BFD_MACH_O_LC_DATA_IN_CODE:
3886 case BFD_MACH_O_LC_DYLIB_CODE_SIGN_DRS:
3887 if (bfd_mach_o_read_linkedit (abfd, command) != 0)
3890 case BFD_MACH_O_LC_ENCRYPTION_INFO:
3891 if (!bfd_mach_o_read_encryption_info (abfd, command))
3894 case BFD_MACH_O_LC_DYLD_INFO:
3895 if (bfd_mach_o_read_dyld_info (abfd, command) != 0)
3898 case BFD_MACH_O_LC_VERSION_MIN_MACOSX:
3899 case BFD_MACH_O_LC_VERSION_MIN_IPHONEOS:
3900 if (!bfd_mach_o_read_version_min (abfd, command))
3903 case BFD_MACH_O_LC_MAIN:
3904 if (!bfd_mach_o_read_main (abfd, command))
3907 case BFD_MACH_O_LC_SOURCE_VERSION:
3908 if (!bfd_mach_o_read_source_version (abfd, command))
3912 (*_bfd_error_handler)(_("%B: unknown load command 0x%lx"),
3913 abfd, (unsigned long) command->type);
3921 bfd_mach_o_flatten_sections (bfd *abfd)
3923 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
3927 /* Count total number of sections. */
3930 for (i = 0; i < mdata->header.ncmds; i++)
3932 if (mdata->commands[i].type == BFD_MACH_O_LC_SEGMENT
3933 || mdata->commands[i].type == BFD_MACH_O_LC_SEGMENT_64)
3935 bfd_mach_o_segment_command *seg;
3937 seg = &mdata->commands[i].command.segment;
3938 mdata->nsects += seg->nsects;
3942 /* Allocate sections array. */
3943 mdata->sections = bfd_alloc (abfd,
3944 mdata->nsects * sizeof (bfd_mach_o_section *));
3946 /* Fill the array. */
3949 for (i = 0; i < mdata->header.ncmds; i++)
3951 if (mdata->commands[i].type == BFD_MACH_O_LC_SEGMENT
3952 || mdata->commands[i].type == BFD_MACH_O_LC_SEGMENT_64)
3954 bfd_mach_o_segment_command *seg;
3955 bfd_mach_o_section *sec;
3957 seg = &mdata->commands[i].command.segment;
3958 BFD_ASSERT (csect + seg->nsects <= mdata->nsects);
3960 for (sec = seg->sect_head; sec != NULL; sec = sec->next)
3961 mdata->sections[csect++] = sec;
3967 bfd_mach_o_scan_start_address (bfd *abfd)
3969 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
3970 bfd_mach_o_thread_command *cmd = NULL;
3973 for (i = 0; i < mdata->header.ncmds; i++)
3974 if ((mdata->commands[i].type == BFD_MACH_O_LC_THREAD) ||
3975 (mdata->commands[i].type == BFD_MACH_O_LC_UNIXTHREAD))
3977 cmd = &mdata->commands[i].command.thread;
3980 else if (mdata->commands[i].type == BFD_MACH_O_LC_MAIN
3981 && mdata->nsects > 1)
3983 bfd_mach_o_main_command *main_cmd = &mdata->commands[i].command.main;
3984 bfd_mach_o_section *text_sect = mdata->sections[0];
3987 abfd->start_address = main_cmd->entryoff
3988 + (text_sect->addr - text_sect->offset);
3993 /* An object file has no start address, so do not fail if not found. */
3997 /* FIXME: create a subtarget hook ? */
3998 for (i = 0; i < cmd->nflavours; i++)
4000 if ((mdata->header.cputype == BFD_MACH_O_CPU_TYPE_I386)
4001 && (cmd->flavours[i].flavour
4002 == (unsigned long) BFD_MACH_O_x86_THREAD_STATE32))
4004 unsigned char buf[4];
4006 if (bfd_seek (abfd, cmd->flavours[i].offset + 40, SEEK_SET) != 0
4007 || bfd_bread (buf, 4, abfd) != 4)
4010 abfd->start_address = bfd_h_get_32 (abfd, buf);
4012 else if ((mdata->header.cputype == BFD_MACH_O_CPU_TYPE_POWERPC)
4013 && (cmd->flavours[i].flavour == BFD_MACH_O_PPC_THREAD_STATE))
4015 unsigned char buf[4];
4017 if (bfd_seek (abfd, cmd->flavours[i].offset + 0, SEEK_SET) != 0
4018 || bfd_bread (buf, 4, abfd) != 4)
4021 abfd->start_address = bfd_h_get_32 (abfd, buf);
4023 else if ((mdata->header.cputype == BFD_MACH_O_CPU_TYPE_POWERPC_64)
4024 && (cmd->flavours[i].flavour == BFD_MACH_O_PPC_THREAD_STATE64))
4026 unsigned char buf[8];
4028 if (bfd_seek (abfd, cmd->flavours[i].offset + 0, SEEK_SET) != 0
4029 || bfd_bread (buf, 8, abfd) != 8)
4032 abfd->start_address = bfd_h_get_64 (abfd, buf);
4034 else if ((mdata->header.cputype == BFD_MACH_O_CPU_TYPE_X86_64)
4035 && (cmd->flavours[i].flavour == BFD_MACH_O_x86_THREAD_STATE64))
4037 unsigned char buf[8];
4039 if (bfd_seek (abfd, cmd->flavours[i].offset + (16 * 8), SEEK_SET) != 0
4040 || bfd_bread (buf, 8, abfd) != 8)
4043 abfd->start_address = bfd_h_get_64 (abfd, buf);
4051 bfd_mach_o_set_arch_mach (bfd *abfd,
4052 enum bfd_architecture arch,
4053 unsigned long machine)
4055 bfd_mach_o_backend_data *bed = bfd_mach_o_get_backend_data (abfd);
4057 /* If this isn't the right architecture for this backend, and this
4058 isn't the generic backend, fail. */
4059 if (arch != bed->arch
4060 && arch != bfd_arch_unknown
4061 && bed->arch != bfd_arch_unknown)
4064 return bfd_default_set_arch_mach (abfd, arch, machine);
4068 bfd_mach_o_scan (bfd *abfd,
4069 bfd_mach_o_header *header,
4070 bfd_mach_o_data_struct *mdata)
4073 enum bfd_architecture cputype;
4074 unsigned long cpusubtype;
4075 unsigned int hdrsize;
4077 hdrsize = mach_o_wide_p (header) ?
4078 BFD_MACH_O_HEADER_64_SIZE : BFD_MACH_O_HEADER_SIZE;
4080 mdata->header = *header;
4082 abfd->flags = abfd->flags & BFD_IN_MEMORY;
4083 switch (header->filetype)
4085 case BFD_MACH_O_MH_OBJECT:
4086 abfd->flags |= HAS_RELOC;
4088 case BFD_MACH_O_MH_EXECUTE:
4089 abfd->flags |= EXEC_P;
4091 case BFD_MACH_O_MH_DYLIB:
4092 case BFD_MACH_O_MH_BUNDLE:
4093 abfd->flags |= DYNAMIC;
4097 abfd->tdata.mach_o_data = mdata;
4099 bfd_mach_o_convert_architecture (header->cputype, header->cpusubtype,
4100 &cputype, &cpusubtype);
4101 if (cputype == bfd_arch_unknown)
4103 (*_bfd_error_handler)
4104 (_("bfd_mach_o_scan: unknown architecture 0x%lx/0x%lx"),
4105 header->cputype, header->cpusubtype);
4109 bfd_set_arch_mach (abfd, cputype, cpusubtype);
4111 if (header->ncmds != 0)
4113 mdata->commands = bfd_alloc
4114 (abfd, header->ncmds * sizeof (bfd_mach_o_load_command));
4115 if (mdata->commands == NULL)
4118 for (i = 0; i < header->ncmds; i++)
4120 bfd_mach_o_load_command *cur = &mdata->commands[i];
4123 cur->offset = hdrsize;
4126 bfd_mach_o_load_command *prev = &mdata->commands[i - 1];
4127 cur->offset = prev->offset + prev->len;
4130 if (bfd_mach_o_read_command (abfd, cur) < 0)
4135 /* Sections should be flatten before scanning start address. */
4136 bfd_mach_o_flatten_sections (abfd);
4137 if (!bfd_mach_o_scan_start_address (abfd))
4144 bfd_mach_o_mkobject_init (bfd *abfd)
4146 bfd_mach_o_data_struct *mdata = NULL;
4148 mdata = bfd_alloc (abfd, sizeof (bfd_mach_o_data_struct));
4151 abfd->tdata.mach_o_data = mdata;
4153 mdata->header.magic = 0;
4154 mdata->header.cputype = 0;
4155 mdata->header.cpusubtype = 0;
4156 mdata->header.filetype = 0;
4157 mdata->header.ncmds = 0;
4158 mdata->header.sizeofcmds = 0;
4159 mdata->header.flags = 0;
4160 mdata->header.byteorder = BFD_ENDIAN_UNKNOWN;
4161 mdata->commands = NULL;
4163 mdata->sections = NULL;
4164 mdata->dyn_reloc_cache = NULL;
4170 bfd_mach_o_gen_mkobject (bfd *abfd)
4172 bfd_mach_o_data_struct *mdata;
4174 if (!bfd_mach_o_mkobject_init (abfd))
4177 mdata = bfd_mach_o_get_data (abfd);
4178 mdata->header.magic = BFD_MACH_O_MH_MAGIC;
4179 mdata->header.cputype = 0;
4180 mdata->header.cpusubtype = 0;
4181 mdata->header.byteorder = abfd->xvec->byteorder;
4182 mdata->header.version = 1;
4188 bfd_mach_o_header_p (bfd *abfd,
4189 bfd_mach_o_filetype filetype,
4190 bfd_mach_o_cpu_type cputype)
4192 bfd_mach_o_header header;
4193 bfd_mach_o_data_struct *mdata;
4195 if (!bfd_mach_o_read_header (abfd, &header))
4198 if (! (header.byteorder == BFD_ENDIAN_BIG
4199 || header.byteorder == BFD_ENDIAN_LITTLE))
4201 (*_bfd_error_handler) (_("unknown header byte-order value 0x%lx"),
4202 (unsigned long) header.byteorder);
4206 if (! ((header.byteorder == BFD_ENDIAN_BIG
4207 && abfd->xvec->byteorder == BFD_ENDIAN_BIG
4208 && abfd->xvec->header_byteorder == BFD_ENDIAN_BIG)
4209 || (header.byteorder == BFD_ENDIAN_LITTLE
4210 && abfd->xvec->byteorder == BFD_ENDIAN_LITTLE
4211 && abfd->xvec->header_byteorder == BFD_ENDIAN_LITTLE)))
4214 /* Check cputype and filetype.
4215 In case of wildcard, do not accept magics that are handled by existing
4219 if (header.cputype != cputype)
4225 if (header.filetype != filetype)
4230 switch (header.filetype)
4232 case BFD_MACH_O_MH_CORE:
4233 /* Handled by core_p */
4240 mdata = (bfd_mach_o_data_struct *) bfd_zalloc (abfd, sizeof (*mdata));
4244 if (!bfd_mach_o_scan (abfd, &header, mdata))
4250 bfd_set_error (bfd_error_wrong_format);
4256 static const bfd_target *
4257 bfd_mach_o_gen_object_p (bfd *abfd)
4259 return bfd_mach_o_header_p (abfd, 0, 0);
4262 static const bfd_target *
4263 bfd_mach_o_gen_core_p (bfd *abfd)
4265 return bfd_mach_o_header_p (abfd, BFD_MACH_O_MH_CORE, 0);
4268 typedef struct mach_o_fat_archentry
4270 unsigned long cputype;
4271 unsigned long cpusubtype;
4272 unsigned long offset;
4274 unsigned long align;
4275 } mach_o_fat_archentry;
4277 typedef struct mach_o_fat_data_struct
4279 unsigned long magic;
4280 unsigned long nfat_arch;
4281 mach_o_fat_archentry *archentries;
4282 } mach_o_fat_data_struct;
4285 bfd_mach_o_archive_p (bfd *abfd)
4287 mach_o_fat_data_struct *adata = NULL;
4288 struct mach_o_fat_header_external hdr;
4291 if (bfd_seek (abfd, 0, SEEK_SET) != 0
4292 || bfd_bread (&hdr, sizeof (hdr), abfd) != sizeof (hdr))
4295 adata = bfd_alloc (abfd, sizeof (mach_o_fat_data_struct));
4299 adata->magic = bfd_getb32 (hdr.magic);
4300 adata->nfat_arch = bfd_getb32 (hdr.nfat_arch);
4301 if (adata->magic != 0xcafebabe)
4303 /* Avoid matching Java bytecode files, which have the same magic number.
4304 In the Java bytecode file format this field contains the JVM version,
4305 which starts at 43.0. */
4306 if (adata->nfat_arch > 30)
4309 adata->archentries =
4310 bfd_alloc (abfd, adata->nfat_arch * sizeof (mach_o_fat_archentry));
4311 if (adata->archentries == NULL)
4314 for (i = 0; i < adata->nfat_arch; i++)
4316 struct mach_o_fat_arch_external arch;
4317 if (bfd_bread (&arch, sizeof (arch), abfd) != sizeof (arch))
4319 adata->archentries[i].cputype = bfd_getb32 (arch.cputype);
4320 adata->archentries[i].cpusubtype = bfd_getb32 (arch.cpusubtype);
4321 adata->archentries[i].offset = bfd_getb32 (arch.offset);
4322 adata->archentries[i].size = bfd_getb32 (arch.size);
4323 adata->archentries[i].align = bfd_getb32 (arch.align);
4326 abfd->tdata.mach_o_fat_data = adata;
4331 bfd_release (abfd, adata);
4332 bfd_set_error (bfd_error_wrong_format);
4336 /* Set the filename for a fat binary member ABFD, whose bfd architecture is
4337 ARCH_TYPE/ARCH_SUBTYPE and corresponding entry in header is ENTRY.
4338 Set arelt_data and origin fields too. */
4341 bfd_mach_o_fat_member_init (bfd *abfd,
4342 enum bfd_architecture arch_type,
4343 unsigned long arch_subtype,
4344 mach_o_fat_archentry *entry)
4346 struct areltdata *areltdata;
4347 /* Create the member filename. Use ARCH_NAME. */
4348 const bfd_arch_info_type *ap = bfd_lookup_arch (arch_type, arch_subtype);
4352 /* Use the architecture name if known. */
4353 abfd->filename = ap->printable_name;
4357 /* Forge a uniq id. */
4358 const size_t namelen = 2 + 8 + 1 + 2 + 8 + 1;
4359 char *name = bfd_alloc (abfd, namelen);
4360 snprintf (name, namelen, "0x%lx-0x%lx",
4361 entry->cputype, entry->cpusubtype);
4362 abfd->filename = name;
4365 areltdata = bfd_zmalloc (sizeof (struct areltdata));
4366 areltdata->parsed_size = entry->size;
4367 abfd->arelt_data = areltdata;
4368 abfd->iostream = NULL;
4369 abfd->origin = entry->offset;
4373 bfd_mach_o_openr_next_archived_file (bfd *archive, bfd *prev)
4375 mach_o_fat_data_struct *adata;
4376 mach_o_fat_archentry *entry = NULL;
4379 enum bfd_architecture arch_type;
4380 unsigned long arch_subtype;
4382 adata = (mach_o_fat_data_struct *) archive->tdata.mach_o_fat_data;
4383 BFD_ASSERT (adata != NULL);
4385 /* Find index of previous entry. */
4388 /* Start at first one. */
4393 /* Find index of PREV. */
4394 for (i = 0; i < adata->nfat_arch; i++)
4396 if (adata->archentries[i].offset == prev->origin)
4400 if (i == adata->nfat_arch)
4403 bfd_set_error (bfd_error_bad_value);
4407 /* Get next entry. */
4411 if (i >= adata->nfat_arch)
4413 bfd_set_error (bfd_error_no_more_archived_files);
4417 entry = &adata->archentries[i];
4418 nbfd = _bfd_new_bfd_contained_in (archive);
4422 bfd_mach_o_convert_architecture (entry->cputype, entry->cpusubtype,
4423 &arch_type, &arch_subtype);
4425 bfd_mach_o_fat_member_init (nbfd, arch_type, arch_subtype, entry);
4427 bfd_set_arch_mach (nbfd, arch_type, arch_subtype);
4432 /* Analogous to stat call. */
4435 bfd_mach_o_fat_stat_arch_elt (bfd *abfd, struct stat *buf)
4437 if (abfd->arelt_data == NULL)
4439 bfd_set_error (bfd_error_invalid_operation);
4446 buf->st_mode = 0644;
4447 buf->st_size = arelt_size (abfd);
4452 /* If ABFD format is FORMAT and architecture is ARCH, return it.
4453 If ABFD is a fat image containing a member that corresponds to FORMAT
4454 and ARCH, returns it.
4455 In other case, returns NULL.
4456 This function allows transparent uses of fat images. */
4459 bfd_mach_o_fat_extract (bfd *abfd,
4461 const bfd_arch_info_type *arch)
4464 mach_o_fat_data_struct *adata;
4467 if (bfd_check_format (abfd, format))
4469 if (bfd_get_arch_info (abfd) == arch)
4473 if (!bfd_check_format (abfd, bfd_archive)
4474 || abfd->xvec != &mach_o_fat_vec)
4477 /* This is a Mach-O fat image. */
4478 adata = (mach_o_fat_data_struct *) abfd->tdata.mach_o_fat_data;
4479 BFD_ASSERT (adata != NULL);
4481 for (i = 0; i < adata->nfat_arch; i++)
4483 struct mach_o_fat_archentry *e = &adata->archentries[i];
4484 enum bfd_architecture cpu_type;
4485 unsigned long cpu_subtype;
4487 bfd_mach_o_convert_architecture (e->cputype, e->cpusubtype,
4488 &cpu_type, &cpu_subtype);
4489 if (cpu_type != arch->arch || cpu_subtype != arch->mach)
4492 /* The architecture is found. */
4493 res = _bfd_new_bfd_contained_in (abfd);
4497 bfd_mach_o_fat_member_init (res, cpu_type, cpu_subtype, e);
4499 if (bfd_check_format (res, format))
4501 BFD_ASSERT (bfd_get_arch_info (res) == arch);
4512 bfd_mach_o_lookup_command (bfd *abfd,
4513 bfd_mach_o_load_command_type type,
4514 bfd_mach_o_load_command **mcommand)
4516 struct mach_o_data_struct *md = bfd_mach_o_get_data (abfd);
4517 bfd_mach_o_load_command *ncmd = NULL;
4518 unsigned int i, num;
4520 BFD_ASSERT (md != NULL);
4521 BFD_ASSERT (mcommand != NULL);
4524 for (i = 0; i < md->header.ncmds; i++)
4526 struct bfd_mach_o_load_command *cmd = &md->commands[i];
4528 if (cmd->type != type)
4541 bfd_mach_o_stack_addr (enum bfd_mach_o_cpu_type type)
4545 case BFD_MACH_O_CPU_TYPE_MC680x0:
4547 case BFD_MACH_O_CPU_TYPE_MC88000:
4549 case BFD_MACH_O_CPU_TYPE_POWERPC:
4551 case BFD_MACH_O_CPU_TYPE_I386:
4553 case BFD_MACH_O_CPU_TYPE_SPARC:
4555 case BFD_MACH_O_CPU_TYPE_I860:
4557 case BFD_MACH_O_CPU_TYPE_HPPA:
4558 return 0xc0000000 - 0x04000000;
4564 /* The following two tables should be kept, as far as possible, in order of
4565 most frequently used entries to optimize their use from gas. */
4567 const bfd_mach_o_xlat_name bfd_mach_o_section_type_name[] =
4569 { "regular", BFD_MACH_O_S_REGULAR},
4570 { "coalesced", BFD_MACH_O_S_COALESCED},
4571 { "zerofill", BFD_MACH_O_S_ZEROFILL},
4572 { "cstring_literals", BFD_MACH_O_S_CSTRING_LITERALS},
4573 { "4byte_literals", BFD_MACH_O_S_4BYTE_LITERALS},
4574 { "8byte_literals", BFD_MACH_O_S_8BYTE_LITERALS},
4575 { "16byte_literals", BFD_MACH_O_S_16BYTE_LITERALS},
4576 { "literal_pointers", BFD_MACH_O_S_LITERAL_POINTERS},
4577 { "mod_init_func_pointers", BFD_MACH_O_S_MOD_INIT_FUNC_POINTERS},
4578 { "mod_fini_func_pointers", BFD_MACH_O_S_MOD_FINI_FUNC_POINTERS},
4579 { "gb_zerofill", BFD_MACH_O_S_GB_ZEROFILL},
4580 { "interposing", BFD_MACH_O_S_INTERPOSING},
4581 { "dtrace_dof", BFD_MACH_O_S_DTRACE_DOF},
4582 { "non_lazy_symbol_pointers", BFD_MACH_O_S_NON_LAZY_SYMBOL_POINTERS},
4583 { "lazy_symbol_pointers", BFD_MACH_O_S_LAZY_SYMBOL_POINTERS},
4584 { "symbol_stubs", BFD_MACH_O_S_SYMBOL_STUBS},
4585 { "lazy_dylib_symbol_pointers", BFD_MACH_O_S_LAZY_DYLIB_SYMBOL_POINTERS},
4589 const bfd_mach_o_xlat_name bfd_mach_o_section_attribute_name[] =
4591 { "pure_instructions", BFD_MACH_O_S_ATTR_PURE_INSTRUCTIONS },
4592 { "some_instructions", BFD_MACH_O_S_ATTR_SOME_INSTRUCTIONS },
4593 { "loc_reloc", BFD_MACH_O_S_ATTR_LOC_RELOC },
4594 { "ext_reloc", BFD_MACH_O_S_ATTR_EXT_RELOC },
4595 { "debug", BFD_MACH_O_S_ATTR_DEBUG },
4596 { "live_support", BFD_MACH_O_S_ATTR_LIVE_SUPPORT },
4597 { "no_dead_strip", BFD_MACH_O_S_ATTR_NO_DEAD_STRIP },
4598 { "strip_static_syms", BFD_MACH_O_S_ATTR_STRIP_STATIC_SYMS },
4599 { "no_toc", BFD_MACH_O_S_ATTR_NO_TOC },
4600 { "self_modifying_code", BFD_MACH_O_S_SELF_MODIFYING_CODE },
4601 { "modifying_code", BFD_MACH_O_S_SELF_MODIFYING_CODE },
4605 /* Get the section type from NAME. Return 256 if NAME is unknown. */
4608 bfd_mach_o_get_section_type_from_name (bfd *abfd, const char *name)
4610 const bfd_mach_o_xlat_name *x;
4611 bfd_mach_o_backend_data *bed = bfd_mach_o_get_backend_data (abfd);
4613 for (x = bfd_mach_o_section_type_name; x->name; x++)
4614 if (strcmp (x->name, name) == 0)
4616 /* We found it... does the target support it? */
4617 if (bed->bfd_mach_o_section_type_valid_for_target == NULL
4618 || bed->bfd_mach_o_section_type_valid_for_target (x->val))
4619 return x->val; /* OK. */
4621 break; /* Not supported. */
4623 /* Maximum section ID = 0xff. */
4627 /* Get the section attribute from NAME. Return -1 if NAME is unknown. */
4630 bfd_mach_o_get_section_attribute_from_name (const char *name)
4632 const bfd_mach_o_xlat_name *x;
4634 for (x = bfd_mach_o_section_attribute_name; x->name; x++)
4635 if (strcmp (x->name, name) == 0)
4637 return (unsigned int)-1;
4641 bfd_mach_o_core_fetch_environment (bfd *abfd,
4642 unsigned char **rbuf,
4645 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
4646 unsigned long stackaddr = bfd_mach_o_stack_addr (mdata->header.cputype);
4649 for (i = 0; i < mdata->header.ncmds; i++)
4651 bfd_mach_o_load_command *cur = &mdata->commands[i];
4652 bfd_mach_o_segment_command *seg = NULL;
4654 if (cur->type != BFD_MACH_O_LC_SEGMENT)
4657 seg = &cur->command.segment;
4659 if ((seg->vmaddr + seg->vmsize) == stackaddr)
4661 unsigned long start = seg->fileoff;
4662 unsigned long end = seg->fileoff + seg->filesize;
4663 unsigned char *buf = bfd_malloc (1024);
4664 unsigned long size = 1024;
4668 bfd_size_type nread = 0;
4669 unsigned long offset;
4670 int found_nonnull = 0;
4672 if (size > (end - start))
4673 size = (end - start);
4675 buf = bfd_realloc_or_free (buf, size);
4679 if (bfd_seek (abfd, end - size, SEEK_SET) != 0)
4685 nread = bfd_bread (buf, size, abfd);
4693 for (offset = 4; offset <= size; offset += 4)
4697 val = *((unsigned long *) (buf + size - offset));
4698 if (! found_nonnull)
4703 else if (val == 0x0)
4705 unsigned long bottom;
4708 bottom = seg->fileoff + seg->filesize - offset;
4709 top = seg->fileoff + seg->filesize - 4;
4710 *rbuf = bfd_malloc (top - bottom);
4711 *rlen = top - bottom;
4713 memcpy (*rbuf, buf + size - *rlen, *rlen);
4719 if (size == (end - start))
4733 bfd_mach_o_core_file_failing_command (bfd *abfd)
4735 unsigned char *buf = NULL;
4736 unsigned int len = 0;
4739 ret = bfd_mach_o_core_fetch_environment (abfd, &buf, &len);
4743 return (char *) buf;
4747 bfd_mach_o_core_file_failing_signal (bfd *abfd ATTRIBUTE_UNUSED)
4752 static bfd_mach_o_uuid_command *
4753 bfd_mach_o_lookup_uuid_command (bfd *abfd)
4755 bfd_mach_o_load_command *uuid_cmd;
4756 int ncmd = bfd_mach_o_lookup_command (abfd, BFD_MACH_O_LC_UUID, &uuid_cmd);
4759 return &uuid_cmd->command.uuid;
4762 /* Return true if ABFD is a dSYM file and its UUID matches UUID_CMD. */
4765 bfd_mach_o_dsym_for_uuid_p (bfd *abfd, const bfd_mach_o_uuid_command *uuid_cmd)
4767 bfd_mach_o_uuid_command *dsym_uuid_cmd;
4770 BFD_ASSERT (uuid_cmd);
4772 if (!bfd_check_format (abfd, bfd_object))
4775 if (bfd_get_flavour (abfd) != bfd_target_mach_o_flavour
4776 || bfd_mach_o_get_data (abfd) == NULL
4777 || bfd_mach_o_get_data (abfd)->header.filetype != BFD_MACH_O_MH_DSYM)
4780 dsym_uuid_cmd = bfd_mach_o_lookup_uuid_command (abfd);
4781 if (dsym_uuid_cmd == NULL)
4784 if (memcmp (uuid_cmd->uuid, dsym_uuid_cmd->uuid,
4785 sizeof (uuid_cmd->uuid)) != 0)
4791 /* Find a BFD in DSYM_FILENAME which matches ARCH and UUID_CMD.
4792 The caller is responsible for closing the returned BFD object and
4793 its my_archive if the returned BFD is in a fat dSYM. */
4796 bfd_mach_o_find_dsym (const char *dsym_filename,
4797 const bfd_mach_o_uuid_command *uuid_cmd,
4798 const bfd_arch_info_type *arch)
4800 bfd *base_dsym_bfd, *dsym_bfd;
4802 BFD_ASSERT (uuid_cmd);
4804 base_dsym_bfd = bfd_openr (dsym_filename, NULL);
4805 if (base_dsym_bfd == NULL)
4808 dsym_bfd = bfd_mach_o_fat_extract (base_dsym_bfd, bfd_object, arch);
4809 if (bfd_mach_o_dsym_for_uuid_p (dsym_bfd, uuid_cmd))
4812 bfd_close (dsym_bfd);
4813 if (base_dsym_bfd != dsym_bfd)
4814 bfd_close (base_dsym_bfd);
4819 /* Return a BFD created from a dSYM file for ABFD.
4820 The caller is responsible for closing the returned BFD object, its
4821 filename, and its my_archive if the returned BFD is in a fat dSYM. */
4824 bfd_mach_o_follow_dsym (bfd *abfd)
4826 char *dsym_filename;
4827 bfd_mach_o_uuid_command *uuid_cmd;
4828 bfd *dsym_bfd, *base_bfd = abfd;
4829 const char *base_basename;
4831 if (abfd == NULL || bfd_get_flavour (abfd) != bfd_target_mach_o_flavour)
4834 if (abfd->my_archive)
4835 base_bfd = abfd->my_archive;
4836 /* BFD may have been opened from a stream. */
4837 if (base_bfd->filename == NULL)
4839 bfd_set_error (bfd_error_invalid_operation);
4842 base_basename = lbasename (base_bfd->filename);
4844 uuid_cmd = bfd_mach_o_lookup_uuid_command (abfd);
4845 if (uuid_cmd == NULL)
4848 /* TODO: We assume the DWARF file has the same as the binary's.
4849 It seems apple's GDB checks all files in the dSYM bundle directory.
4850 http://opensource.apple.com/source/gdb/gdb-1708/src/gdb/macosx/macosx-tdep.c
4852 dsym_filename = (char *)bfd_malloc (strlen (base_bfd->filename)
4853 + strlen (dsym_subdir) + 1
4854 + strlen (base_basename) + 1);
4855 sprintf (dsym_filename, "%s%s/%s",
4856 base_bfd->filename, dsym_subdir, base_basename);
4858 dsym_bfd = bfd_mach_o_find_dsym (dsym_filename, uuid_cmd,
4859 bfd_get_arch_info (abfd));
4860 if (dsym_bfd == NULL)
4861 free (dsym_filename);
4867 bfd_mach_o_find_nearest_line (bfd *abfd,
4871 const char **filename_ptr,
4872 const char **functionname_ptr,
4873 unsigned int *line_ptr)
4875 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
4878 switch (mdata->header.filetype)
4880 case BFD_MACH_O_MH_OBJECT:
4882 case BFD_MACH_O_MH_EXECUTE:
4883 case BFD_MACH_O_MH_DYLIB:
4884 case BFD_MACH_O_MH_BUNDLE:
4885 case BFD_MACH_O_MH_KEXT_BUNDLE:
4886 if (mdata->dwarf2_find_line_info == NULL)
4888 mdata->dsym_bfd = bfd_mach_o_follow_dsym (abfd);
4889 /* When we couldn't find dSYM for this binary, we look for
4890 the debug information in the binary itself. In this way,
4891 we won't try finding separated dSYM again because
4892 mdata->dwarf2_find_line_info will be filled. */
4893 if (! mdata->dsym_bfd)
4895 if (! _bfd_dwarf2_slurp_debug_info (abfd, mdata->dsym_bfd,
4896 dwarf_debug_sections, symbols,
4897 &mdata->dwarf2_find_line_info))
4904 if (_bfd_dwarf2_find_nearest_line (abfd, dwarf_debug_sections,
4905 section, symbols, offset,
4906 filename_ptr, functionname_ptr,
4908 &mdata->dwarf2_find_line_info))
4914 bfd_mach_o_close_and_cleanup (bfd *abfd)
4916 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
4917 if (bfd_get_format (abfd) == bfd_object && mdata != NULL)
4919 _bfd_dwarf2_cleanup_debug_info (abfd, &mdata->dwarf2_find_line_info);
4920 bfd_mach_o_free_cached_info (abfd);
4921 if (mdata->dsym_bfd != NULL)
4923 bfd *fat_bfd = mdata->dsym_bfd->my_archive;
4924 char *dsym_filename = (char *)(fat_bfd
4926 : mdata->dsym_bfd->filename);
4927 bfd_close (mdata->dsym_bfd);
4928 mdata->dsym_bfd = NULL;
4930 bfd_close (fat_bfd);
4931 free (dsym_filename);
4935 if (bfd_get_format (abfd) == bfd_archive
4936 && abfd->xvec == &mach_o_fat_vec)
4938 return _bfd_generic_close_and_cleanup (abfd);
4941 bfd_boolean bfd_mach_o_free_cached_info (bfd *abfd)
4943 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
4945 free (mdata->dyn_reloc_cache);
4946 mdata->dyn_reloc_cache = NULL;
4947 for (asect = abfd->sections; asect != NULL; asect = asect->next)
4949 free (asect->relocation);
4950 asect->relocation = NULL;
4956 #define bfd_mach_o_bfd_reloc_type_lookup _bfd_norelocs_bfd_reloc_type_lookup
4957 #define bfd_mach_o_bfd_reloc_name_lookup _bfd_norelocs_bfd_reloc_name_lookup
4959 #define bfd_mach_o_swap_reloc_in NULL
4960 #define bfd_mach_o_swap_reloc_out NULL
4961 #define bfd_mach_o_print_thread NULL
4962 #define bfd_mach_o_tgt_seg_table NULL
4963 #define bfd_mach_o_section_type_valid_for_tgt NULL
4965 #define TARGET_NAME mach_o_be_vec
4966 #define TARGET_STRING "mach-o-be"
4967 #define TARGET_ARCHITECTURE bfd_arch_unknown
4968 #define TARGET_BIG_ENDIAN 1
4969 #define TARGET_ARCHIVE 0
4970 #define TARGET_PRIORITY 1
4971 #include "mach-o-target.c"
4974 #undef TARGET_STRING
4975 #undef TARGET_ARCHITECTURE
4976 #undef TARGET_BIG_ENDIAN
4977 #undef TARGET_ARCHIVE
4978 #undef TARGET_PRIORITY
4980 #define TARGET_NAME mach_o_le_vec
4981 #define TARGET_STRING "mach-o-le"
4982 #define TARGET_ARCHITECTURE bfd_arch_unknown
4983 #define TARGET_BIG_ENDIAN 0
4984 #define TARGET_ARCHIVE 0
4985 #define TARGET_PRIORITY 1
4987 #include "mach-o-target.c"
4990 #undef TARGET_STRING
4991 #undef TARGET_ARCHITECTURE
4992 #undef TARGET_BIG_ENDIAN
4993 #undef TARGET_ARCHIVE
4994 #undef TARGET_PRIORITY
4996 /* Not yet handled: creating an archive. */
4997 #define bfd_mach_o_mkarchive _bfd_noarchive_mkarchive
5000 #define bfd_mach_o_read_ar_hdr _bfd_noarchive_read_ar_hdr
5001 #define bfd_mach_o_write_ar_hdr _bfd_noarchive_write_ar_hdr
5002 #define bfd_mach_o_slurp_armap _bfd_noarchive_slurp_armap
5003 #define bfd_mach_o_slurp_extended_name_table _bfd_noarchive_slurp_extended_name_table
5004 #define bfd_mach_o_construct_extended_name_table _bfd_noarchive_construct_extended_name_table
5005 #define bfd_mach_o_truncate_arname _bfd_noarchive_truncate_arname
5006 #define bfd_mach_o_write_armap _bfd_noarchive_write_armap
5007 #define bfd_mach_o_get_elt_at_index _bfd_noarchive_get_elt_at_index
5008 #define bfd_mach_o_generic_stat_arch_elt bfd_mach_o_fat_stat_arch_elt
5009 #define bfd_mach_o_update_armap_timestamp _bfd_noarchive_update_armap_timestamp
5011 #define TARGET_NAME mach_o_fat_vec
5012 #define TARGET_STRING "mach-o-fat"
5013 #define TARGET_ARCHITECTURE bfd_arch_unknown
5014 #define TARGET_BIG_ENDIAN 1
5015 #define TARGET_ARCHIVE 1
5016 #define TARGET_PRIORITY 0
5018 #include "mach-o-target.c"
5021 #undef TARGET_STRING
5022 #undef TARGET_ARCHITECTURE
5023 #undef TARGET_BIG_ENDIAN
5024 #undef TARGET_ARCHIVE
5025 #undef TARGET_PRIORITY