1 /* Mach-O support for BFD.
2 Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
4 Free Software Foundation, Inc.
6 This file is part of BFD, the Binary File Descriptor library.
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
21 MA 02110-1301, USA. */
27 #include "libiberty.h"
28 #include "aout/stab_gnu.h"
29 #include "mach-o/reloc.h"
30 #include "mach-o/external.h"
35 #define bfd_mach_o_object_p bfd_mach_o_gen_object_p
36 #define bfd_mach_o_core_p bfd_mach_o_gen_core_p
37 #define bfd_mach_o_mkobject bfd_mach_o_gen_mkobject
39 #define FILE_ALIGN(off, algn) \
40 (((off) + ((file_ptr) 1 << (algn)) - 1) & ((file_ptr) -1 << (algn)))
43 bfd_mach_o_version (bfd *abfd)
45 bfd_mach_o_data_struct *mdata = NULL;
47 BFD_ASSERT (bfd_mach_o_valid (abfd));
48 mdata = bfd_mach_o_get_data (abfd);
50 return mdata->header.version;
54 bfd_mach_o_valid (bfd *abfd)
56 if (abfd == NULL || abfd->xvec == NULL)
59 if (abfd->xvec->flavour != bfd_target_mach_o_flavour)
62 if (bfd_mach_o_get_data (abfd) == NULL)
67 static INLINE bfd_boolean
68 mach_o_wide_p (bfd_mach_o_header *header)
70 switch (header->version)
82 static INLINE bfd_boolean
83 bfd_mach_o_wide_p (bfd *abfd)
85 return mach_o_wide_p (&bfd_mach_o_get_data (abfd)->header);
88 /* Tables to translate well known Mach-O segment/section names to bfd
89 names. Use of canonical names (such as .text or .debug_frame) is required
93 static const mach_o_section_name_xlat text_section_names_xlat[] =
96 SEC_CODE | SEC_LOAD, BFD_MACH_O_S_REGULAR,
97 BFD_MACH_O_S_ATTR_PURE_INSTRUCTIONS, 0},
98 { ".const", "__const",
99 SEC_READONLY | SEC_DATA | SEC_LOAD, BFD_MACH_O_S_REGULAR,
100 BFD_MACH_O_S_ATTR_NONE, 0},
101 { ".static_const", "__static_const",
102 SEC_READONLY | SEC_DATA | SEC_LOAD, BFD_MACH_O_S_REGULAR,
103 BFD_MACH_O_S_ATTR_NONE, 0},
104 { ".cstring", "__cstring",
105 SEC_READONLY | SEC_DATA | SEC_LOAD | SEC_MERGE | SEC_STRINGS,
106 BFD_MACH_O_S_CSTRING_LITERALS,
107 BFD_MACH_O_S_ATTR_NONE, 0},
108 { ".literal4", "__literal4",
109 SEC_READONLY | SEC_DATA | SEC_LOAD, BFD_MACH_O_S_4BYTE_LITERALS,
110 BFD_MACH_O_S_ATTR_NONE, 2},
111 { ".literal8", "__literal8",
112 SEC_READONLY | SEC_DATA | SEC_LOAD, BFD_MACH_O_S_8BYTE_LITERALS,
113 BFD_MACH_O_S_ATTR_NONE, 3},
114 { ".literal16", "__literal16",
115 SEC_READONLY | SEC_DATA | SEC_LOAD, BFD_MACH_O_S_16BYTE_LITERALS,
116 BFD_MACH_O_S_ATTR_NONE, 4},
117 { ".constructor", "__constructor",
118 SEC_CODE | SEC_LOAD, BFD_MACH_O_S_REGULAR,
119 BFD_MACH_O_S_ATTR_NONE, 0},
120 { ".destructor", "__destructor",
121 SEC_CODE | SEC_LOAD, BFD_MACH_O_S_REGULAR,
122 BFD_MACH_O_S_ATTR_NONE, 0},
123 { ".eh_frame", "__eh_frame",
124 SEC_READONLY | SEC_LOAD, BFD_MACH_O_S_COALESCED,
125 BFD_MACH_O_S_ATTR_LIVE_SUPPORT
126 | BFD_MACH_O_S_ATTR_STRIP_STATIC_SYMS
127 | BFD_MACH_O_S_ATTR_NO_TOC, 3},
128 { NULL, NULL, 0, 0, 0, 0}
131 /* __DATA Segment. */
132 static const mach_o_section_name_xlat data_section_names_xlat[] =
135 SEC_DATA | SEC_LOAD, BFD_MACH_O_S_REGULAR,
136 BFD_MACH_O_S_ATTR_NONE, 0},
138 SEC_NO_FLAGS, BFD_MACH_O_S_ZEROFILL,
139 BFD_MACH_O_S_ATTR_NONE, 0},
140 { ".const_data", "__const",
141 SEC_DATA | SEC_LOAD, BFD_MACH_O_S_REGULAR,
142 BFD_MACH_O_S_ATTR_NONE, 0},
143 { ".static_data", "__static_data",
144 SEC_DATA | SEC_LOAD, BFD_MACH_O_S_REGULAR,
145 BFD_MACH_O_S_ATTR_NONE, 0},
146 { ".mod_init_func", "__mod_init_func",
147 SEC_DATA | SEC_LOAD, BFD_MACH_O_S_MOD_INIT_FUNC_POINTERS,
148 BFD_MACH_O_S_ATTR_NONE, 2},
149 { ".mod_term_func", "__mod_term_func",
150 SEC_DATA | SEC_LOAD, BFD_MACH_O_S_MOD_FINI_FUNC_POINTERS,
151 BFD_MACH_O_S_ATTR_NONE, 2},
153 SEC_DATA | SEC_LOAD, BFD_MACH_O_S_REGULAR,
154 BFD_MACH_O_S_ATTR_NONE, 0},
155 { ".cfstring", "__cfstring",
156 SEC_DATA | SEC_LOAD, BFD_MACH_O_S_REGULAR,
157 BFD_MACH_O_S_ATTR_NONE, 2},
158 { NULL, NULL, 0, 0, 0, 0}
161 /* __DWARF Segment. */
162 static const mach_o_section_name_xlat dwarf_section_names_xlat[] =
164 { ".debug_frame", "__debug_frame",
165 SEC_DEBUGGING, BFD_MACH_O_S_REGULAR,
166 BFD_MACH_O_S_ATTR_DEBUG, 0},
167 { ".debug_info", "__debug_info",
168 SEC_DEBUGGING, BFD_MACH_O_S_REGULAR,
169 BFD_MACH_O_S_ATTR_DEBUG, 0},
170 { ".debug_abbrev", "__debug_abbrev",
171 SEC_DEBUGGING, BFD_MACH_O_S_REGULAR,
172 BFD_MACH_O_S_ATTR_DEBUG, 0},
173 { ".debug_aranges", "__debug_aranges",
174 SEC_DEBUGGING, BFD_MACH_O_S_REGULAR,
175 BFD_MACH_O_S_ATTR_DEBUG, 0},
176 { ".debug_macinfo", "__debug_macinfo",
177 SEC_DEBUGGING, BFD_MACH_O_S_REGULAR,
178 BFD_MACH_O_S_ATTR_DEBUG, 0},
179 { ".debug_line", "__debug_line",
180 SEC_DEBUGGING, BFD_MACH_O_S_REGULAR,
181 BFD_MACH_O_S_ATTR_DEBUG, 0},
182 { ".debug_loc", "__debug_loc",
183 SEC_DEBUGGING, BFD_MACH_O_S_REGULAR,
184 BFD_MACH_O_S_ATTR_DEBUG, 0},
185 { ".debug_pubnames", "__debug_pubnames",
186 SEC_DEBUGGING, BFD_MACH_O_S_REGULAR,
187 BFD_MACH_O_S_ATTR_DEBUG, 0},
188 { ".debug_pubtypes", "__debug_pubtypes",
189 SEC_DEBUGGING, BFD_MACH_O_S_REGULAR,
190 BFD_MACH_O_S_ATTR_DEBUG, 0},
191 { ".debug_str", "__debug_str",
192 SEC_DEBUGGING, BFD_MACH_O_S_REGULAR,
193 BFD_MACH_O_S_ATTR_DEBUG, 0},
194 { ".debug_ranges", "__debug_ranges",
195 SEC_DEBUGGING, BFD_MACH_O_S_REGULAR,
196 BFD_MACH_O_S_ATTR_DEBUG, 0},
197 { ".debug_macro", "__debug_macro",
198 SEC_DEBUGGING, BFD_MACH_O_S_REGULAR,
199 BFD_MACH_O_S_ATTR_DEBUG, 0},
200 { NULL, NULL, 0, 0, 0, 0}
203 /* __OBJC Segment. */
204 static const mach_o_section_name_xlat objc_section_names_xlat[] =
206 { ".objc_class", "__class",
207 SEC_DATA | SEC_LOAD, BFD_MACH_O_S_REGULAR,
208 BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
209 { ".objc_meta_class", "__meta_class",
210 SEC_DATA | SEC_LOAD, BFD_MACH_O_S_REGULAR,
211 BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
212 { ".objc_cat_cls_meth", "__cat_cls_meth",
213 SEC_DATA | SEC_LOAD, BFD_MACH_O_S_REGULAR,
214 BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
215 { ".objc_cat_inst_meth", "__cat_inst_meth",
216 SEC_DATA | SEC_LOAD, BFD_MACH_O_S_REGULAR,
217 BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
218 { ".objc_protocol", "__protocol",
219 SEC_DATA | SEC_LOAD, BFD_MACH_O_S_REGULAR,
220 BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
221 { ".objc_string_object", "__string_object",
222 SEC_DATA | SEC_LOAD, BFD_MACH_O_S_REGULAR,
223 BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
224 { ".objc_cls_meth", "__cls_meth",
225 SEC_DATA | SEC_LOAD, BFD_MACH_O_S_REGULAR,
226 BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
227 { ".objc_inst_meth", "__inst_meth",
228 SEC_DATA | SEC_LOAD, BFD_MACH_O_S_REGULAR,
229 BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
230 { ".objc_cls_refs", "__cls_refs",
231 SEC_DATA | SEC_LOAD, BFD_MACH_O_S_LITERAL_POINTERS,
232 BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
233 { ".objc_message_refs", "__message_refs",
234 SEC_DATA | SEC_LOAD, BFD_MACH_O_S_LITERAL_POINTERS,
235 BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
236 { ".objc_symbols", "__symbols",
237 SEC_DATA | SEC_LOAD, BFD_MACH_O_S_REGULAR,
238 BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
239 { ".objc_category", "__category",
240 SEC_DATA | SEC_LOAD, BFD_MACH_O_S_REGULAR,
241 BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
242 { ".objc_class_vars", "__class_vars",
243 SEC_DATA | SEC_LOAD, BFD_MACH_O_S_REGULAR,
244 BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
245 { ".objc_instance_vars", "__instance_vars",
246 SEC_DATA | SEC_LOAD, BFD_MACH_O_S_REGULAR,
247 BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
248 { ".objc_module_info", "__module_info",
249 SEC_DATA | SEC_LOAD, BFD_MACH_O_S_REGULAR,
250 BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
251 { ".objc_selector_strs", "__selector_strs",
252 SEC_DATA | SEC_LOAD, BFD_MACH_O_S_CSTRING_LITERALS,
253 BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
254 { ".objc_image_info", "__image_info",
255 SEC_DATA | SEC_LOAD, BFD_MACH_O_S_REGULAR,
256 BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
257 { ".objc_selector_fixup", "__sel_fixup",
258 SEC_DATA | SEC_LOAD, BFD_MACH_O_S_REGULAR,
259 BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
261 { ".objc1_class_ext", "__class_ext",
262 SEC_DATA | SEC_LOAD, BFD_MACH_O_S_REGULAR,
263 BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
264 { ".objc1_property_list", "__property",
265 SEC_DATA | SEC_LOAD, BFD_MACH_O_S_REGULAR,
266 BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
267 { ".objc1_protocol_ext", "__protocol_ext",
268 SEC_DATA | SEC_LOAD, BFD_MACH_O_S_REGULAR,
269 BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
270 { NULL, NULL, 0, 0, 0, 0}
273 static const mach_o_segment_name_xlat segsec_names_xlat[] =
275 { "__TEXT", text_section_names_xlat },
276 { "__DATA", data_section_names_xlat },
277 { "__DWARF", dwarf_section_names_xlat },
278 { "__OBJC", objc_section_names_xlat },
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,
534 asymbol *isymbol ATTRIBUTE_UNUSED,
535 bfd *obfd ATTRIBUTE_UNUSED,
536 asymbol *osymbol ATTRIBUTE_UNUSED)
541 /* Copy any private info we understand from the input section
542 to the output section. */
545 bfd_mach_o_bfd_copy_private_section_data (bfd *ibfd ATTRIBUTE_UNUSED,
547 bfd *obfd ATTRIBUTE_UNUSED,
550 if (osection->used_by_bfd == NULL)
551 osection->used_by_bfd = isection->used_by_bfd;
553 if (isection->used_by_bfd != NULL)
554 memcpy (osection->used_by_bfd, isection->used_by_bfd,
555 sizeof (bfd_mach_o_section));
557 if (osection->used_by_bfd != NULL)
558 ((bfd_mach_o_section *)osection->used_by_bfd)->bfdsection = osection;
563 /* Copy any private info we understand from the input bfd
564 to the output bfd. */
567 bfd_mach_o_bfd_copy_private_bfd_data (bfd *ibfd, bfd *obfd)
569 if (bfd_get_flavour (ibfd) != bfd_target_mach_o_flavour
570 || bfd_get_flavour (obfd) != bfd_target_mach_o_flavour)
573 BFD_ASSERT (bfd_mach_o_valid (ibfd));
574 BFD_ASSERT (bfd_mach_o_valid (obfd));
576 /* FIXME: copy commands. */
581 /* This allows us to set up to 32 bits of flags (unless we invent some
582 fiendish scheme to subdivide). For now, we'll just set the file flags
583 without error checking - just overwrite. */
586 bfd_mach_o_bfd_set_private_flags (bfd *abfd, flagword flags)
588 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
593 mdata->header.flags = flags;
597 /* Count the total number of symbols. */
600 bfd_mach_o_count_symbols (bfd *abfd)
602 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
604 if (mdata->symtab == NULL)
606 return mdata->symtab->nsyms;
610 bfd_mach_o_get_symtab_upper_bound (bfd *abfd)
612 long nsyms = bfd_mach_o_count_symbols (abfd);
614 return ((nsyms + 1) * sizeof (asymbol *));
618 bfd_mach_o_canonicalize_symtab (bfd *abfd, asymbol **alocation)
620 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
621 long nsyms = bfd_mach_o_count_symbols (abfd);
622 bfd_mach_o_symtab_command *sym = mdata->symtab;
630 /* Do not try to read symbols if there are none. */
635 if (!bfd_mach_o_read_symtab_symbols (abfd))
637 (*_bfd_error_handler)
638 (_("bfd_mach_o_canonicalize_symtab: unable to load symbols"));
642 BFD_ASSERT (sym->symbols != NULL);
644 for (j = 0; j < sym->nsyms; j++)
645 alocation[j] = &sym->symbols[j].symbol;
653 bfd_mach_o_get_synthetic_symtab (bfd *abfd,
654 long symcount ATTRIBUTE_UNUSED,
655 asymbol **syms ATTRIBUTE_UNUSED,
656 long dynsymcount ATTRIBUTE_UNUSED,
657 asymbol **dynsyms ATTRIBUTE_UNUSED,
660 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
661 bfd_mach_o_dysymtab_command *dysymtab = mdata->dysymtab;
662 bfd_mach_o_symtab_command *symtab = mdata->symtab;
664 unsigned long count, i, j, n;
671 if (dysymtab == NULL || symtab == NULL || symtab->symbols == NULL)
674 if (dysymtab->nindirectsyms == 0)
677 count = dysymtab->nindirectsyms;
678 size = count * sizeof (asymbol) + 1;
680 for (j = 0; j < count; j++)
682 unsigned int isym = dysymtab->indirect_syms[j];
684 if (isym < symtab->nsyms && symtab->symbols[isym].symbol.name)
685 size += strlen (symtab->symbols[isym].symbol.name) + sizeof ("$stub");
688 s = *ret = (asymbol *) bfd_malloc (size);
691 names = (char *) (s + count);
696 for (i = 0; i < mdata->nsects; i++)
698 bfd_mach_o_section *sec = mdata->sections[i];
699 unsigned int first, last;
703 switch (sec->flags & BFD_MACH_O_SECTION_TYPE_MASK)
705 case BFD_MACH_O_S_NON_LAZY_SYMBOL_POINTERS:
706 case BFD_MACH_O_S_LAZY_SYMBOL_POINTERS:
707 case BFD_MACH_O_S_SYMBOL_STUBS:
708 first = sec->reserved1;
709 last = first + bfd_mach_o_section_get_nbr_indirect (abfd, sec);
711 entry_size = bfd_mach_o_section_get_entry_size (abfd, sec);
712 for (j = first; j < last; j++)
714 unsigned int isym = dysymtab->indirect_syms[j];
716 s->flags = BSF_GLOBAL | BSF_SYNTHETIC;
717 s->section = sec->bfdsection;
718 s->value = addr - sec->addr;
721 if (isym < symtab->nsyms
722 && symtab->symbols[isym].symbol.name)
724 const char *sym = symtab->symbols[isym].symbol.name;
729 memcpy (names, sym, len);
731 memcpy (names, "$stub", sizeof ("$stub"));
732 names += sizeof ("$stub");
751 bfd_mach_o_get_symbol_info (bfd *abfd ATTRIBUTE_UNUSED,
755 bfd_symbol_info (symbol, ret);
759 bfd_mach_o_print_symbol (bfd *abfd,
762 bfd_print_symbol_type how)
764 FILE *file = (FILE *) afile;
766 bfd_mach_o_asymbol *asym = (bfd_mach_o_asymbol *)symbol;
770 case bfd_print_symbol_name:
771 fprintf (file, "%s", symbol->name);
774 bfd_print_symbol_vandf (abfd, (void *) file, symbol);
775 if (asym->n_type & BFD_MACH_O_N_STAB)
776 name = bfd_get_stab_name (asym->n_type);
778 switch (asym->n_type & BFD_MACH_O_N_TYPE)
780 case BFD_MACH_O_N_UNDF:
781 if (symbol->value == 0)
786 case BFD_MACH_O_N_ABS:
789 case BFD_MACH_O_N_INDR:
792 case BFD_MACH_O_N_PBUD:
795 case BFD_MACH_O_N_SECT:
804 fprintf (file, " %02x %-6s %02x %04x",
805 asym->n_type, name, asym->n_sect, asym->n_desc);
806 if ((asym->n_type & BFD_MACH_O_N_STAB) == 0
807 && (asym->n_type & BFD_MACH_O_N_TYPE) == BFD_MACH_O_N_SECT)
808 fprintf (file, " [%s]", symbol->section->name);
809 fprintf (file, " %s", symbol->name);
814 bfd_mach_o_convert_architecture (bfd_mach_o_cpu_type mtype,
815 bfd_mach_o_cpu_subtype msubtype ATTRIBUTE_UNUSED,
816 enum bfd_architecture *type,
817 unsigned long *subtype)
819 *subtype = bfd_arch_unknown;
823 case BFD_MACH_O_CPU_TYPE_VAX: *type = bfd_arch_vax; break;
824 case BFD_MACH_O_CPU_TYPE_MC680x0: *type = bfd_arch_m68k; break;
825 case BFD_MACH_O_CPU_TYPE_I386:
826 *type = bfd_arch_i386;
827 *subtype = bfd_mach_i386_i386;
829 case BFD_MACH_O_CPU_TYPE_X86_64:
830 *type = bfd_arch_i386;
831 *subtype = bfd_mach_x86_64;
833 case BFD_MACH_O_CPU_TYPE_MIPS: *type = bfd_arch_mips; break;
834 case BFD_MACH_O_CPU_TYPE_MC98000: *type = bfd_arch_m98k; break;
835 case BFD_MACH_O_CPU_TYPE_HPPA: *type = bfd_arch_hppa; break;
836 case BFD_MACH_O_CPU_TYPE_ARM: *type = bfd_arch_arm; break;
837 case BFD_MACH_O_CPU_TYPE_MC88000: *type = bfd_arch_m88k; break;
838 case BFD_MACH_O_CPU_TYPE_SPARC:
839 *type = bfd_arch_sparc;
840 *subtype = bfd_mach_sparc;
842 case BFD_MACH_O_CPU_TYPE_I860: *type = bfd_arch_i860; break;
843 case BFD_MACH_O_CPU_TYPE_ALPHA: *type = bfd_arch_alpha; break;
844 case BFD_MACH_O_CPU_TYPE_POWERPC:
845 *type = bfd_arch_powerpc;
846 *subtype = bfd_mach_ppc;
848 case BFD_MACH_O_CPU_TYPE_POWERPC_64:
849 *type = bfd_arch_powerpc;
850 *subtype = bfd_mach_ppc64;
853 *type = bfd_arch_unknown;
859 bfd_mach_o_write_header (bfd *abfd, bfd_mach_o_header *header)
861 struct mach_o_header_external raw;
864 size = mach_o_wide_p (header) ?
865 BFD_MACH_O_HEADER_64_SIZE : BFD_MACH_O_HEADER_SIZE;
867 bfd_h_put_32 (abfd, header->magic, raw.magic);
868 bfd_h_put_32 (abfd, header->cputype, raw.cputype);
869 bfd_h_put_32 (abfd, header->cpusubtype, raw.cpusubtype);
870 bfd_h_put_32 (abfd, header->filetype, raw.filetype);
871 bfd_h_put_32 (abfd, header->ncmds, raw.ncmds);
872 bfd_h_put_32 (abfd, header->sizeofcmds, raw.sizeofcmds);
873 bfd_h_put_32 (abfd, header->flags, raw.flags);
875 if (mach_o_wide_p (header))
876 bfd_h_put_32 (abfd, header->reserved, raw.reserved);
878 if (bfd_seek (abfd, 0, SEEK_SET) != 0
879 || bfd_bwrite (&raw, size, abfd) != size)
886 bfd_mach_o_write_thread (bfd *abfd, bfd_mach_o_load_command *command)
888 bfd_mach_o_thread_command *cmd = &command->command.thread;
890 struct mach_o_thread_command_external raw;
893 BFD_ASSERT ((command->type == BFD_MACH_O_LC_THREAD)
894 || (command->type == BFD_MACH_O_LC_UNIXTHREAD));
897 for (i = 0; i < cmd->nflavours; i++)
899 BFD_ASSERT ((cmd->flavours[i].size % 4) == 0);
900 BFD_ASSERT (cmd->flavours[i].offset ==
901 (command->offset + offset + BFD_MACH_O_LC_SIZE));
903 bfd_h_put_32 (abfd, cmd->flavours[i].flavour, raw.flavour);
904 bfd_h_put_32 (abfd, (cmd->flavours[i].size / 4), raw.count);
906 if (bfd_seek (abfd, command->offset + offset, SEEK_SET) != 0
907 || bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw))
910 offset += cmd->flavours[i].size + sizeof (raw);
917 bfd_mach_o_get_reloc_upper_bound (bfd *abfd ATTRIBUTE_UNUSED,
920 return (asect->reloc_count + 1) * sizeof (arelent *);
924 bfd_mach_o_canonicalize_one_reloc (bfd *abfd,
925 struct mach_o_reloc_info_external *raw,
926 arelent *res, asymbol **syms)
928 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
929 bfd_mach_o_backend_data *bed = bfd_mach_o_get_backend_data (abfd);
930 bfd_mach_o_reloc_info reloc;
935 addr = bfd_get_32 (abfd, raw->r_address);
936 symnum = bfd_get_32 (abfd, raw->r_symbolnum);
938 if (addr & BFD_MACH_O_SR_SCATTERED)
942 /* Scattered relocation.
943 Extract section and offset from r_value. */
944 res->sym_ptr_ptr = NULL;
946 for (j = 0; j < mdata->nsects; j++)
948 bfd_mach_o_section *sect = mdata->sections[j];
949 if (symnum >= sect->addr && symnum < sect->addr + sect->size)
951 res->sym_ptr_ptr = sect->bfdsection->symbol_ptr_ptr;
952 res->addend = symnum - sect->addr;
956 res->address = BFD_MACH_O_GET_SR_ADDRESS (addr);
957 reloc.r_type = BFD_MACH_O_GET_SR_TYPE (addr);
958 reloc.r_length = BFD_MACH_O_GET_SR_LENGTH (addr);
959 reloc.r_pcrel = addr & BFD_MACH_O_SR_PCREL;
960 reloc.r_scattered = 1;
964 unsigned int num = BFD_MACH_O_GET_R_SYMBOLNUM (symnum);
967 if (symnum & BFD_MACH_O_R_EXTERN)
974 BFD_ASSERT (num != 0);
975 BFD_ASSERT (num <= mdata->nsects);
976 sym = mdata->sections[num - 1]->bfdsection->symbol_ptr_ptr;
977 /* For a symbol defined in section S, the addend (stored in the
978 binary) contains the address of the section. To comply with
979 bfd conventio, substract the section address.
980 Use the address from the header, so that the user can modify
981 the vma of the section. */
982 res->addend = -mdata->sections[num - 1]->addr;
985 res->sym_ptr_ptr = sym;
986 reloc.r_type = BFD_MACH_O_GET_R_TYPE (symnum);
987 reloc.r_length = BFD_MACH_O_GET_R_LENGTH (symnum);
988 reloc.r_pcrel = (symnum & BFD_MACH_O_R_PCREL) ? 1 : 0;
989 reloc.r_scattered = 0;
992 if (!(*bed->_bfd_mach_o_swap_reloc_in)(res, &reloc))
998 bfd_mach_o_canonicalize_relocs (bfd *abfd, unsigned long filepos,
1000 arelent *res, asymbol **syms)
1003 struct mach_o_reloc_info_external *native_relocs;
1004 bfd_size_type native_size;
1006 /* Allocate and read relocs. */
1007 native_size = count * BFD_MACH_O_RELENT_SIZE;
1009 (struct mach_o_reloc_info_external *) bfd_malloc (native_size);
1010 if (native_relocs == NULL)
1013 if (bfd_seek (abfd, filepos, SEEK_SET) != 0
1014 || bfd_bread (native_relocs, native_size, abfd) != native_size)
1017 for (i = 0; i < count; i++)
1019 if (bfd_mach_o_canonicalize_one_reloc (abfd, &native_relocs[i],
1023 free (native_relocs);
1026 free (native_relocs);
1031 bfd_mach_o_canonicalize_reloc (bfd *abfd, asection *asect,
1032 arelent **rels, asymbol **syms)
1034 bfd_mach_o_backend_data *bed = bfd_mach_o_get_backend_data (abfd);
1038 if (asect->reloc_count == 0)
1041 /* No need to go further if we don't know how to read relocs. */
1042 if (bed->_bfd_mach_o_swap_reloc_in == NULL)
1045 if (asect->relocation == NULL)
1047 res = bfd_malloc (asect->reloc_count * sizeof (arelent));
1051 if (bfd_mach_o_canonicalize_relocs (abfd, asect->rel_filepos,
1052 asect->reloc_count, res, syms) < 0)
1057 asect->relocation = res;
1060 res = asect->relocation;
1061 for (i = 0; i < asect->reloc_count; i++)
1069 bfd_mach_o_get_dynamic_reloc_upper_bound (bfd *abfd)
1071 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
1073 if (mdata->dysymtab == NULL)
1075 return (mdata->dysymtab->nextrel + mdata->dysymtab->nlocrel + 1)
1076 * sizeof (arelent *);
1080 bfd_mach_o_canonicalize_dynamic_reloc (bfd *abfd, arelent **rels,
1081 struct bfd_symbol **syms)
1083 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
1084 bfd_mach_o_dysymtab_command *dysymtab = mdata->dysymtab;
1085 bfd_mach_o_backend_data *bed = bfd_mach_o_get_backend_data (abfd);
1089 if (dysymtab == NULL)
1091 if (dysymtab->nextrel == 0 && dysymtab->nlocrel == 0)
1094 /* No need to go further if we don't know how to read relocs. */
1095 if (bed->_bfd_mach_o_swap_reloc_in == NULL)
1098 if (mdata->dyn_reloc_cache == NULL)
1100 res = bfd_malloc ((dysymtab->nextrel + dysymtab->nlocrel)
1101 * sizeof (arelent));
1105 if (bfd_mach_o_canonicalize_relocs (abfd, dysymtab->extreloff,
1106 dysymtab->nextrel, res, syms) < 0)
1112 if (bfd_mach_o_canonicalize_relocs (abfd, dysymtab->locreloff,
1114 res + dysymtab->nextrel, syms) < 0)
1120 mdata->dyn_reloc_cache = res;
1123 res = mdata->dyn_reloc_cache;
1124 for (i = 0; i < dysymtab->nextrel + dysymtab->nlocrel; i++)
1131 bfd_mach_o_write_relocs (bfd *abfd, bfd_mach_o_section *section)
1133 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
1137 bfd_mach_o_backend_data *bed = bfd_mach_o_get_backend_data (abfd);
1139 sec = section->bfdsection;
1140 if (sec->reloc_count == 0)
1143 if (bed->_bfd_mach_o_swap_reloc_out == NULL)
1146 /* Allocate relocation room. */
1147 mdata->filelen = FILE_ALIGN(mdata->filelen, 2);
1148 section->nreloc = sec->reloc_count;
1149 sec->rel_filepos = mdata->filelen;
1150 section->reloff = sec->rel_filepos;
1151 mdata->filelen += sec->reloc_count * BFD_MACH_O_RELENT_SIZE;
1153 if (bfd_seek (abfd, section->reloff, SEEK_SET) != 0)
1156 /* Convert and write. */
1157 entries = section->bfdsection->orelocation;
1158 for (i = 0; i < section->nreloc; i++)
1160 arelent *rel = entries[i];
1161 struct mach_o_reloc_info_external raw;
1162 bfd_mach_o_reloc_info info, *pinfo = &info;
1164 /* Convert relocation to an intermediate representation. */
1165 if (!(*bed->_bfd_mach_o_swap_reloc_out) (rel, pinfo))
1168 /* Lower the relocation info. */
1169 if (pinfo->r_scattered)
1173 v = BFD_MACH_O_SR_SCATTERED
1174 | (pinfo->r_pcrel ? BFD_MACH_O_SR_PCREL : 0)
1175 | BFD_MACH_O_SET_SR_LENGTH(pinfo->r_length)
1176 | BFD_MACH_O_SET_SR_TYPE(pinfo->r_type)
1177 | BFD_MACH_O_SET_SR_ADDRESS(pinfo->r_address);
1178 /* Note: scattered relocs have field in reverse order... */
1179 bfd_put_32 (abfd, v, raw.r_address);
1180 bfd_put_32 (abfd, pinfo->r_value, raw.r_symbolnum);
1186 bfd_put_32 (abfd, pinfo->r_address, raw.r_address);
1187 v = BFD_MACH_O_SET_R_SYMBOLNUM (pinfo->r_value)
1188 | (pinfo->r_pcrel ? BFD_MACH_O_R_PCREL : 0)
1189 | BFD_MACH_O_SET_R_LENGTH (pinfo->r_length)
1190 | (pinfo->r_extern ? BFD_MACH_O_R_EXTERN : 0)
1191 | BFD_MACH_O_SET_R_TYPE (pinfo->r_type);
1192 bfd_put_32 (abfd, v, raw.r_symbolnum);
1195 if (bfd_bwrite (&raw, BFD_MACH_O_RELENT_SIZE, abfd)
1196 != BFD_MACH_O_RELENT_SIZE)
1203 bfd_mach_o_write_section_32 (bfd *abfd, bfd_mach_o_section *section)
1205 struct mach_o_section_32_external raw;
1207 memcpy (raw.sectname, section->sectname, 16);
1208 memcpy (raw.segname, section->segname, 16);
1209 bfd_h_put_32 (abfd, section->addr, raw.addr);
1210 bfd_h_put_32 (abfd, section->size, raw.size);
1211 bfd_h_put_32 (abfd, section->offset, raw.offset);
1212 bfd_h_put_32 (abfd, section->align, raw.align);
1213 bfd_h_put_32 (abfd, section->reloff, raw.reloff);
1214 bfd_h_put_32 (abfd, section->nreloc, raw.nreloc);
1215 bfd_h_put_32 (abfd, section->flags, raw.flags);
1216 bfd_h_put_32 (abfd, section->reserved1, raw.reserved1);
1217 bfd_h_put_32 (abfd, section->reserved2, raw.reserved2);
1219 if (bfd_bwrite (&raw, BFD_MACH_O_SECTION_SIZE, abfd)
1220 != BFD_MACH_O_SECTION_SIZE)
1227 bfd_mach_o_write_section_64 (bfd *abfd, bfd_mach_o_section *section)
1229 struct mach_o_section_64_external raw;
1231 memcpy (raw.sectname, section->sectname, 16);
1232 memcpy (raw.segname, section->segname, 16);
1233 bfd_h_put_64 (abfd, section->addr, raw.addr);
1234 bfd_h_put_64 (abfd, section->size, raw.size);
1235 bfd_h_put_32 (abfd, section->offset, raw.offset);
1236 bfd_h_put_32 (abfd, section->align, raw.align);
1237 bfd_h_put_32 (abfd, section->reloff, raw.reloff);
1238 bfd_h_put_32 (abfd, section->nreloc, raw.nreloc);
1239 bfd_h_put_32 (abfd, section->flags, raw.flags);
1240 bfd_h_put_32 (abfd, section->reserved1, raw.reserved1);
1241 bfd_h_put_32 (abfd, section->reserved2, raw.reserved2);
1242 bfd_h_put_32 (abfd, section->reserved3, raw.reserved3);
1244 if (bfd_bwrite (&raw, BFD_MACH_O_SECTION_64_SIZE, abfd)
1245 != BFD_MACH_O_SECTION_64_SIZE)
1252 bfd_mach_o_write_segment_32 (bfd *abfd, bfd_mach_o_load_command *command)
1254 struct mach_o_segment_command_32_external raw;
1255 bfd_mach_o_segment_command *seg = &command->command.segment;
1256 bfd_mach_o_section *sec;
1258 BFD_ASSERT (command->type == BFD_MACH_O_LC_SEGMENT);
1260 for (sec = seg->sect_head; sec != NULL; sec = sec->next)
1261 if (!bfd_mach_o_write_relocs (abfd, sec))
1264 memcpy (raw.segname, seg->segname, 16);
1265 bfd_h_put_32 (abfd, seg->vmaddr, raw.vmaddr);
1266 bfd_h_put_32 (abfd, seg->vmsize, raw.vmsize);
1267 bfd_h_put_32 (abfd, seg->fileoff, raw.fileoff);
1268 bfd_h_put_32 (abfd, seg->filesize, raw.filesize);
1269 bfd_h_put_32 (abfd, seg->maxprot, raw.maxprot);
1270 bfd_h_put_32 (abfd, seg->initprot, raw.initprot);
1271 bfd_h_put_32 (abfd, seg->nsects, raw.nsects);
1272 bfd_h_put_32 (abfd, seg->flags, raw.flags);
1274 if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
1275 || bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw))
1278 for (sec = seg->sect_head; sec != NULL; sec = sec->next)
1279 if (bfd_mach_o_write_section_32 (abfd, sec))
1286 bfd_mach_o_write_segment_64 (bfd *abfd, bfd_mach_o_load_command *command)
1288 struct mach_o_segment_command_64_external raw;
1289 bfd_mach_o_segment_command *seg = &command->command.segment;
1290 bfd_mach_o_section *sec;
1292 BFD_ASSERT (command->type == BFD_MACH_O_LC_SEGMENT_64);
1294 for (sec = seg->sect_head; sec != NULL; sec = sec->next)
1295 if (!bfd_mach_o_write_relocs (abfd, sec))
1298 memcpy (raw.segname, seg->segname, 16);
1299 bfd_h_put_64 (abfd, seg->vmaddr, raw.vmaddr);
1300 bfd_h_put_64 (abfd, seg->vmsize, raw.vmsize);
1301 bfd_h_put_64 (abfd, seg->fileoff, raw.fileoff);
1302 bfd_h_put_64 (abfd, seg->filesize, raw.filesize);
1303 bfd_h_put_32 (abfd, seg->maxprot, raw.maxprot);
1304 bfd_h_put_32 (abfd, seg->initprot, raw.initprot);
1305 bfd_h_put_32 (abfd, seg->nsects, raw.nsects);
1306 bfd_h_put_32 (abfd, seg->flags, raw.flags);
1308 if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
1309 || bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw))
1312 for (sec = seg->sect_head; sec != NULL; sec = sec->next)
1313 if (bfd_mach_o_write_section_64 (abfd, sec))
1320 bfd_mach_o_write_symtab (bfd *abfd, bfd_mach_o_load_command *command)
1322 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
1323 bfd_mach_o_symtab_command *sym = &command->command.symtab;
1325 unsigned int wide = bfd_mach_o_wide_p (abfd);
1326 unsigned int symlen = wide ? BFD_MACH_O_NLIST_64_SIZE : BFD_MACH_O_NLIST_SIZE;
1327 struct bfd_strtab_hash *strtab;
1328 asymbol **symbols = bfd_get_outsymbols (abfd);
1330 BFD_ASSERT (command->type == BFD_MACH_O_LC_SYMTAB);
1332 /* Write the symbols first. */
1333 mdata->filelen = FILE_ALIGN(mdata->filelen, wide ? 3 : 2);
1334 sym->symoff = mdata->filelen;
1335 if (bfd_seek (abfd, sym->symoff, SEEK_SET) != 0)
1338 sym->nsyms = bfd_get_symcount (abfd);
1339 mdata->filelen += sym->nsyms * symlen;
1341 strtab = _bfd_stringtab_init ();
1346 /* Although we don't strictly need to do this, for compatibility with
1347 Darwin system tools, actually output an empty string for the index
1349 _bfd_stringtab_add (strtab, "", TRUE, FALSE);
1351 for (i = 0; i < sym->nsyms; i++)
1353 bfd_size_type str_index;
1354 bfd_mach_o_asymbol *s = (bfd_mach_o_asymbol *)symbols[i];
1356 /* For a bare indirect symbol, the system tools expect that the symbol
1357 value will be the string table offset for its referenced counterpart.
1359 Normally, indirect syms will not be written this way, but rather as
1360 part of the dysymtab command.
1362 In either case, correct operation depends on the symbol table being
1363 sorted such that the indirect symbols are at the end (since the
1364 string table index is filled in below). */
1366 if (IS_MACHO_INDIRECT (s->n_type))
1367 /* A pointer to the referenced symbol will be stored in the udata
1368 field. Use that to find the string index. */
1370 ((bfd_mach_o_asymbol *)s->symbol.udata.p)->symbol.udata.i;
1372 if (s->symbol.name == 0 || s->symbol.name[0] == '\0')
1373 /* An index of 0 always means the empty string. */
1377 str_index = _bfd_stringtab_add (strtab, s->symbol.name, TRUE, FALSE);
1378 /* Record the string index. This can be looked up by an indirect sym
1379 which retains a pointer to its referenced counterpart, until it is
1381 if (IS_MACHO_INDIRECT (s->n_type))
1382 s->symbol.udata.i = str_index;
1384 if (str_index == (bfd_size_type) -1)
1390 struct mach_o_nlist_64_external raw;
1392 bfd_h_put_32 (abfd, str_index, raw.n_strx);
1393 bfd_h_put_8 (abfd, s->n_type, raw.n_type);
1394 bfd_h_put_8 (abfd, s->n_sect, raw.n_sect);
1395 bfd_h_put_16 (abfd, s->n_desc, raw.n_desc);
1396 bfd_h_put_64 (abfd, s->symbol.section->vma + s->symbol.value,
1399 if (bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw))
1404 struct mach_o_nlist_external raw;
1406 bfd_h_put_32 (abfd, str_index, raw.n_strx);
1407 bfd_h_put_8 (abfd, s->n_type, raw.n_type);
1408 bfd_h_put_8 (abfd, s->n_sect, raw.n_sect);
1409 bfd_h_put_16 (abfd, s->n_desc, raw.n_desc);
1410 bfd_h_put_32 (abfd, s->symbol.section->vma + s->symbol.value,
1413 if (bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw))
1417 sym->strsize = _bfd_stringtab_size (strtab);
1418 sym->stroff = mdata->filelen;
1419 mdata->filelen += sym->strsize;
1421 if (_bfd_stringtab_emit (abfd, strtab) != TRUE)
1423 _bfd_stringtab_free (strtab);
1427 struct mach_o_symtab_command_external raw;
1429 bfd_h_put_32 (abfd, sym->symoff, raw.symoff);
1430 bfd_h_put_32 (abfd, sym->nsyms, raw.nsyms);
1431 bfd_h_put_32 (abfd, sym->stroff, raw.stroff);
1432 bfd_h_put_32 (abfd, sym->strsize, raw.strsize);
1434 if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
1435 || bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw))
1442 _bfd_stringtab_free (strtab);
1446 /* Write a dysymtab command.
1447 TODO: Possibly coalesce writes of smaller objects. */
1450 bfd_mach_o_write_dysymtab (bfd *abfd, bfd_mach_o_load_command *command)
1452 bfd_mach_o_dysymtab_command *cmd = &command->command.dysymtab;
1454 BFD_ASSERT (command->type == BFD_MACH_O_LC_DYSYMTAB);
1456 if (cmd->nmodtab != 0)
1460 if (bfd_seek (abfd, cmd->modtaboff, SEEK_SET) != 0)
1463 for (i = 0; i < cmd->nmodtab; i++)
1465 bfd_mach_o_dylib_module *module = &cmd->dylib_module[i];
1469 iinit = module->iinit & 0xffff;
1470 iinit |= ((module->iterm & 0xffff) << 16);
1472 ninit = module->ninit & 0xffff;
1473 ninit |= ((module->nterm & 0xffff) << 16);
1475 if (bfd_mach_o_wide_p (abfd))
1477 struct mach_o_dylib_module_64_external w;
1479 bfd_h_put_32 (abfd, module->module_name_idx, &w.module_name);
1480 bfd_h_put_32 (abfd, module->iextdefsym, &w.iextdefsym);
1481 bfd_h_put_32 (abfd, module->nextdefsym, &w.nextdefsym);
1482 bfd_h_put_32 (abfd, module->irefsym, &w.irefsym);
1483 bfd_h_put_32 (abfd, module->nrefsym, &w.nrefsym);
1484 bfd_h_put_32 (abfd, module->ilocalsym, &w.ilocalsym);
1485 bfd_h_put_32 (abfd, module->nlocalsym, &w.nlocalsym);
1486 bfd_h_put_32 (abfd, module->iextrel, &w.iextrel);
1487 bfd_h_put_32 (abfd, module->nextrel, &w.nextrel);
1488 bfd_h_put_32 (abfd, iinit, &w.iinit_iterm);
1489 bfd_h_put_32 (abfd, ninit, &w.ninit_nterm);
1490 bfd_h_put_64 (abfd, module->objc_module_info_addr,
1491 &w.objc_module_info_addr);
1492 bfd_h_put_32 (abfd, module->objc_module_info_size,
1493 &w.objc_module_info_size);
1495 if (bfd_bwrite ((void *) &w, sizeof (w), abfd) != sizeof (w))
1500 struct mach_o_dylib_module_external n;
1502 bfd_h_put_32 (abfd, module->module_name_idx, &n.module_name);
1503 bfd_h_put_32 (abfd, module->iextdefsym, &n.iextdefsym);
1504 bfd_h_put_32 (abfd, module->nextdefsym, &n.nextdefsym);
1505 bfd_h_put_32 (abfd, module->irefsym, &n.irefsym);
1506 bfd_h_put_32 (abfd, module->nrefsym, &n.nrefsym);
1507 bfd_h_put_32 (abfd, module->ilocalsym, &n.ilocalsym);
1508 bfd_h_put_32 (abfd, module->nlocalsym, &n.nlocalsym);
1509 bfd_h_put_32 (abfd, module->iextrel, &n.iextrel);
1510 bfd_h_put_32 (abfd, module->nextrel, &n.nextrel);
1511 bfd_h_put_32 (abfd, iinit, &n.iinit_iterm);
1512 bfd_h_put_32 (abfd, ninit, &n.ninit_nterm);
1513 bfd_h_put_32 (abfd, module->objc_module_info_addr,
1514 &n.objc_module_info_addr);
1515 bfd_h_put_32 (abfd, module->objc_module_info_size,
1516 &n.objc_module_info_size);
1518 if (bfd_bwrite ((void *) &n, sizeof (n), abfd) != sizeof (n))
1528 if (bfd_seek (abfd, cmd->tocoff, SEEK_SET) != 0)
1531 for (i = 0; i < cmd->ntoc; i++)
1533 struct mach_o_dylib_table_of_contents_external raw;
1534 bfd_mach_o_dylib_table_of_content *toc = &cmd->dylib_toc[i];
1536 bfd_h_put_32 (abfd, toc->symbol_index, &raw.symbol_index);
1537 bfd_h_put_32 (abfd, toc->module_index, &raw.module_index);
1539 if (bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw))
1544 if (cmd->nindirectsyms > 0)
1548 if (bfd_seek (abfd, cmd->indirectsymoff, SEEK_SET) != 0)
1551 for (i = 0; i < cmd->nindirectsyms; ++i)
1553 unsigned char raw[4];
1555 bfd_h_put_32 (abfd, cmd->indirect_syms[i], &raw);
1556 if (bfd_bwrite (raw, sizeof (raw), abfd) != sizeof (raw))
1561 if (cmd->nextrefsyms != 0)
1565 if (bfd_seek (abfd, cmd->extrefsymoff, SEEK_SET) != 0)
1568 for (i = 0; i < cmd->nextrefsyms; i++)
1571 unsigned char raw[4];
1572 bfd_mach_o_dylib_reference *ref = &cmd->ext_refs[i];
1574 /* Fields isym and flags are written as bit-fields, thus we need
1575 a specific processing for endianness. */
1577 if (bfd_big_endian (abfd))
1579 v = ((ref->isym & 0xffffff) << 8);
1580 v |= ref->flags & 0xff;
1584 v = ref->isym & 0xffffff;
1585 v |= ((ref->flags & 0xff) << 24);
1588 bfd_h_put_32 (abfd, v, raw);
1589 if (bfd_bwrite (raw, sizeof (raw), abfd) != sizeof (raw))
1595 if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0)
1599 struct mach_o_dysymtab_command_external raw;
1601 bfd_h_put_32 (abfd, cmd->ilocalsym, &raw.ilocalsym);
1602 bfd_h_put_32 (abfd, cmd->nlocalsym, &raw.nlocalsym);
1603 bfd_h_put_32 (abfd, cmd->iextdefsym, &raw.iextdefsym);
1604 bfd_h_put_32 (abfd, cmd->nextdefsym, &raw.nextdefsym);
1605 bfd_h_put_32 (abfd, cmd->iundefsym, &raw.iundefsym);
1606 bfd_h_put_32 (abfd, cmd->nundefsym, &raw.nundefsym);
1607 bfd_h_put_32 (abfd, cmd->tocoff, &raw.tocoff);
1608 bfd_h_put_32 (abfd, cmd->ntoc, &raw.ntoc);
1609 bfd_h_put_32 (abfd, cmd->modtaboff, &raw.modtaboff);
1610 bfd_h_put_32 (abfd, cmd->nmodtab, &raw.nmodtab);
1611 bfd_h_put_32 (abfd, cmd->extrefsymoff, &raw.extrefsymoff);
1612 bfd_h_put_32 (abfd, cmd->nextrefsyms, &raw.nextrefsyms);
1613 bfd_h_put_32 (abfd, cmd->indirectsymoff, &raw.indirectsymoff);
1614 bfd_h_put_32 (abfd, cmd->nindirectsyms, &raw.nindirectsyms);
1615 bfd_h_put_32 (abfd, cmd->extreloff, &raw.extreloff);
1616 bfd_h_put_32 (abfd, cmd->nextrel, &raw.nextrel);
1617 bfd_h_put_32 (abfd, cmd->locreloff, &raw.locreloff);
1618 bfd_h_put_32 (abfd, cmd->nlocrel, &raw.nlocrel);
1620 if (bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw))
1628 bfd_mach_o_primary_symbol_sort_key (unsigned type, unsigned ext)
1630 /* TODO: Determine the correct ordering of stabs symbols. */
1631 /* We make indirect symbols a local/synthetic. */
1632 if (type == BFD_MACH_O_N_INDR)
1635 /* Local (we should never see an undefined local AFAICT). */
1639 /* Common symbols look like undefined externs. */
1640 if (type == BFD_MACH_O_N_UNDF)
1643 /* A defined symbol that's not indirect or extern. */
1648 bfd_mach_o_cf_symbols (const void *a, const void *b)
1650 bfd_mach_o_asymbol *sa = *(bfd_mach_o_asymbol **) a;
1651 bfd_mach_o_asymbol *sb = *(bfd_mach_o_asymbol **) b;
1652 unsigned int soa, sob;
1654 soa = bfd_mach_o_primary_symbol_sort_key
1655 (sa->n_type & BFD_MACH_O_N_TYPE,
1656 sa->n_type & (BFD_MACH_O_N_PEXT | BFD_MACH_O_N_EXT));
1657 sob = bfd_mach_o_primary_symbol_sort_key
1658 (sb->n_type & BFD_MACH_O_N_TYPE,
1659 sb->n_type & (BFD_MACH_O_N_PEXT | BFD_MACH_O_N_EXT));
1666 /* If it's local, just preserve the input order. */
1669 if (sa->symbol.udata.i < sb->symbol.udata.i)
1671 if (sa->symbol.udata.i > sb->symbol.udata.i)
1676 /* Unless it's an indirect the second sort key is name. */
1678 return strcmp (sa->symbol.name, sb->symbol.name);
1680 /* Here be indirect symbols, which have different sort rules. */
1682 /* Next sort key for indirect, is the section index. */
1683 if (sa->n_sect < sb->n_sect)
1686 if (sa->n_sect > sb->n_sect)
1689 /* Last sort key is the order of definition - which should be in line with
1690 the value, since a stub size of 0 is meaninglesss. */
1692 if (sa->symbol.value < sb->symbol.value)
1695 if (sa->symbol.value > sb->symbol.value)
1698 /* In the final analysis, this is probably an error ... but leave it alone
1703 /* When this is finished, return the number of non-indirect symbols. */
1706 bfd_mach_o_sort_symbol_table (asymbol **symbols, unsigned int nin)
1708 qsort (symbols, (size_t) nin, sizeof (void *), bfd_mach_o_cf_symbols);
1710 /* Find the last non-indirect symbol.
1711 There must be at least one non-indirect symbol otherwise there's
1712 nothing for the indirect(s) to refer to. */
1715 bfd_mach_o_asymbol *s = (bfd_mach_o_asymbol *)symbols[nin - 1];
1716 if (IS_MACHO_INDIRECT (s->n_type))
1720 } while (nin - 1 > 0);
1724 /* Process the symbols.
1726 This should be OK for single-module files - but it is not likely to work
1727 for multi-module shared libraries.
1729 (a) If the application has not filled in the relevant mach-o fields, make
1732 (b) Order them, like this:
1735 ( ii) external defined
1737 (iii) external undefined
1743 (by position within section).
1745 (c) Indirect symbols are moved to the end of the list. */
1748 bfd_mach_o_mangle_symbols (bfd *abfd, bfd_mach_o_data_struct *mdata)
1751 asymbol **symbols = bfd_get_outsymbols (abfd);
1753 if (symbols == NULL || bfd_get_symcount (abfd) == 0)
1756 for (i = 0; i < bfd_get_symcount (abfd); i++)
1758 bfd_mach_o_asymbol *s = (bfd_mach_o_asymbol *)symbols[i];
1760 if (s->n_type == BFD_MACH_O_N_UNDF && !(s->symbol.flags & BSF_DEBUGGING))
1762 /* As genuine Mach-O symbols type shouldn't be N_UNDF (undefined
1763 symbols should be N_UNDEF | N_EXT), we suppose the back-end
1764 values haven't been set. */
1765 if (s->symbol.section == bfd_abs_section_ptr)
1766 s->n_type = BFD_MACH_O_N_ABS;
1767 else if (s->symbol.section == bfd_und_section_ptr)
1769 s->n_type = BFD_MACH_O_N_UNDF;
1770 if (s->symbol.flags & BSF_WEAK)
1771 s->n_desc |= BFD_MACH_O_N_WEAK_REF;
1772 /* mach-o automatically makes undefined symbols extern. */
1773 s->n_type |= BFD_MACH_O_N_EXT;
1775 else if (s->symbol.section == bfd_com_section_ptr)
1776 s->n_type = BFD_MACH_O_N_UNDF | BFD_MACH_O_N_EXT;
1778 s->n_type = BFD_MACH_O_N_SECT;
1780 if (s->symbol.flags & BSF_GLOBAL)
1781 s->n_type |= BFD_MACH_O_N_EXT;
1784 /* Put the section index in, where required. */
1785 if (s->symbol.section != bfd_abs_section_ptr
1786 && s->symbol.section != bfd_und_section_ptr
1787 && s->symbol.section != bfd_com_section_ptr)
1788 s->n_sect = s->symbol.section->target_index;
1790 /* Unless we're looking at an indirect sym, note the input ordering.
1791 We use this to keep local symbols ordered as per the input. */
1792 if (! IS_MACHO_INDIRECT (s->n_type))
1793 s->symbol.udata.i = i;
1796 /* Sort the symbols and determine how many will remain in the main symbol
1797 table, and how many will be emitted as indirect (assuming that we will
1798 be emitting a dysymtab). Renumber the sorted symbols so that the right
1799 index will be found during indirection. */
1800 i = bfd_mach_o_sort_symbol_table (symbols, bfd_get_symcount (abfd));
1801 if (bfd_mach_o_should_emit_dysymtab ())
1803 /* Point at the first indirect symbol. */
1804 if (i < bfd_get_symcount (abfd))
1806 mdata->indirect_syms = &symbols[i];
1807 mdata->nindirect = bfd_get_symcount (abfd) - i;
1808 /* This is, essentially, local to the output section of mach-o,
1809 and therefore should be safe. */
1813 /* Now setup the counts for each type of symbol. */
1814 for (i = 0; i < bfd_get_symcount (abfd); ++i)
1816 bfd_mach_o_asymbol *s = (bfd_mach_o_asymbol *)symbols[i];
1817 s->symbol.udata.i = i; /* renumber. */
1818 if (s->n_type & (BFD_MACH_O_N_EXT | BFD_MACH_O_N_PEXT))
1822 for (; i < bfd_get_symcount (abfd); ++i)
1824 bfd_mach_o_asymbol *s = (bfd_mach_o_asymbol *)symbols[i];
1825 s->symbol.udata.i = i; /* renumber. */
1826 if ((s->n_type & BFD_MACH_O_N_TYPE) == BFD_MACH_O_N_UNDF)
1829 mdata->ndefext = i - mdata->nlocal;
1830 mdata->nundefext = bfd_get_symcount (abfd)
1833 for (; i < bfd_get_symcount (abfd); ++i)
1835 bfd_mach_o_asymbol *s = (bfd_mach_o_asymbol *)symbols[i];
1836 s->symbol.udata.i = i; /* renumber. */
1843 /* We build a flat table of sections, which can be re-ordered if necessary.
1844 Fill in the section number and other mach-o-specific data. */
1847 bfd_mach_o_mangle_sections (bfd *abfd, bfd_mach_o_data_struct *mdata)
1850 unsigned target_index;
1853 nsect = bfd_count_sections (abfd);
1855 /* Don't do it if it's already set - assume the application knows what it's
1857 if (mdata->nsects == nsect
1858 && (mdata->nsects == 0 || mdata->sections != NULL))
1861 mdata->nsects = nsect;
1862 mdata->sections = bfd_alloc (abfd,
1863 mdata->nsects * sizeof (bfd_mach_o_section *));
1864 if (mdata->sections == NULL)
1867 /* We need to check that this can be done... */
1869 (*_bfd_error_handler) (_("mach-o: there are too many sections (%d)"
1870 " maximum is 255,\n"), nsect);
1872 /* Create Mach-O sections.
1873 Section type, attribute and align should have been set when the
1874 section was created - either read in or specified. */
1876 for (sec = abfd->sections; sec; sec = sec->next)
1878 unsigned bfd_align = bfd_get_section_alignment (abfd, sec);
1879 bfd_mach_o_section *msect = bfd_mach_o_get_mach_o_section (sec);
1881 mdata->sections[target_index] = msect;
1883 msect->addr = bfd_get_section_vma (abfd, sec);
1884 msect->size = bfd_get_section_size (sec);
1886 /* Use the largest alignment set, in case it was bumped after the
1887 section was created. */
1888 msect->align = msect->align > bfd_align ? msect->align : bfd_align;
1891 sec->target_index = ++target_index;
1898 bfd_mach_o_write_contents (bfd *abfd)
1901 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
1903 /* Make the commands, if not already present. */
1904 if (mdata->header.ncmds == 0)
1905 if (!bfd_mach_o_build_commands (abfd))
1908 if (!bfd_mach_o_write_header (abfd, &mdata->header))
1911 for (i = 0; i < mdata->header.ncmds; i++)
1913 struct mach_o_load_command_external raw;
1914 bfd_mach_o_load_command *cur = &mdata->commands[i];
1915 unsigned long typeflag;
1917 typeflag = cur->type | (cur->type_required ? BFD_MACH_O_LC_REQ_DYLD : 0);
1919 bfd_h_put_32 (abfd, typeflag, raw.cmd);
1920 bfd_h_put_32 (abfd, cur->len, raw.cmdsize);
1922 if (bfd_seek (abfd, cur->offset, SEEK_SET) != 0
1923 || bfd_bwrite (&raw, BFD_MACH_O_LC_SIZE, abfd) != 8)
1928 case BFD_MACH_O_LC_SEGMENT:
1929 if (bfd_mach_o_write_segment_32 (abfd, cur) != 0)
1932 case BFD_MACH_O_LC_SEGMENT_64:
1933 if (bfd_mach_o_write_segment_64 (abfd, cur) != 0)
1936 case BFD_MACH_O_LC_SYMTAB:
1937 if (!bfd_mach_o_write_symtab (abfd, cur))
1940 case BFD_MACH_O_LC_DYSYMTAB:
1941 if (!bfd_mach_o_write_dysymtab (abfd, cur))
1944 case BFD_MACH_O_LC_SYMSEG:
1946 case BFD_MACH_O_LC_THREAD:
1947 case BFD_MACH_O_LC_UNIXTHREAD:
1948 if (bfd_mach_o_write_thread (abfd, cur) != 0)
1951 case BFD_MACH_O_LC_LOADFVMLIB:
1952 case BFD_MACH_O_LC_IDFVMLIB:
1953 case BFD_MACH_O_LC_IDENT:
1954 case BFD_MACH_O_LC_FVMFILE:
1955 case BFD_MACH_O_LC_PREPAGE:
1956 case BFD_MACH_O_LC_LOAD_DYLIB:
1957 case BFD_MACH_O_LC_LOAD_WEAK_DYLIB:
1958 case BFD_MACH_O_LC_ID_DYLIB:
1959 case BFD_MACH_O_LC_REEXPORT_DYLIB:
1960 case BFD_MACH_O_LC_LOAD_UPWARD_DYLIB:
1961 case BFD_MACH_O_LC_LOAD_DYLINKER:
1962 case BFD_MACH_O_LC_ID_DYLINKER:
1963 case BFD_MACH_O_LC_PREBOUND_DYLIB:
1964 case BFD_MACH_O_LC_ROUTINES:
1965 case BFD_MACH_O_LC_SUB_FRAMEWORK:
1968 (*_bfd_error_handler) (_("unable to write unknown load command 0x%lx"),
1969 (unsigned long) cur->type);
1978 bfd_mach_o_append_section_to_segment (bfd_mach_o_segment_command *seg,
1981 bfd_mach_o_section *s = (bfd_mach_o_section *)sec->used_by_bfd;
1982 if (seg->sect_head == NULL)
1985 seg->sect_tail->next = s;
1989 /* Create section Mach-O flags from BFD flags. */
1992 bfd_mach_o_set_section_flags_from_bfd (bfd *abfd ATTRIBUTE_UNUSED, asection *sec)
1995 bfd_mach_o_section *s = bfd_mach_o_get_mach_o_section (sec);
1997 /* Create default flags. */
1998 bfd_flags = bfd_get_section_flags (abfd, sec);
1999 if ((bfd_flags & SEC_CODE) == SEC_CODE)
2000 s->flags = BFD_MACH_O_S_ATTR_PURE_INSTRUCTIONS
2001 | BFD_MACH_O_S_ATTR_SOME_INSTRUCTIONS
2002 | BFD_MACH_O_S_REGULAR;
2003 else if ((bfd_flags & (SEC_ALLOC | SEC_LOAD)) == SEC_ALLOC)
2004 s->flags = BFD_MACH_O_S_ZEROFILL;
2005 else if (bfd_flags & SEC_DEBUGGING)
2006 s->flags = BFD_MACH_O_S_REGULAR | BFD_MACH_O_S_ATTR_DEBUG;
2008 s->flags = BFD_MACH_O_S_REGULAR;
2011 /* Count the number of sections in the list for the segment named.
2013 The special case of NULL or "" for the segment name is valid for
2014 an MH_OBJECT file and means 'all sections available'.
2016 Requires that the sections table in mdata be filled in.
2018 Returns the number of sections (0 is valid).
2019 Any number > 255 signals an invalid section count, although we will,
2020 perhaps, allow the file to be written (in line with Darwin tools up
2023 A section count of (unsigned long) -1 signals a definite error. */
2025 static unsigned long
2026 bfd_mach_o_count_sections_for_seg (const char *segment,
2027 bfd_mach_o_data_struct *mdata)
2030 if (mdata == NULL || mdata->sections == NULL)
2031 return (unsigned long) -1;
2033 /* The MH_OBJECT case, all sections are considered; Although nsects is
2034 is an unsigned long, the maximum valid section count is 255 and this
2035 will have been checked already by mangle_sections. */
2036 if (segment == NULL || segment[0] == '\0')
2037 return mdata->nsects;
2039 /* Count the number of sections we see in this segment. */
2041 for (i = 0; i < mdata->nsects; ++i)
2043 bfd_mach_o_section *s = mdata->sections[i];
2044 if (strncmp (segment, s->segname, BFD_MACH_O_SEGNAME_SIZE) == 0)
2051 bfd_mach_o_build_seg_command (const char *segment,
2052 bfd_mach_o_data_struct *mdata,
2053 bfd_mach_o_segment_command *seg)
2056 int is_mho = (segment == NULL || segment[0] == '\0');
2058 /* Fill segment command. */
2060 memset (seg->segname, 0, sizeof (seg->segname));
2062 strncpy (seg->segname, segment, sizeof (seg->segname));
2064 /* TODO: fix this up for non-MH_OBJECT cases. */
2067 seg->fileoff = mdata->filelen;
2069 seg->maxprot = BFD_MACH_O_PROT_READ | BFD_MACH_O_PROT_WRITE
2070 | BFD_MACH_O_PROT_EXECUTE;
2071 seg->initprot = seg->maxprot;
2073 seg->sect_head = NULL;
2074 seg->sect_tail = NULL;
2076 /* Append sections to the segment. */
2078 for (i = 0; i < mdata->nsects; ++i)
2080 bfd_mach_o_section *s = mdata->sections[i];
2081 asection *sec = s->bfdsection;
2083 /* If we're not making an MH_OBJECT, check whether this section is from
2084 our segment, and skip if not. Otherwise, just add all sections. */
2086 && strncmp (segment, s->segname, BFD_MACH_O_SEGNAME_SIZE) != 0)
2089 bfd_mach_o_append_section_to_segment (seg, sec);
2095 mdata->filelen = FILE_ALIGN (mdata->filelen, s->align);
2096 s->offset = mdata->filelen;
2099 sec->filepos = s->offset;
2101 mdata->filelen += s->size;
2104 seg->filesize = mdata->filelen - seg->fileoff;
2105 seg->vmsize = seg->filesize;
2111 bfd_mach_o_build_dysymtab_command (bfd *abfd,
2112 bfd_mach_o_data_struct *mdata,
2113 bfd_mach_o_load_command *cmd)
2115 bfd_mach_o_dysymtab_command *dsym = &cmd->command.dysymtab;
2118 We are not going to try and fill these in yet and, moreover, we are
2119 going to bail if they are already set. */
2120 if (dsym->nmodtab != 0
2122 || dsym->nextrefsyms != 0)
2124 (*_bfd_error_handler) (_("sorry: modtab, toc and extrefsyms are not yet"
2125 " implemented for dysymtab commands."));
2129 dsym->ilocalsym = 0;
2130 dsym->nlocalsym = mdata->nlocal;
2131 dsym->iextdefsym = dsym->nlocalsym;
2132 dsym->nextdefsym = mdata->ndefext;
2133 dsym->iundefsym = dsym->nextdefsym + dsym->iextdefsym;
2134 dsym->nundefsym = mdata->nundefext;
2136 if (mdata->nindirect > 0)
2140 mdata->filelen = FILE_ALIGN (mdata->filelen, 2);
2141 dsym->indirectsymoff = mdata->filelen;
2142 mdata->filelen += mdata->nindirect * 4;
2144 dsym->indirect_syms = bfd_zalloc (abfd, mdata->nindirect * 4);
2145 if (dsym->indirect_syms == NULL)
2147 dsym->nindirectsyms = mdata->nindirect;
2149 /* So fill in the indices, and point the section reserved1 fields
2150 at the right one. */
2151 sect = (unsigned) -1;
2152 for (i = 0; i < mdata->nindirect; ++i)
2154 bfd_mach_o_asymbol *s =
2155 (bfd_mach_o_asymbol *) mdata->indirect_syms[i];
2156 /* Lookup the index of the referenced symbol. */
2157 dsym->indirect_syms[i] =
2158 ((bfd_mach_o_asymbol *) s->symbol.udata.p)->symbol.udata.i;
2159 if (s->n_sect != sect)
2161 /* Mach-o sections are 1-based, but the section table
2163 bfd_mach_o_section *sc = mdata->sections[s->n_sect-1];
2173 /* Build Mach-O load commands (currently assuming an MH_OBJECT file).
2174 TODO: Other file formats, rebuilding symtab/dysymtab commands for strip
2175 and copy functionality. */
2178 bfd_mach_o_build_commands (bfd *abfd)
2180 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
2181 unsigned int wide = mach_o_wide_p (&mdata->header);
2182 bfd_mach_o_segment_command *seg;
2183 bfd_mach_o_load_command *cmd;
2184 bfd_mach_o_load_command *symtab_cmd;
2187 /* Return now if commands are already present. */
2188 if (mdata->header.ncmds)
2191 /* Fill in the file type, if not already set. */
2193 if (mdata->header.filetype == 0)
2195 if (abfd->flags & EXEC_P)
2196 mdata->header.filetype = BFD_MACH_O_MH_EXECUTE;
2197 else if (abfd->flags & DYNAMIC)
2198 mdata->header.filetype = BFD_MACH_O_MH_DYLIB;
2200 mdata->header.filetype = BFD_MACH_O_MH_OBJECT;
2203 /* If hasn't already been done, flatten sections list, and sort
2204 if/when required. Must be done before the symbol table is adjusted,
2205 since that depends on properly numbered sections. */
2206 if (mdata->nsects == 0 || mdata->sections == NULL)
2207 if (! bfd_mach_o_mangle_sections (abfd, mdata))
2210 /* Order the symbol table, fill-in/check mach-o specific fields and
2211 partition out any indirect symbols. */
2212 if (!bfd_mach_o_mangle_symbols (abfd, mdata))
2215 /* It's valid to have a file with only absolute symbols... */
2216 if (mdata->nsects > 0)
2218 mdata->header.ncmds = 1;
2224 /* It's OK to have a file with only section statements. */
2225 if (bfd_get_symcount (abfd) > 0)
2226 mdata->header.ncmds += 1;
2228 /* Very simple version (only really applicable to MH_OBJECTs):
2229 a command (segment) to contain all the sections,
2230 a command for the symbol table
2231 a n (optional) command for the dysymtab.
2233 ??? maybe we should assert that this is an MH_OBJECT? */
2235 if (bfd_mach_o_should_emit_dysymtab ()
2236 && bfd_get_symcount (abfd) > 0)
2237 mdata->header.ncmds += 1;
2239 /* A bit weird, but looks like no content;
2240 as -n empty.s -o empty.o */
2241 if (mdata->header.ncmds == 0)
2244 mdata->commands = bfd_zalloc (abfd, mdata->header.ncmds
2245 * sizeof (bfd_mach_o_load_command));
2246 if (mdata->commands == NULL)
2249 if (mdata->nsects > 0)
2251 cmd = &mdata->commands[0];
2252 seg = &cmd->command.segment;
2254 /* Count the segctions in the special blank segment used for MH_OBJECT. */
2255 seg->nsects = bfd_mach_o_count_sections_for_seg (NULL, mdata);
2256 if (seg->nsects == (unsigned long) -1)
2259 /* Init segment command. */
2262 cmd->type = BFD_MACH_O_LC_SEGMENT_64;
2263 cmd->offset = BFD_MACH_O_HEADER_64_SIZE;
2264 cmd->len = BFD_MACH_O_LC_SEGMENT_64_SIZE
2265 + BFD_MACH_O_SECTION_64_SIZE * seg->nsects;
2269 cmd->type = BFD_MACH_O_LC_SEGMENT;
2270 cmd->offset = BFD_MACH_O_HEADER_SIZE;
2271 cmd->len = BFD_MACH_O_LC_SEGMENT_SIZE
2272 + BFD_MACH_O_SECTION_SIZE * seg->nsects;
2274 cmd->type_required = FALSE;
2275 mdata->header.sizeofcmds = cmd->len;
2276 mdata->filelen = cmd->offset + cmd->len;
2279 if (bfd_get_symcount (abfd) > 0)
2281 /* Init symtab command. */
2282 symtab_cmd = &mdata->commands[symcind];
2284 symtab_cmd->type = BFD_MACH_O_LC_SYMTAB;
2286 symtab_cmd->offset = mdata->commands[0].offset
2287 + mdata->commands[0].len;
2289 symtab_cmd->offset = 0;
2290 symtab_cmd->len = 6 * 4;
2291 symtab_cmd->type_required = FALSE;
2293 mdata->header.sizeofcmds += symtab_cmd->len;
2294 mdata->filelen += symtab_cmd->len;
2297 /* If required, setup symtab command. */
2298 if (bfd_mach_o_should_emit_dysymtab ()
2299 && bfd_get_symcount (abfd) > 0)
2301 cmd = &mdata->commands[symcind+1];
2302 cmd->type = BFD_MACH_O_LC_DYSYMTAB;
2303 cmd->offset = symtab_cmd->offset + symtab_cmd->len;
2304 cmd->type_required = FALSE;
2305 cmd->len = 18 * 4 + BFD_MACH_O_LC_SIZE;
2307 mdata->header.sizeofcmds += cmd->len;
2308 mdata->filelen += cmd->len;
2311 /* So, now we have sized the commands and the filelen set to that.
2312 Now we can build the segment command and set the section file offsets. */
2313 if (mdata->nsects > 0
2314 && ! bfd_mach_o_build_seg_command (NULL, mdata, seg))
2317 /* If we're doing a dysymtab, cmd points to its load command. */
2318 if (bfd_mach_o_should_emit_dysymtab ()
2319 && bfd_get_symcount (abfd) > 0
2320 && ! bfd_mach_o_build_dysymtab_command (abfd, mdata,
2321 &mdata->commands[symcind+1]))
2324 /* The symtab command is filled in when the symtab is written. */
2328 /* Set the contents of a section. */
2331 bfd_mach_o_set_section_contents (bfd *abfd,
2333 const void * location,
2335 bfd_size_type count)
2339 /* Trying to write the first section contents will trigger the creation of
2340 the load commands if they are not already present. */
2341 if (! abfd->output_has_begun && ! bfd_mach_o_build_commands (abfd))
2347 pos = section->filepos + offset;
2348 if (bfd_seek (abfd, pos, SEEK_SET) != 0
2349 || bfd_bwrite (location, count, abfd) != count)
2356 bfd_mach_o_sizeof_headers (bfd *a ATTRIBUTE_UNUSED,
2357 struct bfd_link_info *info ATTRIBUTE_UNUSED)
2362 /* Make an empty symbol. This is required only because
2363 bfd_make_section_anyway wants to create a symbol for the section. */
2366 bfd_mach_o_make_empty_symbol (bfd *abfd)
2368 asymbol *new_symbol;
2370 new_symbol = bfd_zalloc (abfd, sizeof (bfd_mach_o_asymbol));
2371 if (new_symbol == NULL)
2373 new_symbol->the_bfd = abfd;
2374 new_symbol->udata.i = 0;
2379 bfd_mach_o_read_header (bfd *abfd, bfd_mach_o_header *header)
2381 struct mach_o_header_external raw;
2383 bfd_vma (*get32) (const void *) = NULL;
2385 /* Just read the magic number. */
2386 if (bfd_seek (abfd, 0, SEEK_SET) != 0
2387 || bfd_bread (raw.magic, sizeof (raw.magic), abfd) != 4)
2390 if (bfd_getb32 (raw.magic) == BFD_MACH_O_MH_MAGIC)
2392 header->byteorder = BFD_ENDIAN_BIG;
2393 header->magic = BFD_MACH_O_MH_MAGIC;
2394 header->version = 1;
2397 else if (bfd_getl32 (raw.magic) == BFD_MACH_O_MH_MAGIC)
2399 header->byteorder = BFD_ENDIAN_LITTLE;
2400 header->magic = BFD_MACH_O_MH_MAGIC;
2401 header->version = 1;
2404 else if (bfd_getb32 (raw.magic) == BFD_MACH_O_MH_MAGIC_64)
2406 header->byteorder = BFD_ENDIAN_BIG;
2407 header->magic = BFD_MACH_O_MH_MAGIC_64;
2408 header->version = 2;
2411 else if (bfd_getl32 (raw.magic) == BFD_MACH_O_MH_MAGIC_64)
2413 header->byteorder = BFD_ENDIAN_LITTLE;
2414 header->magic = BFD_MACH_O_MH_MAGIC_64;
2415 header->version = 2;
2420 header->byteorder = BFD_ENDIAN_UNKNOWN;
2424 /* Once the size of the header is known, read the full header. */
2425 size = mach_o_wide_p (header) ?
2426 BFD_MACH_O_HEADER_64_SIZE : BFD_MACH_O_HEADER_SIZE;
2428 if (bfd_seek (abfd, 0, SEEK_SET) != 0
2429 || bfd_bread (&raw, size, abfd) != size)
2432 header->cputype = (*get32) (raw.cputype);
2433 header->cpusubtype = (*get32) (raw.cpusubtype);
2434 header->filetype = (*get32) (raw.filetype);
2435 header->ncmds = (*get32) (raw.ncmds);
2436 header->sizeofcmds = (*get32) (raw.sizeofcmds);
2437 header->flags = (*get32) (raw.flags);
2439 if (mach_o_wide_p (header))
2440 header->reserved = (*get32) (raw.reserved);
2446 bfd_mach_o_new_section_hook (bfd *abfd, asection *sec)
2448 bfd_mach_o_section *s;
2449 unsigned bfdalign = bfd_get_section_alignment (abfd, sec);
2451 s = bfd_mach_o_get_mach_o_section (sec);
2455 static const mach_o_section_name_xlat * xlat;
2457 s = (bfd_mach_o_section *) bfd_zalloc (abfd, sizeof (*s));
2460 sec->used_by_bfd = s;
2461 s->bfdsection = sec;
2463 /* Create the Darwin seg/sect name pair from the bfd name.
2464 If this is a canonical name for which a specific paiting exists
2465 there will also be defined flags, type, attribute and alignment
2467 xlat = bfd_mach_o_convert_section_name_to_mach_o (abfd, sec, s);
2470 s->flags = xlat->macho_sectype | xlat->macho_secattr;
2471 s->align = xlat->sectalign > bfdalign ? xlat->sectalign
2473 bfd_set_section_alignment (abfd, sec, s->align);
2474 bfd_flags = bfd_get_section_flags (abfd, sec);
2475 if (bfd_flags == SEC_NO_FLAGS)
2476 bfd_set_section_flags (abfd, sec, xlat->bfd_flags);
2479 /* Create default flags. */
2480 bfd_mach_o_set_section_flags_from_bfd (abfd, sec);
2483 return _bfd_generic_new_section_hook (abfd, sec);
2487 bfd_mach_o_init_section_from_mach_o (bfd *abfd, asection *sec,
2491 bfd_mach_o_section *section;
2493 flags = bfd_get_section_flags (abfd, sec);
2494 section = bfd_mach_o_get_mach_o_section (sec);
2496 /* TODO: see if we should use the xlat system for doing this by
2497 preference and fall back to this for unknown sections. */
2499 if (flags == SEC_NO_FLAGS)
2501 /* Try to guess flags. */
2502 if (section->flags & BFD_MACH_O_S_ATTR_DEBUG)
2503 flags = SEC_DEBUGGING;
2507 if ((section->flags & BFD_MACH_O_SECTION_TYPE_MASK)
2508 != BFD_MACH_O_S_ZEROFILL)
2511 if (prot & BFD_MACH_O_PROT_EXECUTE)
2513 if (prot & BFD_MACH_O_PROT_WRITE)
2515 else if (prot & BFD_MACH_O_PROT_READ)
2516 flags |= SEC_READONLY;
2522 if ((flags & SEC_DEBUGGING) == 0)
2526 if (section->offset != 0)
2527 flags |= SEC_HAS_CONTENTS;
2528 if (section->nreloc != 0)
2531 bfd_set_section_flags (abfd, sec, flags);
2533 sec->vma = section->addr;
2534 sec->lma = section->addr;
2535 sec->size = section->size;
2536 sec->filepos = section->offset;
2537 sec->alignment_power = section->align;
2538 sec->segment_mark = 0;
2539 sec->reloc_count = section->nreloc;
2540 sec->rel_filepos = section->reloff;
2544 bfd_mach_o_make_bfd_section (bfd *abfd,
2545 const unsigned char *segname,
2546 const unsigned char *sectname)
2551 bfd_mach_o_convert_section_name_to_bfd
2552 (abfd, (const char *)segname, (const char *)sectname, &sname, &flags);
2556 return bfd_make_section_anyway_with_flags (abfd, sname, flags);
2560 bfd_mach_o_read_section_32 (bfd *abfd,
2561 unsigned int offset,
2564 struct mach_o_section_32_external raw;
2566 bfd_mach_o_section *section;
2568 if (bfd_seek (abfd, offset, SEEK_SET) != 0
2569 || (bfd_bread (&raw, BFD_MACH_O_SECTION_SIZE, abfd)
2570 != BFD_MACH_O_SECTION_SIZE))
2573 sec = bfd_mach_o_make_bfd_section (abfd, raw.segname, raw.sectname);
2577 section = bfd_mach_o_get_mach_o_section (sec);
2578 memcpy (section->segname, raw.segname, sizeof (raw.segname));
2579 section->segname[BFD_MACH_O_SEGNAME_SIZE] = 0;
2580 memcpy (section->sectname, raw.sectname, sizeof (raw.sectname));
2581 section->sectname[BFD_MACH_O_SECTNAME_SIZE] = 0;
2582 section->addr = bfd_h_get_32 (abfd, raw.addr);
2583 section->size = bfd_h_get_32 (abfd, raw.size);
2584 section->offset = bfd_h_get_32 (abfd, raw.offset);
2585 section->align = bfd_h_get_32 (abfd, raw.align);
2586 section->reloff = bfd_h_get_32 (abfd, raw.reloff);
2587 section->nreloc = bfd_h_get_32 (abfd, raw.nreloc);
2588 section->flags = bfd_h_get_32 (abfd, raw.flags);
2589 section->reserved1 = bfd_h_get_32 (abfd, raw.reserved1);
2590 section->reserved2 = bfd_h_get_32 (abfd, raw.reserved2);
2591 section->reserved3 = 0;
2593 bfd_mach_o_init_section_from_mach_o (abfd, sec, prot);
2599 bfd_mach_o_read_section_64 (bfd *abfd,
2600 unsigned int offset,
2603 struct mach_o_section_64_external raw;
2605 bfd_mach_o_section *section;
2607 if (bfd_seek (abfd, offset, SEEK_SET) != 0
2608 || (bfd_bread (&raw, BFD_MACH_O_SECTION_64_SIZE, abfd)
2609 != BFD_MACH_O_SECTION_64_SIZE))
2612 sec = bfd_mach_o_make_bfd_section (abfd, raw.segname, raw.sectname);
2616 section = bfd_mach_o_get_mach_o_section (sec);
2617 memcpy (section->segname, raw.segname, sizeof (raw.segname));
2618 section->segname[BFD_MACH_O_SEGNAME_SIZE] = 0;
2619 memcpy (section->sectname, raw.sectname, sizeof (raw.sectname));
2620 section->sectname[BFD_MACH_O_SECTNAME_SIZE] = 0;
2621 section->addr = bfd_h_get_64 (abfd, raw.addr);
2622 section->size = bfd_h_get_64 (abfd, raw.size);
2623 section->offset = bfd_h_get_32 (abfd, raw.offset);
2624 section->align = bfd_h_get_32 (abfd, raw.align);
2625 section->reloff = bfd_h_get_32 (abfd, raw.reloff);
2626 section->nreloc = bfd_h_get_32 (abfd, raw.nreloc);
2627 section->flags = bfd_h_get_32 (abfd, raw.flags);
2628 section->reserved1 = bfd_h_get_32 (abfd, raw.reserved1);
2629 section->reserved2 = bfd_h_get_32 (abfd, raw.reserved2);
2630 section->reserved3 = bfd_h_get_32 (abfd, raw.reserved3);
2632 bfd_mach_o_init_section_from_mach_o (abfd, sec, prot);
2638 bfd_mach_o_read_section (bfd *abfd,
2639 unsigned int offset,
2644 return bfd_mach_o_read_section_64 (abfd, offset, prot);
2646 return bfd_mach_o_read_section_32 (abfd, offset, prot);
2650 bfd_mach_o_read_symtab_symbol (bfd *abfd,
2651 bfd_mach_o_symtab_command *sym,
2652 bfd_mach_o_asymbol *s,
2655 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
2656 unsigned int wide = mach_o_wide_p (&mdata->header);
2657 unsigned int symwidth =
2658 wide ? BFD_MACH_O_NLIST_64_SIZE : BFD_MACH_O_NLIST_SIZE;
2659 unsigned int symoff = sym->symoff + (i * symwidth);
2660 struct mach_o_nlist_64_external raw;
2661 unsigned char type = -1;
2662 unsigned char section = -1;
2664 symvalue value = -1;
2665 unsigned long stroff = -1;
2666 unsigned int symtype = -1;
2668 BFD_ASSERT (sym->strtab != NULL);
2670 if (bfd_seek (abfd, symoff, SEEK_SET) != 0
2671 || bfd_bread (&raw, symwidth, abfd) != symwidth)
2673 (*_bfd_error_handler)
2674 (_("bfd_mach_o_read_symtab_symbol: unable to read %d bytes at %lu"),
2675 symwidth, (unsigned long) symoff);
2679 stroff = bfd_h_get_32 (abfd, raw.n_strx);
2680 type = bfd_h_get_8 (abfd, raw.n_type);
2681 symtype = type & BFD_MACH_O_N_TYPE;
2682 section = bfd_h_get_8 (abfd, raw.n_sect);
2683 desc = bfd_h_get_16 (abfd, raw.n_desc);
2685 value = bfd_h_get_64 (abfd, raw.n_value);
2687 value = bfd_h_get_32 (abfd, raw.n_value);
2689 if (stroff >= sym->strsize)
2691 (*_bfd_error_handler)
2692 (_("bfd_mach_o_read_symtab_symbol: name out of range (%lu >= %lu)"),
2693 (unsigned long) stroff,
2694 (unsigned long) sym->strsize);
2698 s->symbol.the_bfd = abfd;
2699 s->symbol.name = sym->strtab + stroff;
2700 s->symbol.value = value;
2701 s->symbol.flags = 0x0;
2702 s->symbol.udata.i = 0;
2704 s->n_sect = section;
2707 if (type & BFD_MACH_O_N_STAB)
2709 s->symbol.flags |= BSF_DEBUGGING;
2710 s->symbol.section = bfd_und_section_ptr;
2722 if ((section > 0) && (section <= mdata->nsects))
2724 s->symbol.section = mdata->sections[section - 1]->bfdsection;
2726 s->symbol.value - mdata->sections[section - 1]->addr;
2733 if (type & BFD_MACH_O_N_PEXT)
2734 s->symbol.flags |= BSF_GLOBAL;
2736 if (type & BFD_MACH_O_N_EXT)
2737 s->symbol.flags |= BSF_GLOBAL;
2739 if (!(type & (BFD_MACH_O_N_PEXT | BFD_MACH_O_N_EXT)))
2740 s->symbol.flags |= BSF_LOCAL;
2744 case BFD_MACH_O_N_UNDF:
2745 if (type == (BFD_MACH_O_N_UNDF | BFD_MACH_O_N_EXT)
2746 && s->symbol.value != 0)
2748 /* A common symbol. */
2749 s->symbol.section = bfd_com_section_ptr;
2750 s->symbol.flags = BSF_NO_FLAGS;
2754 s->symbol.section = bfd_und_section_ptr;
2755 if (s->n_desc & BFD_MACH_O_N_WEAK_REF)
2756 s->symbol.flags |= BSF_WEAK;
2759 case BFD_MACH_O_N_PBUD:
2760 s->symbol.section = bfd_und_section_ptr;
2762 case BFD_MACH_O_N_ABS:
2763 s->symbol.section = bfd_abs_section_ptr;
2765 case BFD_MACH_O_N_SECT:
2766 if ((section > 0) && (section <= mdata->nsects))
2768 s->symbol.section = mdata->sections[section - 1]->bfdsection;
2770 s->symbol.value - mdata->sections[section - 1]->addr;
2774 /* Mach-O uses 0 to mean "no section"; not an error. */
2777 (*_bfd_error_handler) (_("bfd_mach_o_read_symtab_symbol: "
2778 "symbol \"%s\" specified invalid section %d (max %lu): setting to undefined"),
2779 s->symbol.name, section, mdata->nsects);
2781 s->symbol.section = bfd_und_section_ptr;
2784 case BFD_MACH_O_N_INDR:
2785 /* FIXME: we don't follow the BFD convention as this indirect symbol
2786 won't be followed by the referenced one. This looks harmless
2787 unless we start using the linker. */
2788 s->symbol.flags |= BSF_INDIRECT;
2789 s->symbol.section = bfd_ind_section_ptr;
2790 s->symbol.value = 0;
2793 (*_bfd_error_handler) (_("bfd_mach_o_read_symtab_symbol: "
2794 "symbol \"%s\" specified invalid type field 0x%x: setting to undefined"),
2795 s->symbol.name, symtype);
2796 s->symbol.section = bfd_und_section_ptr;
2805 bfd_mach_o_read_symtab_strtab (bfd *abfd)
2807 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
2808 bfd_mach_o_symtab_command *sym = mdata->symtab;
2810 /* Fail if there is no symtab. */
2814 /* Success if already loaded. */
2818 if (abfd->flags & BFD_IN_MEMORY)
2820 struct bfd_in_memory *b;
2822 b = (struct bfd_in_memory *) abfd->iostream;
2824 if ((sym->stroff + sym->strsize) > b->size)
2826 bfd_set_error (bfd_error_file_truncated);
2829 sym->strtab = (char *) b->buffer + sym->stroff;
2833 sym->strtab = bfd_alloc (abfd, sym->strsize);
2834 if (sym->strtab == NULL)
2837 if (bfd_seek (abfd, sym->stroff, SEEK_SET) != 0
2838 || bfd_bread (sym->strtab, sym->strsize, abfd) != sym->strsize)
2840 bfd_set_error (bfd_error_file_truncated);
2849 bfd_mach_o_read_symtab_symbols (bfd *abfd)
2851 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
2852 bfd_mach_o_symtab_command *sym = mdata->symtab;
2855 if (sym == NULL || sym->symbols)
2857 /* Return now if there are no symbols or if already loaded. */
2861 sym->symbols = bfd_alloc (abfd, sym->nsyms * sizeof (bfd_mach_o_asymbol));
2863 if (sym->symbols == NULL)
2865 (*_bfd_error_handler) (_("bfd_mach_o_read_symtab_symbols: unable to allocate memory for symbols"));
2869 if (!bfd_mach_o_read_symtab_strtab (abfd))
2872 for (i = 0; i < sym->nsyms; i++)
2874 if (!bfd_mach_o_read_symtab_symbol (abfd, sym, &sym->symbols[i], i))
2882 bfd_mach_o_i386_flavour_string (unsigned int flavour)
2884 switch ((int) flavour)
2886 case BFD_MACH_O_x86_THREAD_STATE32: return "x86_THREAD_STATE32";
2887 case BFD_MACH_O_x86_FLOAT_STATE32: return "x86_FLOAT_STATE32";
2888 case BFD_MACH_O_x86_EXCEPTION_STATE32: return "x86_EXCEPTION_STATE32";
2889 case BFD_MACH_O_x86_THREAD_STATE64: return "x86_THREAD_STATE64";
2890 case BFD_MACH_O_x86_FLOAT_STATE64: return "x86_FLOAT_STATE64";
2891 case BFD_MACH_O_x86_EXCEPTION_STATE64: return "x86_EXCEPTION_STATE64";
2892 case BFD_MACH_O_x86_THREAD_STATE: return "x86_THREAD_STATE";
2893 case BFD_MACH_O_x86_FLOAT_STATE: return "x86_FLOAT_STATE";
2894 case BFD_MACH_O_x86_EXCEPTION_STATE: return "x86_EXCEPTION_STATE";
2895 case BFD_MACH_O_x86_DEBUG_STATE32: return "x86_DEBUG_STATE32";
2896 case BFD_MACH_O_x86_DEBUG_STATE64: return "x86_DEBUG_STATE64";
2897 case BFD_MACH_O_x86_DEBUG_STATE: return "x86_DEBUG_STATE";
2898 case BFD_MACH_O_x86_THREAD_STATE_NONE: return "x86_THREAD_STATE_NONE";
2899 default: return "UNKNOWN";
2904 bfd_mach_o_ppc_flavour_string (unsigned int flavour)
2906 switch ((int) flavour)
2908 case BFD_MACH_O_PPC_THREAD_STATE: return "PPC_THREAD_STATE";
2909 case BFD_MACH_O_PPC_FLOAT_STATE: return "PPC_FLOAT_STATE";
2910 case BFD_MACH_O_PPC_EXCEPTION_STATE: return "PPC_EXCEPTION_STATE";
2911 case BFD_MACH_O_PPC_VECTOR_STATE: return "PPC_VECTOR_STATE";
2912 case BFD_MACH_O_PPC_THREAD_STATE64: return "PPC_THREAD_STATE64";
2913 case BFD_MACH_O_PPC_EXCEPTION_STATE64: return "PPC_EXCEPTION_STATE64";
2914 default: return "UNKNOWN";
2919 bfd_mach_o_read_dylinker (bfd *abfd, bfd_mach_o_load_command *command)
2921 bfd_mach_o_dylinker_command *cmd = &command->command.dylinker;
2922 struct mach_o_str_command_external raw;
2923 unsigned int nameoff;
2925 BFD_ASSERT ((command->type == BFD_MACH_O_LC_ID_DYLINKER)
2926 || (command->type == BFD_MACH_O_LC_LOAD_DYLINKER));
2928 if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
2929 || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
2932 nameoff = bfd_h_get_32 (abfd, raw.str);
2934 cmd->name_offset = command->offset + nameoff;
2935 cmd->name_len = command->len - nameoff;
2936 cmd->name_str = bfd_alloc (abfd, cmd->name_len);
2937 if (cmd->name_str == NULL)
2939 if (bfd_seek (abfd, cmd->name_offset, SEEK_SET) != 0
2940 || bfd_bread (cmd->name_str, cmd->name_len, abfd) != cmd->name_len)
2946 bfd_mach_o_read_dylib (bfd *abfd, bfd_mach_o_load_command *command)
2948 bfd_mach_o_dylib_command *cmd = &command->command.dylib;
2949 struct mach_o_dylib_command_external raw;
2950 unsigned int nameoff;
2952 switch (command->type)
2954 case BFD_MACH_O_LC_LOAD_DYLIB:
2955 case BFD_MACH_O_LC_LOAD_WEAK_DYLIB:
2956 case BFD_MACH_O_LC_ID_DYLIB:
2957 case BFD_MACH_O_LC_REEXPORT_DYLIB:
2958 case BFD_MACH_O_LC_LOAD_UPWARD_DYLIB:
2965 if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
2966 || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
2969 nameoff = bfd_h_get_32 (abfd, raw.name);
2970 cmd->timestamp = bfd_h_get_32 (abfd, raw.timestamp);
2971 cmd->current_version = bfd_h_get_32 (abfd, raw.current_version);
2972 cmd->compatibility_version = bfd_h_get_32 (abfd, raw.compatibility_version);
2974 cmd->name_offset = command->offset + nameoff;
2975 cmd->name_len = command->len - nameoff;
2976 cmd->name_str = bfd_alloc (abfd, cmd->name_len);
2977 if (cmd->name_str == NULL)
2979 if (bfd_seek (abfd, cmd->name_offset, SEEK_SET) != 0
2980 || bfd_bread (cmd->name_str, cmd->name_len, abfd) != cmd->name_len)
2986 bfd_mach_o_read_prebound_dylib (bfd *abfd ATTRIBUTE_UNUSED,
2987 bfd_mach_o_load_command *command ATTRIBUTE_UNUSED)
2989 /* bfd_mach_o_prebound_dylib_command *cmd = &command->command.prebound_dylib; */
2991 BFD_ASSERT (command->type == BFD_MACH_O_LC_PREBOUND_DYLIB);
2996 bfd_mach_o_read_thread (bfd *abfd, bfd_mach_o_load_command *command)
2998 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
2999 bfd_mach_o_thread_command *cmd = &command->command.thread;
3000 unsigned int offset;
3001 unsigned int nflavours;
3004 BFD_ASSERT ((command->type == BFD_MACH_O_LC_THREAD)
3005 || (command->type == BFD_MACH_O_LC_UNIXTHREAD));
3007 /* Count the number of threads. */
3010 while (offset != command->len)
3012 struct mach_o_thread_command_external raw;
3014 if (offset >= command->len)
3017 if (bfd_seek (abfd, command->offset + offset, SEEK_SET) != 0
3018 || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
3021 offset += sizeof (raw) + bfd_h_get_32 (abfd, raw.count) * 4;
3025 /* Allocate threads. */
3026 cmd->flavours = bfd_alloc
3027 (abfd, nflavours * sizeof (bfd_mach_o_thread_flavour));
3028 if (cmd->flavours == NULL)
3030 cmd->nflavours = nflavours;
3034 while (offset != command->len)
3036 struct mach_o_thread_command_external raw;
3038 if (offset >= command->len)
3041 if (nflavours >= cmd->nflavours)
3044 if (bfd_seek (abfd, command->offset + offset, SEEK_SET) != 0
3045 || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
3048 cmd->flavours[nflavours].flavour = bfd_h_get_32 (abfd, raw.flavour);
3049 cmd->flavours[nflavours].offset = command->offset + offset + sizeof (raw);
3050 cmd->flavours[nflavours].size = bfd_h_get_32 (abfd, raw.count) * 4;
3051 offset += cmd->flavours[nflavours].size + sizeof (raw);
3055 for (i = 0; i < nflavours; i++)
3058 unsigned int snamelen;
3060 const char *flavourstr;
3061 const char *prefix = "LC_THREAD";
3064 switch (mdata->header.cputype)
3066 case BFD_MACH_O_CPU_TYPE_POWERPC:
3067 case BFD_MACH_O_CPU_TYPE_POWERPC_64:
3068 flavourstr = bfd_mach_o_ppc_flavour_string (cmd->flavours[i].flavour);
3070 case BFD_MACH_O_CPU_TYPE_I386:
3071 case BFD_MACH_O_CPU_TYPE_X86_64:
3072 flavourstr = bfd_mach_o_i386_flavour_string (cmd->flavours[i].flavour);
3075 flavourstr = "UNKNOWN_ARCHITECTURE";
3079 snamelen = strlen (prefix) + 1 + 20 + 1 + strlen (flavourstr) + 1;
3080 sname = bfd_alloc (abfd, snamelen);
3086 sprintf (sname, "%s.%s.%u", prefix, flavourstr, j);
3087 if (bfd_get_section_by_name (abfd, sname) == NULL)
3092 bfdsec = bfd_make_section_with_flags (abfd, sname, SEC_HAS_CONTENTS);
3096 bfdsec->size = cmd->flavours[i].size;
3097 bfdsec->filepos = cmd->flavours[i].offset;
3098 bfdsec->alignment_power = 0x0;
3100 cmd->section = bfdsec;
3107 bfd_mach_o_read_dysymtab (bfd *abfd, bfd_mach_o_load_command *command)
3109 bfd_mach_o_dysymtab_command *cmd = &command->command.dysymtab;
3110 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
3112 BFD_ASSERT (command->type == BFD_MACH_O_LC_DYSYMTAB);
3115 struct mach_o_dysymtab_command_external raw;
3117 if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
3118 || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
3121 cmd->ilocalsym = bfd_h_get_32 (abfd, raw.ilocalsym);
3122 cmd->nlocalsym = bfd_h_get_32 (abfd, raw.nlocalsym);
3123 cmd->iextdefsym = bfd_h_get_32 (abfd, raw.iextdefsym);
3124 cmd->nextdefsym = bfd_h_get_32 (abfd, raw.nextdefsym);
3125 cmd->iundefsym = bfd_h_get_32 (abfd, raw.iundefsym);
3126 cmd->nundefsym = bfd_h_get_32 (abfd, raw.nundefsym);
3127 cmd->tocoff = bfd_h_get_32 (abfd, raw.tocoff);
3128 cmd->ntoc = bfd_h_get_32 (abfd, raw.ntoc);
3129 cmd->modtaboff = bfd_h_get_32 (abfd, raw.modtaboff);
3130 cmd->nmodtab = bfd_h_get_32 (abfd, raw.nmodtab);
3131 cmd->extrefsymoff = bfd_h_get_32 (abfd, raw.extrefsymoff);
3132 cmd->nextrefsyms = bfd_h_get_32 (abfd, raw.nextrefsyms);
3133 cmd->indirectsymoff = bfd_h_get_32 (abfd, raw.indirectsymoff);
3134 cmd->nindirectsyms = bfd_h_get_32 (abfd, raw.nindirectsyms);
3135 cmd->extreloff = bfd_h_get_32 (abfd, raw.extreloff);
3136 cmd->nextrel = bfd_h_get_32 (abfd, raw.nextrel);
3137 cmd->locreloff = bfd_h_get_32 (abfd, raw.locreloff);
3138 cmd->nlocrel = bfd_h_get_32 (abfd, raw.nlocrel);
3141 if (cmd->nmodtab != 0)
3144 int wide = bfd_mach_o_wide_p (abfd);
3145 unsigned int module_len = wide ? 56 : 52;
3148 bfd_alloc (abfd, cmd->nmodtab * sizeof (bfd_mach_o_dylib_module));
3149 if (cmd->dylib_module == NULL)
3152 if (bfd_seek (abfd, cmd->modtaboff, SEEK_SET) != 0)
3155 for (i = 0; i < cmd->nmodtab; i++)
3157 bfd_mach_o_dylib_module *module = &cmd->dylib_module[i];
3159 unsigned char buf[56];
3161 if (bfd_bread ((void *) buf, module_len, abfd) != module_len)
3164 module->module_name_idx = bfd_h_get_32 (abfd, buf + 0);
3165 module->iextdefsym = bfd_h_get_32 (abfd, buf + 4);
3166 module->nextdefsym = bfd_h_get_32 (abfd, buf + 8);
3167 module->irefsym = bfd_h_get_32 (abfd, buf + 12);
3168 module->nrefsym = bfd_h_get_32 (abfd, buf + 16);
3169 module->ilocalsym = bfd_h_get_32 (abfd, buf + 20);
3170 module->nlocalsym = bfd_h_get_32 (abfd, buf + 24);
3171 module->iextrel = bfd_h_get_32 (abfd, buf + 28);
3172 module->nextrel = bfd_h_get_32 (abfd, buf + 32);
3173 v = bfd_h_get_32 (abfd, buf +36);
3174 module->iinit = v & 0xffff;
3175 module->iterm = (v >> 16) & 0xffff;
3176 v = bfd_h_get_32 (abfd, buf + 40);
3177 module->ninit = v & 0xffff;
3178 module->nterm = (v >> 16) & 0xffff;
3181 module->objc_module_info_size = bfd_h_get_32 (abfd, buf + 44);
3182 module->objc_module_info_addr = bfd_h_get_64 (abfd, buf + 48);
3186 module->objc_module_info_addr = bfd_h_get_32 (abfd, buf + 44);
3187 module->objc_module_info_size = bfd_h_get_32 (abfd, buf + 48);
3196 cmd->dylib_toc = bfd_alloc
3197 (abfd, cmd->ntoc * sizeof (bfd_mach_o_dylib_table_of_content));
3198 if (cmd->dylib_toc == NULL)
3201 if (bfd_seek (abfd, cmd->tocoff, SEEK_SET) != 0)
3204 for (i = 0; i < cmd->ntoc; i++)
3206 struct mach_o_dylib_table_of_contents_external raw;
3207 bfd_mach_o_dylib_table_of_content *toc = &cmd->dylib_toc[i];
3209 if (bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
3212 toc->symbol_index = bfd_h_get_32 (abfd, raw.symbol_index);
3213 toc->module_index = bfd_h_get_32 (abfd, raw.module_index);
3217 if (cmd->nindirectsyms != 0)
3221 cmd->indirect_syms = bfd_alloc
3222 (abfd, cmd->nindirectsyms * sizeof (unsigned int));
3223 if (cmd->indirect_syms == NULL)
3226 if (bfd_seek (abfd, cmd->indirectsymoff, SEEK_SET) != 0)
3229 for (i = 0; i < cmd->nindirectsyms; i++)
3231 unsigned char raw[4];
3232 unsigned int *is = &cmd->indirect_syms[i];
3234 if (bfd_bread (raw, sizeof (raw), abfd) != sizeof (raw))
3237 *is = bfd_h_get_32 (abfd, raw);
3241 if (cmd->nextrefsyms != 0)
3246 cmd->ext_refs = bfd_alloc
3247 (abfd, cmd->nextrefsyms * sizeof (bfd_mach_o_dylib_reference));
3248 if (cmd->ext_refs == NULL)
3251 if (bfd_seek (abfd, cmd->extrefsymoff, SEEK_SET) != 0)
3254 for (i = 0; i < cmd->nextrefsyms; i++)
3256 unsigned char raw[4];
3257 bfd_mach_o_dylib_reference *ref = &cmd->ext_refs[i];
3259 if (bfd_bread (raw, sizeof (raw), abfd) != sizeof (raw))
3262 /* Fields isym and flags are written as bit-fields, thus we need
3263 a specific processing for endianness. */
3264 v = bfd_h_get_32 (abfd, raw);
3265 if (bfd_big_endian (abfd))
3267 ref->isym = (v >> 8) & 0xffffff;
3268 ref->flags = v & 0xff;
3272 ref->isym = v & 0xffffff;
3273 ref->flags = (v >> 24) & 0xff;
3278 if (mdata->dysymtab)
3280 mdata->dysymtab = cmd;
3286 bfd_mach_o_read_symtab (bfd *abfd, bfd_mach_o_load_command *command)
3288 bfd_mach_o_symtab_command *symtab = &command->command.symtab;
3289 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
3290 struct mach_o_symtab_command_external raw;
3292 BFD_ASSERT (command->type == BFD_MACH_O_LC_SYMTAB);
3294 if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
3295 || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
3298 symtab->symoff = bfd_h_get_32 (abfd, raw.symoff);
3299 symtab->nsyms = bfd_h_get_32 (abfd, raw.nsyms);
3300 symtab->stroff = bfd_h_get_32 (abfd, raw.stroff);
3301 symtab->strsize = bfd_h_get_32 (abfd, raw.strsize);
3302 symtab->symbols = NULL;
3303 symtab->strtab = NULL;
3305 if (symtab->nsyms != 0)
3306 abfd->flags |= HAS_SYMS;
3310 mdata->symtab = symtab;
3315 bfd_mach_o_read_uuid (bfd *abfd, bfd_mach_o_load_command *command)
3317 bfd_mach_o_uuid_command *cmd = &command->command.uuid;
3319 BFD_ASSERT (command->type == BFD_MACH_O_LC_UUID);
3321 if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
3322 || bfd_bread (cmd->uuid, 16, abfd) != 16)
3329 bfd_mach_o_read_linkedit (bfd *abfd, bfd_mach_o_load_command *command)
3331 bfd_mach_o_linkedit_command *cmd = &command->command.linkedit;
3332 struct mach_o_linkedit_data_command_external raw;
3334 if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
3335 || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
3338 cmd->dataoff = bfd_get_32 (abfd, raw.dataoff);
3339 cmd->datasize = bfd_get_32 (abfd, raw.datasize);
3344 bfd_mach_o_read_str (bfd *abfd, bfd_mach_o_load_command *command)
3346 bfd_mach_o_str_command *cmd = &command->command.str;
3347 struct mach_o_str_command_external raw;
3350 if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
3351 || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
3354 off = bfd_get_32 (abfd, raw.str);
3355 cmd->stroff = command->offset + off;
3356 cmd->str_len = command->len - off;
3357 cmd->str = bfd_alloc (abfd, cmd->str_len);
3358 if (cmd->str == NULL)
3360 if (bfd_seek (abfd, cmd->stroff, SEEK_SET) != 0
3361 || bfd_bread ((void *) cmd->str, cmd->str_len, abfd) != cmd->str_len)
3367 bfd_mach_o_read_dyld_info (bfd *abfd, bfd_mach_o_load_command *command)
3369 bfd_mach_o_dyld_info_command *cmd = &command->command.dyld_info;
3370 struct mach_o_dyld_info_command_external raw;
3372 if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
3373 || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
3376 cmd->rebase_off = bfd_get_32 (abfd, raw.rebase_off);
3377 cmd->rebase_size = bfd_get_32 (abfd, raw.rebase_size);
3378 cmd->bind_off = bfd_get_32 (abfd, raw.bind_off);
3379 cmd->bind_size = bfd_get_32 (abfd, raw.bind_size);
3380 cmd->weak_bind_off = bfd_get_32 (abfd, raw.weak_bind_off);
3381 cmd->weak_bind_size = bfd_get_32 (abfd, raw.weak_bind_size);
3382 cmd->lazy_bind_off = bfd_get_32 (abfd, raw.lazy_bind_off);
3383 cmd->lazy_bind_size = bfd_get_32 (abfd, raw.lazy_bind_size);
3384 cmd->export_off = bfd_get_32 (abfd, raw.export_off);
3385 cmd->export_size = bfd_get_32 (abfd, raw.export_size);
3390 bfd_mach_o_read_version_min (bfd *abfd, bfd_mach_o_load_command *command)
3392 bfd_mach_o_version_min_command *cmd = &command->command.version_min;
3393 struct mach_o_version_min_command_external raw;
3396 if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
3397 || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
3400 ver = bfd_get_32 (abfd, raw.version);
3401 cmd->rel = ver >> 16;
3402 cmd->maj = ver >> 8;
3404 cmd->reserved = bfd_get_32 (abfd, raw.reserved);
3409 bfd_mach_o_read_segment (bfd *abfd,
3410 bfd_mach_o_load_command *command,
3413 bfd_mach_o_segment_command *seg = &command->command.segment;
3418 struct mach_o_segment_command_64_external raw;
3420 BFD_ASSERT (command->type == BFD_MACH_O_LC_SEGMENT_64);
3422 if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
3423 || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
3426 memcpy (seg->segname, raw.segname, 16);
3427 seg->segname[16] = '\0';
3429 seg->vmaddr = bfd_h_get_64 (abfd, raw.vmaddr);
3430 seg->vmsize = bfd_h_get_64 (abfd, raw.vmsize);
3431 seg->fileoff = bfd_h_get_64 (abfd, raw.fileoff);
3432 seg->filesize = bfd_h_get_64 (abfd, raw.filesize);
3433 seg->maxprot = bfd_h_get_32 (abfd, raw.maxprot);
3434 seg->initprot = bfd_h_get_32 (abfd, raw.initprot);
3435 seg->nsects = bfd_h_get_32 (abfd, raw.nsects);
3436 seg->flags = bfd_h_get_32 (abfd, raw.flags);
3440 struct mach_o_segment_command_32_external raw;
3442 BFD_ASSERT (command->type == BFD_MACH_O_LC_SEGMENT);
3444 if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
3445 || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
3448 memcpy (seg->segname, raw.segname, 16);
3449 seg->segname[16] = '\0';
3451 seg->vmaddr = bfd_h_get_32 (abfd, raw.vmaddr);
3452 seg->vmsize = bfd_h_get_32 (abfd, raw.vmsize);
3453 seg->fileoff = bfd_h_get_32 (abfd, raw.fileoff);
3454 seg->filesize = bfd_h_get_32 (abfd, raw.filesize);
3455 seg->maxprot = bfd_h_get_32 (abfd, raw.maxprot);
3456 seg->initprot = bfd_h_get_32 (abfd, raw.initprot);
3457 seg->nsects = bfd_h_get_32 (abfd, raw.nsects);
3458 seg->flags = bfd_h_get_32 (abfd, raw.flags);
3460 seg->sect_head = NULL;
3461 seg->sect_tail = NULL;
3463 for (i = 0; i < seg->nsects; i++)
3469 segoff = command->offset + BFD_MACH_O_LC_SEGMENT_64_SIZE
3470 + (i * BFD_MACH_O_SECTION_64_SIZE);
3472 segoff = command->offset + BFD_MACH_O_LC_SEGMENT_SIZE
3473 + (i * BFD_MACH_O_SECTION_SIZE);
3475 sec = bfd_mach_o_read_section (abfd, segoff, seg->initprot, wide);
3479 bfd_mach_o_append_section_to_segment (seg, sec);
3486 bfd_mach_o_read_segment_32 (bfd *abfd, bfd_mach_o_load_command *command)
3488 return bfd_mach_o_read_segment (abfd, command, 0);
3492 bfd_mach_o_read_segment_64 (bfd *abfd, bfd_mach_o_load_command *command)
3494 return bfd_mach_o_read_segment (abfd, command, 1);
3498 bfd_mach_o_read_command (bfd *abfd, bfd_mach_o_load_command *command)
3500 struct mach_o_load_command_external raw;
3503 /* Read command type and length. */
3504 if (bfd_seek (abfd, command->offset, SEEK_SET) != 0
3505 || bfd_bread (&raw, BFD_MACH_O_LC_SIZE, abfd) != BFD_MACH_O_LC_SIZE)
3508 cmd = bfd_h_get_32 (abfd, raw.cmd);
3509 command->type = cmd & ~BFD_MACH_O_LC_REQ_DYLD;
3510 command->type_required = cmd & BFD_MACH_O_LC_REQ_DYLD ? TRUE : FALSE;
3511 command->len = bfd_h_get_32 (abfd, raw.cmdsize);
3513 switch (command->type)
3515 case BFD_MACH_O_LC_SEGMENT:
3516 if (bfd_mach_o_read_segment_32 (abfd, command) != 0)
3519 case BFD_MACH_O_LC_SEGMENT_64:
3520 if (bfd_mach_o_read_segment_64 (abfd, command) != 0)
3523 case BFD_MACH_O_LC_SYMTAB:
3524 if (bfd_mach_o_read_symtab (abfd, command) != 0)
3527 case BFD_MACH_O_LC_SYMSEG:
3529 case BFD_MACH_O_LC_THREAD:
3530 case BFD_MACH_O_LC_UNIXTHREAD:
3531 if (bfd_mach_o_read_thread (abfd, command) != 0)
3534 case BFD_MACH_O_LC_LOAD_DYLINKER:
3535 case BFD_MACH_O_LC_ID_DYLINKER:
3536 if (bfd_mach_o_read_dylinker (abfd, command) != 0)
3539 case BFD_MACH_O_LC_LOAD_DYLIB:
3540 case BFD_MACH_O_LC_ID_DYLIB:
3541 case BFD_MACH_O_LC_LOAD_WEAK_DYLIB:
3542 case BFD_MACH_O_LC_REEXPORT_DYLIB:
3543 case BFD_MACH_O_LC_LOAD_UPWARD_DYLIB:
3544 if (bfd_mach_o_read_dylib (abfd, command) != 0)
3547 case BFD_MACH_O_LC_PREBOUND_DYLIB:
3548 if (bfd_mach_o_read_prebound_dylib (abfd, command) != 0)
3551 case BFD_MACH_O_LC_LOADFVMLIB:
3552 case BFD_MACH_O_LC_IDFVMLIB:
3553 case BFD_MACH_O_LC_IDENT:
3554 case BFD_MACH_O_LC_FVMFILE:
3555 case BFD_MACH_O_LC_PREPAGE:
3556 case BFD_MACH_O_LC_ROUTINES:
3557 case BFD_MACH_O_LC_ROUTINES_64:
3559 case BFD_MACH_O_LC_SUB_FRAMEWORK:
3560 case BFD_MACH_O_LC_SUB_UMBRELLA:
3561 case BFD_MACH_O_LC_SUB_LIBRARY:
3562 case BFD_MACH_O_LC_SUB_CLIENT:
3563 case BFD_MACH_O_LC_RPATH:
3564 if (bfd_mach_o_read_str (abfd, command) != 0)
3567 case BFD_MACH_O_LC_DYSYMTAB:
3568 if (bfd_mach_o_read_dysymtab (abfd, command) != 0)
3571 case BFD_MACH_O_LC_TWOLEVEL_HINTS:
3572 case BFD_MACH_O_LC_PREBIND_CKSUM:
3574 case BFD_MACH_O_LC_UUID:
3575 if (bfd_mach_o_read_uuid (abfd, command) != 0)
3578 case BFD_MACH_O_LC_CODE_SIGNATURE:
3579 case BFD_MACH_O_LC_SEGMENT_SPLIT_INFO:
3580 case BFD_MACH_O_LC_FUNCTION_STARTS:
3581 if (bfd_mach_o_read_linkedit (abfd, command) != 0)
3584 case BFD_MACH_O_LC_DYLD_INFO:
3585 if (bfd_mach_o_read_dyld_info (abfd, command) != 0)
3588 case BFD_MACH_O_LC_VERSION_MIN_MACOSX:
3589 case BFD_MACH_O_LC_VERSION_MIN_IPHONEOS:
3590 if (!bfd_mach_o_read_version_min (abfd, command))
3594 (*_bfd_error_handler)(_("%B: unable to read unknown load command 0x%lx"),
3595 abfd, (unsigned long) command->type);
3603 bfd_mach_o_flatten_sections (bfd *abfd)
3605 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
3609 /* Count total number of sections. */
3612 for (i = 0; i < mdata->header.ncmds; i++)
3614 if (mdata->commands[i].type == BFD_MACH_O_LC_SEGMENT
3615 || mdata->commands[i].type == BFD_MACH_O_LC_SEGMENT_64)
3617 bfd_mach_o_segment_command *seg;
3619 seg = &mdata->commands[i].command.segment;
3620 mdata->nsects += seg->nsects;
3624 /* Allocate sections array. */
3625 mdata->sections = bfd_alloc (abfd,
3626 mdata->nsects * sizeof (bfd_mach_o_section *));
3628 /* Fill the array. */
3631 for (i = 0; i < mdata->header.ncmds; i++)
3633 if (mdata->commands[i].type == BFD_MACH_O_LC_SEGMENT
3634 || mdata->commands[i].type == BFD_MACH_O_LC_SEGMENT_64)
3636 bfd_mach_o_segment_command *seg;
3637 bfd_mach_o_section *sec;
3639 seg = &mdata->commands[i].command.segment;
3640 BFD_ASSERT (csect + seg->nsects <= mdata->nsects);
3642 for (sec = seg->sect_head; sec != NULL; sec = sec->next)
3643 mdata->sections[csect++] = sec;
3649 bfd_mach_o_scan_start_address (bfd *abfd)
3651 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
3652 bfd_mach_o_thread_command *cmd = NULL;
3655 for (i = 0; i < mdata->header.ncmds; i++)
3656 if ((mdata->commands[i].type == BFD_MACH_O_LC_THREAD) ||
3657 (mdata->commands[i].type == BFD_MACH_O_LC_UNIXTHREAD))
3659 cmd = &mdata->commands[i].command.thread;
3666 /* FIXME: create a subtarget hook ? */
3667 for (i = 0; i < cmd->nflavours; i++)
3669 if ((mdata->header.cputype == BFD_MACH_O_CPU_TYPE_I386)
3670 && (cmd->flavours[i].flavour
3671 == (unsigned long) BFD_MACH_O_x86_THREAD_STATE32))
3673 unsigned char buf[4];
3675 if (bfd_seek (abfd, cmd->flavours[i].offset + 40, SEEK_SET) != 0
3676 || bfd_bread (buf, 4, abfd) != 4)
3679 abfd->start_address = bfd_h_get_32 (abfd, buf);
3681 else if ((mdata->header.cputype == BFD_MACH_O_CPU_TYPE_POWERPC)
3682 && (cmd->flavours[i].flavour == BFD_MACH_O_PPC_THREAD_STATE))
3684 unsigned char buf[4];
3686 if (bfd_seek (abfd, cmd->flavours[i].offset + 0, SEEK_SET) != 0
3687 || bfd_bread (buf, 4, abfd) != 4)
3690 abfd->start_address = bfd_h_get_32 (abfd, buf);
3692 else if ((mdata->header.cputype == BFD_MACH_O_CPU_TYPE_POWERPC_64)
3693 && (cmd->flavours[i].flavour == BFD_MACH_O_PPC_THREAD_STATE64))
3695 unsigned char buf[8];
3697 if (bfd_seek (abfd, cmd->flavours[i].offset + 0, SEEK_SET) != 0
3698 || bfd_bread (buf, 8, abfd) != 8)
3701 abfd->start_address = bfd_h_get_64 (abfd, buf);
3703 else if ((mdata->header.cputype == BFD_MACH_O_CPU_TYPE_X86_64)
3704 && (cmd->flavours[i].flavour == BFD_MACH_O_x86_THREAD_STATE64))
3706 unsigned char buf[8];
3708 if (bfd_seek (abfd, cmd->flavours[i].offset + (16 * 8), SEEK_SET) != 0
3709 || bfd_bread (buf, 8, abfd) != 8)
3712 abfd->start_address = bfd_h_get_64 (abfd, buf);
3720 bfd_mach_o_set_arch_mach (bfd *abfd,
3721 enum bfd_architecture arch,
3722 unsigned long machine)
3724 bfd_mach_o_backend_data *bed = bfd_mach_o_get_backend_data (abfd);
3726 /* If this isn't the right architecture for this backend, and this
3727 isn't the generic backend, fail. */
3728 if (arch != bed->arch
3729 && arch != bfd_arch_unknown
3730 && bed->arch != bfd_arch_unknown)
3733 return bfd_default_set_arch_mach (abfd, arch, machine);
3737 bfd_mach_o_scan (bfd *abfd,
3738 bfd_mach_o_header *header,
3739 bfd_mach_o_data_struct *mdata)
3742 enum bfd_architecture cputype;
3743 unsigned long cpusubtype;
3744 unsigned int hdrsize;
3746 hdrsize = mach_o_wide_p (header) ?
3747 BFD_MACH_O_HEADER_64_SIZE : BFD_MACH_O_HEADER_SIZE;
3749 mdata->header = *header;
3751 abfd->flags = abfd->flags & BFD_IN_MEMORY;
3752 switch (header->filetype)
3754 case BFD_MACH_O_MH_OBJECT:
3755 abfd->flags |= HAS_RELOC;
3757 case BFD_MACH_O_MH_EXECUTE:
3758 abfd->flags |= EXEC_P;
3760 case BFD_MACH_O_MH_DYLIB:
3761 case BFD_MACH_O_MH_BUNDLE:
3762 abfd->flags |= DYNAMIC;
3766 abfd->tdata.mach_o_data = mdata;
3768 bfd_mach_o_convert_architecture (header->cputype, header->cpusubtype,
3769 &cputype, &cpusubtype);
3770 if (cputype == bfd_arch_unknown)
3772 (*_bfd_error_handler)
3773 (_("bfd_mach_o_scan: unknown architecture 0x%lx/0x%lx"),
3774 header->cputype, header->cpusubtype);
3778 bfd_set_arch_mach (abfd, cputype, cpusubtype);
3780 if (header->ncmds != 0)
3782 mdata->commands = bfd_alloc
3783 (abfd, header->ncmds * sizeof (bfd_mach_o_load_command));
3784 if (mdata->commands == NULL)
3787 for (i = 0; i < header->ncmds; i++)
3789 bfd_mach_o_load_command *cur = &mdata->commands[i];
3792 cur->offset = hdrsize;
3795 bfd_mach_o_load_command *prev = &mdata->commands[i - 1];
3796 cur->offset = prev->offset + prev->len;
3799 if (bfd_mach_o_read_command (abfd, cur) < 0)
3804 if (bfd_mach_o_scan_start_address (abfd) < 0)
3807 bfd_mach_o_flatten_sections (abfd);
3812 bfd_mach_o_mkobject_init (bfd *abfd)
3814 bfd_mach_o_data_struct *mdata = NULL;
3816 mdata = bfd_alloc (abfd, sizeof (bfd_mach_o_data_struct));
3819 abfd->tdata.mach_o_data = mdata;
3821 mdata->header.magic = 0;
3822 mdata->header.cputype = 0;
3823 mdata->header.cpusubtype = 0;
3824 mdata->header.filetype = 0;
3825 mdata->header.ncmds = 0;
3826 mdata->header.sizeofcmds = 0;
3827 mdata->header.flags = 0;
3828 mdata->header.byteorder = BFD_ENDIAN_UNKNOWN;
3829 mdata->commands = NULL;
3831 mdata->sections = NULL;
3832 mdata->dyn_reloc_cache = NULL;
3838 bfd_mach_o_gen_mkobject (bfd *abfd)
3840 bfd_mach_o_data_struct *mdata;
3842 if (!bfd_mach_o_mkobject_init (abfd))
3845 mdata = bfd_mach_o_get_data (abfd);
3846 mdata->header.magic = BFD_MACH_O_MH_MAGIC;
3847 mdata->header.cputype = 0;
3848 mdata->header.cpusubtype = 0;
3849 mdata->header.byteorder = abfd->xvec->byteorder;
3850 mdata->header.version = 1;
3856 bfd_mach_o_header_p (bfd *abfd,
3857 bfd_mach_o_filetype filetype,
3858 bfd_mach_o_cpu_type cputype)
3860 struct bfd_preserve preserve;
3861 bfd_mach_o_header header;
3863 preserve.marker = NULL;
3864 if (!bfd_mach_o_read_header (abfd, &header))
3867 if (! (header.byteorder == BFD_ENDIAN_BIG
3868 || header.byteorder == BFD_ENDIAN_LITTLE))
3870 (*_bfd_error_handler) (_("unknown header byte-order value 0x%lx"),
3871 (unsigned long) header.byteorder);
3875 if (! ((header.byteorder == BFD_ENDIAN_BIG
3876 && abfd->xvec->byteorder == BFD_ENDIAN_BIG
3877 && abfd->xvec->header_byteorder == BFD_ENDIAN_BIG)
3878 || (header.byteorder == BFD_ENDIAN_LITTLE
3879 && abfd->xvec->byteorder == BFD_ENDIAN_LITTLE
3880 && abfd->xvec->header_byteorder == BFD_ENDIAN_LITTLE)))
3883 /* Check cputype and filetype.
3884 In case of wildcard, do not accept magics that are handled by existing
3888 if (header.cputype != cputype)
3893 if (header.filetype != filetype)
3898 switch (header.filetype)
3900 case BFD_MACH_O_MH_CORE:
3901 /* Handled by core_p */
3908 preserve.marker = bfd_zalloc (abfd, sizeof (bfd_mach_o_data_struct));
3909 if (preserve.marker == NULL
3910 || !bfd_preserve_save (abfd, &preserve))
3913 if (!bfd_mach_o_scan (abfd, &header,
3914 (bfd_mach_o_data_struct *) preserve.marker))
3917 bfd_preserve_finish (abfd, &preserve);
3921 bfd_set_error (bfd_error_wrong_format);
3924 if (preserve.marker != NULL)
3925 bfd_preserve_restore (abfd, &preserve);
3929 static const bfd_target *
3930 bfd_mach_o_gen_object_p (bfd *abfd)
3932 return bfd_mach_o_header_p (abfd, 0, 0);
3935 static const bfd_target *
3936 bfd_mach_o_gen_core_p (bfd *abfd)
3938 return bfd_mach_o_header_p (abfd, BFD_MACH_O_MH_CORE, 0);
3941 typedef struct mach_o_fat_archentry
3943 unsigned long cputype;
3944 unsigned long cpusubtype;
3945 unsigned long offset;
3947 unsigned long align;
3948 } mach_o_fat_archentry;
3950 typedef struct mach_o_fat_data_struct
3952 unsigned long magic;
3953 unsigned long nfat_arch;
3954 mach_o_fat_archentry *archentries;
3955 } mach_o_fat_data_struct;
3958 bfd_mach_o_archive_p (bfd *abfd)
3960 mach_o_fat_data_struct *adata = NULL;
3961 struct mach_o_fat_header_external hdr;
3964 if (bfd_seek (abfd, 0, SEEK_SET) != 0
3965 || bfd_bread (&hdr, sizeof (hdr), abfd) != sizeof (hdr))
3968 adata = bfd_alloc (abfd, sizeof (mach_o_fat_data_struct));
3972 adata->magic = bfd_getb32 (hdr.magic);
3973 adata->nfat_arch = bfd_getb32 (hdr.nfat_arch);
3974 if (adata->magic != 0xcafebabe)
3976 /* Avoid matching Java bytecode files, which have the same magic number.
3977 In the Java bytecode file format this field contains the JVM version,
3978 which starts at 43.0. */
3979 if (adata->nfat_arch > 30)
3982 adata->archentries =
3983 bfd_alloc (abfd, adata->nfat_arch * sizeof (mach_o_fat_archentry));
3984 if (adata->archentries == NULL)
3987 for (i = 0; i < adata->nfat_arch; i++)
3989 struct mach_o_fat_arch_external arch;
3990 if (bfd_bread (&arch, sizeof (arch), abfd) != sizeof (arch))
3992 adata->archentries[i].cputype = bfd_getb32 (arch.cputype);
3993 adata->archentries[i].cpusubtype = bfd_getb32 (arch.cpusubtype);
3994 adata->archentries[i].offset = bfd_getb32 (arch.offset);
3995 adata->archentries[i].size = bfd_getb32 (arch.size);
3996 adata->archentries[i].align = bfd_getb32 (arch.align);
3999 abfd->tdata.mach_o_fat_data = adata;
4004 bfd_release (abfd, adata);
4005 bfd_set_error (bfd_error_wrong_format);
4010 bfd_mach_o_openr_next_archived_file (bfd *archive, bfd *prev)
4012 mach_o_fat_data_struct *adata;
4013 mach_o_fat_archentry *entry = NULL;
4016 enum bfd_architecture arch_type;
4017 unsigned long arch_subtype;
4019 adata = (mach_o_fat_data_struct *) archive->tdata.mach_o_fat_data;
4020 BFD_ASSERT (adata != NULL);
4022 /* Find index of previous entry. */
4024 i = 0; /* Start at first one. */
4027 for (i = 0; i < adata->nfat_arch; i++)
4029 if (adata->archentries[i].offset == prev->origin)
4033 if (i == adata->nfat_arch)
4036 bfd_set_error (bfd_error_bad_value);
4039 i++; /* Get next entry. */
4042 if (i >= adata->nfat_arch)
4044 bfd_set_error (bfd_error_no_more_archived_files);
4048 entry = &adata->archentries[i];
4049 nbfd = _bfd_new_bfd_contained_in (archive);
4053 nbfd->origin = entry->offset;
4055 bfd_mach_o_convert_architecture (entry->cputype, entry->cpusubtype,
4056 &arch_type, &arch_subtype);
4058 /* Create the member filename. Use ARCH_NAME. */
4059 nbfd->filename = bfd_printable_arch_mach (arch_type, arch_subtype);
4060 nbfd->iostream = NULL;
4061 bfd_set_arch_mach (nbfd, arch_type, arch_subtype);
4066 /* If ABFD format is FORMAT and architecture is ARCH, return it.
4067 If ABFD is a fat image containing a member that corresponds to FORMAT
4068 and ARCH, returns it.
4069 In other case, returns NULL.
4070 This function allows transparent uses of fat images. */
4072 bfd_mach_o_fat_extract (bfd *abfd,
4074 const bfd_arch_info_type *arch)
4077 mach_o_fat_data_struct *adata;
4080 if (bfd_check_format (abfd, format))
4082 if (bfd_get_arch_info (abfd) == arch)
4086 if (!bfd_check_format (abfd, bfd_archive)
4087 || abfd->xvec != &mach_o_fat_vec)
4090 /* This is a Mach-O fat image. */
4091 adata = (mach_o_fat_data_struct *) abfd->tdata.mach_o_fat_data;
4092 BFD_ASSERT (adata != NULL);
4094 for (i = 0; i < adata->nfat_arch; i++)
4096 struct mach_o_fat_archentry *e = &adata->archentries[i];
4097 enum bfd_architecture cpu_type;
4098 unsigned long cpu_subtype;
4100 bfd_mach_o_convert_architecture (e->cputype, e->cpusubtype,
4101 &cpu_type, &cpu_subtype);
4102 if (cpu_type != arch->arch || cpu_subtype != arch->mach)
4105 /* The architecture is found. */
4106 res = _bfd_new_bfd_contained_in (abfd);
4110 res->origin = e->offset;
4112 res->filename = bfd_printable_arch_mach (cpu_type, cpu_subtype);
4113 res->iostream = NULL;
4115 if (bfd_check_format (res, format))
4117 BFD_ASSERT (bfd_get_arch_info (res) == arch);
4128 bfd_mach_o_lookup_command (bfd *abfd,
4129 bfd_mach_o_load_command_type type,
4130 bfd_mach_o_load_command **mcommand)
4132 struct mach_o_data_struct *md = bfd_mach_o_get_data (abfd);
4133 bfd_mach_o_load_command *ncmd = NULL;
4134 unsigned int i, num;
4136 BFD_ASSERT (md != NULL);
4137 BFD_ASSERT (mcommand != NULL);
4140 for (i = 0; i < md->header.ncmds; i++)
4142 struct bfd_mach_o_load_command *cmd = &md->commands[i];
4144 if (cmd->type != type)
4157 bfd_mach_o_stack_addr (enum bfd_mach_o_cpu_type type)
4161 case BFD_MACH_O_CPU_TYPE_MC680x0:
4163 case BFD_MACH_O_CPU_TYPE_MC88000:
4165 case BFD_MACH_O_CPU_TYPE_POWERPC:
4167 case BFD_MACH_O_CPU_TYPE_I386:
4169 case BFD_MACH_O_CPU_TYPE_SPARC:
4171 case BFD_MACH_O_CPU_TYPE_I860:
4173 case BFD_MACH_O_CPU_TYPE_HPPA:
4174 return 0xc0000000 - 0x04000000;
4180 /* The following two tables should be kept, as far as possible, in order of
4181 most frequently used entries to optimize their use from gas. */
4183 const bfd_mach_o_xlat_name bfd_mach_o_section_type_name[] =
4185 { "regular", BFD_MACH_O_S_REGULAR},
4186 { "coalesced", BFD_MACH_O_S_COALESCED},
4187 { "zerofill", BFD_MACH_O_S_ZEROFILL},
4188 { "cstring_literals", BFD_MACH_O_S_CSTRING_LITERALS},
4189 { "4byte_literals", BFD_MACH_O_S_4BYTE_LITERALS},
4190 { "8byte_literals", BFD_MACH_O_S_8BYTE_LITERALS},
4191 { "16byte_literals", BFD_MACH_O_S_16BYTE_LITERALS},
4192 { "literal_pointers", BFD_MACH_O_S_LITERAL_POINTERS},
4193 { "mod_init_func_pointers", BFD_MACH_O_S_MOD_INIT_FUNC_POINTERS},
4194 { "mod_fini_func_pointers", BFD_MACH_O_S_MOD_FINI_FUNC_POINTERS},
4195 { "gb_zerofill", BFD_MACH_O_S_GB_ZEROFILL},
4196 { "interposing", BFD_MACH_O_S_INTERPOSING},
4197 { "dtrace_dof", BFD_MACH_O_S_DTRACE_DOF},
4198 { "non_lazy_symbol_pointers", BFD_MACH_O_S_NON_LAZY_SYMBOL_POINTERS},
4199 { "lazy_symbol_pointers", BFD_MACH_O_S_LAZY_SYMBOL_POINTERS},
4200 { "symbol_stubs", BFD_MACH_O_S_SYMBOL_STUBS},
4201 { "lazy_dylib_symbol_pointers", BFD_MACH_O_S_LAZY_DYLIB_SYMBOL_POINTERS},
4205 const bfd_mach_o_xlat_name bfd_mach_o_section_attribute_name[] =
4207 { "pure_instructions", BFD_MACH_O_S_ATTR_PURE_INSTRUCTIONS },
4208 { "some_instructions", BFD_MACH_O_S_ATTR_SOME_INSTRUCTIONS },
4209 { "loc_reloc", BFD_MACH_O_S_ATTR_LOC_RELOC },
4210 { "ext_reloc", BFD_MACH_O_S_ATTR_EXT_RELOC },
4211 { "debug", BFD_MACH_O_S_ATTR_DEBUG },
4212 { "live_support", BFD_MACH_O_S_ATTR_LIVE_SUPPORT },
4213 { "no_dead_strip", BFD_MACH_O_S_ATTR_NO_DEAD_STRIP },
4214 { "strip_static_syms", BFD_MACH_O_S_ATTR_STRIP_STATIC_SYMS },
4215 { "no_toc", BFD_MACH_O_S_ATTR_NO_TOC },
4216 { "self_modifying_code", BFD_MACH_O_S_SELF_MODIFYING_CODE },
4217 { "modifying_code", BFD_MACH_O_S_SELF_MODIFYING_CODE },
4221 /* Get the section type from NAME. Return 256 if NAME is unknown. */
4224 bfd_mach_o_get_section_type_from_name (bfd *abfd, const char *name)
4226 const bfd_mach_o_xlat_name *x;
4227 bfd_mach_o_backend_data *bed = bfd_mach_o_get_backend_data (abfd);
4229 for (x = bfd_mach_o_section_type_name; x->name; x++)
4230 if (strcmp (x->name, name) == 0)
4232 /* We found it... does the target support it? */
4233 if (bed->bfd_mach_o_section_type_valid_for_target == NULL
4234 || bed->bfd_mach_o_section_type_valid_for_target (x->val))
4235 return x->val; /* OK. */
4237 break; /* Not supported. */
4239 /* Maximum section ID = 0xff. */
4243 /* Get the section attribute from NAME. Return -1 if NAME is unknown. */
4246 bfd_mach_o_get_section_attribute_from_name (const char *name)
4248 const bfd_mach_o_xlat_name *x;
4250 for (x = bfd_mach_o_section_attribute_name; x->name; x++)
4251 if (strcmp (x->name, name) == 0)
4253 return (unsigned int)-1;
4257 bfd_mach_o_core_fetch_environment (bfd *abfd,
4258 unsigned char **rbuf,
4261 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
4262 unsigned long stackaddr = bfd_mach_o_stack_addr (mdata->header.cputype);
4265 for (i = 0; i < mdata->header.ncmds; i++)
4267 bfd_mach_o_load_command *cur = &mdata->commands[i];
4268 bfd_mach_o_segment_command *seg = NULL;
4270 if (cur->type != BFD_MACH_O_LC_SEGMENT)
4273 seg = &cur->command.segment;
4275 if ((seg->vmaddr + seg->vmsize) == stackaddr)
4277 unsigned long start = seg->fileoff;
4278 unsigned long end = seg->fileoff + seg->filesize;
4279 unsigned char *buf = bfd_malloc (1024);
4280 unsigned long size = 1024;
4284 bfd_size_type nread = 0;
4285 unsigned long offset;
4286 int found_nonnull = 0;
4288 if (size > (end - start))
4289 size = (end - start);
4291 buf = bfd_realloc_or_free (buf, size);
4295 if (bfd_seek (abfd, end - size, SEEK_SET) != 0)
4301 nread = bfd_bread (buf, size, abfd);
4309 for (offset = 4; offset <= size; offset += 4)
4313 val = *((unsigned long *) (buf + size - offset));
4314 if (! found_nonnull)
4319 else if (val == 0x0)
4321 unsigned long bottom;
4324 bottom = seg->fileoff + seg->filesize - offset;
4325 top = seg->fileoff + seg->filesize - 4;
4326 *rbuf = bfd_malloc (top - bottom);
4327 *rlen = top - bottom;
4329 memcpy (*rbuf, buf + size - *rlen, *rlen);
4335 if (size == (end - start))
4349 bfd_mach_o_core_file_failing_command (bfd *abfd)
4351 unsigned char *buf = NULL;
4352 unsigned int len = 0;
4355 ret = bfd_mach_o_core_fetch_environment (abfd, &buf, &len);
4359 return (char *) buf;
4363 bfd_mach_o_core_file_failing_signal (bfd *abfd ATTRIBUTE_UNUSED)
4369 bfd_mach_o_find_nearest_line (bfd *abfd,
4373 const char **filename_ptr,
4374 const char **functionname_ptr,
4375 unsigned int *line_ptr)
4377 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
4378 /* TODO: Handle executables and dylibs by using dSYMs. */
4379 if (mdata->header.filetype != BFD_MACH_O_MH_OBJECT)
4381 if (_bfd_dwarf2_find_nearest_line (abfd, dwarf_debug_sections,
4382 section, symbols, offset,
4383 filename_ptr, functionname_ptr,
4385 &mdata->dwarf2_find_line_info))
4391 bfd_mach_o_close_and_cleanup (bfd *abfd)
4393 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
4394 if (bfd_get_format (abfd) == bfd_object && mdata != NULL)
4396 _bfd_dwarf2_cleanup_debug_info (abfd, &mdata->dwarf2_find_line_info);
4397 bfd_mach_o_free_cached_info (abfd);
4400 return _bfd_generic_close_and_cleanup (abfd);
4403 bfd_boolean bfd_mach_o_free_cached_info (bfd *abfd)
4405 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
4407 free (mdata->dyn_reloc_cache);
4408 mdata->dyn_reloc_cache = NULL;
4409 for (asect = abfd->sections; asect != NULL; asect = asect->next)
4411 free (asect->relocation);
4412 asect->relocation = NULL;
4418 #define bfd_mach_o_bfd_reloc_type_lookup _bfd_norelocs_bfd_reloc_type_lookup
4419 #define bfd_mach_o_bfd_reloc_name_lookup _bfd_norelocs_bfd_reloc_name_lookup
4421 #define bfd_mach_o_swap_reloc_in NULL
4422 #define bfd_mach_o_swap_reloc_out NULL
4423 #define bfd_mach_o_print_thread NULL
4424 #define bfd_mach_o_tgt_seg_table NULL
4425 #define bfd_mach_o_section_type_valid_for_tgt NULL
4427 #define TARGET_NAME mach_o_be_vec
4428 #define TARGET_STRING "mach-o-be"
4429 #define TARGET_ARCHITECTURE bfd_arch_unknown
4430 #define TARGET_BIG_ENDIAN 1
4431 #define TARGET_ARCHIVE 0
4432 #define TARGET_PRIORITY 1
4433 #include "mach-o-target.c"
4436 #undef TARGET_STRING
4437 #undef TARGET_ARCHITECTURE
4438 #undef TARGET_BIG_ENDIAN
4439 #undef TARGET_ARCHIVE
4440 #undef TARGET_PRIORITY
4442 #define TARGET_NAME mach_o_le_vec
4443 #define TARGET_STRING "mach-o-le"
4444 #define TARGET_ARCHITECTURE bfd_arch_unknown
4445 #define TARGET_BIG_ENDIAN 0
4446 #define TARGET_ARCHIVE 0
4447 #define TARGET_PRIORITY 1
4449 #include "mach-o-target.c"
4452 #undef TARGET_STRING
4453 #undef TARGET_ARCHITECTURE
4454 #undef TARGET_BIG_ENDIAN
4455 #undef TARGET_ARCHIVE
4456 #undef TARGET_PRIORITY
4458 /* Not yet handled: creating an archive. */
4459 #define bfd_mach_o_mkarchive _bfd_noarchive_mkarchive
4462 #define bfd_mach_o_read_ar_hdr _bfd_noarchive_read_ar_hdr
4463 #define bfd_mach_o_write_ar_hdr _bfd_noarchive_write_ar_hdr
4464 #define bfd_mach_o_slurp_armap _bfd_noarchive_slurp_armap
4465 #define bfd_mach_o_slurp_extended_name_table _bfd_noarchive_slurp_extended_name_table
4466 #define bfd_mach_o_construct_extended_name_table _bfd_noarchive_construct_extended_name_table
4467 #define bfd_mach_o_truncate_arname _bfd_noarchive_truncate_arname
4468 #define bfd_mach_o_write_armap _bfd_noarchive_write_armap
4469 #define bfd_mach_o_get_elt_at_index _bfd_noarchive_get_elt_at_index
4470 #define bfd_mach_o_generic_stat_arch_elt _bfd_noarchive_generic_stat_arch_elt
4471 #define bfd_mach_o_update_armap_timestamp _bfd_noarchive_update_armap_timestamp
4473 #define TARGET_NAME mach_o_fat_vec
4474 #define TARGET_STRING "mach-o-fat"
4475 #define TARGET_ARCHITECTURE bfd_arch_unknown
4476 #define TARGET_BIG_ENDIAN 1
4477 #define TARGET_ARCHIVE 1
4478 #define TARGET_PRIORITY 0
4480 #include "mach-o-target.c"
4483 #undef TARGET_STRING
4484 #undef TARGET_ARCHITECTURE
4485 #undef TARGET_BIG_ENDIAN
4486 #undef TARGET_ARCHIVE
4487 #undef TARGET_PRIORITY