Merge bfd_find_nearest_line variants
[external/binutils.git] / bfd / mach-o.c
1 /* Mach-O support for BFD.
2    Copyright (C) 1999-2014 Free Software Foundation, Inc.
3
4    This file is part of BFD, the Binary File Descriptor library.
5
6    This program is free software; you can redistribute it and/or modify
7    it under the terms of the GNU General Public License as published by
8    the Free Software Foundation; either version 3 of the License, or
9    (at your option) any later version.
10
11    This program is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14    GNU General Public License for more details.
15
16    You should have received a copy of the GNU General Public License
17    along with this program; if not, write to the Free Software
18    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
19    MA 02110-1301, USA.  */
20
21 #include "sysdep.h"
22 #include "mach-o.h"
23 #include "bfd.h"
24 #include "libbfd.h"
25 #include "libiberty.h"
26 #include "aout/stab_gnu.h"
27 #include "mach-o/reloc.h"
28 #include "mach-o/external.h"
29 #include <ctype.h>
30 #include <stdlib.h>
31 #include <string.h>
32
33 #define bfd_mach_o_object_p bfd_mach_o_gen_object_p
34 #define bfd_mach_o_core_p bfd_mach_o_gen_core_p
35 #define bfd_mach_o_mkobject bfd_mach_o_gen_mkobject
36
37 #define FILE_ALIGN(off, algn) \
38   (((off) + ((file_ptr) 1 << (algn)) - 1) & ((file_ptr) -1 << (algn)))
39
40 static bfd_boolean
41 bfd_mach_o_read_dyld_content (bfd *abfd, bfd_mach_o_dyld_info_command *cmd);
42
43 unsigned int
44 bfd_mach_o_version (bfd *abfd)
45 {
46   bfd_mach_o_data_struct *mdata = NULL;
47
48   BFD_ASSERT (bfd_mach_o_valid (abfd));
49   mdata = bfd_mach_o_get_data (abfd);
50
51   return mdata->header.version;
52 }
53
54 bfd_boolean
55 bfd_mach_o_valid (bfd *abfd)
56 {
57   if (abfd == NULL || abfd->xvec == NULL)
58     return FALSE;
59
60   if (abfd->xvec->flavour != bfd_target_mach_o_flavour)
61     return FALSE;
62
63   if (bfd_mach_o_get_data (abfd) == NULL)
64     return FALSE;
65   return TRUE;
66 }
67
68 static INLINE bfd_boolean
69 mach_o_wide_p (bfd_mach_o_header *header)
70 {
71   switch (header->version)
72     {
73     case 1:
74       return FALSE;
75     case 2:
76       return TRUE;
77     default:
78       BFD_FAIL ();
79       return FALSE;
80     }
81 }
82
83 static INLINE bfd_boolean
84 bfd_mach_o_wide_p (bfd *abfd)
85 {
86   return mach_o_wide_p (&bfd_mach_o_get_data (abfd)->header);
87 }
88
89 /* Tables to translate well known Mach-O segment/section names to bfd
90    names.  Use of canonical names (such as .text or .debug_frame) is required
91    by gdb.  */
92
93 /* __TEXT Segment.  */
94 static const mach_o_section_name_xlat text_section_names_xlat[] =
95   {
96     {   ".text",                                "__text",
97         SEC_CODE | SEC_LOAD,                    BFD_MACH_O_S_REGULAR,
98         BFD_MACH_O_S_ATTR_PURE_INSTRUCTIONS,    0},
99     {   ".const",                               "__const",
100         SEC_READONLY | SEC_DATA | SEC_LOAD,     BFD_MACH_O_S_REGULAR,
101         BFD_MACH_O_S_ATTR_NONE,                 0},
102     {   ".static_const",                        "__static_const",
103         SEC_READONLY | SEC_DATA | SEC_LOAD,     BFD_MACH_O_S_REGULAR,
104         BFD_MACH_O_S_ATTR_NONE,                 0},
105     {   ".cstring",                             "__cstring",
106         SEC_READONLY | SEC_DATA | SEC_LOAD | SEC_MERGE | SEC_STRINGS,
107                                                 BFD_MACH_O_S_CSTRING_LITERALS,
108         BFD_MACH_O_S_ATTR_NONE,                 0},
109     {   ".literal4",                            "__literal4",
110         SEC_READONLY | SEC_DATA | SEC_LOAD,     BFD_MACH_O_S_4BYTE_LITERALS,
111         BFD_MACH_O_S_ATTR_NONE,                 2},
112     {   ".literal8",                            "__literal8",
113         SEC_READONLY | SEC_DATA | SEC_LOAD,     BFD_MACH_O_S_8BYTE_LITERALS,
114         BFD_MACH_O_S_ATTR_NONE,                 3},
115     {   ".literal16",                           "__literal16",
116         SEC_READONLY | SEC_DATA | SEC_LOAD,     BFD_MACH_O_S_16BYTE_LITERALS,
117         BFD_MACH_O_S_ATTR_NONE,                 4},
118     {   ".constructor",                         "__constructor",
119         SEC_CODE | SEC_LOAD,                    BFD_MACH_O_S_REGULAR,
120         BFD_MACH_O_S_ATTR_NONE,                 0},
121     {   ".destructor",                          "__destructor",
122         SEC_CODE | SEC_LOAD,                    BFD_MACH_O_S_REGULAR,
123         BFD_MACH_O_S_ATTR_NONE,                 0},
124     {   ".eh_frame",                            "__eh_frame",
125         SEC_READONLY | SEC_DATA | SEC_LOAD,     BFD_MACH_O_S_COALESCED,
126         BFD_MACH_O_S_ATTR_LIVE_SUPPORT
127         | BFD_MACH_O_S_ATTR_STRIP_STATIC_SYMS
128         | BFD_MACH_O_S_ATTR_NO_TOC,             2},
129     { NULL, NULL, 0, 0, 0, 0}
130   };
131
132 /* __DATA Segment.  */
133 static const mach_o_section_name_xlat data_section_names_xlat[] =
134   {
135     {   ".data",                        "__data",
136         SEC_DATA | SEC_LOAD,            BFD_MACH_O_S_REGULAR,
137         BFD_MACH_O_S_ATTR_NONE,         0},
138     {   ".bss",                         "__bss",
139         SEC_NO_FLAGS,                   BFD_MACH_O_S_ZEROFILL,
140         BFD_MACH_O_S_ATTR_NONE,         0},
141     {   ".const_data",                  "__const",
142         SEC_DATA | SEC_LOAD,            BFD_MACH_O_S_REGULAR,
143         BFD_MACH_O_S_ATTR_NONE,         0},
144     {   ".static_data",                 "__static_data",
145         SEC_DATA | SEC_LOAD,            BFD_MACH_O_S_REGULAR,
146         BFD_MACH_O_S_ATTR_NONE,         0},
147     {   ".mod_init_func",               "__mod_init_func",
148         SEC_DATA | SEC_LOAD,            BFD_MACH_O_S_MOD_INIT_FUNC_POINTERS,
149         BFD_MACH_O_S_ATTR_NONE,         2},
150     {   ".mod_term_func",               "__mod_term_func",
151         SEC_DATA | SEC_LOAD,            BFD_MACH_O_S_MOD_FINI_FUNC_POINTERS,
152         BFD_MACH_O_S_ATTR_NONE,         2},
153     {   ".dyld",                        "__dyld",
154         SEC_DATA | SEC_LOAD,            BFD_MACH_O_S_REGULAR,
155         BFD_MACH_O_S_ATTR_NONE,         0},
156     {   ".cfstring",                    "__cfstring",
157         SEC_DATA | SEC_LOAD,            BFD_MACH_O_S_REGULAR,
158         BFD_MACH_O_S_ATTR_NONE,         2},
159     { NULL, NULL, 0, 0, 0, 0}
160   };
161
162 /* __DWARF Segment.  */
163 static const mach_o_section_name_xlat dwarf_section_names_xlat[] =
164   {
165     {   ".debug_frame",                 "__debug_frame",
166         SEC_DEBUGGING,                  BFD_MACH_O_S_REGULAR,
167         BFD_MACH_O_S_ATTR_DEBUG,        0},
168     {   ".debug_info",                  "__debug_info",
169         SEC_DEBUGGING,                  BFD_MACH_O_S_REGULAR,
170         BFD_MACH_O_S_ATTR_DEBUG,        0},
171     {   ".debug_abbrev",                "__debug_abbrev",
172         SEC_DEBUGGING,                  BFD_MACH_O_S_REGULAR,
173         BFD_MACH_O_S_ATTR_DEBUG,        0},
174     {   ".debug_aranges",               "__debug_aranges",
175         SEC_DEBUGGING,                  BFD_MACH_O_S_REGULAR,
176         BFD_MACH_O_S_ATTR_DEBUG,        0},
177     {   ".debug_macinfo",               "__debug_macinfo",
178         SEC_DEBUGGING,                  BFD_MACH_O_S_REGULAR,
179         BFD_MACH_O_S_ATTR_DEBUG,        0},
180     {   ".debug_line",                  "__debug_line",
181         SEC_DEBUGGING,                  BFD_MACH_O_S_REGULAR,
182         BFD_MACH_O_S_ATTR_DEBUG,        0},
183     {   ".debug_loc",                   "__debug_loc",
184         SEC_DEBUGGING,                  BFD_MACH_O_S_REGULAR,
185         BFD_MACH_O_S_ATTR_DEBUG,        0},
186     {   ".debug_pubnames",              "__debug_pubnames",
187         SEC_DEBUGGING,                  BFD_MACH_O_S_REGULAR,
188         BFD_MACH_O_S_ATTR_DEBUG,        0},
189     {   ".debug_pubtypes",              "__debug_pubtypes",
190         SEC_DEBUGGING,                  BFD_MACH_O_S_REGULAR,
191         BFD_MACH_O_S_ATTR_DEBUG,        0},
192     {   ".debug_str",                   "__debug_str",
193         SEC_DEBUGGING,                  BFD_MACH_O_S_REGULAR,
194         BFD_MACH_O_S_ATTR_DEBUG,        0},
195     {   ".debug_ranges",                "__debug_ranges",
196         SEC_DEBUGGING,                  BFD_MACH_O_S_REGULAR,
197         BFD_MACH_O_S_ATTR_DEBUG,        0},
198     {   ".debug_macro",                 "__debug_macro",
199         SEC_DEBUGGING,                  BFD_MACH_O_S_REGULAR,
200         BFD_MACH_O_S_ATTR_DEBUG,        0},
201     {   ".debug_gdb_scripts",           "__debug_gdb_scri",
202         SEC_DEBUGGING,                  BFD_MACH_O_S_REGULAR,
203         BFD_MACH_O_S_ATTR_DEBUG,        0},
204     { NULL, NULL, 0, 0, 0, 0}
205   };
206
207 /* __OBJC Segment.  */
208 static const mach_o_section_name_xlat objc_section_names_xlat[] =
209   {
210     {   ".objc_class",                  "__class",
211         SEC_DATA | SEC_LOAD,            BFD_MACH_O_S_REGULAR,
212         BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
213     {   ".objc_meta_class",             "__meta_class",
214         SEC_DATA | SEC_LOAD,            BFD_MACH_O_S_REGULAR,
215         BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
216     {   ".objc_cat_cls_meth",           "__cat_cls_meth",
217         SEC_DATA | SEC_LOAD,            BFD_MACH_O_S_REGULAR,
218         BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
219     {   ".objc_cat_inst_meth",          "__cat_inst_meth",
220         SEC_DATA | SEC_LOAD,            BFD_MACH_O_S_REGULAR,
221         BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
222     {   ".objc_protocol",               "__protocol",
223         SEC_DATA | SEC_LOAD,            BFD_MACH_O_S_REGULAR,
224         BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
225     {   ".objc_string_object",          "__string_object",
226         SEC_DATA | SEC_LOAD,            BFD_MACH_O_S_REGULAR,
227         BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
228     {   ".objc_cls_meth",               "__cls_meth",
229         SEC_DATA | SEC_LOAD,            BFD_MACH_O_S_REGULAR,
230         BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
231     {   ".objc_inst_meth",              "__inst_meth",
232         SEC_DATA | SEC_LOAD,            BFD_MACH_O_S_REGULAR,
233         BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
234     {   ".objc_cls_refs",               "__cls_refs",
235         SEC_DATA | SEC_LOAD,            BFD_MACH_O_S_LITERAL_POINTERS,
236         BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
237     {   ".objc_message_refs",           "__message_refs",
238         SEC_DATA | SEC_LOAD,            BFD_MACH_O_S_LITERAL_POINTERS,
239         BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
240     {   ".objc_symbols",                "__symbols",
241         SEC_DATA | SEC_LOAD,            BFD_MACH_O_S_REGULAR,
242         BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
243     {   ".objc_category",               "__category",
244         SEC_DATA | SEC_LOAD,            BFD_MACH_O_S_REGULAR,
245         BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
246     {   ".objc_class_vars",             "__class_vars",
247         SEC_DATA | SEC_LOAD,            BFD_MACH_O_S_REGULAR,
248         BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
249     {   ".objc_instance_vars",          "__instance_vars",
250         SEC_DATA | SEC_LOAD,            BFD_MACH_O_S_REGULAR,
251         BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
252     {   ".objc_module_info",            "__module_info",
253         SEC_DATA | SEC_LOAD,            BFD_MACH_O_S_REGULAR,
254         BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
255     {   ".objc_selector_strs",          "__selector_strs",
256         SEC_DATA | SEC_LOAD,            BFD_MACH_O_S_CSTRING_LITERALS,
257         BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
258     {   ".objc_image_info",             "__image_info",
259         SEC_DATA | SEC_LOAD,            BFD_MACH_O_S_REGULAR,
260         BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
261     {   ".objc_selector_fixup",         "__sel_fixup",
262         SEC_DATA | SEC_LOAD,            BFD_MACH_O_S_REGULAR,
263         BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
264     /* Objc V1 */
265     {   ".objc1_class_ext",             "__class_ext",
266         SEC_DATA | SEC_LOAD,            BFD_MACH_O_S_REGULAR,
267         BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
268     {   ".objc1_property_list",         "__property",
269         SEC_DATA | SEC_LOAD,            BFD_MACH_O_S_REGULAR,
270         BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
271     {   ".objc1_protocol_ext",          "__protocol_ext",
272         SEC_DATA | SEC_LOAD,            BFD_MACH_O_S_REGULAR,
273         BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
274     { NULL, NULL, 0, 0, 0, 0}
275   };
276
277 static const mach_o_segment_name_xlat segsec_names_xlat[] =
278   {
279     { "__TEXT", text_section_names_xlat },
280     { "__DATA", data_section_names_xlat },
281     { "__DWARF", dwarf_section_names_xlat },
282     { "__OBJC", objc_section_names_xlat },
283     { NULL, NULL }
284   };
285
286 static const char dsym_subdir[] = ".dSYM/Contents/Resources/DWARF";
287
288 /* For both cases bfd-name => mach-o name and vice versa, the specific target
289    is checked before the generic.  This allows a target (e.g. ppc for cstring)
290    to override the generic definition with a more specific one.  */
291
292 /* Fetch the translation from a Mach-O section designation (segment, section)
293    as a bfd short name, if one exists.  Otherwise return NULL.
294
295    Allow the segment and section names to be unterminated 16 byte arrays.  */
296
297 const mach_o_section_name_xlat *
298 bfd_mach_o_section_data_for_mach_sect (bfd *abfd, const char *segname,
299                                        const char *sectname)
300 {
301   const struct mach_o_segment_name_xlat *seg;
302   const mach_o_section_name_xlat *sec;
303   bfd_mach_o_backend_data *bed = bfd_mach_o_get_backend_data (abfd);
304
305   /* First try any target-specific translations defined...  */
306   if (bed->segsec_names_xlat)
307     for (seg = bed->segsec_names_xlat; seg->segname; seg++)
308       if (strncmp (seg->segname, segname, BFD_MACH_O_SEGNAME_SIZE) == 0)
309         for (sec = seg->sections; sec->mach_o_name; sec++)
310           if (strncmp (sec->mach_o_name, sectname,
311                        BFD_MACH_O_SECTNAME_SIZE) == 0)
312             return sec;
313
314   /* ... and then the Mach-O generic ones.  */
315   for (seg = segsec_names_xlat; seg->segname; seg++)
316     if (strncmp (seg->segname, segname, BFD_MACH_O_SEGNAME_SIZE) == 0)
317       for (sec = seg->sections; sec->mach_o_name; sec++)
318         if (strncmp (sec->mach_o_name, sectname,
319                      BFD_MACH_O_SECTNAME_SIZE) == 0)
320           return sec;
321
322   return NULL;
323 }
324
325 /* If the bfd_name for this section is a 'canonical' form for which we
326    know the Mach-O data, return the segment name and the data for the
327    Mach-O equivalent.  Otherwise return NULL.  */
328
329 const mach_o_section_name_xlat *
330 bfd_mach_o_section_data_for_bfd_name (bfd *abfd, const char *bfd_name,
331                                       const char **segname)
332 {
333   const struct mach_o_segment_name_xlat *seg;
334   const mach_o_section_name_xlat *sec;
335   bfd_mach_o_backend_data *bed = bfd_mach_o_get_backend_data (abfd);
336   *segname = NULL;
337
338   if (bfd_name[0] != '.')
339     return NULL;
340
341   /* First try any target-specific translations defined...  */
342   if (bed->segsec_names_xlat)
343     for (seg = bed->segsec_names_xlat; seg->segname; seg++)
344       for (sec = seg->sections; sec->bfd_name; sec++)
345         if (strcmp (bfd_name, sec->bfd_name) == 0)
346           {
347             *segname = seg->segname;
348             return sec;
349           }
350
351   /* ... and then the Mach-O generic ones.  */
352   for (seg = segsec_names_xlat; seg->segname; seg++)
353     for (sec = seg->sections; sec->bfd_name; sec++)
354       if (strcmp (bfd_name, sec->bfd_name) == 0)
355         {
356           *segname = seg->segname;
357           return sec;
358         }
359
360   return NULL;
361 }
362
363 /* Convert Mach-O section name to BFD.
364
365    Try to use standard/canonical names, for which we have tables including
366    default flag settings - which are returned.  Otherwise forge a new name
367    in the form "<segmentname>.<sectionname>" this will be prefixed with
368    LC_SEGMENT. if the segment name does not begin with an underscore.
369
370    SEGNAME and SECTNAME are 16 byte arrays (they do not need to be NUL-
371    terminated if the name length is exactly 16 bytes - but must be if the name
372    length is less than 16 characters).  */
373
374 void
375 bfd_mach_o_convert_section_name_to_bfd (bfd *abfd, const char *segname,
376                                         const char *secname, const char **name,
377                                         flagword *flags)
378 {
379   const mach_o_section_name_xlat *xlat;
380   char *res;
381   unsigned int len;
382   const char *pfx = "";
383
384   *name = NULL;
385   *flags = SEC_NO_FLAGS;
386
387   /* First search for a canonical name...
388      xlat will be non-null if there is an entry for segname, secname.  */
389   xlat = bfd_mach_o_section_data_for_mach_sect (abfd, segname, secname);
390   if (xlat)
391     {
392       len = strlen (xlat->bfd_name);
393       res = bfd_alloc (abfd, len+1);
394       if (res == NULL)
395         return;
396       memcpy (res, xlat->bfd_name, len+1);
397       *name = res;
398       *flags = xlat->bfd_flags;
399       return;
400     }
401
402   /* ... else we make up a bfd name from the segment concatenated with the
403      section.  */
404
405   len = 16 + 1 + 16 + 1;
406
407   /* Put "LC_SEGMENT." prefix if the segment name is weird (ie doesn't start
408      with an underscore.  */
409   if (segname[0] != '_')
410     {
411       static const char seg_pfx[] = "LC_SEGMENT.";
412
413       pfx = seg_pfx;
414       len += sizeof (seg_pfx) - 1;
415     }
416
417   res = bfd_alloc (abfd, len);
418   if (res == NULL)
419     return;
420   snprintf (res, len, "%s%.16s.%.16s", pfx, segname, secname);
421   *name = res;
422 }
423
424 /* Convert a bfd section name to a Mach-O segment + section name.
425
426    If the name is a canonical one for which we have a Darwin match
427    return the translation table - which contains defaults for flags,
428    type, attribute and default alignment data.
429
430    Otherwise, expand the bfd_name (assumed to be in the form
431    "[LC_SEGMENT.]<segmentname>.<sectionname>") and return NULL.  */
432
433 static const mach_o_section_name_xlat *
434 bfd_mach_o_convert_section_name_to_mach_o (bfd *abfd ATTRIBUTE_UNUSED,
435                                            asection *sect,
436                                            bfd_mach_o_section *section)
437 {
438   const mach_o_section_name_xlat *xlat;
439   const char *name = bfd_get_section_name (abfd, sect);
440   const char *segname;
441   const char *dot;
442   unsigned int len;
443   unsigned int seglen;
444   unsigned int seclen;
445
446   memset (section->segname, 0, BFD_MACH_O_SEGNAME_SIZE + 1);
447   memset (section->sectname, 0, BFD_MACH_O_SECTNAME_SIZE + 1);
448
449   /* See if is a canonical name ... */
450   xlat = bfd_mach_o_section_data_for_bfd_name (abfd, name, &segname);
451   if (xlat)
452     {
453       strcpy (section->segname, segname);
454       strcpy (section->sectname, xlat->mach_o_name);
455       return xlat;
456     }
457
458   /* .. else we convert our constructed one back to Mach-O.
459      Strip LC_SEGMENT. prefix, if present.  */
460   if (strncmp (name, "LC_SEGMENT.", 11) == 0)
461     name += 11;
462
463   /* Find a dot.  */
464   dot = strchr (name, '.');
465   len = strlen (name);
466
467   /* Try to split name into segment and section names.  */
468   if (dot && dot != name)
469     {
470       seglen = dot - name;
471       seclen = len - (dot + 1 - name);
472
473       if (seglen <= BFD_MACH_O_SEGNAME_SIZE
474           && seclen <= BFD_MACH_O_SECTNAME_SIZE)
475         {
476           memcpy (section->segname, name, seglen);
477           section->segname[seglen] = 0;
478           memcpy (section->sectname, dot + 1, seclen);
479           section->sectname[seclen] = 0;
480           return NULL;
481         }
482     }
483
484   /* The segment and section names are both missing - don't make them
485      into dots.  */
486   if (dot && dot == name)
487     return NULL;
488
489   /* Just duplicate the name into both segment and section.  */
490   if (len > 16)
491     len = 16;
492   memcpy (section->segname, name, len);
493   section->segname[len] = 0;
494   memcpy (section->sectname, name, len);
495   section->sectname[len] = 0;
496   return NULL;
497 }
498
499 /* Return the size of an entry for section SEC.
500    Must be called only for symbol pointer section and symbol stubs
501    sections.  */
502
503 unsigned int
504 bfd_mach_o_section_get_entry_size (bfd *abfd, bfd_mach_o_section *sec)
505 {
506   switch (sec->flags & BFD_MACH_O_SECTION_TYPE_MASK)
507     {
508     case BFD_MACH_O_S_NON_LAZY_SYMBOL_POINTERS:
509     case BFD_MACH_O_S_LAZY_SYMBOL_POINTERS:
510       return bfd_mach_o_wide_p (abfd) ? 8 : 4;
511     case BFD_MACH_O_S_SYMBOL_STUBS:
512       return sec->reserved2;
513     default:
514       BFD_FAIL ();
515       return 0;
516     }
517 }
518
519 /* Return the number of indirect symbols for a section.
520    Must be called only for symbol pointer section and symbol stubs
521    sections.  */
522
523 unsigned int
524 bfd_mach_o_section_get_nbr_indirect (bfd *abfd, bfd_mach_o_section *sec)
525 {
526   unsigned int elsz;
527
528   elsz = bfd_mach_o_section_get_entry_size (abfd, sec);
529   if (elsz == 0)
530     return 0;
531   else
532     return sec->size / elsz;
533 }
534
535 /* Append command CMD to ABFD.  Note that header.ncmds is not updated.  */
536
537 static void
538 bfd_mach_o_append_command (bfd *abfd, bfd_mach_o_load_command *cmd)
539 {
540   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
541
542   if (mdata->last_command != NULL)
543     mdata->last_command->next = cmd;
544   else
545     mdata->first_command = cmd;
546   mdata->last_command = cmd;
547   cmd->next = NULL;
548 }
549
550 /* Copy any private info we understand from the input symbol
551    to the output symbol.  */
552
553 bfd_boolean
554 bfd_mach_o_bfd_copy_private_symbol_data (bfd *ibfd ATTRIBUTE_UNUSED,
555                                          asymbol *isymbol,
556                                          bfd *obfd ATTRIBUTE_UNUSED,
557                                          asymbol *osymbol)
558 {
559   bfd_mach_o_asymbol *os, *is;
560
561   os = (bfd_mach_o_asymbol *)osymbol;
562   is = (bfd_mach_o_asymbol *)isymbol;
563   os->n_type = is->n_type;
564   os->n_sect = is->n_sect;
565   os->n_desc = is->n_desc;
566   os->symbol.udata.i = is->symbol.udata.i;
567
568   return TRUE;
569 }
570
571 /* Copy any private info we understand from the input section
572    to the output section.  */
573
574 bfd_boolean
575 bfd_mach_o_bfd_copy_private_section_data (bfd *ibfd, asection *isection,
576                                           bfd *obfd, asection *osection)
577 {
578   bfd_mach_o_section *os = bfd_mach_o_get_mach_o_section (osection);
579   bfd_mach_o_section *is = bfd_mach_o_get_mach_o_section (isection);
580
581   if (ibfd->xvec->flavour != bfd_target_mach_o_flavour
582       || obfd->xvec->flavour != bfd_target_mach_o_flavour)
583     return TRUE;
584
585   BFD_ASSERT (is != NULL && os != NULL);
586
587   os->flags = is->flags;
588   os->reserved1 = is->reserved1;
589   os->reserved2 = is->reserved2;
590   os->reserved3 = is->reserved3;
591
592   return TRUE;
593 }
594
595 /* Copy any private info we understand from the input bfd
596    to the output bfd.  */
597
598 bfd_boolean
599 bfd_mach_o_bfd_copy_private_header_data (bfd *ibfd, bfd *obfd)
600 {
601   bfd_mach_o_data_struct *imdata;
602   bfd_mach_o_data_struct *omdata;
603   bfd_mach_o_load_command *icmd;
604
605   if (bfd_get_flavour (ibfd) != bfd_target_mach_o_flavour
606       || bfd_get_flavour (obfd) != bfd_target_mach_o_flavour)
607     return TRUE;
608
609   BFD_ASSERT (bfd_mach_o_valid (ibfd));
610   BFD_ASSERT (bfd_mach_o_valid (obfd));
611
612   imdata = bfd_mach_o_get_data (ibfd);
613   omdata = bfd_mach_o_get_data (obfd);
614
615   /* Copy header flags.  */
616   omdata->header.flags = imdata->header.flags;
617
618   /* Copy commands.  */
619   for (icmd = imdata->first_command; icmd != NULL; icmd = icmd->next)
620     {
621       bfd_mach_o_load_command *ocmd;
622
623       switch (icmd->type)
624         {
625         case BFD_MACH_O_LC_LOAD_DYLIB:
626         case BFD_MACH_O_LC_LOAD_DYLINKER:
627         case BFD_MACH_O_LC_DYLD_INFO:
628           /* Command is copied.  */
629           ocmd = bfd_alloc (obfd, sizeof (bfd_mach_o_load_command));
630           if (ocmd == NULL)
631             return FALSE;
632
633           /* Copy common fields.  */
634           ocmd->type = icmd->type;
635           ocmd->type_required = icmd->type_required;
636           ocmd->offset = 0;
637           ocmd->len = icmd->len;
638           break;
639
640         default:
641           /* Command is not copied.  */
642           continue;
643           break;
644         }
645
646       switch (icmd->type)
647         {
648         case BFD_MACH_O_LC_LOAD_DYLIB:
649           {
650             bfd_mach_o_dylib_command *idy = &icmd->command.dylib;
651             bfd_mach_o_dylib_command *ody = &ocmd->command.dylib;
652
653             ody->name_offset = idy->name_offset;
654             ody->timestamp = idy->timestamp;
655             ody->current_version = idy->current_version;
656             ody->compatibility_version = idy->compatibility_version;
657             ody->name_str = idy->name_str;
658           }
659           break;
660
661         case BFD_MACH_O_LC_LOAD_DYLINKER:
662           {
663             bfd_mach_o_dylinker_command *idy = &icmd->command.dylinker;
664             bfd_mach_o_dylinker_command *ody = &ocmd->command.dylinker;
665
666             ody->name_offset = idy->name_offset;
667             ody->name_str = idy->name_str;
668           }
669           break;
670
671         case BFD_MACH_O_LC_DYLD_INFO:
672           {
673             bfd_mach_o_dyld_info_command *idy = &icmd->command.dyld_info;
674             bfd_mach_o_dyld_info_command *ody = &ocmd->command.dyld_info;
675
676             if (bfd_mach_o_read_dyld_content (ibfd, idy))
677               {
678                 ody->rebase_size = idy->rebase_size;
679                 ody->rebase_content = idy->rebase_content;
680
681                 ody->bind_size = idy->bind_size;
682                 ody->bind_content = idy->bind_content;
683
684                 ody->weak_bind_size = idy->weak_bind_size;
685                 ody->weak_bind_content = idy->weak_bind_content;
686
687                 ody->lazy_bind_size = idy->lazy_bind_size;
688                 ody->lazy_bind_content = idy->lazy_bind_content;
689
690                 ody->export_size = idy->export_size;
691                 ody->export_content = idy->export_content;
692               }
693           }
694           break;
695
696         default:
697           /* That command should be handled.  */
698           abort ();
699         }
700
701       /* Insert command.  */
702       bfd_mach_o_append_command (obfd, ocmd);
703     }
704
705   return TRUE;
706 }
707
708 /* This allows us to set up to 32 bits of flags (unless we invent some
709    fiendish scheme to subdivide).  For now, we'll just set the file flags
710    without error checking - just overwrite.  */
711
712 bfd_boolean
713 bfd_mach_o_bfd_set_private_flags (bfd *abfd, flagword flags)
714 {
715   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
716
717   if (!mdata)
718     return FALSE;
719
720   mdata->header.flags = flags;
721   return TRUE;
722 }
723
724 /* Count the total number of symbols.  */
725
726 static long
727 bfd_mach_o_count_symbols (bfd *abfd)
728 {
729   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
730
731   if (mdata->symtab == NULL)
732     return 0;
733   return mdata->symtab->nsyms;
734 }
735
736 long
737 bfd_mach_o_get_symtab_upper_bound (bfd *abfd)
738 {
739   long nsyms = bfd_mach_o_count_symbols (abfd);
740
741   return ((nsyms + 1) * sizeof (asymbol *));
742 }
743
744 long
745 bfd_mach_o_canonicalize_symtab (bfd *abfd, asymbol **alocation)
746 {
747   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
748   long nsyms = bfd_mach_o_count_symbols (abfd);
749   bfd_mach_o_symtab_command *sym = mdata->symtab;
750   unsigned long j;
751
752   if (nsyms < 0)
753     return nsyms;
754
755   if (nsyms == 0)
756     {
757       /* Do not try to read symbols if there are none.  */
758       alocation[0] = NULL;
759       return 0;
760     }
761
762   if (!bfd_mach_o_read_symtab_symbols (abfd))
763     {
764       (*_bfd_error_handler)
765         (_("bfd_mach_o_canonicalize_symtab: unable to load symbols"));
766       return 0;
767     }
768
769   BFD_ASSERT (sym->symbols != NULL);
770
771   for (j = 0; j < sym->nsyms; j++)
772     alocation[j] = &sym->symbols[j].symbol;
773
774   alocation[j] = NULL;
775
776   return nsyms;
777 }
778
779 /* Create synthetic symbols for indirect symbols.  */
780
781 long
782 bfd_mach_o_get_synthetic_symtab (bfd *abfd,
783                                  long symcount ATTRIBUTE_UNUSED,
784                                  asymbol **syms ATTRIBUTE_UNUSED,
785                                  long dynsymcount ATTRIBUTE_UNUSED,
786                                  asymbol **dynsyms ATTRIBUTE_UNUSED,
787                                  asymbol **ret)
788 {
789   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
790   bfd_mach_o_dysymtab_command *dysymtab = mdata->dysymtab;
791   bfd_mach_o_symtab_command *symtab = mdata->symtab;
792   asymbol *s;
793   unsigned long count, i, j, n;
794   size_t size;
795   char *names;
796   char *nul_name;
797
798   *ret = NULL;
799
800   /* Stop now if no symbols or no indirect symbols.  */
801   if (dysymtab == NULL || symtab == NULL || symtab->symbols == NULL)
802     return 0;
803
804   if (dysymtab->nindirectsyms == 0)
805     return 0;
806
807   /* We need to allocate a bfd symbol for every indirect symbol and to
808      allocate the memory for its name.  */
809   count = dysymtab->nindirectsyms;
810   size = count * sizeof (asymbol) + 1;
811
812   for (j = 0; j < count; j++)
813     {
814       unsigned int isym = dysymtab->indirect_syms[j];
815
816       /* Some indirect symbols are anonymous.  */
817       if (isym < symtab->nsyms && symtab->symbols[isym].symbol.name)
818         size += strlen (symtab->symbols[isym].symbol.name) + sizeof ("$stub");
819     }
820
821   s = *ret = (asymbol *) bfd_malloc (size);
822   if (s == NULL)
823     return -1;
824   names = (char *) (s + count);
825   nul_name = names;
826   *names++ = 0;
827
828   n = 0;
829   for (i = 0; i < mdata->nsects; i++)
830     {
831       bfd_mach_o_section *sec = mdata->sections[i];
832       unsigned int first, last;
833       bfd_vma addr;
834       bfd_vma entry_size;
835
836       switch (sec->flags & BFD_MACH_O_SECTION_TYPE_MASK)
837         {
838         case BFD_MACH_O_S_NON_LAZY_SYMBOL_POINTERS:
839         case BFD_MACH_O_S_LAZY_SYMBOL_POINTERS:
840         case BFD_MACH_O_S_SYMBOL_STUBS:
841           /* Only these sections have indirect symbols.  */
842           first = sec->reserved1;
843           last = first + bfd_mach_o_section_get_nbr_indirect (abfd, sec);
844           addr = sec->addr;
845           entry_size = bfd_mach_o_section_get_entry_size (abfd, sec);
846           for (j = first; j < last; j++)
847             {
848               unsigned int isym = dysymtab->indirect_syms[j];
849
850               s->flags = BSF_GLOBAL | BSF_SYNTHETIC;
851               s->section = sec->bfdsection;
852               s->value = addr - sec->addr;
853               s->udata.p = NULL;
854
855               if (isym < symtab->nsyms
856                   && symtab->symbols[isym].symbol.name)
857                 {
858                   const char *sym = symtab->symbols[isym].symbol.name;
859                   size_t len;
860
861                   s->name = names;
862                   len = strlen (sym);
863                   memcpy (names, sym, len);
864                   names += len;
865                   memcpy (names, "$stub", sizeof ("$stub"));
866                   names += sizeof ("$stub");
867                 }
868               else
869                 s->name = nul_name;
870
871               addr += entry_size;
872               s++;
873               n++;
874             }
875           break;
876         default:
877           break;
878         }
879     }
880
881   return n;
882 }
883
884 void
885 bfd_mach_o_get_symbol_info (bfd *abfd ATTRIBUTE_UNUSED,
886                             asymbol *symbol,
887                             symbol_info *ret)
888 {
889   bfd_symbol_info (symbol, ret);
890 }
891
892 void
893 bfd_mach_o_print_symbol (bfd *abfd,
894                          void * afile,
895                          asymbol *symbol,
896                          bfd_print_symbol_type how)
897 {
898   FILE *file = (FILE *) afile;
899   const char *name;
900   bfd_mach_o_asymbol *asym = (bfd_mach_o_asymbol *)symbol;
901
902   switch (how)
903     {
904     case bfd_print_symbol_name:
905       fprintf (file, "%s", symbol->name);
906       break;
907     default:
908       bfd_print_symbol_vandf (abfd, (void *) file, symbol);
909       if (asym->n_type & BFD_MACH_O_N_STAB)
910         name = bfd_get_stab_name (asym->n_type);
911       else
912         switch (asym->n_type & BFD_MACH_O_N_TYPE)
913           {
914           case BFD_MACH_O_N_UNDF:
915             if (symbol->value == 0)
916               name = "UND";
917             else
918               name = "COM";
919             break;
920           case BFD_MACH_O_N_ABS:
921             name = "ABS";
922             break;
923           case BFD_MACH_O_N_INDR:
924             name = "INDR";
925             break;
926           case BFD_MACH_O_N_PBUD:
927             name = "PBUD";
928             break;
929           case BFD_MACH_O_N_SECT:
930             name = "SECT";
931             break;
932           default:
933             name = "???";
934             break;
935           }
936       if (name == NULL)
937         name = "";
938       fprintf (file, " %02x %-6s %02x %04x",
939                asym->n_type, name, asym->n_sect, asym->n_desc);
940       if ((asym->n_type & BFD_MACH_O_N_STAB) == 0
941           && (asym->n_type & BFD_MACH_O_N_TYPE) == BFD_MACH_O_N_SECT)
942         fprintf (file, " [%s]", symbol->section->name);
943       fprintf (file, " %s", symbol->name);
944     }
945 }
946
947 static void
948 bfd_mach_o_convert_architecture (bfd_mach_o_cpu_type mtype,
949                                  bfd_mach_o_cpu_subtype msubtype,
950                                  enum bfd_architecture *type,
951                                  unsigned long *subtype)
952 {
953   *subtype = bfd_arch_unknown;
954
955   switch (mtype)
956     {
957     case BFD_MACH_O_CPU_TYPE_VAX:
958       *type = bfd_arch_vax;
959       break;
960     case BFD_MACH_O_CPU_TYPE_MC680x0:
961       *type = bfd_arch_m68k;
962       break;
963     case BFD_MACH_O_CPU_TYPE_I386:
964       *type = bfd_arch_i386;
965       *subtype = bfd_mach_i386_i386;
966       break;
967     case BFD_MACH_O_CPU_TYPE_X86_64:
968       *type = bfd_arch_i386;
969       *subtype = bfd_mach_x86_64;
970       break;
971     case BFD_MACH_O_CPU_TYPE_MIPS:
972       *type = bfd_arch_mips;
973       break;
974     case BFD_MACH_O_CPU_TYPE_MC98000:
975       *type = bfd_arch_m98k;
976       break;
977     case BFD_MACH_O_CPU_TYPE_HPPA:
978       *type = bfd_arch_hppa;
979       break;
980     case BFD_MACH_O_CPU_TYPE_ARM:
981       *type = bfd_arch_arm;
982       switch (msubtype)
983         {
984         case BFD_MACH_O_CPU_SUBTYPE_ARM_V4T:
985           *subtype = bfd_mach_arm_4T;
986           break;
987         case BFD_MACH_O_CPU_SUBTYPE_ARM_V6:
988           *subtype = bfd_mach_arm_4T;   /* Best fit ?  */
989           break;
990         case BFD_MACH_O_CPU_SUBTYPE_ARM_V5TEJ:
991           *subtype = bfd_mach_arm_5TE;
992           break;
993         case BFD_MACH_O_CPU_SUBTYPE_ARM_XSCALE:
994           *subtype = bfd_mach_arm_XScale;
995           break;
996         case BFD_MACH_O_CPU_SUBTYPE_ARM_V7:
997           *subtype = bfd_mach_arm_5TE;  /* Best fit ?  */
998           break;
999         case BFD_MACH_O_CPU_SUBTYPE_ARM_ALL:
1000         default:
1001           break;
1002         }
1003       break;
1004     case BFD_MACH_O_CPU_TYPE_MC88000:
1005       *type = bfd_arch_m88k;
1006       break;
1007     case BFD_MACH_O_CPU_TYPE_SPARC:
1008       *type = bfd_arch_sparc;
1009       *subtype = bfd_mach_sparc;
1010       break;
1011     case BFD_MACH_O_CPU_TYPE_I860:
1012       *type = bfd_arch_i860;
1013       break;
1014     case BFD_MACH_O_CPU_TYPE_ALPHA:
1015       *type = bfd_arch_alpha;
1016       break;
1017     case BFD_MACH_O_CPU_TYPE_POWERPC:
1018       *type = bfd_arch_powerpc;
1019       *subtype = bfd_mach_ppc;
1020       break;
1021     case BFD_MACH_O_CPU_TYPE_POWERPC_64:
1022       *type = bfd_arch_powerpc;
1023       *subtype = bfd_mach_ppc64;
1024       break;
1025     case BFD_MACH_O_CPU_TYPE_ARM64:
1026       *type = bfd_arch_aarch64;
1027       *subtype = bfd_mach_aarch64;
1028       break;
1029     default:
1030       *type = bfd_arch_unknown;
1031       break;
1032     }
1033 }
1034
1035 /* Write n NUL bytes to ABFD so that LEN + n is a multiple of 4.  Return the
1036    number of bytes written or -1 in case of error.  */
1037
1038 static int
1039 bfd_mach_o_pad4 (bfd *abfd, unsigned int len)
1040 {
1041   if (len % 4 != 0)
1042     {
1043       char pad[4] = {0,0,0,0};
1044       unsigned int padlen = 4 - (len % 4);
1045
1046       if (bfd_bwrite (pad, padlen, abfd) != padlen)
1047         return -1;
1048
1049       return padlen;
1050     }
1051   else
1052     return 0;
1053 }
1054
1055 /* Likewise, but for a command.  */
1056
1057 static int
1058 bfd_mach_o_pad_command (bfd *abfd, unsigned int len)
1059 {
1060   unsigned int align = bfd_mach_o_wide_p (abfd) ? 8 : 4;
1061
1062   if (len % align != 0)
1063     {
1064       char pad[8] = {0};
1065       unsigned int padlen = align - (len % align);
1066
1067       if (bfd_bwrite (pad, padlen, abfd) != padlen)
1068         return -1;
1069
1070       return padlen;
1071     }
1072   else
1073     return 0;
1074 }
1075
1076 static bfd_boolean
1077 bfd_mach_o_write_header (bfd *abfd, bfd_mach_o_header *header)
1078 {
1079   struct mach_o_header_external raw;
1080   unsigned int size;
1081
1082   size = mach_o_wide_p (header) ?
1083     BFD_MACH_O_HEADER_64_SIZE : BFD_MACH_O_HEADER_SIZE;
1084
1085   bfd_h_put_32 (abfd, header->magic, raw.magic);
1086   bfd_h_put_32 (abfd, header->cputype, raw.cputype);
1087   bfd_h_put_32 (abfd, header->cpusubtype, raw.cpusubtype);
1088   bfd_h_put_32 (abfd, header->filetype, raw.filetype);
1089   bfd_h_put_32 (abfd, header->ncmds, raw.ncmds);
1090   bfd_h_put_32 (abfd, header->sizeofcmds, raw.sizeofcmds);
1091   bfd_h_put_32 (abfd, header->flags, raw.flags);
1092
1093   if (mach_o_wide_p (header))
1094     bfd_h_put_32 (abfd, header->reserved, raw.reserved);
1095
1096   if (bfd_seek (abfd, 0, SEEK_SET) != 0
1097       || bfd_bwrite (&raw, size, abfd) != size)
1098     return FALSE;
1099
1100   return TRUE;
1101 }
1102
1103 static bfd_boolean
1104 bfd_mach_o_write_thread (bfd *abfd, bfd_mach_o_load_command *command)
1105 {
1106   bfd_mach_o_thread_command *cmd = &command->command.thread;
1107   unsigned int i;
1108   struct mach_o_thread_command_external raw;
1109   unsigned int offset;
1110
1111   BFD_ASSERT ((command->type == BFD_MACH_O_LC_THREAD)
1112               || (command->type == BFD_MACH_O_LC_UNIXTHREAD));
1113
1114   offset = BFD_MACH_O_LC_SIZE;
1115   for (i = 0; i < cmd->nflavours; i++)
1116     {
1117       BFD_ASSERT ((cmd->flavours[i].size % 4) == 0);
1118       BFD_ASSERT (cmd->flavours[i].offset ==
1119                   (command->offset + offset + BFD_MACH_O_LC_SIZE));
1120
1121       bfd_h_put_32 (abfd, cmd->flavours[i].flavour, raw.flavour);
1122       bfd_h_put_32 (abfd, (cmd->flavours[i].size / 4), raw.count);
1123
1124       if (bfd_seek (abfd, command->offset + offset, SEEK_SET) != 0
1125           || bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw))
1126         return FALSE;
1127
1128       offset += cmd->flavours[i].size + sizeof (raw);
1129     }
1130
1131   return TRUE;
1132 }
1133
1134 static bfd_boolean
1135 bfd_mach_o_write_dylinker (bfd *abfd, bfd_mach_o_load_command *command)
1136 {
1137   bfd_mach_o_dylinker_command *cmd = &command->command.dylinker;
1138   struct mach_o_str_command_external raw;
1139   unsigned int namelen;
1140
1141   bfd_h_put_32 (abfd, cmd->name_offset, raw.str);
1142
1143   if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
1144       || bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw))
1145     return FALSE;
1146
1147   namelen = strlen (cmd->name_str) + 1;
1148   if (bfd_bwrite (cmd->name_str, namelen, abfd) != namelen)
1149     return FALSE;
1150
1151   if (bfd_mach_o_pad_command (abfd, namelen) < 0)
1152     return FALSE;
1153
1154   return TRUE;
1155 }
1156
1157 static bfd_boolean
1158 bfd_mach_o_write_dylib (bfd *abfd, bfd_mach_o_load_command *command)
1159 {
1160   bfd_mach_o_dylib_command *cmd = &command->command.dylib;
1161   struct mach_o_dylib_command_external raw;
1162   unsigned int namelen;
1163
1164   bfd_h_put_32 (abfd, cmd->name_offset, raw.name);
1165   bfd_h_put_32 (abfd, cmd->timestamp, raw.timestamp);
1166   bfd_h_put_32 (abfd, cmd->current_version, raw.current_version);
1167   bfd_h_put_32 (abfd, cmd->compatibility_version, raw.compatibility_version);
1168
1169   if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
1170       || bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw))
1171     return FALSE;
1172
1173   namelen = strlen (cmd->name_str) + 1;
1174   if (bfd_bwrite (cmd->name_str, namelen, abfd) != namelen)
1175     return FALSE;
1176
1177   if (bfd_mach_o_pad_command (abfd, namelen) < 0)
1178     return FALSE;
1179
1180   return TRUE;
1181 }
1182
1183 static bfd_boolean
1184 bfd_mach_o_write_main (bfd *abfd, bfd_mach_o_load_command *command)
1185 {
1186   bfd_mach_o_main_command *cmd = &command->command.main;
1187   struct mach_o_entry_point_command_external raw;
1188
1189   bfd_h_put_64 (abfd, cmd->entryoff, raw.entryoff);
1190   bfd_h_put_64 (abfd, cmd->stacksize, raw.stacksize);
1191
1192   if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
1193       || bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw))
1194     return FALSE;
1195
1196   return TRUE;
1197 }
1198
1199 static bfd_boolean
1200 bfd_mach_o_write_dyld_info (bfd *abfd, bfd_mach_o_load_command *command)
1201 {
1202   bfd_mach_o_dyld_info_command *cmd = &command->command.dyld_info;
1203   struct mach_o_dyld_info_command_external raw;
1204
1205   bfd_h_put_32 (abfd, cmd->rebase_off, raw.rebase_off);
1206   bfd_h_put_32 (abfd, cmd->rebase_size, raw.rebase_size);
1207   bfd_h_put_32 (abfd, cmd->bind_off, raw.bind_off);
1208   bfd_h_put_32 (abfd, cmd->bind_size, raw.bind_size);
1209   bfd_h_put_32 (abfd, cmd->weak_bind_off, raw.weak_bind_off);
1210   bfd_h_put_32 (abfd, cmd->weak_bind_size, raw.weak_bind_size);
1211   bfd_h_put_32 (abfd, cmd->lazy_bind_off, raw.lazy_bind_off);
1212   bfd_h_put_32 (abfd, cmd->lazy_bind_size, raw.lazy_bind_size);
1213   bfd_h_put_32 (abfd, cmd->export_off, raw.export_off);
1214   bfd_h_put_32 (abfd, cmd->export_size, raw.export_size);
1215
1216   if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
1217       || bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw))
1218     return FALSE;
1219
1220   if (cmd->rebase_size != 0)
1221     if (bfd_seek (abfd, cmd->rebase_off, SEEK_SET) != 0
1222         || (bfd_bwrite (cmd->rebase_content, cmd->rebase_size, abfd) !=
1223             cmd->rebase_size))
1224       return FALSE;
1225
1226   if (cmd->bind_size != 0)
1227     if (bfd_seek (abfd, cmd->bind_off, SEEK_SET) != 0
1228         || (bfd_bwrite (cmd->bind_content, cmd->bind_size, abfd) !=
1229             cmd->bind_size))
1230       return FALSE;
1231
1232   if (cmd->weak_bind_size != 0)
1233     if (bfd_seek (abfd, cmd->weak_bind_off, SEEK_SET) != 0
1234         || (bfd_bwrite (cmd->weak_bind_content, cmd->weak_bind_size, abfd) !=
1235             cmd->weak_bind_size))
1236       return FALSE;
1237
1238   if (cmd->lazy_bind_size != 0)
1239     if (bfd_seek (abfd, cmd->lazy_bind_off, SEEK_SET) != 0
1240         || (bfd_bwrite (cmd->lazy_bind_content, cmd->lazy_bind_size, abfd) !=
1241             cmd->lazy_bind_size))
1242       return FALSE;
1243
1244   if (cmd->export_size != 0)
1245     if (bfd_seek (abfd, cmd->export_off, SEEK_SET) != 0
1246         || (bfd_bwrite (cmd->export_content, cmd->export_size, abfd) !=
1247             cmd->export_size))
1248       return FALSE;
1249
1250   return TRUE;
1251 }
1252
1253 long
1254 bfd_mach_o_get_reloc_upper_bound (bfd *abfd ATTRIBUTE_UNUSED,
1255                                   asection *asect)
1256 {
1257   return (asect->reloc_count + 1) * sizeof (arelent *);
1258 }
1259
1260 /* In addition to the need to byte-swap the symbol number, the bit positions
1261    of the fields in the relocation information vary per target endian-ness.  */
1262
1263 static void
1264 bfd_mach_o_swap_in_non_scattered_reloc (bfd *abfd, bfd_mach_o_reloc_info *rel,
1265                                        unsigned char *fields)
1266 {
1267   unsigned char info = fields[3];
1268
1269   if (bfd_big_endian (abfd))
1270     {
1271       rel->r_value = (fields[0] << 16) | (fields[1] << 8) | fields[2];
1272       rel->r_type = (info >> BFD_MACH_O_BE_TYPE_SHIFT) & BFD_MACH_O_TYPE_MASK;
1273       rel->r_pcrel = (info & BFD_MACH_O_BE_PCREL) ? 1 : 0;
1274       rel->r_length = (info >> BFD_MACH_O_BE_LENGTH_SHIFT)
1275                       & BFD_MACH_O_LENGTH_MASK;
1276       rel->r_extern = (info & BFD_MACH_O_BE_EXTERN) ? 1 : 0;
1277     }
1278   else
1279     {
1280       rel->r_value = (fields[2] << 16) | (fields[1] << 8) | fields[0];
1281       rel->r_type = (info >> BFD_MACH_O_LE_TYPE_SHIFT) & BFD_MACH_O_TYPE_MASK;
1282       rel->r_pcrel = (info & BFD_MACH_O_LE_PCREL) ? 1 : 0;
1283       rel->r_length = (info >> BFD_MACH_O_LE_LENGTH_SHIFT)
1284                       & BFD_MACH_O_LENGTH_MASK;
1285       rel->r_extern = (info & BFD_MACH_O_LE_EXTERN) ? 1 : 0;
1286     }
1287 }
1288
1289 static int
1290 bfd_mach_o_canonicalize_one_reloc (bfd *abfd,
1291                                    struct mach_o_reloc_info_external *raw,
1292                                    arelent *res, asymbol **syms)
1293 {
1294   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
1295   bfd_mach_o_backend_data *bed = bfd_mach_o_get_backend_data (abfd);
1296   bfd_mach_o_reloc_info reloc;
1297   bfd_vma addr;
1298   asymbol **sym;
1299
1300   addr = bfd_get_32 (abfd, raw->r_address);
1301   res->sym_ptr_ptr = NULL;
1302   res->addend = 0;
1303
1304   if (addr & BFD_MACH_O_SR_SCATTERED)
1305     {
1306       unsigned int j;
1307       bfd_vma symnum = bfd_get_32 (abfd, raw->r_symbolnum);
1308
1309       /* Scattered relocation, can't be extern. */
1310       reloc.r_scattered = 1;
1311       reloc.r_extern = 0;
1312
1313       /*   Extract section and offset from r_value (symnum).  */
1314       reloc.r_value = symnum;
1315       /* FIXME: This breaks when a symbol in a reloc exactly follows the
1316          end of the data for the section (e.g. in a calculation of section
1317          data length).  At present, the symbol will end up associated with
1318          the following section or, if it falls within alignment padding, as
1319          null - which will assert later.  */
1320       for (j = 0; j < mdata->nsects; j++)
1321         {
1322           bfd_mach_o_section *sect = mdata->sections[j];
1323           if (symnum >= sect->addr && symnum < sect->addr + sect->size)
1324             {
1325               res->sym_ptr_ptr = sect->bfdsection->symbol_ptr_ptr;
1326               res->addend = symnum - sect->addr;
1327               break;
1328             }
1329         }
1330
1331       /* Extract the info and address fields from r_address.  */
1332       reloc.r_type = BFD_MACH_O_GET_SR_TYPE (addr);
1333       reloc.r_length = BFD_MACH_O_GET_SR_LENGTH (addr);
1334       reloc.r_pcrel = addr & BFD_MACH_O_SR_PCREL;
1335       reloc.r_address = BFD_MACH_O_GET_SR_TYPE (addr);
1336       res->address = BFD_MACH_O_GET_SR_ADDRESS (addr);
1337     }
1338   else
1339     {
1340       unsigned int num;
1341
1342       /* Non-scattered relocation.  */
1343       reloc.r_scattered = 0;
1344
1345       /* The value and info fields have to be extracted dependent on target
1346          endian-ness.  */
1347       bfd_mach_o_swap_in_non_scattered_reloc (abfd, &reloc, raw->r_symbolnum);
1348       num = reloc.r_value;
1349
1350       if (reloc.r_extern)
1351         {
1352           /* An external symbol number.  */
1353           sym = syms + num;
1354         }
1355       else if (num == 0x00ffffff || num == 0)
1356         {
1357           /* The 'symnum' in a non-scattered PAIR is 0x00ffffff.  But as this
1358              is generic code, we don't know wether this is really a PAIR.
1359              This value is almost certainly not a valid section number, hence
1360              this specific case to avoid an assertion failure.
1361              Target specific swap_reloc_in routine should adjust that.  */
1362           sym = bfd_abs_section_ptr->symbol_ptr_ptr;
1363         }
1364       else
1365         {
1366           /* A section number.  */
1367           BFD_ASSERT (num <= mdata->nsects);
1368
1369           sym = mdata->sections[num - 1]->bfdsection->symbol_ptr_ptr;
1370           /* For a symbol defined in section S, the addend (stored in the
1371              binary) contains the address of the section.  To comply with
1372              bfd convention, subtract the section address.
1373              Use the address from the header, so that the user can modify
1374              the vma of the section.  */
1375           res->addend = -mdata->sections[num - 1]->addr;
1376         }
1377       /* Note: Pairs for PPC LO/HI/HA are not scattered, but contain the offset
1378          in the lower 16bits of the address value.  So we have to find the
1379          'symbol' from the preceding reloc.  We do this even though the
1380          section symbol is probably not needed here, because NULL symbol
1381          values cause an assert in generic BFD code.  This must be done in
1382          the PPC swap_reloc_in routine.  */
1383       res->sym_ptr_ptr = sym;
1384
1385       /* The 'address' is just r_address.
1386          ??? maybe this should be masked with  0xffffff for safety.  */
1387       res->address = addr;
1388       reloc.r_address = addr;
1389     }
1390
1391   /* We have set up a reloc with all the information present, so the swapper
1392      can modify address, value and addend fields, if necessary, to convey
1393      information in the generic BFD reloc that is mach-o specific.  */
1394
1395   if (!(*bed->_bfd_mach_o_swap_reloc_in)(res, &reloc))
1396     return -1;
1397   return 0;
1398 }
1399
1400 static int
1401 bfd_mach_o_canonicalize_relocs (bfd *abfd, unsigned long filepos,
1402                                 unsigned long count,
1403                                 arelent *res, asymbol **syms)
1404 {
1405   unsigned long i;
1406   struct mach_o_reloc_info_external *native_relocs;
1407   bfd_size_type native_size;
1408
1409   /* Allocate and read relocs.  */
1410   native_size = count * BFD_MACH_O_RELENT_SIZE;
1411   native_relocs =
1412     (struct mach_o_reloc_info_external *) bfd_malloc (native_size);
1413   if (native_relocs == NULL)
1414     return -1;
1415
1416   if (bfd_seek (abfd, filepos, SEEK_SET) != 0
1417       || bfd_bread (native_relocs, native_size, abfd) != native_size)
1418     goto err;
1419
1420   for (i = 0; i < count; i++)
1421     {
1422       if (bfd_mach_o_canonicalize_one_reloc (abfd, &native_relocs[i],
1423                                              &res[i], syms) < 0)
1424         goto err;
1425     }
1426   free (native_relocs);
1427   return i;
1428  err:
1429   free (native_relocs);
1430   return -1;
1431 }
1432
1433 long
1434 bfd_mach_o_canonicalize_reloc (bfd *abfd, asection *asect,
1435                                arelent **rels, asymbol **syms)
1436 {
1437   bfd_mach_o_backend_data *bed = bfd_mach_o_get_backend_data (abfd);
1438   unsigned long i;
1439   arelent *res;
1440
1441   if (asect->reloc_count == 0)
1442     return 0;
1443
1444   /* No need to go further if we don't know how to read relocs.  */
1445   if (bed->_bfd_mach_o_swap_reloc_in == NULL)
1446     return 0;
1447
1448   if (asect->relocation == NULL)
1449     {
1450       res = bfd_malloc (asect->reloc_count * sizeof (arelent));
1451       if (res == NULL)
1452         return -1;
1453
1454       if (bfd_mach_o_canonicalize_relocs (abfd, asect->rel_filepos,
1455                                           asect->reloc_count, res, syms) < 0)
1456         {
1457           free (res);
1458           return -1;
1459         }
1460       asect->relocation = res;
1461     }
1462
1463   res = asect->relocation;
1464   for (i = 0; i < asect->reloc_count; i++)
1465     rels[i] = &res[i];
1466   rels[i] = NULL;
1467
1468   return i;
1469 }
1470
1471 long
1472 bfd_mach_o_get_dynamic_reloc_upper_bound (bfd *abfd)
1473 {
1474   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
1475
1476   if (mdata->dysymtab == NULL)
1477     return 1;
1478   return (mdata->dysymtab->nextrel + mdata->dysymtab->nlocrel + 1)
1479     * sizeof (arelent *);
1480 }
1481
1482 long
1483 bfd_mach_o_canonicalize_dynamic_reloc (bfd *abfd, arelent **rels,
1484                                        struct bfd_symbol **syms)
1485 {
1486   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
1487   bfd_mach_o_dysymtab_command *dysymtab = mdata->dysymtab;
1488   bfd_mach_o_backend_data *bed = bfd_mach_o_get_backend_data (abfd);
1489   unsigned long i;
1490   arelent *res;
1491
1492   if (dysymtab == NULL)
1493     return 0;
1494   if (dysymtab->nextrel == 0 && dysymtab->nlocrel == 0)
1495     return 0;
1496
1497   /* No need to go further if we don't know how to read relocs.  */
1498   if (bed->_bfd_mach_o_swap_reloc_in == NULL)
1499     return 0;
1500
1501   if (mdata->dyn_reloc_cache == NULL)
1502     {
1503       res = bfd_malloc ((dysymtab->nextrel + dysymtab->nlocrel)
1504                         * sizeof (arelent));
1505       if (res == NULL)
1506         return -1;
1507
1508       if (bfd_mach_o_canonicalize_relocs (abfd, dysymtab->extreloff,
1509                                           dysymtab->nextrel, res, syms) < 0)
1510         {
1511           free (res);
1512           return -1;
1513         }
1514
1515       if (bfd_mach_o_canonicalize_relocs (abfd, dysymtab->locreloff,
1516                                           dysymtab->nlocrel,
1517                                           res + dysymtab->nextrel, syms) < 0)
1518         {
1519           free (res);
1520           return -1;
1521         }
1522
1523       mdata->dyn_reloc_cache = res;
1524     }
1525
1526   res = mdata->dyn_reloc_cache;
1527   for (i = 0; i < dysymtab->nextrel + dysymtab->nlocrel; i++)
1528     rels[i] = &res[i];
1529   rels[i] = NULL;
1530   return i;
1531 }
1532
1533 /* In addition to the need to byte-swap the symbol number, the bit positions
1534    of the fields in the relocation information vary per target endian-ness.  */
1535
1536 static void
1537 bfd_mach_o_swap_out_non_scattered_reloc (bfd *abfd, unsigned char *fields,
1538                                        bfd_mach_o_reloc_info *rel)
1539 {
1540   unsigned char info = 0;
1541
1542   BFD_ASSERT (rel->r_type <= 15);
1543   BFD_ASSERT (rel->r_length <= 3);
1544
1545   if (bfd_big_endian (abfd))
1546     {
1547       fields[0] = (rel->r_value >> 16) & 0xff;
1548       fields[1] = (rel->r_value >> 8) & 0xff;
1549       fields[2] = rel->r_value & 0xff;
1550       info |= rel->r_type << BFD_MACH_O_BE_TYPE_SHIFT;
1551       info |= rel->r_pcrel ? BFD_MACH_O_BE_PCREL : 0;
1552       info |= rel->r_length << BFD_MACH_O_BE_LENGTH_SHIFT;
1553       info |= rel->r_extern ? BFD_MACH_O_BE_EXTERN : 0;
1554     }
1555   else
1556     {
1557       fields[2] = (rel->r_value >> 16) & 0xff;
1558       fields[1] = (rel->r_value >> 8) & 0xff;
1559       fields[0] = rel->r_value & 0xff;
1560       info |= rel->r_type << BFD_MACH_O_LE_TYPE_SHIFT;
1561       info |= rel->r_pcrel ? BFD_MACH_O_LE_PCREL : 0;
1562       info |= rel->r_length << BFD_MACH_O_LE_LENGTH_SHIFT;
1563       info |= rel->r_extern ? BFD_MACH_O_LE_EXTERN : 0;
1564     }
1565   fields[3] = info;
1566 }
1567
1568 static bfd_boolean
1569 bfd_mach_o_write_relocs (bfd *abfd, bfd_mach_o_section *section)
1570 {
1571   unsigned int i;
1572   arelent **entries;
1573   asection *sec;
1574   bfd_mach_o_backend_data *bed = bfd_mach_o_get_backend_data (abfd);
1575
1576   sec = section->bfdsection;
1577   if (sec->reloc_count == 0)
1578     return TRUE;
1579
1580   if (bed->_bfd_mach_o_swap_reloc_out == NULL)
1581     return TRUE;
1582
1583   if (bfd_seek (abfd, section->reloff, SEEK_SET) != 0)
1584     return FALSE;
1585
1586   /* Convert and write.  */
1587   entries = section->bfdsection->orelocation;
1588   for (i = 0; i < section->nreloc; i++)
1589     {
1590       arelent *rel = entries[i];
1591       struct mach_o_reloc_info_external raw;
1592       bfd_mach_o_reloc_info info, *pinfo = &info;
1593
1594       /* Convert relocation to an intermediate representation.  */
1595       if (!(*bed->_bfd_mach_o_swap_reloc_out) (rel, pinfo))
1596         return FALSE;
1597
1598       /* Lower the relocation info.  */
1599       if (pinfo->r_scattered)
1600         {
1601           unsigned long v;
1602
1603           v = BFD_MACH_O_SR_SCATTERED
1604             | (pinfo->r_pcrel ? BFD_MACH_O_SR_PCREL : 0)
1605             | BFD_MACH_O_SET_SR_LENGTH (pinfo->r_length)
1606             | BFD_MACH_O_SET_SR_TYPE (pinfo->r_type)
1607             | BFD_MACH_O_SET_SR_ADDRESS (pinfo->r_address);
1608           /* Note: scattered relocs have field in reverse order...  */
1609           bfd_put_32 (abfd, v, raw.r_address);
1610           bfd_put_32 (abfd, pinfo->r_value, raw.r_symbolnum);
1611         }
1612       else
1613         {
1614           bfd_put_32 (abfd, pinfo->r_address, raw.r_address);
1615           bfd_mach_o_swap_out_non_scattered_reloc (abfd, raw.r_symbolnum,
1616                                                    pinfo);
1617         }
1618
1619       if (bfd_bwrite (&raw, BFD_MACH_O_RELENT_SIZE, abfd)
1620           != BFD_MACH_O_RELENT_SIZE)
1621         return FALSE;
1622     }
1623   return TRUE;
1624 }
1625
1626 static bfd_boolean
1627 bfd_mach_o_write_section_32 (bfd *abfd, bfd_mach_o_section *section)
1628 {
1629   struct mach_o_section_32_external raw;
1630
1631   memcpy (raw.sectname, section->sectname, 16);
1632   memcpy (raw.segname, section->segname, 16);
1633   bfd_h_put_32 (abfd, section->addr, raw.addr);
1634   bfd_h_put_32 (abfd, section->size, raw.size);
1635   bfd_h_put_32 (abfd, section->offset, raw.offset);
1636   bfd_h_put_32 (abfd, section->align, raw.align);
1637   bfd_h_put_32 (abfd, section->reloff, raw.reloff);
1638   bfd_h_put_32 (abfd, section->nreloc, raw.nreloc);
1639   bfd_h_put_32 (abfd, section->flags, raw.flags);
1640   bfd_h_put_32 (abfd, section->reserved1, raw.reserved1);
1641   bfd_h_put_32 (abfd, section->reserved2, raw.reserved2);
1642
1643   if (bfd_bwrite (&raw, BFD_MACH_O_SECTION_SIZE, abfd)
1644       != BFD_MACH_O_SECTION_SIZE)
1645     return FALSE;
1646
1647   return TRUE;
1648 }
1649
1650 static bfd_boolean
1651 bfd_mach_o_write_section_64 (bfd *abfd, bfd_mach_o_section *section)
1652 {
1653   struct mach_o_section_64_external raw;
1654
1655   memcpy (raw.sectname, section->sectname, 16);
1656   memcpy (raw.segname, section->segname, 16);
1657   bfd_h_put_64 (abfd, section->addr, raw.addr);
1658   bfd_h_put_64 (abfd, section->size, raw.size);
1659   bfd_h_put_32 (abfd, section->offset, raw.offset);
1660   bfd_h_put_32 (abfd, section->align, raw.align);
1661   bfd_h_put_32 (abfd, section->reloff, raw.reloff);
1662   bfd_h_put_32 (abfd, section->nreloc, raw.nreloc);
1663   bfd_h_put_32 (abfd, section->flags, raw.flags);
1664   bfd_h_put_32 (abfd, section->reserved1, raw.reserved1);
1665   bfd_h_put_32 (abfd, section->reserved2, raw.reserved2);
1666   bfd_h_put_32 (abfd, section->reserved3, raw.reserved3);
1667
1668   if (bfd_bwrite (&raw, BFD_MACH_O_SECTION_64_SIZE, abfd)
1669       != BFD_MACH_O_SECTION_64_SIZE)
1670     return FALSE;
1671
1672   return TRUE;
1673 }
1674
1675 static bfd_boolean
1676 bfd_mach_o_write_segment_32 (bfd *abfd, bfd_mach_o_load_command *command)
1677 {
1678   struct mach_o_segment_command_32_external raw;
1679   bfd_mach_o_segment_command *seg = &command->command.segment;
1680   bfd_mach_o_section *sec;
1681
1682   BFD_ASSERT (command->type == BFD_MACH_O_LC_SEGMENT);
1683
1684   for (sec = seg->sect_head; sec != NULL; sec = sec->next)
1685     if (!bfd_mach_o_write_relocs (abfd, sec))
1686       return FALSE;
1687
1688   memcpy (raw.segname, seg->segname, 16);
1689   bfd_h_put_32 (abfd, seg->vmaddr, raw.vmaddr);
1690   bfd_h_put_32 (abfd, seg->vmsize, raw.vmsize);
1691   bfd_h_put_32 (abfd, seg->fileoff, raw.fileoff);
1692   bfd_h_put_32 (abfd, seg->filesize, raw.filesize);
1693   bfd_h_put_32 (abfd, seg->maxprot, raw.maxprot);
1694   bfd_h_put_32 (abfd, seg->initprot, raw.initprot);
1695   bfd_h_put_32 (abfd, seg->nsects, raw.nsects);
1696   bfd_h_put_32 (abfd, seg->flags, raw.flags);
1697
1698   if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
1699       || bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw))
1700     return FALSE;
1701
1702   for (sec = seg->sect_head; sec != NULL; sec = sec->next)
1703     if (!bfd_mach_o_write_section_32 (abfd, sec))
1704       return FALSE;
1705
1706   return TRUE;
1707 }
1708
1709 static bfd_boolean
1710 bfd_mach_o_write_segment_64 (bfd *abfd, bfd_mach_o_load_command *command)
1711 {
1712   struct mach_o_segment_command_64_external raw;
1713   bfd_mach_o_segment_command *seg = &command->command.segment;
1714   bfd_mach_o_section *sec;
1715
1716   BFD_ASSERT (command->type == BFD_MACH_O_LC_SEGMENT_64);
1717
1718   for (sec = seg->sect_head; sec != NULL; sec = sec->next)
1719     if (!bfd_mach_o_write_relocs (abfd, sec))
1720       return FALSE;
1721
1722   memcpy (raw.segname, seg->segname, 16);
1723   bfd_h_put_64 (abfd, seg->vmaddr, raw.vmaddr);
1724   bfd_h_put_64 (abfd, seg->vmsize, raw.vmsize);
1725   bfd_h_put_64 (abfd, seg->fileoff, raw.fileoff);
1726   bfd_h_put_64 (abfd, seg->filesize, raw.filesize);
1727   bfd_h_put_32 (abfd, seg->maxprot, raw.maxprot);
1728   bfd_h_put_32 (abfd, seg->initprot, raw.initprot);
1729   bfd_h_put_32 (abfd, seg->nsects, raw.nsects);
1730   bfd_h_put_32 (abfd, seg->flags, raw.flags);
1731
1732   if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
1733       || bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw))
1734     return FALSE;
1735
1736   for (sec = seg->sect_head; sec != NULL; sec = sec->next)
1737     if (!bfd_mach_o_write_section_64 (abfd, sec))
1738       return FALSE;
1739
1740   return TRUE;
1741 }
1742
1743 static bfd_boolean
1744 bfd_mach_o_write_symtab_content (bfd *abfd, bfd_mach_o_symtab_command *sym)
1745 {
1746   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
1747   unsigned long i;
1748   unsigned int wide = bfd_mach_o_wide_p (abfd);
1749   struct bfd_strtab_hash *strtab;
1750   asymbol **symbols = bfd_get_outsymbols (abfd);
1751   int padlen;
1752
1753   /* Write the symbols first.  */
1754   if (bfd_seek (abfd, sym->symoff, SEEK_SET) != 0)
1755     return FALSE;
1756
1757   strtab = _bfd_stringtab_init ();
1758   if (strtab == NULL)
1759     return FALSE;
1760
1761   if (sym->nsyms > 0)
1762     /* Although we don't strictly need to do this, for compatibility with
1763        Darwin system tools, actually output an empty string for the index
1764        0 entry.  */
1765     _bfd_stringtab_add (strtab, "", TRUE, FALSE);
1766
1767   for (i = 0; i < sym->nsyms; i++)
1768     {
1769       bfd_size_type str_index;
1770       bfd_mach_o_asymbol *s = (bfd_mach_o_asymbol *)symbols[i];
1771
1772       if (s->symbol.name == 0 || s->symbol.name[0] == '\0')
1773         /* An index of 0 always means the empty string.  */
1774         str_index = 0;
1775       else
1776         {
1777           str_index = _bfd_stringtab_add (strtab, s->symbol.name, TRUE, FALSE);
1778
1779           if (str_index == (bfd_size_type) -1)
1780             goto err;
1781         }
1782
1783       if (wide)
1784         {
1785           struct mach_o_nlist_64_external raw;
1786
1787           bfd_h_put_32 (abfd, str_index, raw.n_strx);
1788           bfd_h_put_8 (abfd, s->n_type, raw.n_type);
1789           bfd_h_put_8 (abfd, s->n_sect, raw.n_sect);
1790           bfd_h_put_16 (abfd, s->n_desc, raw.n_desc);
1791           bfd_h_put_64 (abfd, s->symbol.section->vma + s->symbol.value,
1792                         raw.n_value);
1793
1794           if (bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw))
1795             goto err;
1796         }
1797       else
1798         {
1799           struct mach_o_nlist_external raw;
1800
1801           bfd_h_put_32 (abfd, str_index, raw.n_strx);
1802           bfd_h_put_8 (abfd, s->n_type, raw.n_type);
1803           bfd_h_put_8 (abfd, s->n_sect, raw.n_sect);
1804           bfd_h_put_16 (abfd, s->n_desc, raw.n_desc);
1805           bfd_h_put_32 (abfd, s->symbol.section->vma + s->symbol.value,
1806                         raw.n_value);
1807
1808           if (bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw))
1809             goto err;
1810         }
1811     }
1812   sym->strsize = _bfd_stringtab_size (strtab);
1813   sym->stroff = mdata->filelen;
1814   mdata->filelen += sym->strsize;
1815
1816   if (bfd_seek (abfd, sym->stroff, SEEK_SET) != 0)
1817     return FALSE;
1818
1819   if (_bfd_stringtab_emit (abfd, strtab) != TRUE)
1820     goto err;
1821   _bfd_stringtab_free (strtab);
1822
1823   /* Pad string table.  */
1824   padlen = bfd_mach_o_pad4 (abfd, sym->strsize);
1825   if (padlen < 0)
1826     return FALSE;
1827   mdata->filelen += padlen;
1828   sym->strsize += padlen;
1829
1830   return TRUE;
1831
1832  err:
1833   _bfd_stringtab_free (strtab);
1834   return FALSE;
1835 }
1836
1837 static bfd_boolean
1838 bfd_mach_o_write_symtab (bfd *abfd, bfd_mach_o_load_command *command)
1839 {
1840   bfd_mach_o_symtab_command *sym = &command->command.symtab;
1841   struct mach_o_symtab_command_external raw;
1842
1843   BFD_ASSERT (command->type == BFD_MACH_O_LC_SYMTAB);
1844
1845   /* The command.  */
1846   bfd_h_put_32 (abfd, sym->symoff, raw.symoff);
1847   bfd_h_put_32 (abfd, sym->nsyms, raw.nsyms);
1848   bfd_h_put_32 (abfd, sym->stroff, raw.stroff);
1849   bfd_h_put_32 (abfd, sym->strsize, raw.strsize);
1850
1851   if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
1852       || bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw))
1853     return FALSE;
1854
1855   return TRUE;
1856 }
1857
1858 /* Count the number of indirect symbols in the image.
1859    Requires that the sections are in their final order.  */
1860
1861 static unsigned int
1862 bfd_mach_o_count_indirect_symbols (bfd *abfd, bfd_mach_o_data_struct *mdata)
1863 {
1864   unsigned int i;
1865   unsigned int nisyms = 0;
1866
1867   for (i = 0; i < mdata->nsects; ++i)
1868     {
1869       bfd_mach_o_section *sec = mdata->sections[i];
1870
1871       switch (sec->flags & BFD_MACH_O_SECTION_TYPE_MASK)
1872         {
1873           case BFD_MACH_O_S_NON_LAZY_SYMBOL_POINTERS:
1874           case BFD_MACH_O_S_LAZY_SYMBOL_POINTERS:
1875           case BFD_MACH_O_S_SYMBOL_STUBS:
1876             nisyms += bfd_mach_o_section_get_nbr_indirect (abfd, sec);
1877             break;
1878           default:
1879             break;
1880         }
1881     }
1882   return nisyms;
1883 }
1884
1885 /* Create the dysymtab.  */
1886
1887 static bfd_boolean
1888 bfd_mach_o_build_dysymtab (bfd *abfd, bfd_mach_o_dysymtab_command *cmd)
1889 {
1890   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
1891
1892   /* TODO:
1893      We are not going to try and fill these in yet and, moreover, we are
1894      going to bail if they are already set.  */
1895   if (cmd->nmodtab != 0
1896       || cmd->ntoc != 0
1897       || cmd->nextrefsyms != 0)
1898     {
1899       (*_bfd_error_handler) (_("sorry: modtab, toc and extrefsyms are not yet"
1900                                 " implemented for dysymtab commands."));
1901       return FALSE;
1902     }
1903
1904   cmd->ilocalsym = 0;
1905
1906   if (bfd_get_symcount (abfd) > 0)
1907     {
1908       asymbol **symbols = bfd_get_outsymbols (abfd);
1909       unsigned long i;
1910
1911        /* Count the number of each kind of symbol.  */
1912       for (i = 0; i < bfd_get_symcount (abfd); ++i)
1913         {
1914           bfd_mach_o_asymbol *s = (bfd_mach_o_asymbol *)symbols[i];
1915           if (s->n_type & (BFD_MACH_O_N_EXT | BFD_MACH_O_N_PEXT))
1916             break;
1917         }
1918       cmd->nlocalsym = i;
1919       cmd->iextdefsym = i;
1920       for (; i < bfd_get_symcount (abfd); ++i)
1921         {
1922           bfd_mach_o_asymbol *s = (bfd_mach_o_asymbol *)symbols[i];
1923           if ((s->n_type & BFD_MACH_O_N_TYPE) == BFD_MACH_O_N_UNDF)
1924             break;
1925         }
1926       cmd->nextdefsym = i - cmd->nlocalsym;
1927       cmd->iundefsym = cmd->nextdefsym + cmd->iextdefsym;
1928       cmd->nundefsym = bfd_get_symcount (abfd)
1929                         - cmd->nlocalsym
1930                         - cmd->nextdefsym;
1931     }
1932   else
1933     {
1934       cmd->nlocalsym = 0;
1935       cmd->iextdefsym = 0;
1936       cmd->nextdefsym = 0;
1937       cmd->iundefsym = 0;
1938       cmd->nundefsym = 0;
1939     }
1940
1941   cmd->nindirectsyms = bfd_mach_o_count_indirect_symbols (abfd, mdata);
1942   if (cmd->nindirectsyms > 0)
1943     {
1944       unsigned i;
1945       unsigned n;
1946
1947       mdata->filelen = FILE_ALIGN (mdata->filelen, 2);
1948       cmd->indirectsymoff = mdata->filelen;
1949       mdata->filelen += cmd->nindirectsyms * 4;
1950
1951       cmd->indirect_syms = bfd_zalloc (abfd, cmd->nindirectsyms * 4);
1952       if (cmd->indirect_syms == NULL)
1953         return FALSE;
1954
1955       n = 0;
1956       for (i = 0; i < mdata->nsects; ++i)
1957         {
1958           bfd_mach_o_section *sec = mdata->sections[i];
1959
1960           switch (sec->flags & BFD_MACH_O_SECTION_TYPE_MASK)
1961             {
1962               case BFD_MACH_O_S_NON_LAZY_SYMBOL_POINTERS:
1963               case BFD_MACH_O_S_LAZY_SYMBOL_POINTERS:
1964               case BFD_MACH_O_S_SYMBOL_STUBS:
1965                 {
1966                   unsigned j, num;
1967                   bfd_mach_o_asymbol **isyms = sec->indirect_syms;
1968
1969                   num = bfd_mach_o_section_get_nbr_indirect (abfd, sec);
1970                   if (isyms == NULL || num == 0)
1971                     break;
1972                   /* Record the starting index in the reserved1 field.  */
1973                   sec->reserved1 = n;
1974                   for (j = 0; j < num; j++, n++)
1975                     {
1976                       if (isyms[j] == NULL)
1977                         cmd->indirect_syms[n] = BFD_MACH_O_INDIRECT_SYM_LOCAL;
1978                       else if (isyms[j]->symbol.section == bfd_abs_section_ptr
1979                                && ! (isyms[j]->n_type & BFD_MACH_O_N_EXT))
1980                         cmd->indirect_syms[n] = BFD_MACH_O_INDIRECT_SYM_LOCAL
1981                                                  | BFD_MACH_O_INDIRECT_SYM_ABS;
1982                       else
1983                         cmd->indirect_syms[n] = isyms[j]->symbol.udata.i;
1984                     }
1985                 }
1986                 break;
1987               default:
1988                 break;
1989             }
1990         }
1991     }
1992
1993   return TRUE;
1994 }
1995
1996 /* Write a dysymtab command.
1997    TODO: Possibly coalesce writes of smaller objects.  */
1998
1999 static bfd_boolean
2000 bfd_mach_o_write_dysymtab (bfd *abfd, bfd_mach_o_load_command *command)
2001 {
2002   bfd_mach_o_dysymtab_command *cmd = &command->command.dysymtab;
2003
2004   BFD_ASSERT (command->type == BFD_MACH_O_LC_DYSYMTAB);
2005
2006   if (cmd->nmodtab != 0)
2007     {
2008       unsigned int i;
2009
2010       if (bfd_seek (abfd, cmd->modtaboff, SEEK_SET) != 0)
2011         return FALSE;
2012
2013       for (i = 0; i < cmd->nmodtab; i++)
2014         {
2015           bfd_mach_o_dylib_module *module = &cmd->dylib_module[i];
2016           unsigned int iinit;
2017           unsigned int ninit;
2018
2019           iinit = module->iinit & 0xffff;
2020           iinit |= ((module->iterm & 0xffff) << 16);
2021
2022           ninit = module->ninit & 0xffff;
2023           ninit |= ((module->nterm & 0xffff) << 16);
2024
2025           if (bfd_mach_o_wide_p (abfd))
2026             {
2027               struct mach_o_dylib_module_64_external w;
2028
2029               bfd_h_put_32 (abfd, module->module_name_idx, &w.module_name);
2030               bfd_h_put_32 (abfd, module->iextdefsym, &w.iextdefsym);
2031               bfd_h_put_32 (abfd, module->nextdefsym, &w.nextdefsym);
2032               bfd_h_put_32 (abfd, module->irefsym, &w.irefsym);
2033               bfd_h_put_32 (abfd, module->nrefsym, &w.nrefsym);
2034               bfd_h_put_32 (abfd, module->ilocalsym, &w.ilocalsym);
2035               bfd_h_put_32 (abfd, module->nlocalsym, &w.nlocalsym);
2036               bfd_h_put_32 (abfd, module->iextrel, &w.iextrel);
2037               bfd_h_put_32 (abfd, module->nextrel, &w.nextrel);
2038               bfd_h_put_32 (abfd, iinit, &w.iinit_iterm);
2039               bfd_h_put_32 (abfd, ninit, &w.ninit_nterm);
2040               bfd_h_put_64 (abfd, module->objc_module_info_addr,
2041                             &w.objc_module_info_addr);
2042               bfd_h_put_32 (abfd, module->objc_module_info_size,
2043                             &w.objc_module_info_size);
2044
2045               if (bfd_bwrite ((void *) &w, sizeof (w), abfd) != sizeof (w))
2046                 return FALSE;
2047             }
2048           else
2049             {
2050               struct mach_o_dylib_module_external n;
2051
2052               bfd_h_put_32 (abfd, module->module_name_idx, &n.module_name);
2053               bfd_h_put_32 (abfd, module->iextdefsym, &n.iextdefsym);
2054               bfd_h_put_32 (abfd, module->nextdefsym, &n.nextdefsym);
2055               bfd_h_put_32 (abfd, module->irefsym, &n.irefsym);
2056               bfd_h_put_32 (abfd, module->nrefsym, &n.nrefsym);
2057               bfd_h_put_32 (abfd, module->ilocalsym, &n.ilocalsym);
2058               bfd_h_put_32 (abfd, module->nlocalsym, &n.nlocalsym);
2059               bfd_h_put_32 (abfd, module->iextrel, &n.iextrel);
2060               bfd_h_put_32 (abfd, module->nextrel, &n.nextrel);
2061               bfd_h_put_32 (abfd, iinit, &n.iinit_iterm);
2062               bfd_h_put_32 (abfd, ninit, &n.ninit_nterm);
2063               bfd_h_put_32 (abfd, module->objc_module_info_addr,
2064                             &n.objc_module_info_addr);
2065               bfd_h_put_32 (abfd, module->objc_module_info_size,
2066                             &n.objc_module_info_size);
2067
2068               if (bfd_bwrite ((void *) &n, sizeof (n), abfd) != sizeof (n))
2069                 return FALSE;
2070             }
2071         }
2072     }
2073
2074   if (cmd->ntoc != 0)
2075     {
2076       unsigned int i;
2077
2078       if (bfd_seek (abfd, cmd->tocoff, SEEK_SET) != 0)
2079         return FALSE;
2080
2081       for (i = 0; i < cmd->ntoc; i++)
2082         {
2083           struct mach_o_dylib_table_of_contents_external raw;
2084           bfd_mach_o_dylib_table_of_content *toc = &cmd->dylib_toc[i];
2085
2086           bfd_h_put_32 (abfd, toc->symbol_index, &raw.symbol_index);
2087           bfd_h_put_32 (abfd, toc->module_index, &raw.module_index);
2088
2089           if (bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw))
2090             return FALSE;
2091         }
2092     }
2093
2094   if (cmd->nindirectsyms > 0)
2095     {
2096       unsigned int i;
2097
2098       if (bfd_seek (abfd, cmd->indirectsymoff, SEEK_SET) != 0)
2099         return FALSE;
2100
2101       for (i = 0; i < cmd->nindirectsyms; ++i)
2102         {
2103           unsigned char raw[4];
2104
2105           bfd_h_put_32 (abfd, cmd->indirect_syms[i], &raw);
2106           if (bfd_bwrite (raw, sizeof (raw), abfd) != sizeof (raw))
2107             return FALSE;
2108         }
2109     }
2110
2111   if (cmd->nextrefsyms != 0)
2112     {
2113       unsigned int i;
2114
2115       if (bfd_seek (abfd, cmd->extrefsymoff, SEEK_SET) != 0)
2116         return FALSE;
2117
2118       for (i = 0; i < cmd->nextrefsyms; i++)
2119         {
2120           unsigned long v;
2121           unsigned char raw[4];
2122           bfd_mach_o_dylib_reference *ref = &cmd->ext_refs[i];
2123
2124           /* Fields isym and flags are written as bit-fields, thus we need
2125              a specific processing for endianness.  */
2126
2127           if (bfd_big_endian (abfd))
2128             {
2129               v = ((ref->isym & 0xffffff) << 8);
2130               v |= ref->flags & 0xff;
2131             }
2132           else
2133             {
2134               v = ref->isym  & 0xffffff;
2135               v |= ((ref->flags & 0xff) << 24);
2136             }
2137
2138           bfd_h_put_32 (abfd, v, raw);
2139           if (bfd_bwrite (raw, sizeof (raw), abfd) != sizeof (raw))
2140             return FALSE;
2141         }
2142     }
2143
2144   /* The command.  */
2145   if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0)
2146     return FALSE;
2147   else
2148     {
2149       struct mach_o_dysymtab_command_external raw;
2150
2151       bfd_h_put_32 (abfd, cmd->ilocalsym, &raw.ilocalsym);
2152       bfd_h_put_32 (abfd, cmd->nlocalsym, &raw.nlocalsym);
2153       bfd_h_put_32 (abfd, cmd->iextdefsym, &raw.iextdefsym);
2154       bfd_h_put_32 (abfd, cmd->nextdefsym, &raw.nextdefsym);
2155       bfd_h_put_32 (abfd, cmd->iundefsym, &raw.iundefsym);
2156       bfd_h_put_32 (abfd, cmd->nundefsym, &raw.nundefsym);
2157       bfd_h_put_32 (abfd, cmd->tocoff, &raw.tocoff);
2158       bfd_h_put_32 (abfd, cmd->ntoc, &raw.ntoc);
2159       bfd_h_put_32 (abfd, cmd->modtaboff, &raw.modtaboff);
2160       bfd_h_put_32 (abfd, cmd->nmodtab, &raw.nmodtab);
2161       bfd_h_put_32 (abfd, cmd->extrefsymoff, &raw.extrefsymoff);
2162       bfd_h_put_32 (abfd, cmd->nextrefsyms, &raw.nextrefsyms);
2163       bfd_h_put_32 (abfd, cmd->indirectsymoff, &raw.indirectsymoff);
2164       bfd_h_put_32 (abfd, cmd->nindirectsyms, &raw.nindirectsyms);
2165       bfd_h_put_32 (abfd, cmd->extreloff, &raw.extreloff);
2166       bfd_h_put_32 (abfd, cmd->nextrel, &raw.nextrel);
2167       bfd_h_put_32 (abfd, cmd->locreloff, &raw.locreloff);
2168       bfd_h_put_32 (abfd, cmd->nlocrel, &raw.nlocrel);
2169
2170       if (bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw))
2171         return FALSE;
2172     }
2173
2174   return TRUE;
2175 }
2176
2177 static unsigned
2178 bfd_mach_o_primary_symbol_sort_key (bfd_mach_o_asymbol *s)
2179 {
2180   unsigned mtyp = s->n_type & BFD_MACH_O_N_TYPE;
2181
2182   /* Just leave debug symbols where they are (pretend they are local, and
2183      then they will just be sorted on position).  */
2184   if (s->n_type & BFD_MACH_O_N_STAB)
2185     return 0;
2186
2187   /* Local (we should never see an undefined local AFAICT).  */
2188   if (! (s->n_type & (BFD_MACH_O_N_EXT | BFD_MACH_O_N_PEXT)))
2189     return 0;
2190
2191   /* Common symbols look like undefined externs.  */
2192   if (mtyp == BFD_MACH_O_N_UNDF)
2193     return 2;
2194
2195   /* A defined non-local, non-debug symbol.  */
2196   return 1;
2197 }
2198
2199 static int
2200 bfd_mach_o_cf_symbols (const void *a, const void *b)
2201 {
2202   bfd_mach_o_asymbol *sa = *(bfd_mach_o_asymbol **) a;
2203   bfd_mach_o_asymbol *sb = *(bfd_mach_o_asymbol **) b;
2204   unsigned int soa, sob;
2205
2206   soa = bfd_mach_o_primary_symbol_sort_key (sa);
2207   sob = bfd_mach_o_primary_symbol_sort_key (sb);
2208   if (soa < sob)
2209     return -1;
2210
2211   if (soa > sob)
2212     return 1;
2213
2214   /* If it's local or stab, just preserve the input order.  */
2215   if (soa == 0)
2216     {
2217       if (sa->symbol.udata.i < sb->symbol.udata.i)
2218         return -1;
2219       if (sa->symbol.udata.i > sb->symbol.udata.i)
2220         return  1;
2221
2222       /* This is probably an error.  */
2223       return 0;
2224     }
2225
2226   /* The second sort key is name.  */
2227   return strcmp (sa->symbol.name, sb->symbol.name);
2228 }
2229
2230 /* Process the symbols.
2231
2232    This should be OK for single-module files - but it is not likely to work
2233    for multi-module shared libraries.
2234
2235    (a) If the application has not filled in the relevant mach-o fields, make
2236        an estimate.
2237
2238    (b) Order them, like this:
2239         (  i) local.
2240                 (unsorted)
2241         ( ii) external defined
2242                 (by name)
2243         (iii) external undefined/common
2244                 (by name)
2245         ( iv) common
2246                 (by name)
2247 */
2248
2249 static bfd_boolean
2250 bfd_mach_o_mangle_symbols (bfd *abfd)
2251 {
2252   unsigned long i;
2253   asymbol **symbols = bfd_get_outsymbols (abfd);
2254
2255   if (symbols == NULL || bfd_get_symcount (abfd) == 0)
2256     return TRUE;
2257
2258   for (i = 0; i < bfd_get_symcount (abfd); i++)
2259     {
2260       bfd_mach_o_asymbol *s = (bfd_mach_o_asymbol *)symbols[i];
2261
2262       /* We use this value, which is out-of-range as a symbol index, to signal
2263          that the mach-o-specific data are not filled in and need to be created
2264          from the bfd values.  It is much preferable for the application to do
2265          this, since more meaningful diagnostics can be made that way.  */
2266
2267       if (s->symbol.udata.i == SYM_MACHO_FIELDS_UNSET)
2268         {
2269           /* No symbol information has been set - therefore determine
2270              it from the bfd symbol flags/info.  */
2271           if (s->symbol.section == bfd_abs_section_ptr)
2272             s->n_type = BFD_MACH_O_N_ABS;
2273           else if (s->symbol.section == bfd_und_section_ptr)
2274             {
2275               s->n_type = BFD_MACH_O_N_UNDF;
2276               if (s->symbol.flags & BSF_WEAK)
2277                 s->n_desc |= BFD_MACH_O_N_WEAK_REF;
2278               /* mach-o automatically makes undefined symbols extern.  */
2279               s->n_type |= BFD_MACH_O_N_EXT;
2280               s->symbol.flags |= BSF_GLOBAL;
2281             }
2282           else if (s->symbol.section == bfd_com_section_ptr)
2283             {
2284               s->n_type = BFD_MACH_O_N_UNDF | BFD_MACH_O_N_EXT;
2285               s->symbol.flags |= BSF_GLOBAL;
2286             }
2287           else
2288             s->n_type = BFD_MACH_O_N_SECT;
2289
2290           if (s->symbol.flags & BSF_GLOBAL)
2291             s->n_type |= BFD_MACH_O_N_EXT;
2292         }
2293
2294       /* Put the section index in, where required.  */
2295       if ((s->symbol.section != bfd_abs_section_ptr
2296           && s->symbol.section != bfd_und_section_ptr
2297           && s->symbol.section != bfd_com_section_ptr)
2298           || ((s->n_type & BFD_MACH_O_N_STAB) != 0
2299                && s->symbol.name == NULL))
2300         s->n_sect = s->symbol.section->output_section->target_index;
2301
2302       /* Number to preserve order for local and debug syms.  */
2303       s->symbol.udata.i = i;
2304     }
2305
2306   /* Sort the symbols.  */
2307   qsort ((void *) symbols, (size_t) bfd_get_symcount (abfd),
2308          sizeof (asymbol *), bfd_mach_o_cf_symbols);
2309
2310   for (i = 0; i < bfd_get_symcount (abfd); ++i)
2311     {
2312       bfd_mach_o_asymbol *s = (bfd_mach_o_asymbol *)symbols[i];
2313       s->symbol.udata.i = i;  /* renumber.  */
2314     }
2315
2316   return TRUE;
2317 }
2318
2319 /* We build a flat table of sections, which can be re-ordered if necessary.
2320    Fill in the section number and other mach-o-specific data.  */
2321
2322 static bfd_boolean
2323 bfd_mach_o_mangle_sections (bfd *abfd, bfd_mach_o_data_struct *mdata)
2324 {
2325   asection *sec;
2326   unsigned target_index;
2327   unsigned nsect;
2328
2329   nsect = bfd_count_sections (abfd);
2330
2331   /* Don't do it if it's already set - assume the application knows what it's
2332      doing.  */
2333   if (mdata->nsects == nsect
2334       && (mdata->nsects == 0 || mdata->sections != NULL))
2335     return TRUE;
2336
2337   mdata->nsects = nsect;
2338   mdata->sections = bfd_alloc (abfd,
2339                                mdata->nsects * sizeof (bfd_mach_o_section *));
2340   if (mdata->sections == NULL)
2341     return FALSE;
2342
2343   /* We need to check that this can be done...  */
2344   if (nsect > 255)
2345     (*_bfd_error_handler) (_("mach-o: there are too many sections (%d)"
2346                              " maximum is 255,\n"), nsect);
2347
2348   /* Create Mach-O sections.
2349      Section type, attribute and align should have been set when the
2350      section was created - either read in or specified.  */
2351   target_index = 0;
2352   for (sec = abfd->sections; sec; sec = sec->next)
2353     {
2354       unsigned bfd_align = bfd_get_section_alignment (abfd, sec);
2355       bfd_mach_o_section *msect = bfd_mach_o_get_mach_o_section (sec);
2356
2357       mdata->sections[target_index] = msect;
2358
2359       msect->addr = bfd_get_section_vma (abfd, sec);
2360       msect->size = bfd_get_section_size (sec);
2361
2362       /* Use the largest alignment set, in case it was bumped after the
2363          section was created.  */
2364       msect->align = msect->align > bfd_align ? msect->align : bfd_align;
2365
2366       msect->offset = 0;
2367       sec->target_index = ++target_index;
2368     }
2369
2370   return TRUE;
2371 }
2372
2373 bfd_boolean
2374 bfd_mach_o_write_contents (bfd *abfd)
2375 {
2376   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
2377   bfd_mach_o_load_command *cmd;
2378   bfd_mach_o_symtab_command *symtab = NULL;
2379   bfd_mach_o_dysymtab_command *dysymtab = NULL;
2380   bfd_mach_o_segment_command *linkedit = NULL;
2381
2382   /* Make the commands, if not already present.  */
2383   if (!abfd->output_has_begun && !bfd_mach_o_build_commands (abfd))
2384     return FALSE;
2385   abfd->output_has_begun = TRUE;
2386
2387   /* Write the header.  */
2388   if (!bfd_mach_o_write_header (abfd, &mdata->header))
2389     return FALSE;
2390
2391   /* First pass: allocate the linkedit segment.  */
2392   for (cmd = mdata->first_command; cmd != NULL; cmd = cmd->next)
2393     switch (cmd->type)
2394       {
2395       case BFD_MACH_O_LC_SEGMENT_64:
2396       case BFD_MACH_O_LC_SEGMENT:
2397         if (strcmp (cmd->command.segment.segname, "__LINKEDIT") == 0)
2398           linkedit = &cmd->command.segment;
2399         break;
2400       case BFD_MACH_O_LC_SYMTAB:
2401         symtab = &cmd->command.symtab;
2402         break;
2403       case BFD_MACH_O_LC_DYSYMTAB:
2404         dysymtab = &cmd->command.dysymtab;
2405         break;
2406       case BFD_MACH_O_LC_DYLD_INFO:
2407         {
2408           bfd_mach_o_dyld_info_command *di = &cmd->command.dyld_info;
2409
2410           if (di->rebase_size != 0)
2411             {
2412               di->rebase_off = mdata->filelen;
2413               mdata->filelen += di->rebase_size;
2414             }
2415           if (di->bind_size != 0)
2416             {
2417               di->bind_off = mdata->filelen;
2418               mdata->filelen += di->bind_size;
2419             }
2420           if (di->weak_bind_size != 0)
2421             {
2422               di->weak_bind_off = mdata->filelen;
2423               mdata->filelen += di->weak_bind_size;
2424             }
2425           if (di->lazy_bind_size != 0)
2426             {
2427               di->lazy_bind_off = mdata->filelen;
2428               mdata->filelen += di->lazy_bind_size;
2429             }
2430           if (di->export_size != 0)
2431             {
2432               di->export_off = mdata->filelen;
2433               mdata->filelen += di->export_size;
2434             }
2435         }
2436         break;
2437       case BFD_MACH_O_LC_LOAD_DYLIB:
2438       case BFD_MACH_O_LC_LOAD_DYLINKER:
2439       case BFD_MACH_O_LC_MAIN:
2440         /* Nothing to do.  */
2441         break;
2442       default:
2443         (*_bfd_error_handler)
2444           (_("unable to allocate data for load command 0x%lx"),
2445            (unsigned long) cmd->type);
2446         break;
2447       }
2448
2449   /* Specially handle symtab and dysymtab.  */
2450
2451   /* Pre-allocate the symbol table (but not the string table).  The reason
2452      is that the dysymtab is after the symbol table but before the string
2453      table (required by the native strip tool).  */
2454   if (symtab != NULL)
2455     {
2456       unsigned int symlen;
2457       unsigned int wide = bfd_mach_o_wide_p (abfd);
2458
2459       symlen = wide ? BFD_MACH_O_NLIST_64_SIZE : BFD_MACH_O_NLIST_SIZE;
2460
2461       /* Align for symbols.  */
2462       mdata->filelen = FILE_ALIGN (mdata->filelen, wide ? 3 : 2);
2463       symtab->symoff = mdata->filelen;
2464
2465       symtab->nsyms = bfd_get_symcount (abfd);
2466       mdata->filelen += symtab->nsyms * symlen;
2467     }
2468
2469   /* Build the dysymtab.  */
2470   if (dysymtab != NULL)
2471     if (!bfd_mach_o_build_dysymtab (abfd, dysymtab))
2472       return FALSE;
2473
2474   /* Write symtab and strtab.  */
2475   if (symtab != NULL)
2476     if (!bfd_mach_o_write_symtab_content (abfd, symtab))
2477       return FALSE;
2478
2479   /* Adjust linkedit size.  */
2480   if (linkedit != NULL)
2481     {
2482       /* bfd_vma pagemask = bfd_mach_o_get_backend_data (abfd)->page_size - 1; */
2483
2484       linkedit->vmsize = mdata->filelen - linkedit->fileoff;
2485       /* linkedit->vmsize = (linkedit->vmsize + pagemask) & ~pagemask; */
2486       linkedit->filesize = mdata->filelen - linkedit->fileoff;
2487
2488       linkedit->initprot = BFD_MACH_O_PROT_READ;
2489       linkedit->maxprot = BFD_MACH_O_PROT_READ | BFD_MACH_O_PROT_WRITE
2490         | BFD_MACH_O_PROT_EXECUTE;
2491     }
2492
2493   /* Second pass: write commands.  */
2494   for (cmd = mdata->first_command; cmd != NULL; cmd = cmd->next)
2495     {
2496       struct mach_o_load_command_external raw;
2497       unsigned long typeflag;
2498
2499       typeflag = cmd->type | (cmd->type_required ? BFD_MACH_O_LC_REQ_DYLD : 0);
2500
2501       bfd_h_put_32 (abfd, typeflag, raw.cmd);
2502       bfd_h_put_32 (abfd, cmd->len, raw.cmdsize);
2503
2504       if (bfd_seek (abfd, cmd->offset, SEEK_SET) != 0
2505           || bfd_bwrite (&raw, BFD_MACH_O_LC_SIZE, abfd) != 8)
2506         return FALSE;
2507
2508       switch (cmd->type)
2509         {
2510         case BFD_MACH_O_LC_SEGMENT:
2511           if (!bfd_mach_o_write_segment_32 (abfd, cmd))
2512             return FALSE;
2513           break;
2514         case BFD_MACH_O_LC_SEGMENT_64:
2515           if (!bfd_mach_o_write_segment_64 (abfd, cmd))
2516             return FALSE;
2517           break;
2518         case BFD_MACH_O_LC_SYMTAB:
2519           if (!bfd_mach_o_write_symtab (abfd, cmd))
2520             return FALSE;
2521           break;
2522         case BFD_MACH_O_LC_DYSYMTAB:
2523           if (!bfd_mach_o_write_dysymtab (abfd, cmd))
2524             return FALSE;
2525           break;
2526         case BFD_MACH_O_LC_THREAD:
2527         case BFD_MACH_O_LC_UNIXTHREAD:
2528           if (!bfd_mach_o_write_thread (abfd, cmd))
2529             return FALSE;
2530           break;
2531         case BFD_MACH_O_LC_LOAD_DYLIB:
2532           if (!bfd_mach_o_write_dylib (abfd, cmd))
2533             return FALSE;
2534           break;
2535         case BFD_MACH_O_LC_LOAD_DYLINKER:
2536           if (!bfd_mach_o_write_dylinker (abfd, cmd))
2537             return FALSE;
2538           break;
2539         case BFD_MACH_O_LC_MAIN:
2540           if (!bfd_mach_o_write_main (abfd, cmd))
2541             return FALSE;
2542           break;
2543         case BFD_MACH_O_LC_DYLD_INFO:
2544           if (!bfd_mach_o_write_dyld_info (abfd, cmd))
2545             return FALSE;
2546           break;
2547         default:
2548           (*_bfd_error_handler)
2549             (_("unable to write unknown load command 0x%lx"),
2550              (unsigned long) cmd->type);
2551           return FALSE;
2552         }
2553     }
2554
2555   return TRUE;
2556 }
2557
2558 static void
2559 bfd_mach_o_append_section_to_segment (bfd_mach_o_segment_command *seg,
2560                                       bfd_mach_o_section *s)
2561 {
2562   if (seg->sect_head == NULL)
2563     seg->sect_head = s;
2564   else
2565     seg->sect_tail->next = s;
2566   seg->sect_tail = s;
2567 }
2568
2569 /* Create section Mach-O flags from BFD flags.  */
2570
2571 static void
2572 bfd_mach_o_set_section_flags_from_bfd (bfd *abfd ATTRIBUTE_UNUSED,
2573                                        asection *sec)
2574 {
2575   flagword bfd_flags;
2576   bfd_mach_o_section *s = bfd_mach_o_get_mach_o_section (sec);
2577
2578   /* Create default flags.  */
2579   bfd_flags = bfd_get_section_flags (abfd, sec);
2580   if ((bfd_flags & SEC_CODE) == SEC_CODE)
2581     s->flags = BFD_MACH_O_S_ATTR_PURE_INSTRUCTIONS
2582       | BFD_MACH_O_S_ATTR_SOME_INSTRUCTIONS
2583       | BFD_MACH_O_S_REGULAR;
2584   else if ((bfd_flags & (SEC_ALLOC | SEC_LOAD)) == SEC_ALLOC)
2585     s->flags = BFD_MACH_O_S_ZEROFILL;
2586   else if (bfd_flags & SEC_DEBUGGING)
2587     s->flags = BFD_MACH_O_S_REGULAR |  BFD_MACH_O_S_ATTR_DEBUG;
2588   else
2589     s->flags = BFD_MACH_O_S_REGULAR;
2590 }
2591
2592 static bfd_boolean
2593 bfd_mach_o_build_obj_seg_command (bfd *abfd, bfd_mach_o_segment_command *seg)
2594 {
2595   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
2596   unsigned int i, j;
2597
2598   seg->vmaddr = 0;
2599   seg->fileoff = mdata->filelen;
2600   seg->initprot = BFD_MACH_O_PROT_READ | BFD_MACH_O_PROT_WRITE
2601     | BFD_MACH_O_PROT_EXECUTE;
2602   seg->maxprot = seg->initprot;
2603
2604   /*  Append sections to the segment.
2605
2606       This is a little tedious, we have to honor the need to account zerofill
2607       sections after all the rest.  This forces us to do the calculation of
2608       total vmsize in three passes so that any alignment increments are
2609       properly accounted.  */
2610   for (i = 0; i < mdata->nsects; ++i)
2611     {
2612       bfd_mach_o_section *s = mdata->sections[i];
2613       asection *sec = s->bfdsection;
2614
2615       /* Although we account for zerofill section sizes in vm order, they are
2616          placed in the file in source sequence.  */
2617       bfd_mach_o_append_section_to_segment (seg, s);
2618       s->offset = 0;
2619
2620       /* Zerofill sections have zero file size & offset, the only content
2621          written to the file is the symbols.  */
2622       if ((s->flags & BFD_MACH_O_SECTION_TYPE_MASK) == BFD_MACH_O_S_ZEROFILL
2623           || ((s->flags & BFD_MACH_O_SECTION_TYPE_MASK)
2624               == BFD_MACH_O_S_GB_ZEROFILL))
2625         continue;
2626
2627       /* The Darwin system tools (in MH_OBJECT files, at least) always account
2628          sections, even those with zero size.  */
2629       if (s->size > 0)
2630         {
2631           seg->vmsize = FILE_ALIGN (seg->vmsize, s->align);
2632           seg->vmsize += s->size;
2633
2634           /* MH_OBJECT files have unaligned content.  */
2635           if (1)
2636             {
2637               seg->filesize = FILE_ALIGN (seg->filesize, s->align);
2638               mdata->filelen = FILE_ALIGN (mdata->filelen, s->align);
2639             }
2640           seg->filesize += s->size;
2641
2642           /* The system tools write even zero-sized sections with an offset
2643              field set to the current file position.  */
2644           s->offset = mdata->filelen;
2645         }
2646
2647       sec->filepos = s->offset;
2648       mdata->filelen += s->size;
2649     }
2650
2651   /* Now pass through again, for zerofill, only now we just update the
2652      vmsize, and then for zerofill_GB.  */
2653   for (j = 0; j < 2; j++)
2654     {
2655       unsigned int stype;
2656
2657       if (j == 0)
2658         stype = BFD_MACH_O_S_ZEROFILL;
2659       else
2660         stype = BFD_MACH_O_S_GB_ZEROFILL;
2661
2662       for (i = 0; i < mdata->nsects; ++i)
2663         {
2664           bfd_mach_o_section *s = mdata->sections[i];
2665
2666           if ((s->flags & BFD_MACH_O_SECTION_TYPE_MASK) != stype)
2667             continue;
2668
2669           if (s->size > 0)
2670             {
2671               seg->vmsize = FILE_ALIGN (seg->vmsize, s->align);
2672               seg->vmsize += s->size;
2673             }
2674         }
2675     }
2676
2677   /* Allocate space for the relocations.  */
2678   mdata->filelen = FILE_ALIGN (mdata->filelen, 2);
2679
2680   for (i = 0; i < mdata->nsects; ++i)
2681     {
2682       bfd_mach_o_section *ms = mdata->sections[i];
2683       asection *sec = ms->bfdsection;
2684
2685       ms->nreloc = sec->reloc_count;
2686       if (ms->nreloc == 0)
2687         {
2688           /* Clear nreloc and reloff if there is no relocs.  */
2689           ms->reloff = 0;
2690           continue;
2691         }
2692       sec->rel_filepos = mdata->filelen;
2693       ms->reloff = sec->rel_filepos;
2694       mdata->filelen += sec->reloc_count * BFD_MACH_O_RELENT_SIZE;
2695     }
2696
2697   return TRUE;
2698 }
2699
2700 static bfd_boolean
2701 bfd_mach_o_build_exec_seg_command (bfd *abfd, bfd_mach_o_segment_command *seg)
2702 {
2703   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
2704   unsigned int i;
2705   bfd_vma pagemask = bfd_mach_o_get_backend_data (abfd)->page_size - 1;
2706   bfd_vma vma;
2707   bfd_mach_o_section *s;
2708
2709   seg->vmsize = 0;
2710
2711   seg->fileoff = mdata->filelen;
2712   seg->maxprot = 0;
2713   seg->initprot = 0;
2714   seg->flags = 0;
2715
2716   /*  Append sections to the segment.  We assume they are properly ordered
2717       by vma (but we check that).  */
2718   vma = 0;
2719   for (i = 0; i < mdata->nsects; ++i)
2720     {
2721       s = mdata->sections[i];
2722
2723       /* Consider only sections for this segment.  */
2724       if (strcmp (seg->segname, s->segname) != 0)
2725         continue;
2726
2727       bfd_mach_o_append_section_to_segment (seg, s);
2728
2729       BFD_ASSERT (s->addr >= vma);
2730       vma = s->addr + s->size;
2731     }
2732
2733   /* Set segment file offset: make it page aligned.  */
2734   vma = seg->sect_head->addr;
2735   seg->vmaddr = vma & ~pagemask;
2736   if ((mdata->filelen & pagemask) > (vma & pagemask))
2737     mdata->filelen += pagemask + 1;
2738   seg->fileoff = mdata->filelen & ~pagemask;
2739   mdata->filelen = seg->fileoff + (vma & pagemask);
2740
2741   /* Set section file offset.  */
2742   for (s = seg->sect_head; s != NULL; s = s->next)
2743     {
2744       asection *sec = s->bfdsection;
2745       flagword flags = bfd_get_section_flags (abfd, sec);
2746
2747       /* Adjust segment size.  */
2748       seg->vmsize = FILE_ALIGN (seg->vmsize, s->align);
2749       seg->vmsize += s->size;
2750
2751       /* File offset and length.  */
2752       seg->filesize = FILE_ALIGN (seg->filesize, s->align);
2753
2754       if ((s->flags & BFD_MACH_O_SECTION_TYPE_MASK) != BFD_MACH_O_S_ZEROFILL
2755           && ((s->flags & BFD_MACH_O_SECTION_TYPE_MASK)
2756               != BFD_MACH_O_S_GB_ZEROFILL))
2757         {
2758           mdata->filelen = FILE_ALIGN (mdata->filelen, s->align);
2759
2760           s->offset = mdata->filelen;
2761           s->bfdsection->filepos = s->offset;
2762
2763           seg->filesize += s->size;
2764           mdata->filelen += s->size;
2765         }
2766       else
2767         {
2768           s->offset = 0;
2769           s->bfdsection->filepos = 0;
2770         }
2771
2772       /* Set protection.  */
2773       if (flags & SEC_LOAD)
2774         {
2775           if (flags & SEC_CODE)
2776             seg->initprot |= BFD_MACH_O_PROT_READ | BFD_MACH_O_PROT_EXECUTE;
2777           if ((flags & (SEC_DATA | SEC_READONLY)) == SEC_DATA)
2778             seg->initprot |= BFD_MACH_O_PROT_WRITE | BFD_MACH_O_PROT_READ;
2779         }
2780
2781       /* Relocs shouldn't appear in non-object files.  */
2782       if (s->bfdsection->reloc_count != 0)
2783         return FALSE;
2784     }
2785
2786   /* Set maxprot.  */
2787   if (seg->initprot != 0)
2788     seg->maxprot = BFD_MACH_O_PROT_READ | BFD_MACH_O_PROT_WRITE
2789                  | BFD_MACH_O_PROT_EXECUTE;
2790   else
2791     seg->maxprot = 0;
2792
2793   /* Round segment size (and file size).  */
2794   seg->vmsize = (seg->vmsize + pagemask) & ~pagemask;
2795   seg->filesize = (seg->filesize + pagemask) & ~pagemask;
2796   mdata->filelen = (mdata->filelen + pagemask) & ~pagemask;
2797
2798   return TRUE;
2799 }
2800
2801 /* Layout the commands: set commands size and offset, set ncmds and sizeofcmds
2802    fields in header.  */
2803
2804 static void
2805 bfd_mach_o_layout_commands (bfd_mach_o_data_struct *mdata)
2806 {
2807   unsigned wide = mach_o_wide_p (&mdata->header);
2808   unsigned int hdrlen;
2809   ufile_ptr offset;
2810   bfd_mach_o_load_command *cmd;
2811   unsigned int align;
2812
2813   hdrlen = wide ? BFD_MACH_O_HEADER_64_SIZE : BFD_MACH_O_HEADER_SIZE;
2814   align = wide ? 8 - 1 : 4 - 1;
2815   offset = hdrlen;
2816   mdata->header.ncmds = 0;
2817
2818   for (cmd = mdata->first_command; cmd; cmd = cmd->next)
2819     {
2820       mdata->header.ncmds++;
2821       cmd->offset = offset;
2822
2823       switch (cmd->type)
2824         {
2825         case BFD_MACH_O_LC_SEGMENT_64:
2826           cmd->len = BFD_MACH_O_LC_SEGMENT_64_SIZE
2827             + BFD_MACH_O_SECTION_64_SIZE * cmd->command.segment.nsects;
2828           break;
2829         case BFD_MACH_O_LC_SEGMENT:
2830           cmd->len = BFD_MACH_O_LC_SEGMENT_SIZE
2831             + BFD_MACH_O_SECTION_SIZE * cmd->command.segment.nsects;
2832           break;
2833         case BFD_MACH_O_LC_SYMTAB:
2834           cmd->len = sizeof (struct mach_o_symtab_command_external)
2835             + BFD_MACH_O_LC_SIZE;
2836           break;
2837         case BFD_MACH_O_LC_DYSYMTAB:
2838           cmd->len = sizeof (struct mach_o_dysymtab_command_external)
2839                  + BFD_MACH_O_LC_SIZE;
2840           break;
2841         case BFD_MACH_O_LC_LOAD_DYLIB:
2842           cmd->len = sizeof (struct mach_o_dylib_command_external)
2843                  + BFD_MACH_O_LC_SIZE;
2844           cmd->command.dylib.name_offset = cmd->len;
2845           cmd->len += strlen (cmd->command.dylib.name_str);
2846           cmd->len = (cmd->len + align) & ~align;
2847           break;
2848         case BFD_MACH_O_LC_LOAD_DYLINKER:
2849           cmd->len = sizeof (struct mach_o_str_command_external)
2850                  + BFD_MACH_O_LC_SIZE;
2851           cmd->command.dylinker.name_offset = cmd->len;
2852           cmd->len += strlen (cmd->command.dylinker.name_str);
2853           cmd->len = (cmd->len + align) & ~align;
2854           break;
2855         case BFD_MACH_O_LC_MAIN:
2856           cmd->len = sizeof (struct mach_o_entry_point_command_external)
2857                  + BFD_MACH_O_LC_SIZE;
2858           break;
2859         case BFD_MACH_O_LC_DYLD_INFO:
2860           cmd->len = sizeof (struct mach_o_dyld_info_command_external)
2861                  + BFD_MACH_O_LC_SIZE;
2862           break;
2863         default:
2864           (*_bfd_error_handler)
2865             (_("unable to layout unknown load command 0x%lx"),
2866              (unsigned long) cmd->type);
2867           break;
2868         }
2869
2870       BFD_ASSERT (cmd->len % (align + 1) == 0);
2871       offset += cmd->len;
2872     }
2873   mdata->header.sizeofcmds = offset - hdrlen;
2874   mdata->filelen = offset;
2875 }
2876
2877 /* Subroutine of bfd_mach_o_build_commands: set type, name and nsects of a
2878    segment.  */
2879
2880 static void
2881 bfd_mach_o_init_segment (bfd_mach_o_data_struct *mdata,
2882                          bfd_mach_o_load_command *cmd,
2883                          const char *segname, unsigned int nbr_sect)
2884 {
2885   bfd_mach_o_segment_command *seg = &cmd->command.segment;
2886   unsigned wide = mach_o_wide_p (&mdata->header);
2887
2888   /* Init segment command.  */
2889   cmd->type = wide ? BFD_MACH_O_LC_SEGMENT_64 : BFD_MACH_O_LC_SEGMENT;
2890   cmd->type_required = FALSE;
2891
2892   strcpy (seg->segname, segname);
2893   seg->nsects = nbr_sect;
2894
2895   seg->vmaddr = 0;
2896   seg->vmsize = 0;
2897
2898   seg->fileoff = 0;
2899   seg->filesize = 0;
2900   seg->maxprot = 0;
2901   seg->initprot = 0;
2902   seg->flags = 0;
2903   seg->sect_head = NULL;
2904   seg->sect_tail = NULL;
2905 }
2906
2907 /* Build Mach-O load commands (currently assuming an MH_OBJECT file).
2908    TODO: Other file formats, rebuilding symtab/dysymtab commands for strip
2909    and copy functionality.  */
2910
2911 bfd_boolean
2912 bfd_mach_o_build_commands (bfd *abfd)
2913 {
2914   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
2915   unsigned wide = mach_o_wide_p (&mdata->header);
2916   unsigned int nbr_segcmd = 0;
2917   bfd_mach_o_load_command *commands;
2918   unsigned int nbr_commands;
2919   int symtab_idx = -1;
2920   int dysymtab_idx = -1;
2921   int main_idx = -1;
2922   unsigned int i;
2923
2924   /* Return now if already built.  */
2925   if (mdata->header.ncmds != 0)
2926     return TRUE;
2927
2928   /* Fill in the file type, if not already set.  */
2929   if (mdata->header.filetype == 0)
2930     {
2931       if (abfd->flags & EXEC_P)
2932         mdata->header.filetype = BFD_MACH_O_MH_EXECUTE;
2933       else if (abfd->flags & DYNAMIC)
2934         mdata->header.filetype = BFD_MACH_O_MH_DYLIB;
2935       else
2936         mdata->header.filetype = BFD_MACH_O_MH_OBJECT;
2937     }
2938
2939   /* If hasn't already been done, flatten sections list, and sort
2940      if/when required.  Must be done before the symbol table is adjusted,
2941      since that depends on properly numbered sections.  */
2942   if (mdata->nsects == 0 || mdata->sections == NULL)
2943     if (! bfd_mach_o_mangle_sections (abfd, mdata))
2944       return FALSE;
2945
2946   /* Order the symbol table, fill-in/check mach-o specific fields and
2947      partition out any indirect symbols.  */
2948   if (!bfd_mach_o_mangle_symbols (abfd))
2949     return FALSE;
2950
2951   /* Segment commands.  */
2952   if (mdata->header.filetype == BFD_MACH_O_MH_OBJECT)
2953     {
2954       /* Only one segment for all the sections.  But the segment is
2955          optional if there is no sections.  */
2956       nbr_segcmd = (mdata->nsects > 0) ? 1 : 0;
2957     }
2958   else
2959     {
2960       bfd_mach_o_section *prev_sect = NULL;
2961
2962       /* One pagezero segment and one linkedit segment.  */
2963       nbr_segcmd = 2;
2964
2965       /* Create one segment for associated segment name in sections.
2966          Assume that sections with the same segment name are consecutive.  */
2967       for (i = 0; i < mdata->nsects; i++)
2968         {
2969           bfd_mach_o_section *this_sect = mdata->sections[i];
2970
2971           if (prev_sect == NULL
2972               || strcmp (prev_sect->segname, this_sect->segname) != 0)
2973             {
2974               nbr_segcmd++;
2975               prev_sect = this_sect;
2976             }
2977         }
2978     }
2979
2980   nbr_commands = nbr_segcmd;
2981
2982   /* One command for the symbol table (only if there are symbols.  */
2983   if (bfd_get_symcount (abfd) > 0)
2984     symtab_idx = nbr_commands++;
2985
2986   /* FIXME:
2987      This is a rather crude test for whether we should build a dysymtab.  */
2988   if (bfd_mach_o_should_emit_dysymtab ()
2989       && bfd_get_symcount (abfd))
2990     {
2991       /* If there should be a case where a dysymtab could be emitted without
2992          a symtab (seems improbable), this would need amending.  */
2993       dysymtab_idx = nbr_commands++;
2994     }
2995
2996   /* Add an entry point command.  */
2997   if (mdata->header.filetype == BFD_MACH_O_MH_EXECUTE
2998       && bfd_get_start_address (abfd) != 0)
2999     main_idx = nbr_commands++;
3000
3001   /* Well, we must have a header, at least.  */
3002   mdata->filelen = wide ? BFD_MACH_O_HEADER_64_SIZE : BFD_MACH_O_HEADER_SIZE;
3003
3004   /* A bit unusual, but no content is valid;
3005      as -n empty.s -o empty.o  */
3006   if (nbr_commands == 0)
3007     {
3008       /* Layout commands (well none...) and set headers command fields.  */
3009       bfd_mach_o_layout_commands (mdata);
3010       return TRUE;
3011     }
3012
3013   /* Create commands for segments (and symtabs), prepend them.  */
3014   commands = bfd_zalloc (abfd, nbr_commands * sizeof (bfd_mach_o_load_command));
3015   if (commands == NULL)
3016     return FALSE;
3017   for (i = 0; i < nbr_commands - 1; i++)
3018     commands[i].next = &commands[i + 1];
3019   commands[nbr_commands - 1].next = mdata->first_command;
3020   if (mdata->first_command == NULL)
3021     mdata->last_command = &commands[nbr_commands - 1];
3022   mdata->first_command = &commands[0];
3023
3024   if (mdata->header.filetype == BFD_MACH_O_MH_OBJECT && nbr_segcmd != 0)
3025     {
3026       /* For object file, there is only one segment.  */
3027       bfd_mach_o_init_segment (mdata, &commands[0], "", mdata->nsects);
3028     }
3029   else if (nbr_segcmd != 0)
3030     {
3031       bfd_mach_o_load_command *cmd;
3032
3033       BFD_ASSERT (nbr_segcmd >= 2);
3034
3035       /* The pagezero.  */
3036       cmd = &commands[0];
3037       bfd_mach_o_init_segment (mdata, cmd, "__PAGEZERO", 0);
3038
3039       /* Segments from sections.  */
3040       cmd++;
3041       for (i = 0; i < mdata->nsects;)
3042         {
3043           const char *segname = mdata->sections[i]->segname;
3044           unsigned int nbr_sect = 1;
3045
3046           /* Count number of sections for this segment.  */
3047           for (i++; i < mdata->nsects; i++)
3048             if (strcmp (mdata->sections[i]->segname, segname) == 0)
3049               nbr_sect++;
3050             else
3051               break;
3052
3053           bfd_mach_o_init_segment (mdata, cmd, segname, nbr_sect);
3054           cmd++;
3055         }
3056
3057       /* The linkedit.  */
3058       bfd_mach_o_init_segment (mdata, cmd, "__LINKEDIT", 0);
3059     }
3060
3061   if (symtab_idx >= 0)
3062     {
3063       /* Init symtab command.  */
3064       bfd_mach_o_load_command *cmd = &commands[symtab_idx];
3065
3066       cmd->type = BFD_MACH_O_LC_SYMTAB;
3067       cmd->type_required = FALSE;
3068     }
3069
3070   /* If required, setup symtab command, see comment above about the quality
3071      of this test.  */
3072   if (dysymtab_idx >= 0)
3073     {
3074       bfd_mach_o_load_command *cmd = &commands[dysymtab_idx];
3075
3076       cmd->type = BFD_MACH_O_LC_DYSYMTAB;
3077       cmd->type_required = FALSE;
3078     }
3079
3080   /* Create the main command.  */
3081   if (main_idx >= 0)
3082     {
3083       bfd_mach_o_load_command *cmd = &commands[main_idx];
3084
3085       cmd->type = BFD_MACH_O_LC_MAIN;
3086       cmd->type_required = TRUE;
3087
3088       cmd->command.main.entryoff = 0;
3089       cmd->command.main.stacksize = 0;
3090     }
3091
3092   /* Layout commands.  */
3093   bfd_mach_o_layout_commands (mdata);
3094
3095   /* So, now we have sized the commands and the filelen set to that.
3096      Now we can build the segment command and set the section file offsets.  */
3097   if (mdata->header.filetype == BFD_MACH_O_MH_OBJECT)
3098     {
3099       for (i = 0; i < nbr_segcmd; i++)
3100         if (!bfd_mach_o_build_obj_seg_command
3101             (abfd, &commands[i].command.segment))
3102           return FALSE;
3103     }
3104   else
3105     {
3106       bfd_vma maxvma = 0;
3107
3108       /* Skip pagezero and linkedit segments.  */
3109       for (i = 1; i < nbr_segcmd - 1; i++)
3110         {
3111           bfd_mach_o_segment_command *seg = &commands[i].command.segment;
3112
3113           if (!bfd_mach_o_build_exec_seg_command (abfd, seg))
3114             return FALSE;
3115
3116           if (seg->vmaddr + seg->vmsize > maxvma)
3117             maxvma = seg->vmaddr + seg->vmsize;
3118         }
3119
3120       /* Set the size of __PAGEZERO.  */
3121       commands[0].command.segment.vmsize =
3122         commands[1].command.segment.vmaddr;
3123
3124       /* Set the vma and fileoff of __LINKEDIT.  */
3125       commands[nbr_segcmd - 1].command.segment.vmaddr = maxvma;
3126       commands[nbr_segcmd - 1].command.segment.fileoff = mdata->filelen;
3127
3128       /* Set entry point (once segments have been laid out).  */
3129       if (main_idx >= 0)
3130         commands[main_idx].command.main.entryoff =
3131           bfd_get_start_address (abfd) - commands[1].command.segment.vmaddr;
3132     }
3133
3134   return TRUE;
3135 }
3136
3137 /* Set the contents of a section.  */
3138
3139 bfd_boolean
3140 bfd_mach_o_set_section_contents (bfd *abfd,
3141                                  asection *section,
3142                                  const void * location,
3143                                  file_ptr offset,
3144                                  bfd_size_type count)
3145 {
3146   file_ptr pos;
3147
3148   /* Trying to write the first section contents will trigger the creation of
3149      the load commands if they are not already present.  */
3150   if (!abfd->output_has_begun && !bfd_mach_o_build_commands (abfd))
3151     return FALSE;
3152
3153   if (count == 0)
3154     return TRUE;
3155
3156   pos = section->filepos + offset;
3157   if (bfd_seek (abfd, pos, SEEK_SET) != 0
3158       || bfd_bwrite (location, count, abfd) != count)
3159     return FALSE;
3160
3161   return TRUE;
3162 }
3163
3164 int
3165 bfd_mach_o_sizeof_headers (bfd *a ATTRIBUTE_UNUSED,
3166                            struct bfd_link_info *info ATTRIBUTE_UNUSED)
3167 {
3168   return 0;
3169 }
3170
3171 /* Make an empty symbol.  This is required only because
3172    bfd_make_section_anyway wants to create a symbol for the section.  */
3173
3174 asymbol *
3175 bfd_mach_o_make_empty_symbol (bfd *abfd)
3176 {
3177   asymbol *new_symbol;
3178
3179   new_symbol = bfd_zalloc (abfd, sizeof (bfd_mach_o_asymbol));
3180   if (new_symbol == NULL)
3181     return new_symbol;
3182   new_symbol->the_bfd = abfd;
3183   new_symbol->udata.i = SYM_MACHO_FIELDS_UNSET;
3184   return new_symbol;
3185 }
3186
3187 static bfd_boolean
3188 bfd_mach_o_read_header (bfd *abfd, bfd_mach_o_header *header)
3189 {
3190   struct mach_o_header_external raw;
3191   unsigned int size;
3192   bfd_vma (*get32) (const void *) = NULL;
3193
3194   /* Just read the magic number.  */
3195   if (bfd_seek (abfd, 0, SEEK_SET) != 0
3196       || bfd_bread (raw.magic, sizeof (raw.magic), abfd) != 4)
3197     return FALSE;
3198
3199   if (bfd_getb32 (raw.magic) == BFD_MACH_O_MH_MAGIC)
3200     {
3201       header->byteorder = BFD_ENDIAN_BIG;
3202       header->magic = BFD_MACH_O_MH_MAGIC;
3203       header->version = 1;
3204       get32 = bfd_getb32;
3205     }
3206   else if (bfd_getl32 (raw.magic) == BFD_MACH_O_MH_MAGIC)
3207     {
3208       header->byteorder = BFD_ENDIAN_LITTLE;
3209       header->magic = BFD_MACH_O_MH_MAGIC;
3210       header->version = 1;
3211       get32 = bfd_getl32;
3212     }
3213   else if (bfd_getb32 (raw.magic) == BFD_MACH_O_MH_MAGIC_64)
3214     {
3215       header->byteorder = BFD_ENDIAN_BIG;
3216       header->magic = BFD_MACH_O_MH_MAGIC_64;
3217       header->version = 2;
3218       get32 = bfd_getb32;
3219     }
3220   else if (bfd_getl32 (raw.magic) == BFD_MACH_O_MH_MAGIC_64)
3221     {
3222       header->byteorder = BFD_ENDIAN_LITTLE;
3223       header->magic = BFD_MACH_O_MH_MAGIC_64;
3224       header->version = 2;
3225       get32 = bfd_getl32;
3226     }
3227   else
3228     {
3229       header->byteorder = BFD_ENDIAN_UNKNOWN;
3230       return FALSE;
3231     }
3232
3233   /* Once the size of the header is known, read the full header.  */
3234   size = mach_o_wide_p (header) ?
3235     BFD_MACH_O_HEADER_64_SIZE : BFD_MACH_O_HEADER_SIZE;
3236
3237   if (bfd_seek (abfd, 0, SEEK_SET) != 0
3238       || bfd_bread (&raw, size, abfd) != size)
3239     return FALSE;
3240
3241   header->cputype = (*get32) (raw.cputype);
3242   header->cpusubtype = (*get32) (raw.cpusubtype);
3243   header->filetype = (*get32) (raw.filetype);
3244   header->ncmds = (*get32) (raw.ncmds);
3245   header->sizeofcmds = (*get32) (raw.sizeofcmds);
3246   header->flags = (*get32) (raw.flags);
3247
3248   if (mach_o_wide_p (header))
3249     header->reserved = (*get32) (raw.reserved);
3250   else
3251     header->reserved = 0;
3252
3253   return TRUE;
3254 }
3255
3256 bfd_boolean
3257 bfd_mach_o_new_section_hook (bfd *abfd, asection *sec)
3258 {
3259   bfd_mach_o_section *s;
3260   unsigned bfdalign = bfd_get_section_alignment (abfd, sec);
3261
3262   s = bfd_mach_o_get_mach_o_section (sec);
3263   if (s == NULL)
3264     {
3265       flagword bfd_flags;
3266       static const mach_o_section_name_xlat * xlat;
3267
3268       s = (bfd_mach_o_section *) bfd_zalloc (abfd, sizeof (*s));
3269       if (s == NULL)
3270         return FALSE;
3271       sec->used_by_bfd = s;
3272       s->bfdsection = sec;
3273
3274       /* Create the Darwin seg/sect name pair from the bfd name.
3275          If this is a canonical name for which a specific paiting exists
3276          there will also be defined flags, type, attribute and alignment
3277          values.  */
3278       xlat = bfd_mach_o_convert_section_name_to_mach_o (abfd, sec, s);
3279       if (xlat != NULL)
3280         {
3281           s->flags = xlat->macho_sectype | xlat->macho_secattr;
3282           s->align = xlat->sectalign > bfdalign ? xlat->sectalign
3283                                                 : bfdalign;
3284           (void) bfd_set_section_alignment (abfd, sec, s->align);
3285           bfd_flags = bfd_get_section_flags (abfd, sec);
3286           if (bfd_flags == SEC_NO_FLAGS)
3287             bfd_set_section_flags (abfd, sec, xlat->bfd_flags);
3288         }
3289       else
3290         /* Create default flags.  */
3291         bfd_mach_o_set_section_flags_from_bfd (abfd, sec);
3292     }
3293
3294   return _bfd_generic_new_section_hook (abfd, sec);
3295 }
3296
3297 static void
3298 bfd_mach_o_init_section_from_mach_o (bfd *abfd, asection *sec,
3299                                      unsigned long prot)
3300 {
3301   flagword flags;
3302   bfd_mach_o_section *section;
3303
3304   flags = bfd_get_section_flags (abfd, sec);
3305   section = bfd_mach_o_get_mach_o_section (sec);
3306
3307   /* TODO: see if we should use the xlat system for doing this by
3308      preference and fall back to this for unknown sections.  */
3309
3310   if (flags == SEC_NO_FLAGS)
3311     {
3312       /* Try to guess flags.  */
3313       if (section->flags & BFD_MACH_O_S_ATTR_DEBUG)
3314         flags = SEC_DEBUGGING;
3315       else
3316         {
3317           flags = SEC_ALLOC;
3318           if ((section->flags & BFD_MACH_O_SECTION_TYPE_MASK)
3319               != BFD_MACH_O_S_ZEROFILL)
3320             {
3321               flags |= SEC_LOAD;
3322               if (prot & BFD_MACH_O_PROT_EXECUTE)
3323                 flags |= SEC_CODE;
3324               if (prot & BFD_MACH_O_PROT_WRITE)
3325                 flags |= SEC_DATA;
3326               else if (prot & BFD_MACH_O_PROT_READ)
3327                 flags |= SEC_READONLY;
3328             }
3329         }
3330     }
3331   else
3332     {
3333       if ((flags & SEC_DEBUGGING) == 0)
3334         flags |= SEC_ALLOC;
3335     }
3336
3337   if (section->offset != 0)
3338     flags |= SEC_HAS_CONTENTS;
3339   if (section->nreloc != 0)
3340     flags |= SEC_RELOC;
3341
3342   bfd_set_section_flags (abfd, sec, flags);
3343
3344   sec->vma = section->addr;
3345   sec->lma = section->addr;
3346   sec->size = section->size;
3347   sec->filepos = section->offset;
3348   sec->alignment_power = section->align;
3349   sec->segment_mark = 0;
3350   sec->reloc_count = section->nreloc;
3351   sec->rel_filepos = section->reloff;
3352 }
3353
3354 static asection *
3355 bfd_mach_o_make_bfd_section (bfd *abfd,
3356                              const unsigned char *segname,
3357                              const unsigned char *sectname)
3358 {
3359   const char *sname;
3360   flagword flags;
3361
3362   bfd_mach_o_convert_section_name_to_bfd
3363     (abfd, (const char *)segname, (const char *)sectname, &sname, &flags);
3364   if (sname == NULL)
3365     return NULL;
3366
3367   return bfd_make_section_anyway_with_flags (abfd, sname, flags);
3368 }
3369
3370 static asection *
3371 bfd_mach_o_read_section_32 (bfd *abfd,
3372                             unsigned int offset,
3373                             unsigned long prot)
3374 {
3375   struct mach_o_section_32_external raw;
3376   asection *sec;
3377   bfd_mach_o_section *section;
3378
3379   if (bfd_seek (abfd, offset, SEEK_SET) != 0
3380       || (bfd_bread (&raw, BFD_MACH_O_SECTION_SIZE, abfd)
3381           != BFD_MACH_O_SECTION_SIZE))
3382     return NULL;
3383
3384   sec = bfd_mach_o_make_bfd_section (abfd, raw.segname, raw.sectname);
3385   if (sec == NULL)
3386     return NULL;
3387
3388   section = bfd_mach_o_get_mach_o_section (sec);
3389   memcpy (section->segname, raw.segname, sizeof (raw.segname));
3390   section->segname[BFD_MACH_O_SEGNAME_SIZE] = 0;
3391   memcpy (section->sectname, raw.sectname, sizeof (raw.sectname));
3392   section->sectname[BFD_MACH_O_SECTNAME_SIZE] = 0;
3393   section->addr = bfd_h_get_32 (abfd, raw.addr);
3394   section->size = bfd_h_get_32 (abfd, raw.size);
3395   section->offset = bfd_h_get_32 (abfd, raw.offset);
3396   section->align = bfd_h_get_32 (abfd, raw.align);
3397   section->reloff = bfd_h_get_32 (abfd, raw.reloff);
3398   section->nreloc = bfd_h_get_32 (abfd, raw.nreloc);
3399   section->flags = bfd_h_get_32 (abfd, raw.flags);
3400   section->reserved1 = bfd_h_get_32 (abfd, raw.reserved1);
3401   section->reserved2 = bfd_h_get_32 (abfd, raw.reserved2);
3402   section->reserved3 = 0;
3403
3404   bfd_mach_o_init_section_from_mach_o (abfd, sec, prot);
3405
3406   return sec;
3407 }
3408
3409 static asection *
3410 bfd_mach_o_read_section_64 (bfd *abfd,
3411                             unsigned int offset,
3412                             unsigned long prot)
3413 {
3414   struct mach_o_section_64_external raw;
3415   asection *sec;
3416   bfd_mach_o_section *section;
3417
3418   if (bfd_seek (abfd, offset, SEEK_SET) != 0
3419       || (bfd_bread (&raw, BFD_MACH_O_SECTION_64_SIZE, abfd)
3420           != BFD_MACH_O_SECTION_64_SIZE))
3421     return NULL;
3422
3423   sec = bfd_mach_o_make_bfd_section (abfd, raw.segname, raw.sectname);
3424   if (sec == NULL)
3425     return NULL;
3426
3427   section = bfd_mach_o_get_mach_o_section (sec);
3428   memcpy (section->segname, raw.segname, sizeof (raw.segname));
3429   section->segname[BFD_MACH_O_SEGNAME_SIZE] = 0;
3430   memcpy (section->sectname, raw.sectname, sizeof (raw.sectname));
3431   section->sectname[BFD_MACH_O_SECTNAME_SIZE] = 0;
3432   section->addr = bfd_h_get_64 (abfd, raw.addr);
3433   section->size = bfd_h_get_64 (abfd, raw.size);
3434   section->offset = bfd_h_get_32 (abfd, raw.offset);
3435   section->align = bfd_h_get_32 (abfd, raw.align);
3436   section->reloff = bfd_h_get_32 (abfd, raw.reloff);
3437   section->nreloc = bfd_h_get_32 (abfd, raw.nreloc);
3438   section->flags = bfd_h_get_32 (abfd, raw.flags);
3439   section->reserved1 = bfd_h_get_32 (abfd, raw.reserved1);
3440   section->reserved2 = bfd_h_get_32 (abfd, raw.reserved2);
3441   section->reserved3 = bfd_h_get_32 (abfd, raw.reserved3);
3442
3443   bfd_mach_o_init_section_from_mach_o (abfd, sec, prot);
3444
3445   return sec;
3446 }
3447
3448 static asection *
3449 bfd_mach_o_read_section (bfd *abfd,
3450                          unsigned int offset,
3451                          unsigned long prot,
3452                          unsigned int wide)
3453 {
3454   if (wide)
3455     return bfd_mach_o_read_section_64 (abfd, offset, prot);
3456   else
3457     return bfd_mach_o_read_section_32 (abfd, offset, prot);
3458 }
3459
3460 static bfd_boolean
3461 bfd_mach_o_read_symtab_symbol (bfd *abfd,
3462                                bfd_mach_o_symtab_command *sym,
3463                                bfd_mach_o_asymbol *s,
3464                                unsigned long i)
3465 {
3466   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
3467   unsigned int wide = mach_o_wide_p (&mdata->header);
3468   unsigned int symwidth =
3469     wide ? BFD_MACH_O_NLIST_64_SIZE : BFD_MACH_O_NLIST_SIZE;
3470   unsigned int symoff = sym->symoff + (i * symwidth);
3471   struct mach_o_nlist_64_external raw;
3472   unsigned char type = -1;
3473   unsigned char section = -1;
3474   short desc = -1;
3475   symvalue value = -1;
3476   unsigned long stroff = -1;
3477   unsigned int symtype = -1;
3478
3479   BFD_ASSERT (sym->strtab != NULL);
3480
3481   if (bfd_seek (abfd, symoff, SEEK_SET) != 0
3482       || bfd_bread (&raw, symwidth, abfd) != symwidth)
3483     {
3484       (*_bfd_error_handler)
3485         (_("bfd_mach_o_read_symtab_symbol: unable to read %d bytes at %lu"),
3486          symwidth, (unsigned long) symoff);
3487       return FALSE;
3488     }
3489
3490   stroff = bfd_h_get_32 (abfd, raw.n_strx);
3491   type = bfd_h_get_8 (abfd, raw.n_type);
3492   symtype = type & BFD_MACH_O_N_TYPE;
3493   section = bfd_h_get_8 (abfd, raw.n_sect);
3494   desc = bfd_h_get_16 (abfd, raw.n_desc);
3495   if (wide)
3496     value = bfd_h_get_64 (abfd, raw.n_value);
3497   else
3498     value = bfd_h_get_32 (abfd, raw.n_value);
3499
3500   if (stroff >= sym->strsize)
3501     {
3502       (*_bfd_error_handler)
3503         (_("bfd_mach_o_read_symtab_symbol: name out of range (%lu >= %lu)"),
3504          (unsigned long) stroff,
3505          (unsigned long) sym->strsize);
3506       return FALSE;
3507     }
3508
3509   s->symbol.the_bfd = abfd;
3510   s->symbol.name = sym->strtab + stroff;
3511   s->symbol.value = value;
3512   s->symbol.flags = 0x0;
3513   s->symbol.udata.i = i;
3514   s->n_type = type;
3515   s->n_sect = section;
3516   s->n_desc = desc;
3517
3518   if (type & BFD_MACH_O_N_STAB)
3519     {
3520       s->symbol.flags |= BSF_DEBUGGING;
3521       s->symbol.section = bfd_und_section_ptr;
3522       switch (type)
3523         {
3524         case N_FUN:
3525         case N_STSYM:
3526         case N_LCSYM:
3527         case N_BNSYM:
3528         case N_SLINE:
3529         case N_ENSYM:
3530         case N_ECOMM:
3531         case N_ECOML:
3532         case N_GSYM:
3533           if ((section > 0) && (section <= mdata->nsects))
3534             {
3535               s->symbol.section = mdata->sections[section - 1]->bfdsection;
3536               s->symbol.value =
3537                 s->symbol.value - mdata->sections[section - 1]->addr;
3538             }
3539           break;
3540         }
3541     }
3542   else
3543     {
3544       if (type & (BFD_MACH_O_N_PEXT | BFD_MACH_O_N_EXT))
3545         s->symbol.flags |= BSF_GLOBAL;
3546       else
3547         s->symbol.flags |= BSF_LOCAL;
3548
3549       switch (symtype)
3550         {
3551         case BFD_MACH_O_N_UNDF:
3552           if (type == (BFD_MACH_O_N_UNDF | BFD_MACH_O_N_EXT)
3553               && s->symbol.value != 0)
3554             {
3555               /* A common symbol.  */
3556               s->symbol.section = bfd_com_section_ptr;
3557               s->symbol.flags = BSF_NO_FLAGS;
3558             }
3559           else
3560             {
3561               s->symbol.section = bfd_und_section_ptr;
3562               if (s->n_desc & BFD_MACH_O_N_WEAK_REF)
3563                 s->symbol.flags |= BSF_WEAK;
3564             }
3565           break;
3566         case BFD_MACH_O_N_PBUD:
3567           s->symbol.section = bfd_und_section_ptr;
3568           break;
3569         case BFD_MACH_O_N_ABS:
3570           s->symbol.section = bfd_abs_section_ptr;
3571           break;
3572         case BFD_MACH_O_N_SECT:
3573           if ((section > 0) && (section <= mdata->nsects))
3574             {
3575               s->symbol.section = mdata->sections[section - 1]->bfdsection;
3576               s->symbol.value =
3577                 s->symbol.value - mdata->sections[section - 1]->addr;
3578             }
3579           else
3580             {
3581               /* Mach-O uses 0 to mean "no section"; not an error.  */
3582               if (section != 0)
3583                 {
3584                   (*_bfd_error_handler) (_("bfd_mach_o_read_symtab_symbol: "
3585                                            "symbol \"%s\" specified invalid section %d (max %lu): setting to undefined"),
3586                                          s->symbol.name, section, mdata->nsects);
3587                 }
3588               s->symbol.section = bfd_und_section_ptr;
3589             }
3590           break;
3591         case BFD_MACH_O_N_INDR:
3592           /* FIXME: we don't follow the BFD convention as this indirect symbol
3593              won't be followed by the referenced one.  This looks harmless
3594              unless we start using the linker.  */
3595           s->symbol.flags |= BSF_INDIRECT;
3596           s->symbol.section = bfd_ind_section_ptr;
3597           s->symbol.value = 0;
3598           break;
3599         default:
3600           (*_bfd_error_handler) (_("bfd_mach_o_read_symtab_symbol: "
3601                                    "symbol \"%s\" specified invalid type field 0x%x: setting to undefined"),
3602                                  s->symbol.name, symtype);
3603           s->symbol.section = bfd_und_section_ptr;
3604           break;
3605         }
3606     }
3607
3608   return TRUE;
3609 }
3610
3611 bfd_boolean
3612 bfd_mach_o_read_symtab_strtab (bfd *abfd)
3613 {
3614   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
3615   bfd_mach_o_symtab_command *sym = mdata->symtab;
3616
3617   /* Fail if there is no symtab.  */
3618   if (sym == NULL)
3619     return FALSE;
3620
3621   /* Success if already loaded.  */
3622   if (sym->strtab)
3623     return TRUE;
3624
3625   if (abfd->flags & BFD_IN_MEMORY)
3626     {
3627       struct bfd_in_memory *b;
3628
3629       b = (struct bfd_in_memory *) abfd->iostream;
3630
3631       if ((sym->stroff + sym->strsize) > b->size)
3632         {
3633           bfd_set_error (bfd_error_file_truncated);
3634           return FALSE;
3635         }
3636       sym->strtab = (char *) b->buffer + sym->stroff;
3637     }
3638   else
3639     {
3640       sym->strtab = bfd_alloc (abfd, sym->strsize);
3641       if (sym->strtab == NULL)
3642         return FALSE;
3643
3644       if (bfd_seek (abfd, sym->stroff, SEEK_SET) != 0
3645           || bfd_bread (sym->strtab, sym->strsize, abfd) != sym->strsize)
3646         {
3647           bfd_set_error (bfd_error_file_truncated);
3648           return FALSE;
3649         }
3650     }
3651
3652   return TRUE;
3653 }
3654
3655 bfd_boolean
3656 bfd_mach_o_read_symtab_symbols (bfd *abfd)
3657 {
3658   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
3659   bfd_mach_o_symtab_command *sym = mdata->symtab;
3660   unsigned long i;
3661
3662   if (sym == NULL || sym->symbols)
3663     {
3664       /* Return now if there are no symbols or if already loaded.  */
3665       return TRUE;
3666     }
3667
3668   sym->symbols = bfd_alloc (abfd, sym->nsyms * sizeof (bfd_mach_o_asymbol));
3669
3670   if (sym->symbols == NULL)
3671     {
3672       (*_bfd_error_handler) (_("bfd_mach_o_read_symtab_symbols: unable to allocate memory for symbols"));
3673       return FALSE;
3674     }
3675
3676   if (!bfd_mach_o_read_symtab_strtab (abfd))
3677     return FALSE;
3678
3679   for (i = 0; i < sym->nsyms; i++)
3680     {
3681       if (!bfd_mach_o_read_symtab_symbol (abfd, sym, &sym->symbols[i], i))
3682         return FALSE;
3683     }
3684
3685   return TRUE;
3686 }
3687
3688 static const char *
3689 bfd_mach_o_i386_flavour_string (unsigned int flavour)
3690 {
3691   switch ((int) flavour)
3692     {
3693     case BFD_MACH_O_x86_THREAD_STATE32:    return "x86_THREAD_STATE32";
3694     case BFD_MACH_O_x86_FLOAT_STATE32:     return "x86_FLOAT_STATE32";
3695     case BFD_MACH_O_x86_EXCEPTION_STATE32: return "x86_EXCEPTION_STATE32";
3696     case BFD_MACH_O_x86_THREAD_STATE64:    return "x86_THREAD_STATE64";
3697     case BFD_MACH_O_x86_FLOAT_STATE64:     return "x86_FLOAT_STATE64";
3698     case BFD_MACH_O_x86_EXCEPTION_STATE64: return "x86_EXCEPTION_STATE64";
3699     case BFD_MACH_O_x86_THREAD_STATE:      return "x86_THREAD_STATE";
3700     case BFD_MACH_O_x86_FLOAT_STATE:       return "x86_FLOAT_STATE";
3701     case BFD_MACH_O_x86_EXCEPTION_STATE:   return "x86_EXCEPTION_STATE";
3702     case BFD_MACH_O_x86_DEBUG_STATE32:     return "x86_DEBUG_STATE32";
3703     case BFD_MACH_O_x86_DEBUG_STATE64:     return "x86_DEBUG_STATE64";
3704     case BFD_MACH_O_x86_DEBUG_STATE:       return "x86_DEBUG_STATE";
3705     case BFD_MACH_O_x86_THREAD_STATE_NONE: return "x86_THREAD_STATE_NONE";
3706     default: return "UNKNOWN";
3707     }
3708 }
3709
3710 static const char *
3711 bfd_mach_o_ppc_flavour_string (unsigned int flavour)
3712 {
3713   switch ((int) flavour)
3714     {
3715     case BFD_MACH_O_PPC_THREAD_STATE:      return "PPC_THREAD_STATE";
3716     case BFD_MACH_O_PPC_FLOAT_STATE:       return "PPC_FLOAT_STATE";
3717     case BFD_MACH_O_PPC_EXCEPTION_STATE:   return "PPC_EXCEPTION_STATE";
3718     case BFD_MACH_O_PPC_VECTOR_STATE:      return "PPC_VECTOR_STATE";
3719     case BFD_MACH_O_PPC_THREAD_STATE64:    return "PPC_THREAD_STATE64";
3720     case BFD_MACH_O_PPC_EXCEPTION_STATE64: return "PPC_EXCEPTION_STATE64";
3721     default: return "UNKNOWN";
3722     }
3723 }
3724
3725 static bfd_boolean
3726 bfd_mach_o_read_dylinker (bfd *abfd, bfd_mach_o_load_command *command)
3727 {
3728   bfd_mach_o_dylinker_command *cmd = &command->command.dylinker;
3729   struct mach_o_str_command_external raw;
3730   unsigned int nameoff;
3731   unsigned int namelen;
3732
3733   if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
3734       || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
3735     return FALSE;
3736
3737   nameoff = bfd_h_get_32 (abfd, raw.str);
3738
3739   cmd->name_offset = nameoff;
3740   namelen = command->len - nameoff;
3741   nameoff += command->offset;
3742   cmd->name_str = bfd_alloc (abfd, namelen);
3743   if (cmd->name_str == NULL)
3744     return FALSE;
3745   if (bfd_seek (abfd, nameoff, SEEK_SET) != 0
3746       || bfd_bread (cmd->name_str, namelen, abfd) != namelen)
3747     return FALSE;
3748   return TRUE;
3749 }
3750
3751 static bfd_boolean
3752 bfd_mach_o_read_dylib (bfd *abfd, bfd_mach_o_load_command *command)
3753 {
3754   bfd_mach_o_dylib_command *cmd = &command->command.dylib;
3755   struct mach_o_dylib_command_external raw;
3756   unsigned int nameoff;
3757   unsigned int namelen;
3758
3759   switch (command->type)
3760     {
3761     case BFD_MACH_O_LC_LOAD_DYLIB:
3762     case BFD_MACH_O_LC_LAZY_LOAD_DYLIB:
3763     case BFD_MACH_O_LC_LOAD_WEAK_DYLIB:
3764     case BFD_MACH_O_LC_ID_DYLIB:
3765     case BFD_MACH_O_LC_REEXPORT_DYLIB:
3766     case BFD_MACH_O_LC_LOAD_UPWARD_DYLIB:
3767       break;
3768     default:
3769       BFD_FAIL ();
3770       return FALSE;
3771     }
3772
3773   if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
3774       || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
3775     return FALSE;
3776
3777   nameoff = bfd_h_get_32 (abfd, raw.name);
3778   cmd->timestamp = bfd_h_get_32 (abfd, raw.timestamp);
3779   cmd->current_version = bfd_h_get_32 (abfd, raw.current_version);
3780   cmd->compatibility_version = bfd_h_get_32 (abfd, raw.compatibility_version);
3781
3782   cmd->name_offset = command->offset + nameoff;
3783   namelen = command->len - nameoff;
3784   cmd->name_str = bfd_alloc (abfd, namelen);
3785   if (cmd->name_str == NULL)
3786     return FALSE;
3787   if (bfd_seek (abfd, cmd->name_offset, SEEK_SET) != 0
3788       || bfd_bread (cmd->name_str, namelen, abfd) != namelen)
3789     return FALSE;
3790   return TRUE;
3791 }
3792
3793 static bfd_boolean
3794 bfd_mach_o_read_prebound_dylib (bfd *abfd,
3795                                 bfd_mach_o_load_command *command)
3796 {
3797   bfd_mach_o_prebound_dylib_command *cmd = &command->command.prebound_dylib;
3798   struct mach_o_prebound_dylib_command_external raw;
3799   unsigned int nameoff;
3800   unsigned int modoff;
3801   unsigned int str_len;
3802   unsigned char *str;
3803
3804   if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
3805       || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
3806     return FALSE;
3807
3808   nameoff = bfd_h_get_32 (abfd, raw.name);
3809   modoff = bfd_h_get_32 (abfd, raw.linked_modules);
3810   if (nameoff > command->len || modoff > command->len)
3811     return FALSE;
3812
3813   str_len = command->len - sizeof (raw);
3814   str = bfd_alloc (abfd, str_len);
3815   if (str == NULL)
3816     return FALSE;
3817   if (bfd_bread (str, str_len, abfd) != str_len)
3818     return FALSE;
3819
3820   cmd->name_offset = command->offset + nameoff;
3821   cmd->nmodules = bfd_h_get_32 (abfd, raw.nmodules);
3822   cmd->linked_modules_offset = command->offset + modoff;
3823
3824   cmd->name_str = (char *)str + nameoff - (sizeof (raw) + BFD_MACH_O_LC_SIZE);
3825   cmd->linked_modules = str + modoff - (sizeof (raw) + BFD_MACH_O_LC_SIZE);
3826   return TRUE;
3827 }
3828
3829 static bfd_boolean
3830 bfd_mach_o_read_prebind_cksum (bfd *abfd,
3831                                bfd_mach_o_load_command *command)
3832 {
3833   bfd_mach_o_prebind_cksum_command *cmd = &command->command.prebind_cksum;
3834   struct mach_o_prebind_cksum_command_external raw;
3835
3836   if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
3837       || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
3838     return FALSE;
3839
3840   cmd->cksum = bfd_get_32 (abfd, raw.cksum);
3841   return TRUE;
3842 }
3843
3844 static bfd_boolean
3845 bfd_mach_o_read_twolevel_hints (bfd *abfd,
3846                                 bfd_mach_o_load_command *command)
3847 {
3848   bfd_mach_o_twolevel_hints_command *cmd = &command->command.twolevel_hints;
3849   struct mach_o_twolevel_hints_command_external raw;
3850
3851   if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
3852       || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
3853     return FALSE;
3854
3855   cmd->offset = bfd_get_32 (abfd, raw.offset);
3856   cmd->nhints = bfd_get_32 (abfd, raw.nhints);
3857   return TRUE;
3858 }
3859
3860 static bfd_boolean
3861 bfd_mach_o_read_fvmlib (bfd *abfd, bfd_mach_o_load_command *command)
3862 {
3863   bfd_mach_o_fvmlib_command *fvm = &command->command.fvmlib;
3864   struct mach_o_fvmlib_command_external raw;
3865   unsigned int nameoff;
3866   unsigned int namelen;
3867
3868   if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
3869       || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
3870     return FALSE;
3871
3872   nameoff = bfd_h_get_32 (abfd, raw.name);
3873   fvm->minor_version = bfd_h_get_32 (abfd, raw.minor_version);
3874   fvm->header_addr = bfd_h_get_32 (abfd, raw.header_addr);
3875
3876   fvm->name_offset = command->offset + nameoff;
3877   namelen = command->len - nameoff;
3878   fvm->name_str = bfd_alloc (abfd, namelen);
3879   if (fvm->name_str == NULL)
3880     return FALSE;
3881   if (bfd_seek (abfd, fvm->name_offset, SEEK_SET) != 0
3882       || bfd_bread (fvm->name_str, namelen, abfd) != namelen)
3883     return FALSE;
3884   return TRUE;
3885 }
3886
3887 static bfd_boolean
3888 bfd_mach_o_read_thread (bfd *abfd, bfd_mach_o_load_command *command)
3889 {
3890   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
3891   bfd_mach_o_thread_command *cmd = &command->command.thread;
3892   unsigned int offset;
3893   unsigned int nflavours;
3894   unsigned int i;
3895
3896   BFD_ASSERT ((command->type == BFD_MACH_O_LC_THREAD)
3897               || (command->type == BFD_MACH_O_LC_UNIXTHREAD));
3898
3899   /* Count the number of threads.  */
3900   offset = 8;
3901   nflavours = 0;
3902   while (offset != command->len)
3903     {
3904       struct mach_o_thread_command_external raw;
3905
3906       if (offset >= command->len)
3907         return FALSE;
3908
3909       if (bfd_seek (abfd, command->offset + offset, SEEK_SET) != 0
3910           || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
3911         return FALSE;
3912
3913       offset += sizeof (raw) + bfd_h_get_32 (abfd, raw.count) * 4;
3914       nflavours++;
3915     }
3916
3917   /* Allocate threads.  */
3918   cmd->flavours = bfd_alloc
3919     (abfd, nflavours * sizeof (bfd_mach_o_thread_flavour));
3920   if (cmd->flavours == NULL)
3921     return FALSE;
3922   cmd->nflavours = nflavours;
3923
3924   offset = 8;
3925   nflavours = 0;
3926   while (offset != command->len)
3927     {
3928       struct mach_o_thread_command_external raw;
3929
3930       if (offset >= command->len)
3931         return FALSE;
3932
3933       if (nflavours >= cmd->nflavours)
3934         return FALSE;
3935
3936       if (bfd_seek (abfd, command->offset + offset, SEEK_SET) != 0
3937           || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
3938         return FALSE;
3939
3940       cmd->flavours[nflavours].flavour = bfd_h_get_32 (abfd, raw.flavour);
3941       cmd->flavours[nflavours].offset = command->offset + offset + sizeof (raw);
3942       cmd->flavours[nflavours].size = bfd_h_get_32 (abfd, raw.count) * 4;
3943       offset += cmd->flavours[nflavours].size + sizeof (raw);
3944       nflavours++;
3945     }
3946
3947   for (i = 0; i < nflavours; i++)
3948     {
3949       asection *bfdsec;
3950       unsigned int snamelen;
3951       char *sname;
3952       const char *flavourstr;
3953       const char *prefix = "LC_THREAD";
3954       unsigned int j = 0;
3955
3956       switch (mdata->header.cputype)
3957         {
3958         case BFD_MACH_O_CPU_TYPE_POWERPC:
3959         case BFD_MACH_O_CPU_TYPE_POWERPC_64:
3960           flavourstr =
3961             bfd_mach_o_ppc_flavour_string (cmd->flavours[i].flavour);
3962           break;
3963         case BFD_MACH_O_CPU_TYPE_I386:
3964         case BFD_MACH_O_CPU_TYPE_X86_64:
3965           flavourstr =
3966             bfd_mach_o_i386_flavour_string (cmd->flavours[i].flavour);
3967           break;
3968         default:
3969           flavourstr = "UNKNOWN_ARCHITECTURE";
3970           break;
3971         }
3972
3973       snamelen = strlen (prefix) + 1 + 20 + 1 + strlen (flavourstr) + 1;
3974       sname = bfd_alloc (abfd, snamelen);
3975       if (sname == NULL)
3976         return FALSE;
3977
3978       for (;;)
3979         {
3980           sprintf (sname, "%s.%s.%u", prefix, flavourstr, j);
3981           if (bfd_get_section_by_name (abfd, sname) == NULL)
3982             break;
3983           j++;
3984         }
3985
3986       bfdsec = bfd_make_section_with_flags (abfd, sname, SEC_HAS_CONTENTS);
3987
3988       bfdsec->vma = 0;
3989       bfdsec->lma = 0;
3990       bfdsec->size = cmd->flavours[i].size;
3991       bfdsec->filepos = cmd->flavours[i].offset;
3992       bfdsec->alignment_power = 0x0;
3993
3994       cmd->section = bfdsec;
3995     }
3996
3997   return TRUE;
3998 }
3999
4000 static bfd_boolean
4001 bfd_mach_o_read_dysymtab (bfd *abfd, bfd_mach_o_load_command *command)
4002 {
4003   bfd_mach_o_dysymtab_command *cmd = &command->command.dysymtab;
4004   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
4005
4006   BFD_ASSERT (command->type == BFD_MACH_O_LC_DYSYMTAB);
4007
4008   {
4009     struct mach_o_dysymtab_command_external raw;
4010
4011     if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
4012         || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
4013       return FALSE;
4014
4015     cmd->ilocalsym = bfd_h_get_32 (abfd, raw.ilocalsym);
4016     cmd->nlocalsym = bfd_h_get_32 (abfd, raw.nlocalsym);
4017     cmd->iextdefsym = bfd_h_get_32 (abfd, raw.iextdefsym);
4018     cmd->nextdefsym = bfd_h_get_32 (abfd, raw.nextdefsym);
4019     cmd->iundefsym = bfd_h_get_32 (abfd, raw.iundefsym);
4020     cmd->nundefsym = bfd_h_get_32 (abfd, raw.nundefsym);
4021     cmd->tocoff = bfd_h_get_32 (abfd, raw.tocoff);
4022     cmd->ntoc = bfd_h_get_32 (abfd, raw.ntoc);
4023     cmd->modtaboff = bfd_h_get_32 (abfd, raw.modtaboff);
4024     cmd->nmodtab = bfd_h_get_32 (abfd, raw.nmodtab);
4025     cmd->extrefsymoff = bfd_h_get_32 (abfd, raw.extrefsymoff);
4026     cmd->nextrefsyms = bfd_h_get_32 (abfd, raw.nextrefsyms);
4027     cmd->indirectsymoff = bfd_h_get_32 (abfd, raw.indirectsymoff);
4028     cmd->nindirectsyms = bfd_h_get_32 (abfd, raw.nindirectsyms);
4029     cmd->extreloff = bfd_h_get_32 (abfd, raw.extreloff);
4030     cmd->nextrel = bfd_h_get_32 (abfd, raw.nextrel);
4031     cmd->locreloff = bfd_h_get_32 (abfd, raw.locreloff);
4032     cmd->nlocrel = bfd_h_get_32 (abfd, raw.nlocrel);
4033   }
4034
4035   if (cmd->nmodtab != 0)
4036     {
4037       unsigned int i;
4038       int wide = bfd_mach_o_wide_p (abfd);
4039       unsigned int module_len = wide ? 56 : 52;
4040
4041       cmd->dylib_module =
4042         bfd_alloc (abfd, cmd->nmodtab * sizeof (bfd_mach_o_dylib_module));
4043       if (cmd->dylib_module == NULL)
4044         return FALSE;
4045
4046       if (bfd_seek (abfd, cmd->modtaboff, SEEK_SET) != 0)
4047         return FALSE;
4048
4049       for (i = 0; i < cmd->nmodtab; i++)
4050         {
4051           bfd_mach_o_dylib_module *module = &cmd->dylib_module[i];
4052           unsigned long v;
4053           unsigned char buf[56];
4054
4055           if (bfd_bread ((void *) buf, module_len, abfd) != module_len)
4056             return FALSE;
4057
4058           module->module_name_idx = bfd_h_get_32 (abfd, buf + 0);
4059           module->iextdefsym = bfd_h_get_32 (abfd, buf + 4);
4060           module->nextdefsym = bfd_h_get_32 (abfd, buf + 8);
4061           module->irefsym = bfd_h_get_32 (abfd, buf + 12);
4062           module->nrefsym = bfd_h_get_32 (abfd, buf + 16);
4063           module->ilocalsym = bfd_h_get_32 (abfd, buf + 20);
4064           module->nlocalsym = bfd_h_get_32 (abfd, buf + 24);
4065           module->iextrel = bfd_h_get_32 (abfd, buf + 28);
4066           module->nextrel = bfd_h_get_32 (abfd, buf + 32);
4067           v = bfd_h_get_32 (abfd, buf +36);
4068           module->iinit = v & 0xffff;
4069           module->iterm = (v >> 16) & 0xffff;
4070           v = bfd_h_get_32 (abfd, buf + 40);
4071           module->ninit = v & 0xffff;
4072           module->nterm = (v >> 16) & 0xffff;
4073           if (wide)
4074             {
4075               module->objc_module_info_size = bfd_h_get_32 (abfd, buf + 44);
4076               module->objc_module_info_addr = bfd_h_get_64 (abfd, buf + 48);
4077             }
4078           else
4079             {
4080               module->objc_module_info_addr = bfd_h_get_32 (abfd, buf + 44);
4081               module->objc_module_info_size = bfd_h_get_32 (abfd, buf + 48);
4082             }
4083         }
4084     }
4085
4086   if (cmd->ntoc != 0)
4087     {
4088       unsigned int i;
4089
4090       cmd->dylib_toc = bfd_alloc
4091         (abfd, cmd->ntoc * sizeof (bfd_mach_o_dylib_table_of_content));
4092       if (cmd->dylib_toc == NULL)
4093         return FALSE;
4094
4095       if (bfd_seek (abfd, cmd->tocoff, SEEK_SET) != 0)
4096         return FALSE;
4097
4098       for (i = 0; i < cmd->ntoc; i++)
4099         {
4100           struct mach_o_dylib_table_of_contents_external raw;
4101           bfd_mach_o_dylib_table_of_content *toc = &cmd->dylib_toc[i];
4102
4103           if (bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
4104             return FALSE;
4105
4106           toc->symbol_index = bfd_h_get_32 (abfd, raw.symbol_index);
4107           toc->module_index = bfd_h_get_32 (abfd, raw.module_index);
4108         }
4109     }
4110
4111   if (cmd->nindirectsyms != 0)
4112     {
4113       unsigned int i;
4114
4115       cmd->indirect_syms = bfd_alloc
4116         (abfd, cmd->nindirectsyms * sizeof (unsigned int));
4117       if (cmd->indirect_syms == NULL)
4118         return FALSE;
4119
4120       if (bfd_seek (abfd, cmd->indirectsymoff, SEEK_SET) != 0)
4121         return FALSE;
4122
4123       for (i = 0; i < cmd->nindirectsyms; i++)
4124         {
4125           unsigned char raw[4];
4126           unsigned int *is = &cmd->indirect_syms[i];
4127
4128           if (bfd_bread (raw, sizeof (raw), abfd) != sizeof (raw))
4129             return FALSE;
4130
4131           *is = bfd_h_get_32 (abfd, raw);
4132         }
4133     }
4134
4135   if (cmd->nextrefsyms != 0)
4136     {
4137       unsigned long v;
4138       unsigned int i;
4139
4140       cmd->ext_refs = bfd_alloc
4141         (abfd, cmd->nextrefsyms * sizeof (bfd_mach_o_dylib_reference));
4142       if (cmd->ext_refs == NULL)
4143         return FALSE;
4144
4145       if (bfd_seek (abfd, cmd->extrefsymoff, SEEK_SET) != 0)
4146         return FALSE;
4147
4148       for (i = 0; i < cmd->nextrefsyms; i++)
4149         {
4150           unsigned char raw[4];
4151           bfd_mach_o_dylib_reference *ref = &cmd->ext_refs[i];
4152
4153           if (bfd_bread (raw, sizeof (raw), abfd) != sizeof (raw))
4154             return FALSE;
4155
4156           /* Fields isym and flags are written as bit-fields, thus we need
4157              a specific processing for endianness.  */
4158           v = bfd_h_get_32 (abfd, raw);
4159           if (bfd_big_endian (abfd))
4160             {
4161               ref->isym = (v >> 8) & 0xffffff;
4162               ref->flags = v & 0xff;
4163             }
4164           else
4165             {
4166               ref->isym = v & 0xffffff;
4167               ref->flags = (v >> 24) & 0xff;
4168             }
4169         }
4170     }
4171
4172   if (mdata->dysymtab)
4173     return FALSE;
4174   mdata->dysymtab = cmd;
4175
4176   return TRUE;
4177 }
4178
4179 static bfd_boolean
4180 bfd_mach_o_read_symtab (bfd *abfd, bfd_mach_o_load_command *command)
4181 {
4182   bfd_mach_o_symtab_command *symtab = &command->command.symtab;
4183   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
4184   struct mach_o_symtab_command_external raw;
4185
4186   BFD_ASSERT (command->type == BFD_MACH_O_LC_SYMTAB);
4187
4188   if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
4189       || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
4190     return FALSE;
4191
4192   symtab->symoff = bfd_h_get_32 (abfd, raw.symoff);
4193   symtab->nsyms = bfd_h_get_32 (abfd, raw.nsyms);
4194   symtab->stroff = bfd_h_get_32 (abfd, raw.stroff);
4195   symtab->strsize = bfd_h_get_32 (abfd, raw.strsize);
4196   symtab->symbols = NULL;
4197   symtab->strtab = NULL;
4198
4199   if (symtab->nsyms != 0)
4200     abfd->flags |= HAS_SYMS;
4201
4202   if (mdata->symtab)
4203     return FALSE;
4204   mdata->symtab = symtab;
4205   return TRUE;
4206 }
4207
4208 static bfd_boolean
4209 bfd_mach_o_read_uuid (bfd *abfd, bfd_mach_o_load_command *command)
4210 {
4211   bfd_mach_o_uuid_command *cmd = &command->command.uuid;
4212
4213   BFD_ASSERT (command->type == BFD_MACH_O_LC_UUID);
4214
4215   if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
4216       || bfd_bread (cmd->uuid, 16, abfd) != 16)
4217     return FALSE;
4218
4219   return TRUE;
4220 }
4221
4222 static bfd_boolean
4223 bfd_mach_o_read_linkedit (bfd *abfd, bfd_mach_o_load_command *command)
4224 {
4225   bfd_mach_o_linkedit_command *cmd = &command->command.linkedit;
4226   struct mach_o_linkedit_data_command_external raw;
4227
4228   if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
4229       || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
4230     return FALSE;
4231
4232   cmd->dataoff = bfd_get_32 (abfd, raw.dataoff);
4233   cmd->datasize = bfd_get_32 (abfd, raw.datasize);
4234   return TRUE;
4235 }
4236
4237 static bfd_boolean
4238 bfd_mach_o_read_str (bfd *abfd, bfd_mach_o_load_command *command)
4239 {
4240   bfd_mach_o_str_command *cmd = &command->command.str;
4241   struct mach_o_str_command_external raw;
4242   unsigned long off;
4243
4244   if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
4245       || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
4246     return FALSE;
4247
4248   off = bfd_get_32 (abfd, raw.str);
4249   cmd->stroff = command->offset + off;
4250   cmd->str_len = command->len - off;
4251   cmd->str = bfd_alloc (abfd, cmd->str_len);
4252   if (cmd->str == NULL)
4253     return FALSE;
4254   if (bfd_seek (abfd, cmd->stroff, SEEK_SET) != 0
4255       || bfd_bread ((void *) cmd->str, cmd->str_len, abfd) != cmd->str_len)
4256     return FALSE;
4257   return TRUE;
4258 }
4259
4260 static unsigned char *
4261 bfd_mach_o_alloc_and_read (bfd *abfd, unsigned int off, unsigned int size)
4262 {
4263   unsigned char *buf;
4264
4265   buf = bfd_alloc (abfd, size);
4266   if (buf == NULL)
4267     return NULL;
4268   if (bfd_seek (abfd, off, SEEK_SET) != 0
4269       || bfd_bread (buf, size, abfd) != size)
4270     return NULL;
4271   return buf;
4272 }
4273
4274 static bfd_boolean
4275 bfd_mach_o_read_dyld_content (bfd *abfd, bfd_mach_o_dyld_info_command *cmd)
4276 {
4277   /* Read rebase content.  */
4278   if (cmd->rebase_content == NULL && cmd->rebase_size != 0)
4279     {
4280       cmd->rebase_content =
4281         bfd_mach_o_alloc_and_read (abfd, cmd->rebase_off, cmd->rebase_size);
4282       if (cmd->rebase_content == NULL)
4283         return FALSE;
4284     }
4285
4286   /* Read bind content.  */
4287   if (cmd->bind_content == NULL && cmd->bind_size != 0)
4288     {
4289       cmd->bind_content =
4290         bfd_mach_o_alloc_and_read (abfd, cmd->bind_off, cmd->bind_size);
4291       if (cmd->bind_content == NULL)
4292         return FALSE;
4293     }
4294
4295   /* Read weak bind content.  */
4296   if (cmd->weak_bind_content == NULL && cmd->weak_bind_size != 0)
4297     {
4298       cmd->weak_bind_content = bfd_mach_o_alloc_and_read
4299         (abfd, cmd->weak_bind_off, cmd->weak_bind_size);
4300       if (cmd->weak_bind_content == NULL)
4301         return FALSE;
4302     }
4303
4304   /* Read lazy bind content.  */
4305   if (cmd->lazy_bind_content == NULL && cmd->lazy_bind_size != 0)
4306     {
4307       cmd->lazy_bind_content = bfd_mach_o_alloc_and_read
4308         (abfd, cmd->lazy_bind_off, cmd->lazy_bind_size);
4309       if (cmd->lazy_bind_content == NULL)
4310         return FALSE;
4311     }
4312
4313   /* Read export content.  */
4314   if (cmd->export_content == NULL && cmd->export_size != 0)
4315     {
4316       cmd->export_content = bfd_mach_o_alloc_and_read
4317         (abfd, cmd->export_off, cmd->export_size);
4318       if (cmd->export_content == NULL)
4319         return FALSE;
4320     }
4321
4322   return TRUE;
4323 }
4324
4325 static bfd_boolean
4326 bfd_mach_o_read_dyld_info (bfd *abfd, bfd_mach_o_load_command *command)
4327 {
4328   bfd_mach_o_dyld_info_command *cmd = &command->command.dyld_info;
4329   struct mach_o_dyld_info_command_external raw;
4330
4331   if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
4332       || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
4333     return FALSE;
4334
4335   cmd->rebase_off = bfd_get_32 (abfd, raw.rebase_off);
4336   cmd->rebase_size = bfd_get_32 (abfd, raw.rebase_size);
4337   cmd->rebase_content = NULL;
4338   cmd->bind_off = bfd_get_32 (abfd, raw.bind_off);
4339   cmd->bind_size = bfd_get_32 (abfd, raw.bind_size);
4340   cmd->bind_content = NULL;
4341   cmd->weak_bind_off = bfd_get_32 (abfd, raw.weak_bind_off);
4342   cmd->weak_bind_size = bfd_get_32 (abfd, raw.weak_bind_size);
4343   cmd->weak_bind_content = NULL;
4344   cmd->lazy_bind_off = bfd_get_32 (abfd, raw.lazy_bind_off);
4345   cmd->lazy_bind_size = bfd_get_32 (abfd, raw.lazy_bind_size);
4346   cmd->lazy_bind_content = NULL;
4347   cmd->export_off = bfd_get_32 (abfd, raw.export_off);
4348   cmd->export_size = bfd_get_32 (abfd, raw.export_size);
4349   cmd->export_content = NULL;
4350   return TRUE;
4351 }
4352
4353 static bfd_boolean
4354 bfd_mach_o_read_version_min (bfd *abfd, bfd_mach_o_load_command *command)
4355 {
4356   bfd_mach_o_version_min_command *cmd = &command->command.version_min;
4357   struct mach_o_version_min_command_external raw;
4358   unsigned int ver;
4359
4360   if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
4361       || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
4362     return FALSE;
4363
4364   ver = bfd_get_32 (abfd, raw.version);
4365   cmd->rel = ver >> 16;
4366   cmd->maj = ver >> 8;
4367   cmd->min = ver;
4368   cmd->reserved = bfd_get_32 (abfd, raw.reserved);
4369   return TRUE;
4370 }
4371
4372 static bfd_boolean
4373 bfd_mach_o_read_encryption_info (bfd *abfd, bfd_mach_o_load_command *command)
4374 {
4375   bfd_mach_o_encryption_info_command *cmd = &command->command.encryption_info;
4376   struct mach_o_encryption_info_command_external raw;
4377
4378   if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
4379       || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
4380     return FALSE;
4381
4382   cmd->cryptoff = bfd_get_32 (abfd, raw.cryptoff);
4383   cmd->cryptsize = bfd_get_32 (abfd, raw.cryptsize);
4384   cmd->cryptid = bfd_get_32 (abfd, raw.cryptid);
4385   return TRUE;
4386 }
4387
4388 static bfd_boolean
4389 bfd_mach_o_read_main (bfd *abfd, bfd_mach_o_load_command *command)
4390 {
4391   bfd_mach_o_main_command *cmd = &command->command.main;
4392   struct mach_o_entry_point_command_external raw;
4393
4394   if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
4395       || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
4396     return FALSE;
4397
4398   cmd->entryoff = bfd_get_64 (abfd, raw.entryoff);
4399   cmd->stacksize = bfd_get_64 (abfd, raw.stacksize);
4400   return TRUE;
4401 }
4402
4403 static bfd_boolean
4404 bfd_mach_o_read_source_version (bfd *abfd, bfd_mach_o_load_command *command)
4405 {
4406   bfd_mach_o_source_version_command *cmd = &command->command.source_version;
4407   struct mach_o_source_version_command_external raw;
4408   bfd_uint64_t ver;
4409
4410   if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
4411       || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
4412     return FALSE;
4413
4414   ver = bfd_get_64 (abfd, raw.version);
4415   /* Note: we use a serie of shift to avoid shift > 32 (for which gcc
4416      generates warnings) in case of the host doesn't support 64 bit
4417      integers.  */
4418   cmd->e = ver & 0x3ff;
4419   ver >>= 10;
4420   cmd->d = ver & 0x3ff;
4421   ver >>= 10;
4422   cmd->c = ver & 0x3ff;
4423   ver >>= 10;
4424   cmd->b = ver & 0x3ff;
4425   ver >>= 10;
4426   cmd->a = ver & 0xffffff;
4427   return TRUE;
4428 }
4429
4430 static bfd_boolean
4431 bfd_mach_o_read_segment (bfd *abfd,
4432                          bfd_mach_o_load_command *command,
4433                          unsigned int wide)
4434 {
4435   bfd_mach_o_segment_command *seg = &command->command.segment;
4436   unsigned long i;
4437
4438   if (wide)
4439     {
4440       struct mach_o_segment_command_64_external raw;
4441
4442       BFD_ASSERT (command->type == BFD_MACH_O_LC_SEGMENT_64);
4443
4444       if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
4445           || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
4446         return FALSE;
4447
4448       memcpy (seg->segname, raw.segname, 16);
4449       seg->segname[16] = '\0';
4450
4451       seg->vmaddr = bfd_h_get_64 (abfd, raw.vmaddr);
4452       seg->vmsize = bfd_h_get_64 (abfd, raw.vmsize);
4453       seg->fileoff = bfd_h_get_64 (abfd, raw.fileoff);
4454       seg->filesize = bfd_h_get_64 (abfd, raw.filesize);
4455       seg->maxprot = bfd_h_get_32 (abfd, raw.maxprot);
4456       seg->initprot = bfd_h_get_32 (abfd, raw.initprot);
4457       seg->nsects = bfd_h_get_32 (abfd, raw.nsects);
4458       seg->flags = bfd_h_get_32 (abfd, raw.flags);
4459     }
4460   else
4461     {
4462       struct mach_o_segment_command_32_external raw;
4463
4464       BFD_ASSERT (command->type == BFD_MACH_O_LC_SEGMENT);
4465
4466       if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
4467           || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
4468         return FALSE;
4469
4470       memcpy (seg->segname, raw.segname, 16);
4471       seg->segname[16] = '\0';
4472
4473       seg->vmaddr = bfd_h_get_32 (abfd, raw.vmaddr);
4474       seg->vmsize = bfd_h_get_32 (abfd, raw.vmsize);
4475       seg->fileoff = bfd_h_get_32 (abfd, raw.fileoff);
4476       seg->filesize = bfd_h_get_32 (abfd, raw.filesize);
4477       seg->maxprot = bfd_h_get_32 (abfd, raw.maxprot);
4478       seg->initprot = bfd_h_get_32 (abfd, raw.initprot);
4479       seg->nsects = bfd_h_get_32 (abfd, raw.nsects);
4480       seg->flags = bfd_h_get_32 (abfd, raw.flags);
4481     }
4482   seg->sect_head = NULL;
4483   seg->sect_tail = NULL;
4484
4485   for (i = 0; i < seg->nsects; i++)
4486     {
4487       bfd_vma segoff;
4488       asection *sec;
4489
4490       if (wide)
4491         segoff = command->offset + BFD_MACH_O_LC_SEGMENT_64_SIZE
4492           + (i * BFD_MACH_O_SECTION_64_SIZE);
4493       else
4494         segoff = command->offset + BFD_MACH_O_LC_SEGMENT_SIZE
4495           + (i * BFD_MACH_O_SECTION_SIZE);
4496
4497       sec = bfd_mach_o_read_section (abfd, segoff, seg->initprot, wide);
4498       if (sec == NULL)
4499         return FALSE;
4500
4501       bfd_mach_o_append_section_to_segment
4502         (seg, bfd_mach_o_get_mach_o_section (sec));
4503     }
4504
4505   return TRUE;
4506 }
4507
4508 static bfd_boolean
4509 bfd_mach_o_read_segment_32 (bfd *abfd, bfd_mach_o_load_command *command)
4510 {
4511   return bfd_mach_o_read_segment (abfd, command, 0);
4512 }
4513
4514 static bfd_boolean
4515 bfd_mach_o_read_segment_64 (bfd *abfd, bfd_mach_o_load_command *command)
4516 {
4517   return bfd_mach_o_read_segment (abfd, command, 1);
4518 }
4519
4520 static bfd_boolean
4521 bfd_mach_o_read_command (bfd *abfd, bfd_mach_o_load_command *command)
4522 {
4523   struct mach_o_load_command_external raw;
4524   unsigned int cmd;
4525
4526   /* Read command type and length.  */
4527   if (bfd_seek (abfd, command->offset, SEEK_SET) != 0
4528       || bfd_bread (&raw, BFD_MACH_O_LC_SIZE, abfd) != BFD_MACH_O_LC_SIZE)
4529     return FALSE;
4530
4531   cmd = bfd_h_get_32 (abfd, raw.cmd);
4532   command->type =  cmd & ~BFD_MACH_O_LC_REQ_DYLD;
4533   command->type_required = cmd & BFD_MACH_O_LC_REQ_DYLD ? TRUE : FALSE;
4534   command->len = bfd_h_get_32 (abfd, raw.cmdsize);
4535
4536   switch (command->type)
4537     {
4538     case BFD_MACH_O_LC_SEGMENT:
4539       if (!bfd_mach_o_read_segment_32 (abfd, command))
4540         return FALSE;
4541       break;
4542     case BFD_MACH_O_LC_SEGMENT_64:
4543       if (!bfd_mach_o_read_segment_64 (abfd, command))
4544         return FALSE;
4545       break;
4546     case BFD_MACH_O_LC_SYMTAB:
4547       if (!bfd_mach_o_read_symtab (abfd, command))
4548         return FALSE;
4549       break;
4550     case BFD_MACH_O_LC_SYMSEG:
4551       break;
4552     case BFD_MACH_O_LC_THREAD:
4553     case BFD_MACH_O_LC_UNIXTHREAD:
4554       if (!bfd_mach_o_read_thread (abfd, command))
4555         return FALSE;
4556       break;
4557     case BFD_MACH_O_LC_LOAD_DYLINKER:
4558     case BFD_MACH_O_LC_ID_DYLINKER:
4559     case BFD_MACH_O_LC_DYLD_ENVIRONMENT:
4560       if (!bfd_mach_o_read_dylinker (abfd, command))
4561         return FALSE;
4562       break;
4563     case BFD_MACH_O_LC_LOAD_DYLIB:
4564     case BFD_MACH_O_LC_LAZY_LOAD_DYLIB:
4565     case BFD_MACH_O_LC_ID_DYLIB:
4566     case BFD_MACH_O_LC_LOAD_WEAK_DYLIB:
4567     case BFD_MACH_O_LC_REEXPORT_DYLIB:
4568     case BFD_MACH_O_LC_LOAD_UPWARD_DYLIB:
4569       if (!bfd_mach_o_read_dylib (abfd, command))
4570         return FALSE;
4571       break;
4572     case BFD_MACH_O_LC_PREBOUND_DYLIB:
4573       if (!bfd_mach_o_read_prebound_dylib (abfd, command))
4574         return FALSE;
4575       break;
4576     case BFD_MACH_O_LC_LOADFVMLIB:
4577     case BFD_MACH_O_LC_IDFVMLIB:
4578       if (!bfd_mach_o_read_fvmlib (abfd, command))
4579         return FALSE;
4580       break;
4581     case BFD_MACH_O_LC_IDENT:
4582     case BFD_MACH_O_LC_FVMFILE:
4583     case BFD_MACH_O_LC_PREPAGE:
4584     case BFD_MACH_O_LC_ROUTINES:
4585     case BFD_MACH_O_LC_ROUTINES_64:
4586       break;
4587     case BFD_MACH_O_LC_SUB_FRAMEWORK:
4588     case BFD_MACH_O_LC_SUB_UMBRELLA:
4589     case BFD_MACH_O_LC_SUB_LIBRARY:
4590     case BFD_MACH_O_LC_SUB_CLIENT:
4591     case BFD_MACH_O_LC_RPATH:
4592       if (!bfd_mach_o_read_str (abfd, command))
4593         return FALSE;
4594       break;
4595     case BFD_MACH_O_LC_DYSYMTAB:
4596       if (!bfd_mach_o_read_dysymtab (abfd, command))
4597         return FALSE;
4598       break;
4599     case BFD_MACH_O_LC_PREBIND_CKSUM:
4600       if (!bfd_mach_o_read_prebind_cksum (abfd, command))
4601         return FALSE;
4602       break;
4603     case BFD_MACH_O_LC_TWOLEVEL_HINTS:
4604       if (!bfd_mach_o_read_twolevel_hints (abfd, command))
4605         return FALSE;
4606       break;
4607     case BFD_MACH_O_LC_UUID:
4608       if (!bfd_mach_o_read_uuid (abfd, command))
4609         return FALSE;
4610       break;
4611     case BFD_MACH_O_LC_CODE_SIGNATURE:
4612     case BFD_MACH_O_LC_SEGMENT_SPLIT_INFO:
4613     case BFD_MACH_O_LC_FUNCTION_STARTS:
4614     case BFD_MACH_O_LC_DATA_IN_CODE:
4615     case BFD_MACH_O_LC_DYLIB_CODE_SIGN_DRS:
4616       if (!bfd_mach_o_read_linkedit (abfd, command))
4617         return FALSE;
4618       break;
4619     case BFD_MACH_O_LC_ENCRYPTION_INFO:
4620       if (!bfd_mach_o_read_encryption_info (abfd, command))
4621         return FALSE;
4622       break;
4623     case BFD_MACH_O_LC_DYLD_INFO:
4624       if (!bfd_mach_o_read_dyld_info (abfd, command))
4625         return FALSE;
4626       break;
4627     case BFD_MACH_O_LC_VERSION_MIN_MACOSX:
4628     case BFD_MACH_O_LC_VERSION_MIN_IPHONEOS:
4629       if (!bfd_mach_o_read_version_min (abfd, command))
4630         return FALSE;
4631       break;
4632     case BFD_MACH_O_LC_MAIN:
4633       if (!bfd_mach_o_read_main (abfd, command))
4634         return FALSE;
4635       break;
4636     case BFD_MACH_O_LC_SOURCE_VERSION:
4637       if (!bfd_mach_o_read_source_version (abfd, command))
4638         return FALSE;
4639       break;
4640     default:
4641       (*_bfd_error_handler)(_("%B: unknown load command 0x%lx"),
4642          abfd, (unsigned long) command->type);
4643       break;
4644     }
4645
4646   return TRUE;
4647 }
4648
4649 static void
4650 bfd_mach_o_flatten_sections (bfd *abfd)
4651 {
4652   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
4653   bfd_mach_o_load_command *cmd;
4654   long csect = 0;
4655
4656   /* Count total number of sections.  */
4657   mdata->nsects = 0;
4658
4659   for (cmd = mdata->first_command; cmd != NULL; cmd = cmd->next)
4660     {
4661       if (cmd->type == BFD_MACH_O_LC_SEGMENT
4662           || cmd->type == BFD_MACH_O_LC_SEGMENT_64)
4663         {
4664           bfd_mach_o_segment_command *seg = &cmd->command.segment;
4665
4666           mdata->nsects += seg->nsects;
4667         }
4668     }
4669
4670   /* Allocate sections array.  */
4671   mdata->sections = bfd_alloc (abfd,
4672                                mdata->nsects * sizeof (bfd_mach_o_section *));
4673
4674   /* Fill the array.  */
4675   csect = 0;
4676
4677   for (cmd = mdata->first_command; cmd != NULL; cmd = cmd->next)
4678     {
4679       if (cmd->type == BFD_MACH_O_LC_SEGMENT
4680           || cmd->type == BFD_MACH_O_LC_SEGMENT_64)
4681         {
4682           bfd_mach_o_segment_command *seg = &cmd->command.segment;
4683           bfd_mach_o_section *sec;
4684
4685           BFD_ASSERT (csect + seg->nsects <= mdata->nsects);
4686
4687           for (sec = seg->sect_head; sec != NULL; sec = sec->next)
4688             mdata->sections[csect++] = sec;
4689         }
4690     }
4691 }
4692
4693 static bfd_boolean
4694 bfd_mach_o_scan_start_address (bfd *abfd)
4695 {
4696   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
4697   bfd_mach_o_thread_command *thr = NULL;
4698   bfd_mach_o_load_command *cmd;
4699   unsigned long i;
4700
4701   for (cmd = mdata->first_command; cmd != NULL; cmd = cmd->next)
4702     if (cmd->type == BFD_MACH_O_LC_THREAD
4703         || cmd->type == BFD_MACH_O_LC_UNIXTHREAD)
4704       {
4705         thr = &cmd->command.thread;
4706         break;
4707       }
4708     else if (cmd->type == BFD_MACH_O_LC_MAIN && mdata->nsects > 1)
4709       {
4710         bfd_mach_o_main_command *main_cmd = &cmd->command.main;
4711         bfd_mach_o_section *text_sect = mdata->sections[0];
4712
4713         if (text_sect)
4714           {
4715             abfd->start_address = main_cmd->entryoff
4716               + (text_sect->addr - text_sect->offset);
4717             return TRUE;
4718           }
4719       }
4720
4721   /* An object file has no start address, so do not fail if not found.  */
4722   if (thr == NULL)
4723     return TRUE;
4724
4725   /* FIXME: create a subtarget hook ?  */
4726   for (i = 0; i < thr->nflavours; i++)
4727     {
4728       if ((mdata->header.cputype == BFD_MACH_O_CPU_TYPE_I386)
4729           && (thr->flavours[i].flavour == BFD_MACH_O_x86_THREAD_STATE32))
4730         {
4731           unsigned char buf[4];
4732
4733           if (bfd_seek (abfd, thr->flavours[i].offset + 40, SEEK_SET) != 0
4734               || bfd_bread (buf, 4, abfd) != 4)
4735             return FALSE;
4736
4737           abfd->start_address = bfd_h_get_32 (abfd, buf);
4738         }
4739       else if ((mdata->header.cputype == BFD_MACH_O_CPU_TYPE_POWERPC)
4740                && (thr->flavours[i].flavour == BFD_MACH_O_PPC_THREAD_STATE))
4741         {
4742           unsigned char buf[4];
4743
4744           if (bfd_seek (abfd, thr->flavours[i].offset + 0, SEEK_SET) != 0
4745               || bfd_bread (buf, 4, abfd) != 4)
4746             return FALSE;
4747
4748           abfd->start_address = bfd_h_get_32 (abfd, buf);
4749         }
4750       else if ((mdata->header.cputype == BFD_MACH_O_CPU_TYPE_POWERPC_64)
4751                && (thr->flavours[i].flavour == BFD_MACH_O_PPC_THREAD_STATE64))
4752         {
4753           unsigned char buf[8];
4754
4755           if (bfd_seek (abfd, thr->flavours[i].offset + 0, SEEK_SET) != 0
4756               || bfd_bread (buf, 8, abfd) != 8)
4757             return FALSE;
4758
4759           abfd->start_address = bfd_h_get_64 (abfd, buf);
4760         }
4761       else if ((mdata->header.cputype == BFD_MACH_O_CPU_TYPE_X86_64)
4762                && (thr->flavours[i].flavour == BFD_MACH_O_x86_THREAD_STATE64))
4763         {
4764           unsigned char buf[8];
4765
4766           if (bfd_seek (abfd, thr->flavours[i].offset + (16 * 8), SEEK_SET) != 0
4767               || bfd_bread (buf, 8, abfd) != 8)
4768             return FALSE;
4769
4770           abfd->start_address = bfd_h_get_64 (abfd, buf);
4771         }
4772     }
4773
4774   return TRUE;
4775 }
4776
4777 bfd_boolean
4778 bfd_mach_o_set_arch_mach (bfd *abfd,
4779                           enum bfd_architecture arch,
4780                           unsigned long machine)
4781 {
4782   bfd_mach_o_backend_data *bed = bfd_mach_o_get_backend_data (abfd);
4783
4784   /* If this isn't the right architecture for this backend, and this
4785      isn't the generic backend, fail.  */
4786   if (arch != bed->arch
4787       && arch != bfd_arch_unknown
4788       && bed->arch != bfd_arch_unknown)
4789     return FALSE;
4790
4791   return bfd_default_set_arch_mach (abfd, arch, machine);
4792 }
4793
4794 static bfd_boolean
4795 bfd_mach_o_scan (bfd *abfd,
4796                  bfd_mach_o_header *header,
4797                  bfd_mach_o_data_struct *mdata)
4798 {
4799   unsigned int i;
4800   enum bfd_architecture cputype;
4801   unsigned long cpusubtype;
4802   unsigned int hdrsize;
4803
4804   hdrsize = mach_o_wide_p (header) ?
4805     BFD_MACH_O_HEADER_64_SIZE : BFD_MACH_O_HEADER_SIZE;
4806
4807   mdata->header = *header;
4808
4809   abfd->flags = abfd->flags & BFD_IN_MEMORY;
4810   switch (header->filetype)
4811     {
4812     case BFD_MACH_O_MH_OBJECT:
4813       abfd->flags |= HAS_RELOC;
4814       break;
4815     case BFD_MACH_O_MH_EXECUTE:
4816       abfd->flags |= EXEC_P;
4817       break;
4818     case BFD_MACH_O_MH_DYLIB:
4819     case BFD_MACH_O_MH_BUNDLE:
4820       abfd->flags |= DYNAMIC;
4821       break;
4822     }
4823
4824   abfd->tdata.mach_o_data = mdata;
4825
4826   bfd_mach_o_convert_architecture (header->cputype, header->cpusubtype,
4827                                    &cputype, &cpusubtype);
4828   if (cputype == bfd_arch_unknown)
4829     {
4830       (*_bfd_error_handler)
4831         (_("bfd_mach_o_scan: unknown architecture 0x%lx/0x%lx"),
4832          header->cputype, header->cpusubtype);
4833       return FALSE;
4834     }
4835
4836   bfd_set_arch_mach (abfd, cputype, cpusubtype);
4837
4838   if (header->ncmds != 0)
4839     {
4840       bfd_mach_o_load_command *cmd;
4841
4842       mdata->first_command = NULL;
4843       mdata->last_command = NULL;
4844       cmd = bfd_alloc (abfd, header->ncmds * sizeof (bfd_mach_o_load_command));
4845       if (cmd == NULL)
4846         return FALSE;
4847
4848       for (i = 0; i < header->ncmds; i++)
4849         {
4850           bfd_mach_o_load_command *cur = &cmd[i];
4851
4852           bfd_mach_o_append_command (abfd, cur);
4853
4854           if (i == 0)
4855             cur->offset = hdrsize;
4856           else
4857             {
4858               bfd_mach_o_load_command *prev = &cmd[i - 1];
4859               cur->offset = prev->offset + prev->len;
4860             }
4861
4862           if (!bfd_mach_o_read_command (abfd, cur))
4863             return FALSE;
4864         }
4865     }
4866
4867   /* Sections should be flatten before scanning start address.  */
4868   bfd_mach_o_flatten_sections (abfd);
4869   if (!bfd_mach_o_scan_start_address (abfd))
4870     return FALSE;
4871
4872   return TRUE;
4873 }
4874
4875 bfd_boolean
4876 bfd_mach_o_mkobject_init (bfd *abfd)
4877 {
4878   bfd_mach_o_data_struct *mdata = NULL;
4879
4880   mdata = bfd_zalloc (abfd, sizeof (bfd_mach_o_data_struct));
4881   if (mdata == NULL)
4882     return FALSE;
4883   abfd->tdata.mach_o_data = mdata;
4884
4885   mdata->header.magic = 0;
4886   mdata->header.cputype = 0;
4887   mdata->header.cpusubtype = 0;
4888   mdata->header.filetype = 0;
4889   mdata->header.ncmds = 0;
4890   mdata->header.sizeofcmds = 0;
4891   mdata->header.flags = 0;
4892   mdata->header.byteorder = BFD_ENDIAN_UNKNOWN;
4893   mdata->first_command = NULL;
4894   mdata->last_command = NULL;
4895   mdata->nsects = 0;
4896   mdata->sections = NULL;
4897   mdata->dyn_reloc_cache = NULL;
4898
4899   return TRUE;
4900 }
4901
4902 static bfd_boolean
4903 bfd_mach_o_gen_mkobject (bfd *abfd)
4904 {
4905   bfd_mach_o_data_struct *mdata;
4906
4907   if (!bfd_mach_o_mkobject_init (abfd))
4908     return FALSE;
4909
4910   mdata = bfd_mach_o_get_data (abfd);
4911   mdata->header.magic = BFD_MACH_O_MH_MAGIC;
4912   mdata->header.cputype = 0;
4913   mdata->header.cpusubtype = 0;
4914   mdata->header.byteorder = abfd->xvec->byteorder;
4915   mdata->header.version = 1;
4916
4917   return TRUE;
4918 }
4919
4920 const bfd_target *
4921 bfd_mach_o_header_p (bfd *abfd,
4922                      bfd_mach_o_filetype filetype,
4923                      bfd_mach_o_cpu_type cputype)
4924 {
4925   bfd_mach_o_header header;
4926   bfd_mach_o_data_struct *mdata;
4927
4928   if (!bfd_mach_o_read_header (abfd, &header))
4929     goto wrong;
4930
4931   if (! (header.byteorder == BFD_ENDIAN_BIG
4932          || header.byteorder == BFD_ENDIAN_LITTLE))
4933     {
4934       (*_bfd_error_handler) (_("unknown header byte-order value 0x%lx"),
4935                              (unsigned long) header.byteorder);
4936       goto wrong;
4937     }
4938
4939   if (! ((header.byteorder == BFD_ENDIAN_BIG
4940           && abfd->xvec->byteorder == BFD_ENDIAN_BIG
4941           && abfd->xvec->header_byteorder == BFD_ENDIAN_BIG)
4942          || (header.byteorder == BFD_ENDIAN_LITTLE
4943              && abfd->xvec->byteorder == BFD_ENDIAN_LITTLE
4944              && abfd->xvec->header_byteorder == BFD_ENDIAN_LITTLE)))
4945     goto wrong;
4946
4947   /* Check cputype and filetype.
4948      In case of wildcard, do not accept magics that are handled by existing
4949      targets.  */
4950   if (cputype)
4951     {
4952       if (header.cputype != cputype)
4953         goto wrong;
4954     }
4955   else
4956     {
4957 #ifndef BFD64
4958       /* Do not recognize 64 architectures if not configured for 64bit targets.
4959          This could happen only for generic targets.  */
4960       if (mach_o_wide_p (&header))
4961          goto wrong;
4962 #endif
4963     }
4964
4965   if (filetype)
4966     {
4967       if (header.filetype != filetype)
4968         goto wrong;
4969     }
4970   else
4971     {
4972       switch (header.filetype)
4973         {
4974         case BFD_MACH_O_MH_CORE:
4975           /* Handled by core_p */
4976           goto wrong;
4977         default:
4978           break;
4979         }
4980     }
4981
4982   mdata = (bfd_mach_o_data_struct *) bfd_zalloc (abfd, sizeof (*mdata));
4983   if (mdata == NULL)
4984     goto fail;
4985
4986   if (!bfd_mach_o_scan (abfd, &header, mdata))
4987     goto wrong;
4988
4989   return abfd->xvec;
4990
4991  wrong:
4992   bfd_set_error (bfd_error_wrong_format);
4993
4994  fail:
4995   return NULL;
4996 }
4997
4998 static const bfd_target *
4999 bfd_mach_o_gen_object_p (bfd *abfd)
5000 {
5001   return bfd_mach_o_header_p (abfd, 0, 0);
5002 }
5003
5004 static const bfd_target *
5005 bfd_mach_o_gen_core_p (bfd *abfd)
5006 {
5007   return bfd_mach_o_header_p (abfd, BFD_MACH_O_MH_CORE, 0);
5008 }
5009
5010 /* Return the base address of ABFD, ie the address at which the image is
5011    mapped.  The possible initial pagezero is ignored.  */
5012
5013 bfd_vma
5014 bfd_mach_o_get_base_address (bfd *abfd)
5015 {
5016   bfd_mach_o_data_struct *mdata;
5017   bfd_mach_o_load_command *cmd;
5018
5019   /* Check for Mach-O.  */
5020   if (!bfd_mach_o_valid (abfd))
5021     return 0;
5022   mdata = bfd_mach_o_get_data (abfd);
5023
5024   for (cmd = mdata->first_command; cmd != NULL; cmd = cmd->next)
5025     {
5026       if ((cmd->type == BFD_MACH_O_LC_SEGMENT
5027            || cmd->type == BFD_MACH_O_LC_SEGMENT_64))
5028         {
5029           struct bfd_mach_o_segment_command *segcmd = &cmd->command.segment;
5030
5031           if (segcmd->initprot != 0)
5032             return segcmd->vmaddr;
5033         }
5034     }
5035   return 0;
5036 }
5037
5038 typedef struct mach_o_fat_archentry
5039 {
5040   unsigned long cputype;
5041   unsigned long cpusubtype;
5042   unsigned long offset;
5043   unsigned long size;
5044   unsigned long align;
5045 } mach_o_fat_archentry;
5046
5047 typedef struct mach_o_fat_data_struct
5048 {
5049   unsigned long magic;
5050   unsigned long nfat_arch;
5051   mach_o_fat_archentry *archentries;
5052 } mach_o_fat_data_struct;
5053
5054 const bfd_target *
5055 bfd_mach_o_archive_p (bfd *abfd)
5056 {
5057   mach_o_fat_data_struct *adata = NULL;
5058   struct mach_o_fat_header_external hdr;
5059   unsigned long i;
5060
5061   if (bfd_seek (abfd, 0, SEEK_SET) != 0
5062       || bfd_bread (&hdr, sizeof (hdr), abfd) != sizeof (hdr))
5063     goto error;
5064
5065   adata = bfd_alloc (abfd, sizeof (mach_o_fat_data_struct));
5066   if (adata == NULL)
5067     goto error;
5068
5069   adata->magic = bfd_getb32 (hdr.magic);
5070   adata->nfat_arch = bfd_getb32 (hdr.nfat_arch);
5071   if (adata->magic != 0xcafebabe)
5072     goto error;
5073   /* Avoid matching Java bytecode files, which have the same magic number.
5074      In the Java bytecode file format this field contains the JVM version,
5075      which starts at 43.0.  */
5076   if (adata->nfat_arch > 30)
5077     goto error;
5078
5079   adata->archentries =
5080     bfd_alloc (abfd, adata->nfat_arch * sizeof (mach_o_fat_archentry));
5081   if (adata->archentries == NULL)
5082     goto error;
5083
5084   for (i = 0; i < adata->nfat_arch; i++)
5085     {
5086       struct mach_o_fat_arch_external arch;
5087       if (bfd_bread (&arch, sizeof (arch), abfd) != sizeof (arch))
5088         goto error;
5089       adata->archentries[i].cputype = bfd_getb32 (arch.cputype);
5090       adata->archentries[i].cpusubtype = bfd_getb32 (arch.cpusubtype);
5091       adata->archentries[i].offset = bfd_getb32 (arch.offset);
5092       adata->archentries[i].size = bfd_getb32 (arch.size);
5093       adata->archentries[i].align = bfd_getb32 (arch.align);
5094     }
5095
5096   abfd->tdata.mach_o_fat_data = adata;
5097   return abfd->xvec;
5098
5099  error:
5100   if (adata != NULL)
5101     bfd_release (abfd, adata);
5102   bfd_set_error (bfd_error_wrong_format);
5103   return NULL;
5104 }
5105
5106 /* Set the filename for a fat binary member ABFD, whose bfd architecture is
5107    ARCH_TYPE/ARCH_SUBTYPE and corresponding entry in header is ENTRY.
5108    Set arelt_data and origin fields too.  */
5109
5110 static void
5111 bfd_mach_o_fat_member_init (bfd *abfd,
5112                             enum bfd_architecture arch_type,
5113                             unsigned long arch_subtype,
5114                             mach_o_fat_archentry *entry)
5115 {
5116   struct areltdata *areltdata;
5117   /* Create the member filename. Use ARCH_NAME.  */
5118   const bfd_arch_info_type *ap = bfd_lookup_arch (arch_type, arch_subtype);
5119
5120   if (ap)
5121     {
5122       /* Use the architecture name if known.  */
5123       abfd->filename = xstrdup (ap->printable_name);
5124     }
5125   else
5126     {
5127       /* Forge a uniq id.  */
5128       const size_t namelen = 2 + 8 + 1 + 2 + 8 + 1;
5129       char *name = xmalloc (namelen);
5130       snprintf (name, namelen, "0x%lx-0x%lx",
5131                 entry->cputype, entry->cpusubtype);
5132       abfd->filename = name;
5133     }
5134
5135   areltdata = bfd_zmalloc (sizeof (struct areltdata));
5136   areltdata->parsed_size = entry->size;
5137   abfd->arelt_data = areltdata;
5138   abfd->iostream = NULL;
5139   abfd->origin = entry->offset;
5140 }
5141
5142 bfd *
5143 bfd_mach_o_openr_next_archived_file (bfd *archive, bfd *prev)
5144 {
5145   mach_o_fat_data_struct *adata;
5146   mach_o_fat_archentry *entry = NULL;
5147   unsigned long i;
5148   bfd *nbfd;
5149   enum bfd_architecture arch_type;
5150   unsigned long arch_subtype;
5151
5152   adata = (mach_o_fat_data_struct *) archive->tdata.mach_o_fat_data;
5153   BFD_ASSERT (adata != NULL);
5154
5155   /* Find index of previous entry.  */
5156   if (prev == NULL)
5157     {
5158       /* Start at first one.  */
5159       i = 0;
5160     }
5161   else
5162     {
5163       /* Find index of PREV.  */
5164       for (i = 0; i < adata->nfat_arch; i++)
5165         {
5166           if (adata->archentries[i].offset == prev->origin)
5167             break;
5168         }
5169
5170       if (i == adata->nfat_arch)
5171         {
5172           /* Not found.  */
5173           bfd_set_error (bfd_error_bad_value);
5174           return NULL;
5175         }
5176
5177       /* Get next entry.  */
5178       i++;
5179     }
5180
5181   if (i >= adata->nfat_arch)
5182     {
5183       bfd_set_error (bfd_error_no_more_archived_files);
5184       return NULL;
5185     }
5186
5187   entry = &adata->archentries[i];
5188   nbfd = _bfd_new_bfd_contained_in (archive);
5189   if (nbfd == NULL)
5190     return NULL;
5191
5192   bfd_mach_o_convert_architecture (entry->cputype, entry->cpusubtype,
5193                                    &arch_type, &arch_subtype);
5194
5195   bfd_mach_o_fat_member_init (nbfd, arch_type, arch_subtype, entry);
5196
5197   bfd_set_arch_mach (nbfd, arch_type, arch_subtype);
5198
5199   return nbfd;
5200 }
5201
5202 /* Analogous to stat call.  */
5203
5204 static int
5205 bfd_mach_o_fat_stat_arch_elt (bfd *abfd, struct stat *buf)
5206 {
5207   if (abfd->arelt_data == NULL)
5208     {
5209       bfd_set_error (bfd_error_invalid_operation);
5210       return -1;
5211     }
5212
5213   buf->st_mtime = 0;
5214   buf->st_uid = 0;
5215   buf->st_gid = 0;
5216   buf->st_mode = 0644;
5217   buf->st_size = arelt_size (abfd);
5218
5219   return 0;
5220 }
5221
5222 /* If ABFD format is FORMAT and architecture is ARCH, return it.
5223    If ABFD is a fat image containing a member that corresponds to FORMAT
5224    and ARCH, returns it.
5225    In other case, returns NULL.
5226    This function allows transparent uses of fat images.  */
5227
5228 bfd *
5229 bfd_mach_o_fat_extract (bfd *abfd,
5230                         bfd_format format,
5231                         const bfd_arch_info_type *arch)
5232 {
5233   bfd *res;
5234   mach_o_fat_data_struct *adata;
5235   unsigned int i;
5236
5237   if (bfd_check_format (abfd, format))
5238     {
5239       if (bfd_get_arch_info (abfd) == arch)
5240         return abfd;
5241       return NULL;
5242     }
5243   if (!bfd_check_format (abfd, bfd_archive)
5244       || abfd->xvec != &mach_o_fat_vec)
5245     return NULL;
5246
5247   /* This is a Mach-O fat image.  */
5248   adata = (mach_o_fat_data_struct *) abfd->tdata.mach_o_fat_data;
5249   BFD_ASSERT (adata != NULL);
5250
5251   for (i = 0; i < adata->nfat_arch; i++)
5252     {
5253       struct mach_o_fat_archentry *e = &adata->archentries[i];
5254       enum bfd_architecture cpu_type;
5255       unsigned long cpu_subtype;
5256
5257       bfd_mach_o_convert_architecture (e->cputype, e->cpusubtype,
5258                                        &cpu_type, &cpu_subtype);
5259       if (cpu_type != arch->arch || cpu_subtype != arch->mach)
5260         continue;
5261
5262       /* The architecture is found.  */
5263       res = _bfd_new_bfd_contained_in (abfd);
5264       if (res == NULL)
5265         return NULL;
5266
5267       bfd_mach_o_fat_member_init (res, cpu_type, cpu_subtype, e);
5268
5269       if (bfd_check_format (res, format))
5270         {
5271           BFD_ASSERT (bfd_get_arch_info (res) == arch);
5272           return res;
5273         }
5274       bfd_close (res);
5275       return NULL;
5276     }
5277
5278   return NULL;
5279 }
5280
5281 int
5282 bfd_mach_o_lookup_command (bfd *abfd,
5283                            bfd_mach_o_load_command_type type,
5284                            bfd_mach_o_load_command **mcommand)
5285 {
5286   struct mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
5287   struct bfd_mach_o_load_command *cmd;
5288   unsigned int num;
5289
5290   BFD_ASSERT (mdata != NULL);
5291   BFD_ASSERT (mcommand != NULL);
5292
5293   num = 0;
5294   for (cmd = mdata->first_command; cmd != NULL; cmd = cmd->next)
5295     {
5296       if (cmd->type != type)
5297         continue;
5298
5299       if (num == 0)
5300         *mcommand = cmd;
5301       num++;
5302     }
5303
5304   return num;
5305 }
5306
5307 unsigned long
5308 bfd_mach_o_stack_addr (enum bfd_mach_o_cpu_type type)
5309 {
5310   switch (type)
5311     {
5312     case BFD_MACH_O_CPU_TYPE_MC680x0:
5313       return 0x04000000;
5314     case BFD_MACH_O_CPU_TYPE_MC88000:
5315       return 0xffffe000;
5316     case BFD_MACH_O_CPU_TYPE_POWERPC:
5317       return 0xc0000000;
5318     case BFD_MACH_O_CPU_TYPE_I386:
5319       return 0xc0000000;
5320     case BFD_MACH_O_CPU_TYPE_SPARC:
5321       return 0xf0000000;
5322     case BFD_MACH_O_CPU_TYPE_I860:
5323       return 0;
5324     case BFD_MACH_O_CPU_TYPE_HPPA:
5325       return 0xc0000000 - 0x04000000;
5326     default:
5327       return 0;
5328     }
5329 }
5330
5331 /* The following two tables should be kept, as far as possible, in order of
5332    most frequently used entries to optimize their use from gas.  */
5333
5334 const bfd_mach_o_xlat_name bfd_mach_o_section_type_name[] =
5335 {
5336   { "regular", BFD_MACH_O_S_REGULAR},
5337   { "coalesced", BFD_MACH_O_S_COALESCED},
5338   { "zerofill", BFD_MACH_O_S_ZEROFILL},
5339   { "cstring_literals", BFD_MACH_O_S_CSTRING_LITERALS},
5340   { "4byte_literals", BFD_MACH_O_S_4BYTE_LITERALS},
5341   { "8byte_literals", BFD_MACH_O_S_8BYTE_LITERALS},
5342   { "16byte_literals", BFD_MACH_O_S_16BYTE_LITERALS},
5343   { "literal_pointers", BFD_MACH_O_S_LITERAL_POINTERS},
5344   { "mod_init_func_pointers", BFD_MACH_O_S_MOD_INIT_FUNC_POINTERS},
5345   { "mod_fini_func_pointers", BFD_MACH_O_S_MOD_FINI_FUNC_POINTERS},
5346   { "gb_zerofill", BFD_MACH_O_S_GB_ZEROFILL},
5347   { "interposing", BFD_MACH_O_S_INTERPOSING},
5348   { "dtrace_dof", BFD_MACH_O_S_DTRACE_DOF},
5349   { "non_lazy_symbol_pointers", BFD_MACH_O_S_NON_LAZY_SYMBOL_POINTERS},
5350   { "lazy_symbol_pointers", BFD_MACH_O_S_LAZY_SYMBOL_POINTERS},
5351   { "symbol_stubs", BFD_MACH_O_S_SYMBOL_STUBS},
5352   { "lazy_dylib_symbol_pointers", BFD_MACH_O_S_LAZY_DYLIB_SYMBOL_POINTERS},
5353   { NULL, 0}
5354 };
5355
5356 const bfd_mach_o_xlat_name bfd_mach_o_section_attribute_name[] =
5357 {
5358   { "pure_instructions", BFD_MACH_O_S_ATTR_PURE_INSTRUCTIONS },
5359   { "some_instructions", BFD_MACH_O_S_ATTR_SOME_INSTRUCTIONS },
5360   { "loc_reloc", BFD_MACH_O_S_ATTR_LOC_RELOC },
5361   { "ext_reloc", BFD_MACH_O_S_ATTR_EXT_RELOC },
5362   { "debug", BFD_MACH_O_S_ATTR_DEBUG },
5363   { "live_support", BFD_MACH_O_S_ATTR_LIVE_SUPPORT },
5364   { "no_dead_strip", BFD_MACH_O_S_ATTR_NO_DEAD_STRIP },
5365   { "strip_static_syms", BFD_MACH_O_S_ATTR_STRIP_STATIC_SYMS },
5366   { "no_toc", BFD_MACH_O_S_ATTR_NO_TOC },
5367   { "self_modifying_code", BFD_MACH_O_S_SELF_MODIFYING_CODE },
5368   { "modifying_code", BFD_MACH_O_S_SELF_MODIFYING_CODE },
5369   { NULL, 0}
5370 };
5371
5372 /* Get the section type from NAME.  Return 256 if NAME is unknown.  */
5373
5374 unsigned int
5375 bfd_mach_o_get_section_type_from_name (bfd *abfd, const char *name)
5376 {
5377   const bfd_mach_o_xlat_name *x;
5378   bfd_mach_o_backend_data *bed = bfd_mach_o_get_backend_data (abfd);
5379
5380   for (x = bfd_mach_o_section_type_name; x->name; x++)
5381     if (strcmp (x->name, name) == 0)
5382       {
5383         /* We found it... does the target support it?  */
5384         if (bed->bfd_mach_o_section_type_valid_for_target == NULL
5385             || bed->bfd_mach_o_section_type_valid_for_target (x->val))
5386           return x->val; /* OK.  */
5387         else
5388           break; /* Not supported.  */
5389       }
5390   /* Maximum section ID = 0xff.  */
5391   return 256;
5392 }
5393
5394 /* Get the section attribute from NAME.  Return -1 if NAME is unknown.  */
5395
5396 unsigned int
5397 bfd_mach_o_get_section_attribute_from_name (const char *name)
5398 {
5399   const bfd_mach_o_xlat_name *x;
5400
5401   for (x = bfd_mach_o_section_attribute_name; x->name; x++)
5402     if (strcmp (x->name, name) == 0)
5403       return x->val;
5404   return (unsigned int)-1;
5405 }
5406
5407 int
5408 bfd_mach_o_core_fetch_environment (bfd *abfd,
5409                                    unsigned char **rbuf,
5410                                    unsigned int *rlen)
5411 {
5412   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
5413   unsigned long stackaddr = bfd_mach_o_stack_addr (mdata->header.cputype);
5414   bfd_mach_o_load_command *cmd;
5415
5416   for (cmd = mdata->first_command; cmd != NULL; cmd = cmd->next)
5417     {
5418       bfd_mach_o_segment_command *seg;
5419
5420       if (cmd->type != BFD_MACH_O_LC_SEGMENT)
5421         continue;
5422
5423       seg = &cmd->command.segment;
5424
5425       if ((seg->vmaddr + seg->vmsize) == stackaddr)
5426         {
5427           unsigned long start = seg->fileoff;
5428           unsigned long end = seg->fileoff + seg->filesize;
5429           unsigned char *buf = bfd_malloc (1024);
5430           unsigned long size = 1024;
5431
5432           for (;;)
5433             {
5434               bfd_size_type nread = 0;
5435               unsigned long offset;
5436               int found_nonnull = 0;
5437
5438               if (size > (end - start))
5439                 size = (end - start);
5440
5441               buf = bfd_realloc_or_free (buf, size);
5442               if (buf == NULL)
5443                 return -1;
5444
5445               if (bfd_seek (abfd, end - size, SEEK_SET) != 0)
5446                 {
5447                   free (buf);
5448                   return -1;
5449                 }
5450
5451               nread = bfd_bread (buf, size, abfd);
5452
5453               if (nread != size)
5454                 {
5455                   free (buf);
5456                   return -1;
5457                 }
5458
5459               for (offset = 4; offset <= size; offset += 4)
5460                 {
5461                   unsigned long val;
5462
5463                   val = *((unsigned long *) (buf + size - offset));
5464                   if (! found_nonnull)
5465                     {
5466                       if (val != 0)
5467                         found_nonnull = 1;
5468                     }
5469                   else if (val == 0x0)
5470                     {
5471                       unsigned long bottom;
5472                       unsigned long top;
5473
5474                       bottom = seg->fileoff + seg->filesize - offset;
5475                       top = seg->fileoff + seg->filesize - 4;
5476                       *rbuf = bfd_malloc (top - bottom);
5477                       *rlen = top - bottom;
5478
5479                       memcpy (*rbuf, buf + size - *rlen, *rlen);
5480                       free (buf);
5481                       return 0;
5482                     }
5483                 }
5484
5485               if (size == (end - start))
5486                 break;
5487
5488               size *= 2;
5489             }
5490
5491           free (buf);
5492         }
5493     }
5494
5495   return -1;
5496 }
5497
5498 char *
5499 bfd_mach_o_core_file_failing_command (bfd *abfd)
5500 {
5501   unsigned char *buf = NULL;
5502   unsigned int len = 0;
5503   int ret;
5504
5505   ret = bfd_mach_o_core_fetch_environment (abfd, &buf, &len);
5506   if (ret < 0)
5507     return NULL;
5508
5509   return (char *) buf;
5510 }
5511
5512 int
5513 bfd_mach_o_core_file_failing_signal (bfd *abfd ATTRIBUTE_UNUSED)
5514 {
5515   return 0;
5516 }
5517
5518 static bfd_mach_o_uuid_command *
5519 bfd_mach_o_lookup_uuid_command (bfd *abfd)
5520 {
5521   bfd_mach_o_load_command *uuid_cmd;
5522   int ncmd = bfd_mach_o_lookup_command (abfd, BFD_MACH_O_LC_UUID, &uuid_cmd);
5523   if (ncmd != 1)
5524     return FALSE;
5525   return &uuid_cmd->command.uuid;
5526 }
5527
5528 /* Return true if ABFD is a dSYM file and its UUID matches UUID_CMD. */
5529
5530 static bfd_boolean
5531 bfd_mach_o_dsym_for_uuid_p (bfd *abfd, const bfd_mach_o_uuid_command *uuid_cmd)
5532 {
5533   bfd_mach_o_uuid_command *dsym_uuid_cmd;
5534
5535   BFD_ASSERT (abfd);
5536   BFD_ASSERT (uuid_cmd);
5537
5538   if (!bfd_check_format (abfd, bfd_object))
5539     return FALSE;
5540
5541   if (bfd_get_flavour (abfd) != bfd_target_mach_o_flavour
5542       || bfd_mach_o_get_data (abfd) == NULL
5543       || bfd_mach_o_get_data (abfd)->header.filetype != BFD_MACH_O_MH_DSYM)
5544     return FALSE;
5545
5546   dsym_uuid_cmd = bfd_mach_o_lookup_uuid_command (abfd);
5547   if (dsym_uuid_cmd == NULL)
5548     return FALSE;
5549
5550   if (memcmp (uuid_cmd->uuid, dsym_uuid_cmd->uuid,
5551               sizeof (uuid_cmd->uuid)) != 0)
5552     return FALSE;
5553
5554   return TRUE;
5555 }
5556
5557 /* Find a BFD in DSYM_FILENAME which matches ARCH and UUID_CMD.
5558    The caller is responsible for closing the returned BFD object and
5559    its my_archive if the returned BFD is in a fat dSYM. */
5560
5561 static bfd *
5562 bfd_mach_o_find_dsym (const char *dsym_filename,
5563                       const bfd_mach_o_uuid_command *uuid_cmd,
5564                       const bfd_arch_info_type *arch)
5565 {
5566   bfd *base_dsym_bfd, *dsym_bfd;
5567
5568   BFD_ASSERT (uuid_cmd);
5569
5570   base_dsym_bfd = bfd_openr (dsym_filename, NULL);
5571   if (base_dsym_bfd == NULL)
5572     return NULL;
5573
5574   dsym_bfd = bfd_mach_o_fat_extract (base_dsym_bfd, bfd_object, arch);
5575   if (bfd_mach_o_dsym_for_uuid_p (dsym_bfd, uuid_cmd))
5576     return dsym_bfd;
5577
5578   bfd_close (dsym_bfd);
5579   if (base_dsym_bfd != dsym_bfd)
5580     bfd_close (base_dsym_bfd);
5581
5582   return NULL;
5583 }
5584
5585 /* Return a BFD created from a dSYM file for ABFD.
5586    The caller is responsible for closing the returned BFD object, its
5587    filename, and its my_archive if the returned BFD is in a fat dSYM. */
5588
5589 static bfd *
5590 bfd_mach_o_follow_dsym (bfd *abfd)
5591 {
5592   char *dsym_filename;
5593   bfd_mach_o_uuid_command *uuid_cmd;
5594   bfd *dsym_bfd, *base_bfd = abfd;
5595   const char *base_basename;
5596
5597   if (abfd == NULL || bfd_get_flavour (abfd) != bfd_target_mach_o_flavour)
5598     return NULL;
5599
5600   if (abfd->my_archive)
5601     base_bfd = abfd->my_archive;
5602   /* BFD may have been opened from a stream. */
5603   if (base_bfd->filename == NULL)
5604     {
5605       bfd_set_error (bfd_error_invalid_operation);
5606       return NULL;
5607     }
5608   base_basename = lbasename (base_bfd->filename);
5609
5610   uuid_cmd = bfd_mach_o_lookup_uuid_command (abfd);
5611   if (uuid_cmd == NULL)
5612     return NULL;
5613
5614   /* TODO: We assume the DWARF file has the same as the binary's.
5615      It seems apple's GDB checks all files in the dSYM bundle directory.
5616      http://opensource.apple.com/source/gdb/gdb-1708/src/gdb/macosx/macosx-tdep.c
5617   */
5618   dsym_filename = (char *)bfd_malloc (strlen (base_bfd->filename)
5619                                        + strlen (dsym_subdir) + 1
5620                                        + strlen (base_basename) + 1);
5621   sprintf (dsym_filename, "%s%s/%s",
5622            base_bfd->filename, dsym_subdir, base_basename);
5623
5624   dsym_bfd = bfd_mach_o_find_dsym (dsym_filename, uuid_cmd,
5625                                    bfd_get_arch_info (abfd));
5626   if (dsym_bfd == NULL)
5627     free (dsym_filename);
5628
5629   return dsym_bfd;
5630 }
5631
5632 bfd_boolean
5633 bfd_mach_o_find_nearest_line (bfd *abfd,
5634                               asymbol **symbols,
5635                               asection *section,
5636                               bfd_vma offset,
5637                               const char **filename_ptr,
5638                               const char **functionname_ptr,
5639                               unsigned int *line_ptr,
5640                               unsigned int *discriminator_ptr)
5641 {
5642   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
5643   if (mdata == NULL)
5644     return FALSE;
5645   switch (mdata->header.filetype)
5646     {
5647     case BFD_MACH_O_MH_OBJECT:
5648       break;
5649     case BFD_MACH_O_MH_EXECUTE:
5650     case BFD_MACH_O_MH_DYLIB:
5651     case BFD_MACH_O_MH_BUNDLE:
5652     case BFD_MACH_O_MH_KEXT_BUNDLE:
5653       if (mdata->dwarf2_find_line_info == NULL)
5654         {
5655           mdata->dsym_bfd = bfd_mach_o_follow_dsym (abfd);
5656           /* When we couldn't find dSYM for this binary, we look for
5657              the debug information in the binary itself. In this way,
5658              we won't try finding separated dSYM again because
5659              mdata->dwarf2_find_line_info will be filled. */
5660           if (! mdata->dsym_bfd)
5661             break;
5662           if (! _bfd_dwarf2_slurp_debug_info (abfd, mdata->dsym_bfd,
5663                                               dwarf_debug_sections, symbols,
5664                                               &mdata->dwarf2_find_line_info,
5665                                               FALSE))
5666             return FALSE;
5667         }
5668       break;
5669     default:
5670       return FALSE;
5671     }
5672   return _bfd_dwarf2_find_nearest_line (abfd, symbols, NULL, section, offset,
5673                                         filename_ptr, functionname_ptr,
5674                                         line_ptr, discriminator_ptr,
5675                                         dwarf_debug_sections, 0,
5676                                         &mdata->dwarf2_find_line_info);
5677 }
5678
5679 bfd_boolean
5680 bfd_mach_o_close_and_cleanup (bfd *abfd)
5681 {
5682   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
5683   if (bfd_get_format (abfd) == bfd_object && mdata != NULL)
5684     {
5685       _bfd_dwarf2_cleanup_debug_info (abfd, &mdata->dwarf2_find_line_info);
5686       bfd_mach_o_free_cached_info (abfd);
5687       if (mdata->dsym_bfd != NULL)
5688         {
5689           bfd *fat_bfd = mdata->dsym_bfd->my_archive;
5690           char *dsym_filename = (char *)(fat_bfd
5691                                          ? fat_bfd->filename
5692                                          : mdata->dsym_bfd->filename);
5693           bfd_close (mdata->dsym_bfd);
5694           mdata->dsym_bfd = NULL;
5695           if (fat_bfd)
5696             bfd_close (fat_bfd);
5697           free (dsym_filename);
5698         }
5699     }
5700
5701   if (bfd_get_format (abfd) == bfd_archive
5702       && abfd->xvec == &mach_o_fat_vec)
5703     return TRUE;
5704   return _bfd_generic_close_and_cleanup (abfd);
5705 }
5706
5707 bfd_boolean bfd_mach_o_free_cached_info (bfd *abfd)
5708 {
5709   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
5710   asection *asect;
5711   free (mdata->dyn_reloc_cache);
5712   mdata->dyn_reloc_cache = NULL;
5713   for (asect = abfd->sections; asect != NULL; asect = asect->next)
5714     {
5715       free (asect->relocation);
5716       asect->relocation = NULL;
5717     }
5718
5719   return TRUE;
5720 }
5721
5722 #define bfd_mach_o_bfd_reloc_type_lookup _bfd_norelocs_bfd_reloc_type_lookup
5723 #define bfd_mach_o_bfd_reloc_name_lookup _bfd_norelocs_bfd_reloc_name_lookup
5724
5725 #define bfd_mach_o_swap_reloc_in NULL
5726 #define bfd_mach_o_swap_reloc_out NULL
5727 #define bfd_mach_o_print_thread NULL
5728 #define bfd_mach_o_tgt_seg_table NULL
5729 #define bfd_mach_o_section_type_valid_for_tgt NULL
5730
5731 #define TARGET_NAME             mach_o_be_vec
5732 #define TARGET_STRING           "mach-o-be"
5733 #define TARGET_ARCHITECTURE     bfd_arch_unknown
5734 #define TARGET_PAGESIZE         1
5735 #define TARGET_BIG_ENDIAN       1
5736 #define TARGET_ARCHIVE          0
5737 #define TARGET_PRIORITY         1
5738 #include "mach-o-target.c"
5739
5740 #undef TARGET_NAME
5741 #undef TARGET_STRING
5742 #undef TARGET_ARCHITECTURE
5743 #undef TARGET_PAGESIZE
5744 #undef TARGET_BIG_ENDIAN
5745 #undef TARGET_ARCHIVE
5746 #undef TARGET_PRIORITY
5747
5748 #define TARGET_NAME             mach_o_le_vec
5749 #define TARGET_STRING           "mach-o-le"
5750 #define TARGET_ARCHITECTURE     bfd_arch_unknown
5751 #define TARGET_PAGESIZE         1
5752 #define TARGET_BIG_ENDIAN       0
5753 #define TARGET_ARCHIVE          0
5754 #define TARGET_PRIORITY         1
5755
5756 #include "mach-o-target.c"
5757
5758 #undef TARGET_NAME
5759 #undef TARGET_STRING
5760 #undef TARGET_ARCHITECTURE
5761 #undef TARGET_PAGESIZE
5762 #undef TARGET_BIG_ENDIAN
5763 #undef TARGET_ARCHIVE
5764 #undef TARGET_PRIORITY
5765
5766 /* Not yet handled: creating an archive.  */
5767 #define bfd_mach_o_mkarchive                      _bfd_noarchive_mkarchive
5768
5769 /* Not used.  */
5770 #define bfd_mach_o_read_ar_hdr                    _bfd_noarchive_read_ar_hdr
5771 #define bfd_mach_o_write_ar_hdr                   _bfd_noarchive_write_ar_hdr
5772 #define bfd_mach_o_slurp_armap                    _bfd_noarchive_slurp_armap
5773 #define bfd_mach_o_slurp_extended_name_table      _bfd_noarchive_slurp_extended_name_table
5774 #define bfd_mach_o_construct_extended_name_table  _bfd_noarchive_construct_extended_name_table
5775 #define bfd_mach_o_truncate_arname                _bfd_noarchive_truncate_arname
5776 #define bfd_mach_o_write_armap                    _bfd_noarchive_write_armap
5777 #define bfd_mach_o_get_elt_at_index               _bfd_noarchive_get_elt_at_index
5778 #define bfd_mach_o_generic_stat_arch_elt          bfd_mach_o_fat_stat_arch_elt
5779 #define bfd_mach_o_update_armap_timestamp         _bfd_noarchive_update_armap_timestamp
5780
5781 #define TARGET_NAME             mach_o_fat_vec
5782 #define TARGET_STRING           "mach-o-fat"
5783 #define TARGET_ARCHITECTURE     bfd_arch_unknown
5784 #define TARGET_PAGESIZE         1
5785 #define TARGET_BIG_ENDIAN       1
5786 #define TARGET_ARCHIVE          1
5787 #define TARGET_PRIORITY         0
5788
5789 #include "mach-o-target.c"
5790
5791 #undef TARGET_NAME
5792 #undef TARGET_STRING
5793 #undef TARGET_ARCHITECTURE
5794 #undef TARGET_PAGESIZE
5795 #undef TARGET_BIG_ENDIAN
5796 #undef TARGET_ARCHIVE
5797 #undef TARGET_PRIORITY