2012-01-04 Shinichiro Hamaji <shinichiro.hamaji@gmail.com>
[external/binutils.git] / bfd / mach-o.c
1 /* Mach-O support for BFD.
2    Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
3    2009, 2010, 2011, 2012
4    Free Software Foundation, Inc.
5
6    This file is part of BFD, the Binary File Descriptor library.
7
8    This program is free software; you can redistribute it and/or modify
9    it under the terms of the GNU General Public License as published by
10    the Free Software Foundation; either version 3 of the License, or
11    (at your option) any later version.
12
13    This program is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16    GNU General Public License for more details.
17
18    You should have received a copy of the GNU General Public License
19    along with this program; if not, write to the Free Software
20    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
21    MA 02110-1301, USA.  */
22
23 #include "sysdep.h"
24 #include "mach-o.h"
25 #include "bfd.h"
26 #include "libbfd.h"
27 #include "libiberty.h"
28 #include "aout/stab_gnu.h"
29 #include "mach-o/reloc.h"
30 #include "mach-o/external.h"
31 #include <ctype.h>
32 #include <stdlib.h>
33 #include <string.h>
34
35 #define bfd_mach_o_object_p bfd_mach_o_gen_object_p
36 #define bfd_mach_o_core_p bfd_mach_o_gen_core_p
37 #define bfd_mach_o_mkobject bfd_mach_o_gen_mkobject
38
39 #define FILE_ALIGN(off, algn) \
40   (((off) + ((file_ptr) 1 << (algn)) - 1) & ((file_ptr) -1 << (algn)))
41
42 unsigned int
43 bfd_mach_o_version (bfd *abfd)
44 {
45   bfd_mach_o_data_struct *mdata = NULL;
46
47   BFD_ASSERT (bfd_mach_o_valid (abfd));
48   mdata = bfd_mach_o_get_data (abfd);
49
50   return mdata->header.version;
51 }
52
53 bfd_boolean
54 bfd_mach_o_valid (bfd *abfd)
55 {
56   if (abfd == NULL || abfd->xvec == NULL)
57     return FALSE;
58
59   if (abfd->xvec->flavour != bfd_target_mach_o_flavour)
60     return FALSE;
61
62   if (bfd_mach_o_get_data (abfd) == NULL)
63     return FALSE;
64   return TRUE;
65 }
66
67 static INLINE bfd_boolean
68 mach_o_wide_p (bfd_mach_o_header *header)
69 {
70   switch (header->version)
71     {
72     case 1:
73       return FALSE;
74     case 2:
75       return TRUE;
76     default:
77       BFD_FAIL ();
78       return FALSE;
79     }
80 }
81
82 static INLINE bfd_boolean
83 bfd_mach_o_wide_p (bfd *abfd)
84 {
85   return mach_o_wide_p (&bfd_mach_o_get_data (abfd)->header);
86 }
87       
88 /* Tables to translate well known Mach-O segment/section names to bfd
89    names.  Use of canonical names (such as .text or .debug_frame) is required
90    by gdb.  */
91
92 /* __TEXT Segment.  */
93 static const mach_o_section_name_xlat text_section_names_xlat[] =
94   {
95     {   ".text",                                "__text",       
96         SEC_CODE | SEC_LOAD,                    BFD_MACH_O_S_REGULAR,
97         BFD_MACH_O_S_ATTR_PURE_INSTRUCTIONS,    0},
98     {   ".const",                               "__const",
99         SEC_READONLY | SEC_DATA | SEC_LOAD,     BFD_MACH_O_S_REGULAR,
100         BFD_MACH_O_S_ATTR_NONE,                 0},
101     {   ".static_const",                        "__static_const",
102         SEC_READONLY | SEC_DATA | SEC_LOAD,     BFD_MACH_O_S_REGULAR,
103         BFD_MACH_O_S_ATTR_NONE,                 0},
104     {   ".cstring",                             "__cstring",
105         SEC_READONLY | SEC_DATA | SEC_LOAD | SEC_MERGE | SEC_STRINGS,
106                                                 BFD_MACH_O_S_CSTRING_LITERALS,
107         BFD_MACH_O_S_ATTR_NONE,                 0},
108     {   ".literal4",                            "__literal4",
109         SEC_READONLY | SEC_DATA | SEC_LOAD,     BFD_MACH_O_S_4BYTE_LITERALS,
110         BFD_MACH_O_S_ATTR_NONE,                 2},
111     {   ".literal8",                            "__literal8",
112         SEC_READONLY | SEC_DATA | SEC_LOAD,     BFD_MACH_O_S_8BYTE_LITERALS,
113         BFD_MACH_O_S_ATTR_NONE,                 3},
114     {   ".literal16",                           "__literal16",
115         SEC_READONLY | SEC_DATA | SEC_LOAD,     BFD_MACH_O_S_16BYTE_LITERALS,
116         BFD_MACH_O_S_ATTR_NONE,                 4},
117     {   ".constructor",                         "__constructor",
118         SEC_CODE | SEC_LOAD,                    BFD_MACH_O_S_REGULAR,
119         BFD_MACH_O_S_ATTR_NONE,                 0},
120     {   ".destructor",                          "__destructor",
121         SEC_CODE | SEC_LOAD,                    BFD_MACH_O_S_REGULAR,
122         BFD_MACH_O_S_ATTR_NONE,                 0},
123     {   ".eh_frame",                            "__eh_frame",
124         SEC_READONLY | SEC_LOAD,                BFD_MACH_O_S_COALESCED,
125         BFD_MACH_O_S_ATTR_LIVE_SUPPORT
126         | BFD_MACH_O_S_ATTR_STRIP_STATIC_SYMS
127         | BFD_MACH_O_S_ATTR_NO_TOC,             3},
128     { NULL, NULL, 0, 0, 0, 0}
129   };
130
131 /* __DATA Segment.  */
132 static const mach_o_section_name_xlat data_section_names_xlat[] =
133   {
134     {   ".data",                        "__data",
135         SEC_DATA | SEC_LOAD,            BFD_MACH_O_S_REGULAR,
136         BFD_MACH_O_S_ATTR_NONE,         0},
137     {   ".bss",                         "__bss",
138         SEC_NO_FLAGS,                   BFD_MACH_O_S_ZEROFILL,
139         BFD_MACH_O_S_ATTR_NONE,         0},
140     {   ".const_data",                  "__const",
141         SEC_DATA | SEC_LOAD,            BFD_MACH_O_S_REGULAR,
142         BFD_MACH_O_S_ATTR_NONE,         0},
143     {   ".static_data",                 "__static_data",
144         SEC_DATA | SEC_LOAD,            BFD_MACH_O_S_REGULAR,
145         BFD_MACH_O_S_ATTR_NONE,         0},
146     {   ".mod_init_func",               "__mod_init_func",
147         SEC_DATA | SEC_LOAD,            BFD_MACH_O_S_MOD_INIT_FUNC_POINTERS,
148         BFD_MACH_O_S_ATTR_NONE,         2},
149     {   ".mod_term_func",               "__mod_term_func",
150         SEC_DATA | SEC_LOAD,            BFD_MACH_O_S_MOD_FINI_FUNC_POINTERS,
151         BFD_MACH_O_S_ATTR_NONE,         2},
152     {   ".dyld",                        "__dyld",
153         SEC_DATA | SEC_LOAD,            BFD_MACH_O_S_REGULAR,
154         BFD_MACH_O_S_ATTR_NONE,         0},
155     {   ".cfstring",                    "__cfstring",
156         SEC_DATA | SEC_LOAD,            BFD_MACH_O_S_REGULAR,
157         BFD_MACH_O_S_ATTR_NONE,         2},
158     { NULL, NULL, 0, 0, 0, 0}
159   };
160
161 /* __DWARF Segment.  */
162 static const mach_o_section_name_xlat dwarf_section_names_xlat[] =
163   {
164     {   ".debug_frame",                 "__debug_frame",
165         SEC_DEBUGGING,                  BFD_MACH_O_S_REGULAR,
166         BFD_MACH_O_S_ATTR_DEBUG,        0},
167     {   ".debug_info",                  "__debug_info",
168         SEC_DEBUGGING,                  BFD_MACH_O_S_REGULAR,
169         BFD_MACH_O_S_ATTR_DEBUG,        0},
170     {   ".debug_abbrev",                "__debug_abbrev",
171         SEC_DEBUGGING,                  BFD_MACH_O_S_REGULAR,
172         BFD_MACH_O_S_ATTR_DEBUG,        0},
173     {   ".debug_aranges",               "__debug_aranges",
174         SEC_DEBUGGING,                  BFD_MACH_O_S_REGULAR,
175         BFD_MACH_O_S_ATTR_DEBUG,        0},
176     {   ".debug_macinfo",               "__debug_macinfo",
177         SEC_DEBUGGING,                  BFD_MACH_O_S_REGULAR,
178         BFD_MACH_O_S_ATTR_DEBUG,        0},
179     {   ".debug_line",                  "__debug_line",
180         SEC_DEBUGGING,                  BFD_MACH_O_S_REGULAR,
181         BFD_MACH_O_S_ATTR_DEBUG,        0},
182     {   ".debug_loc",                   "__debug_loc",
183         SEC_DEBUGGING,                  BFD_MACH_O_S_REGULAR,
184         BFD_MACH_O_S_ATTR_DEBUG,        0},
185     {   ".debug_pubnames",              "__debug_pubnames",
186         SEC_DEBUGGING,                  BFD_MACH_O_S_REGULAR,
187         BFD_MACH_O_S_ATTR_DEBUG,        0},
188     {   ".debug_pubtypes",              "__debug_pubtypes",
189         SEC_DEBUGGING,                  BFD_MACH_O_S_REGULAR,
190         BFD_MACH_O_S_ATTR_DEBUG,        0},
191     {   ".debug_str",                   "__debug_str",
192         SEC_DEBUGGING,                  BFD_MACH_O_S_REGULAR,
193         BFD_MACH_O_S_ATTR_DEBUG,        0},
194     {   ".debug_ranges",                "__debug_ranges",
195         SEC_DEBUGGING,                  BFD_MACH_O_S_REGULAR,
196         BFD_MACH_O_S_ATTR_DEBUG,        0},
197     {   ".debug_macro",                 "__debug_macro",
198         SEC_DEBUGGING,                  BFD_MACH_O_S_REGULAR,
199         BFD_MACH_O_S_ATTR_DEBUG,        0},
200     { NULL, NULL, 0, 0, 0, 0}
201   };
202
203 /* __OBJC Segment.  */
204 static const mach_o_section_name_xlat objc_section_names_xlat[] =
205   {
206     {   ".objc_class",                  "__class",
207         SEC_DATA | SEC_LOAD,            BFD_MACH_O_S_REGULAR,
208         BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
209     {   ".objc_meta_class",             "__meta_class",
210         SEC_DATA | SEC_LOAD,            BFD_MACH_O_S_REGULAR,
211         BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
212     {   ".objc_cat_cls_meth",           "__cat_cls_meth",
213         SEC_DATA | SEC_LOAD,            BFD_MACH_O_S_REGULAR,
214         BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
215     {   ".objc_cat_inst_meth",          "__cat_inst_meth",
216         SEC_DATA | SEC_LOAD,            BFD_MACH_O_S_REGULAR,
217         BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
218     {   ".objc_protocol",               "__protocol",
219         SEC_DATA | SEC_LOAD,            BFD_MACH_O_S_REGULAR,
220         BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
221     {   ".objc_string_object",          "__string_object",
222         SEC_DATA | SEC_LOAD,            BFD_MACH_O_S_REGULAR,
223         BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
224     {   ".objc_cls_meth",               "__cls_meth",
225         SEC_DATA | SEC_LOAD,            BFD_MACH_O_S_REGULAR,
226         BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
227     {   ".objc_inst_meth",              "__inst_meth",
228         SEC_DATA | SEC_LOAD,            BFD_MACH_O_S_REGULAR,
229         BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
230     {   ".objc_cls_refs",               "__cls_refs",
231         SEC_DATA | SEC_LOAD,            BFD_MACH_O_S_LITERAL_POINTERS,
232         BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
233     {   ".objc_message_refs",           "__message_refs",
234         SEC_DATA | SEC_LOAD,            BFD_MACH_O_S_LITERAL_POINTERS,
235         BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
236     {   ".objc_symbols",                "__symbols",
237         SEC_DATA | SEC_LOAD,            BFD_MACH_O_S_REGULAR,
238         BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
239     {   ".objc_category",               "__category",
240         SEC_DATA | SEC_LOAD,            BFD_MACH_O_S_REGULAR,
241         BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
242     {   ".objc_class_vars",             "__class_vars",
243         SEC_DATA | SEC_LOAD,            BFD_MACH_O_S_REGULAR,
244         BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
245     {   ".objc_instance_vars",          "__instance_vars",
246         SEC_DATA | SEC_LOAD,            BFD_MACH_O_S_REGULAR,
247         BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
248     {   ".objc_module_info",            "__module_info",
249         SEC_DATA | SEC_LOAD,            BFD_MACH_O_S_REGULAR,
250         BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
251     {   ".objc_selector_strs",          "__selector_strs",
252         SEC_DATA | SEC_LOAD,            BFD_MACH_O_S_CSTRING_LITERALS,
253         BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
254     {   ".objc_image_info",             "__image_info",
255         SEC_DATA | SEC_LOAD,            BFD_MACH_O_S_REGULAR,
256         BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
257     {   ".objc_selector_fixup",         "__sel_fixup",
258         SEC_DATA | SEC_LOAD,            BFD_MACH_O_S_REGULAR,
259         BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
260     /* Objc V1 */
261     {   ".objc1_class_ext",             "__class_ext",
262         SEC_DATA | SEC_LOAD,            BFD_MACH_O_S_REGULAR,
263         BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
264     {   ".objc1_property_list",         "__property",
265         SEC_DATA | SEC_LOAD,            BFD_MACH_O_S_REGULAR,
266         BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
267     {   ".objc1_protocol_ext",          "__protocol_ext",
268         SEC_DATA | SEC_LOAD,            BFD_MACH_O_S_REGULAR,
269         BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
270     { NULL, NULL, 0, 0, 0, 0}
271   };
272
273 static const mach_o_segment_name_xlat segsec_names_xlat[] =
274   {
275     { "__TEXT", text_section_names_xlat },
276     { "__DATA", data_section_names_xlat },
277     { "__DWARF", dwarf_section_names_xlat },
278     { "__OBJC", objc_section_names_xlat },
279     { NULL, NULL }
280   };
281
282 static const char dsym_subdir[] = ".dSYM/Contents/Resources/DWARF";
283
284 /* For both cases bfd-name => mach-o name and vice versa, the specific target
285    is checked before the generic.  This allows a target (e.g. ppc for cstring)
286    to override the generic definition with a more specific one.  */
287
288 /* Fetch the translation from a Mach-O section designation (segment, section)
289    as a bfd short name, if one exists.  Otherwise return NULL.
290    
291    Allow the segment and section names to be unterminated 16 byte arrays.  */
292
293 const mach_o_section_name_xlat *
294 bfd_mach_o_section_data_for_mach_sect (bfd *abfd, const char *segname,
295                                        const char *sectname)
296 {
297   const struct mach_o_segment_name_xlat *seg;
298   const mach_o_section_name_xlat *sec;
299   bfd_mach_o_backend_data *bed = bfd_mach_o_get_backend_data (abfd);
300
301   /* First try any target-specific translations defined...  */
302   if (bed->segsec_names_xlat)
303     for (seg = bed->segsec_names_xlat; seg->segname; seg++)
304       if (strncmp (seg->segname, segname, BFD_MACH_O_SEGNAME_SIZE) == 0)
305         for (sec = seg->sections; sec->mach_o_name; sec++)
306           if (strncmp (sec->mach_o_name, sectname,
307                        BFD_MACH_O_SECTNAME_SIZE) == 0)
308             return sec;
309
310   /* ... and then the Mach-O generic ones.  */
311   for (seg = segsec_names_xlat; seg->segname; seg++)
312     if (strncmp (seg->segname, segname, BFD_MACH_O_SEGNAME_SIZE) == 0)
313       for (sec = seg->sections; sec->mach_o_name; sec++)
314         if (strncmp (sec->mach_o_name, sectname,
315                      BFD_MACH_O_SECTNAME_SIZE) == 0)
316           return sec;
317
318   return NULL;  
319 }
320
321 /* If the bfd_name for this section is a 'canonical' form for which we
322    know the Mach-O data, return the segment name and the data for the 
323    Mach-O equivalent.  Otherwise return NULL.  */
324
325 const mach_o_section_name_xlat *
326 bfd_mach_o_section_data_for_bfd_name (bfd *abfd, const char *bfd_name,
327                                       const char **segname)
328 {
329   const struct mach_o_segment_name_xlat *seg;
330   const mach_o_section_name_xlat *sec;
331   bfd_mach_o_backend_data *bed = bfd_mach_o_get_backend_data (abfd);
332   *segname = NULL;
333
334   if (bfd_name[0] != '.')
335     return NULL;
336
337   /* First try any target-specific translations defined...  */
338   if (bed->segsec_names_xlat)
339     for (seg = bed->segsec_names_xlat; seg->segname; seg++)
340       for (sec = seg->sections; sec->bfd_name; sec++)
341         if (strcmp (bfd_name, sec->bfd_name) == 0)
342           {
343             *segname = seg->segname;
344             return sec;
345           }
346
347   /* ... and then the Mach-O generic ones.  */
348   for (seg = segsec_names_xlat; seg->segname; seg++)
349     for (sec = seg->sections; sec->bfd_name; sec++)
350       if (strcmp (bfd_name, sec->bfd_name) == 0)
351         {
352           *segname = seg->segname;
353           return sec;
354         }
355
356   return NULL;  
357 }
358
359 /* Convert Mach-O section name to BFD.
360
361    Try to use standard/canonical names, for which we have tables including 
362    default flag settings - which are returned.  Otherwise forge a new name
363    in the form "<segmentname>.<sectionname>" this will be prefixed with
364    LC_SEGMENT. if the segment name does not begin with an underscore.
365
366    SEGNAME and SECTNAME are 16 byte arrays (they do not need to be NUL-
367    terminated if the name length is exactly 16 bytes - but must be if the name
368    length is less than 16 characters).  */
369
370 void
371 bfd_mach_o_convert_section_name_to_bfd (bfd *abfd, const char *segname,
372                                         const char *secname, const char **name,
373                                         flagword *flags)
374 {
375   const mach_o_section_name_xlat *xlat;
376   char *res;
377   unsigned int len;
378   const char *pfx = "";
379
380   *name = NULL;
381   *flags = SEC_NO_FLAGS;
382
383   /* First search for a canonical name...  
384      xlat will be non-null if there is an entry for segname, secname.  */
385   xlat = bfd_mach_o_section_data_for_mach_sect (abfd, segname, secname);
386   if (xlat)
387     {
388       len = strlen (xlat->bfd_name);
389       res = bfd_alloc (abfd, len+1);
390       if (res == NULL)
391         return;
392       memcpy (res, xlat->bfd_name, len+1);
393       *name = res;
394       *flags = xlat->bfd_flags;
395       return;
396     }
397
398   /* ... else we make up a bfd name from the segment concatenated with the
399      section.  */
400
401   len = 16 + 1 + 16 + 1;
402
403   /* Put "LC_SEGMENT." prefix if the segment name is weird (ie doesn't start
404      with an underscore.  */
405   if (segname[0] != '_')
406     {
407       static const char seg_pfx[] = "LC_SEGMENT.";
408
409       pfx = seg_pfx;
410       len += sizeof (seg_pfx) - 1;
411     }
412
413   res = bfd_alloc (abfd, len);
414   if (res == NULL)
415     return;
416   snprintf (res, len, "%s%.16s.%.16s", pfx, segname, secname);
417   *name = res;
418 }
419
420 /* Convert a bfd section name to a Mach-O segment + section name.
421
422    If the name is a canonical one for which we have a Darwin match
423    return the translation table - which contains defaults for flags,
424    type, attribute and default alignment data.
425
426    Otherwise, expand the bfd_name (assumed to be in the form 
427    "[LC_SEGMENT.]<segmentname>.<sectionname>") and return NULL.  */
428
429 static const mach_o_section_name_xlat *
430 bfd_mach_o_convert_section_name_to_mach_o (bfd *abfd ATTRIBUTE_UNUSED,
431                                            asection *sect,
432                                            bfd_mach_o_section *section)
433 {
434   const mach_o_section_name_xlat *xlat;
435   const char *name = bfd_get_section_name (abfd, sect);
436   const char *segname;
437   const char *dot;
438   unsigned int len;
439   unsigned int seglen;
440   unsigned int seclen;
441
442   memset (section->segname, 0, BFD_MACH_O_SEGNAME_SIZE + 1);
443   memset (section->sectname, 0, BFD_MACH_O_SECTNAME_SIZE + 1);
444
445   /* See if is a canonical name ... */
446   xlat = bfd_mach_o_section_data_for_bfd_name (abfd, name, &segname);
447   if (xlat)
448     {
449       strcpy (section->segname, segname);
450       strcpy (section->sectname, xlat->mach_o_name);
451       return xlat;
452     }
453
454   /* .. else we convert our constructed one back to Mach-O.
455      Strip LC_SEGMENT. prefix, if present.  */
456   if (strncmp (name, "LC_SEGMENT.", 11) == 0)
457     name += 11;
458
459   /* Find a dot.  */
460   dot = strchr (name, '.');
461   len = strlen (name);
462
463   /* Try to split name into segment and section names.  */
464   if (dot && dot != name)
465     {
466       seglen = dot - name;
467       seclen = len - (dot + 1 - name);
468
469       if (seglen < 16 && seclen < 16)
470         {
471           memcpy (section->segname, name, seglen);
472           section->segname[seglen] = 0;
473           memcpy (section->sectname, dot + 1, seclen);
474           section->sectname[seclen] = 0;
475           return NULL;
476         }
477     }
478
479   /* The segment and section names are both missing - don't make them
480      into dots.  */
481   if (dot && dot == name)
482     return NULL;
483
484   /* Just duplicate the name into both segment and section.  */
485   if (len > 16)
486     len = 16;
487   memcpy (section->segname, name, len);
488   section->segname[len] = 0;
489   memcpy (section->sectname, name, len);
490   section->sectname[len] = 0;
491   return NULL;
492 }
493
494 /* Return the size of an entry for section SEC.
495    Must be called only for symbol pointer section and symbol stubs
496    sections.  */
497
498 unsigned int
499 bfd_mach_o_section_get_entry_size (bfd *abfd, bfd_mach_o_section *sec)
500 {
501   switch (sec->flags & BFD_MACH_O_SECTION_TYPE_MASK)
502     {
503     case BFD_MACH_O_S_NON_LAZY_SYMBOL_POINTERS:
504     case BFD_MACH_O_S_LAZY_SYMBOL_POINTERS:
505       return bfd_mach_o_wide_p (abfd) ? 8 : 4;
506     case BFD_MACH_O_S_SYMBOL_STUBS:
507       return sec->reserved2;
508     default:
509       BFD_FAIL ();
510       return 0;
511     }
512 }
513
514 /* Return the number of indirect symbols for a section.
515    Must be called only for symbol pointer section and symbol stubs
516    sections.  */
517
518 unsigned int
519 bfd_mach_o_section_get_nbr_indirect (bfd *abfd, bfd_mach_o_section *sec)
520 {
521   unsigned int elsz;
522
523   elsz = bfd_mach_o_section_get_entry_size (abfd, sec);
524   if (elsz == 0)
525     return 0;
526   else
527     return sec->size / elsz;
528 }
529
530
531 /* Copy any private info we understand from the input symbol
532    to the output symbol.  */
533
534 bfd_boolean
535 bfd_mach_o_bfd_copy_private_symbol_data (bfd *ibfd ATTRIBUTE_UNUSED,
536                                          asymbol *isymbol ATTRIBUTE_UNUSED,
537                                          bfd *obfd ATTRIBUTE_UNUSED,
538                                          asymbol *osymbol ATTRIBUTE_UNUSED)
539 {
540   return TRUE;
541 }
542
543 /* Copy any private info we understand from the input section
544    to the output section.  */
545
546 bfd_boolean
547 bfd_mach_o_bfd_copy_private_section_data (bfd *ibfd ATTRIBUTE_UNUSED,
548                                           asection *isection,
549                                           bfd *obfd ATTRIBUTE_UNUSED,
550                                           asection *osection)
551 {
552   if (osection->used_by_bfd == NULL)
553     osection->used_by_bfd = isection->used_by_bfd;
554   else 
555     if (isection->used_by_bfd != NULL)
556       memcpy (osection->used_by_bfd, isection->used_by_bfd, 
557               sizeof (bfd_mach_o_section));
558  
559   if (osection->used_by_bfd != NULL)
560     ((bfd_mach_o_section *)osection->used_by_bfd)->bfdsection = osection;
561
562   return TRUE;
563 }
564
565 /* Copy any private info we understand from the input bfd
566    to the output bfd.  */
567
568 bfd_boolean
569 bfd_mach_o_bfd_copy_private_bfd_data (bfd *ibfd, bfd *obfd)
570 {
571   if (bfd_get_flavour (ibfd) != bfd_target_mach_o_flavour
572       || bfd_get_flavour (obfd) != bfd_target_mach_o_flavour)
573     return TRUE;
574
575   BFD_ASSERT (bfd_mach_o_valid (ibfd));
576   BFD_ASSERT (bfd_mach_o_valid (obfd));
577
578   /* FIXME: copy commands.  */
579
580   return TRUE;
581 }
582
583 /* This allows us to set up to 32 bits of flags (unless we invent some
584    fiendish scheme to subdivide).  For now, we'll just set the file flags
585    without error checking - just overwrite.  */
586    
587 bfd_boolean
588 bfd_mach_o_bfd_set_private_flags (bfd *abfd, flagword flags)
589 {
590   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
591
592   if (!mdata)
593     return FALSE;
594
595   mdata->header.flags = flags;
596   return TRUE;
597 }
598
599 /* Count the total number of symbols.  */
600
601 static long
602 bfd_mach_o_count_symbols (bfd *abfd)
603 {
604   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
605
606   if (mdata->symtab == NULL)
607     return 0;
608   return mdata->symtab->nsyms;
609 }
610
611 long
612 bfd_mach_o_get_symtab_upper_bound (bfd *abfd)
613 {
614   long nsyms = bfd_mach_o_count_symbols (abfd);
615
616   return ((nsyms + 1) * sizeof (asymbol *));
617 }
618
619 long
620 bfd_mach_o_canonicalize_symtab (bfd *abfd, asymbol **alocation)
621 {
622   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
623   long nsyms = bfd_mach_o_count_symbols (abfd);
624   bfd_mach_o_symtab_command *sym = mdata->symtab;
625   unsigned long j;
626
627   if (nsyms < 0)
628     return nsyms;
629
630   if (nsyms == 0)
631     {
632       /* Do not try to read symbols if there are none.  */
633       alocation[0] = NULL;
634       return 0;
635     }
636
637   if (!bfd_mach_o_read_symtab_symbols (abfd))
638     {
639       (*_bfd_error_handler)
640         (_("bfd_mach_o_canonicalize_symtab: unable to load symbols"));
641       return 0;
642     }
643
644   BFD_ASSERT (sym->symbols != NULL);
645
646   for (j = 0; j < sym->nsyms; j++)
647     alocation[j] = &sym->symbols[j].symbol;
648
649   alocation[j] = NULL;
650
651   return nsyms;
652 }
653
654 long
655 bfd_mach_o_get_synthetic_symtab (bfd *abfd,
656                                  long symcount ATTRIBUTE_UNUSED,
657                                  asymbol **syms ATTRIBUTE_UNUSED,
658                                  long dynsymcount ATTRIBUTE_UNUSED,
659                                  asymbol **dynsyms ATTRIBUTE_UNUSED,
660                                  asymbol **ret)
661 {
662   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
663   bfd_mach_o_dysymtab_command *dysymtab = mdata->dysymtab;
664   bfd_mach_o_symtab_command *symtab = mdata->symtab;
665   asymbol *s;
666   unsigned long count, i, j, n;
667   size_t size;
668   char *names;
669   char *nul_name;
670
671   *ret = NULL;
672
673   if (dysymtab == NULL || symtab == NULL || symtab->symbols == NULL)
674     return 0;
675
676   if (dysymtab->nindirectsyms == 0)
677     return 0;
678
679   count = dysymtab->nindirectsyms;
680   size = count * sizeof (asymbol) + 1;
681
682   for (j = 0; j < count; j++)
683     {
684       unsigned int isym = dysymtab->indirect_syms[j];
685               
686       if (isym < symtab->nsyms && symtab->symbols[isym].symbol.name)
687         size += strlen (symtab->symbols[isym].symbol.name) + sizeof ("$stub");
688     }
689
690   s = *ret = (asymbol *) bfd_malloc (size);
691   if (s == NULL)
692     return -1;
693   names = (char *) (s + count);
694   nul_name = names;
695   *names++ = 0;
696   
697   n = 0;
698   for (i = 0; i < mdata->nsects; i++)
699     {
700       bfd_mach_o_section *sec = mdata->sections[i];
701       unsigned int first, last;
702       bfd_vma addr;
703       bfd_vma entry_size;
704       
705       switch (sec->flags & BFD_MACH_O_SECTION_TYPE_MASK)
706         {
707         case BFD_MACH_O_S_NON_LAZY_SYMBOL_POINTERS:
708         case BFD_MACH_O_S_LAZY_SYMBOL_POINTERS:
709         case BFD_MACH_O_S_SYMBOL_STUBS:
710           first = sec->reserved1;
711           last = first + bfd_mach_o_section_get_nbr_indirect (abfd, sec);
712           addr = sec->addr;
713           entry_size = bfd_mach_o_section_get_entry_size (abfd, sec);
714           for (j = first; j < last; j++)
715             {
716               unsigned int isym = dysymtab->indirect_syms[j];
717
718               s->flags = BSF_GLOBAL | BSF_SYNTHETIC;
719               s->section = sec->bfdsection;
720               s->value = addr - sec->addr;
721               s->udata.p = NULL;
722               
723               if (isym < symtab->nsyms
724                   && symtab->symbols[isym].symbol.name)
725                 {
726                   const char *sym = symtab->symbols[isym].symbol.name;
727                   size_t len;
728
729                   s->name = names;
730                   len = strlen (sym);
731                   memcpy (names, sym, len);
732                   names += len;
733                   memcpy (names, "$stub", sizeof ("$stub"));
734                   names += sizeof ("$stub");
735                 }
736               else
737                 s->name = nul_name;
738
739               addr += entry_size;
740               s++;
741               n++;
742             }
743           break;
744         default:
745           break;
746         }
747     }
748
749   return n;
750 }
751
752 void
753 bfd_mach_o_get_symbol_info (bfd *abfd ATTRIBUTE_UNUSED,
754                             asymbol *symbol,
755                             symbol_info *ret)
756 {
757   bfd_symbol_info (symbol, ret);
758 }
759
760 void
761 bfd_mach_o_print_symbol (bfd *abfd,
762                          void * afile,
763                          asymbol *symbol,
764                          bfd_print_symbol_type how)
765 {
766   FILE *file = (FILE *) afile;
767   const char *name;
768   bfd_mach_o_asymbol *asym = (bfd_mach_o_asymbol *)symbol;
769
770   switch (how)
771     {
772     case bfd_print_symbol_name:
773       fprintf (file, "%s", symbol->name);
774       break;
775     default:
776       bfd_print_symbol_vandf (abfd, (void *) file, symbol);
777       if (asym->n_type & BFD_MACH_O_N_STAB)
778         name = bfd_get_stab_name (asym->n_type);
779       else
780         switch (asym->n_type & BFD_MACH_O_N_TYPE)
781           {
782           case BFD_MACH_O_N_UNDF:
783             if (symbol->value == 0)
784               name = "UND";
785             else
786               name = "COM";
787             break;
788           case BFD_MACH_O_N_ABS:
789             name = "ABS";
790             break;
791           case BFD_MACH_O_N_INDR:
792             name = "INDR";
793             break;
794           case BFD_MACH_O_N_PBUD:
795             name = "PBUD";
796             break;
797           case BFD_MACH_O_N_SECT:
798             name = "SECT";
799             break;
800           default:
801             name = "???";
802             break;
803           }
804       if (name == NULL)
805         name = "";
806       fprintf (file, " %02x %-6s %02x %04x",
807                asym->n_type, name, asym->n_sect, asym->n_desc);
808       if ((asym->n_type & BFD_MACH_O_N_STAB) == 0
809           && (asym->n_type & BFD_MACH_O_N_TYPE) == BFD_MACH_O_N_SECT)
810         fprintf (file, " [%s]", symbol->section->name);
811       fprintf (file, " %s", symbol->name);
812     }
813 }
814
815 static void
816 bfd_mach_o_convert_architecture (bfd_mach_o_cpu_type mtype,
817                                  bfd_mach_o_cpu_subtype msubtype ATTRIBUTE_UNUSED,
818                                  enum bfd_architecture *type,
819                                  unsigned long *subtype)
820 {
821   *subtype = bfd_arch_unknown;
822
823   switch (mtype)
824     {
825     case BFD_MACH_O_CPU_TYPE_VAX: *type = bfd_arch_vax; break;
826     case BFD_MACH_O_CPU_TYPE_MC680x0: *type = bfd_arch_m68k; break;
827     case BFD_MACH_O_CPU_TYPE_I386:
828       *type = bfd_arch_i386;
829       *subtype = bfd_mach_i386_i386;
830       break;
831     case BFD_MACH_O_CPU_TYPE_X86_64:
832       *type = bfd_arch_i386;
833       *subtype = bfd_mach_x86_64;
834       break;
835     case BFD_MACH_O_CPU_TYPE_MIPS: *type = bfd_arch_mips; break;
836     case BFD_MACH_O_CPU_TYPE_MC98000: *type = bfd_arch_m98k; break;
837     case BFD_MACH_O_CPU_TYPE_HPPA: *type = bfd_arch_hppa; break;
838     case BFD_MACH_O_CPU_TYPE_ARM: *type = bfd_arch_arm; break;
839     case BFD_MACH_O_CPU_TYPE_MC88000: *type = bfd_arch_m88k; break;
840     case BFD_MACH_O_CPU_TYPE_SPARC:
841       *type = bfd_arch_sparc;
842       *subtype = bfd_mach_sparc;
843       break;
844     case BFD_MACH_O_CPU_TYPE_I860: *type = bfd_arch_i860; break;
845     case BFD_MACH_O_CPU_TYPE_ALPHA: *type = bfd_arch_alpha; break;
846     case BFD_MACH_O_CPU_TYPE_POWERPC:
847       *type = bfd_arch_powerpc;
848       *subtype = bfd_mach_ppc;
849       break;
850     case BFD_MACH_O_CPU_TYPE_POWERPC_64:
851       *type = bfd_arch_powerpc;
852       *subtype = bfd_mach_ppc64;
853       break;
854     default:
855       *type = bfd_arch_unknown;
856       break;
857     }
858 }
859
860 static bfd_boolean
861 bfd_mach_o_write_header (bfd *abfd, bfd_mach_o_header *header)
862 {
863   struct mach_o_header_external raw;
864   unsigned int size;
865
866   size = mach_o_wide_p (header) ?
867     BFD_MACH_O_HEADER_64_SIZE : BFD_MACH_O_HEADER_SIZE;
868
869   bfd_h_put_32 (abfd, header->magic, raw.magic);
870   bfd_h_put_32 (abfd, header->cputype, raw.cputype);
871   bfd_h_put_32 (abfd, header->cpusubtype, raw.cpusubtype);
872   bfd_h_put_32 (abfd, header->filetype, raw.filetype);
873   bfd_h_put_32 (abfd, header->ncmds, raw.ncmds);
874   bfd_h_put_32 (abfd, header->sizeofcmds, raw.sizeofcmds);
875   bfd_h_put_32 (abfd, header->flags, raw.flags);
876
877   if (mach_o_wide_p (header))
878     bfd_h_put_32 (abfd, header->reserved, raw.reserved);
879
880   if (bfd_seek (abfd, 0, SEEK_SET) != 0
881       || bfd_bwrite (&raw, size, abfd) != size)
882     return FALSE;
883
884   return TRUE;
885 }
886
887 static int
888 bfd_mach_o_write_thread (bfd *abfd, bfd_mach_o_load_command *command)
889 {
890   bfd_mach_o_thread_command *cmd = &command->command.thread;
891   unsigned int i;
892   struct mach_o_thread_command_external raw;
893   unsigned int offset;
894
895   BFD_ASSERT ((command->type == BFD_MACH_O_LC_THREAD)
896               || (command->type == BFD_MACH_O_LC_UNIXTHREAD));
897
898   offset = 8;
899   for (i = 0; i < cmd->nflavours; i++)
900     {
901       BFD_ASSERT ((cmd->flavours[i].size % 4) == 0);
902       BFD_ASSERT (cmd->flavours[i].offset ==
903                   (command->offset + offset + BFD_MACH_O_LC_SIZE));
904
905       bfd_h_put_32 (abfd, cmd->flavours[i].flavour, raw.flavour);
906       bfd_h_put_32 (abfd, (cmd->flavours[i].size / 4), raw.count);
907
908       if (bfd_seek (abfd, command->offset + offset, SEEK_SET) != 0
909           || bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw))
910         return -1;
911
912       offset += cmd->flavours[i].size + sizeof (raw);
913     }
914
915   return 0;
916 }
917
918 long
919 bfd_mach_o_get_reloc_upper_bound (bfd *abfd ATTRIBUTE_UNUSED,
920                                   asection *asect)
921 {
922   return (asect->reloc_count + 1) * sizeof (arelent *);
923 }
924
925 static int
926 bfd_mach_o_canonicalize_one_reloc (bfd *abfd,
927                                    struct mach_o_reloc_info_external *raw,
928                                    arelent *res, asymbol **syms)
929 {
930   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
931   bfd_mach_o_backend_data *bed = bfd_mach_o_get_backend_data (abfd);
932   bfd_mach_o_reloc_info reloc;
933   bfd_vma addr;
934   bfd_vma symnum;
935   asymbol **sym;
936
937   addr = bfd_get_32 (abfd, raw->r_address);
938   symnum = bfd_get_32 (abfd, raw->r_symbolnum);
939   
940   if (addr & BFD_MACH_O_SR_SCATTERED)
941     {
942       unsigned int j;
943
944       /* Scattered relocation.
945          Extract section and offset from r_value.  */
946       res->sym_ptr_ptr = NULL;
947       res->addend = 0;
948       for (j = 0; j < mdata->nsects; j++)
949         {
950           bfd_mach_o_section *sect = mdata->sections[j];
951           if (symnum >= sect->addr && symnum < sect->addr + sect->size)
952             {
953               res->sym_ptr_ptr = sect->bfdsection->symbol_ptr_ptr;
954               res->addend = symnum - sect->addr;
955               break;
956             }
957         }
958       res->address = BFD_MACH_O_GET_SR_ADDRESS (addr);
959       reloc.r_type = BFD_MACH_O_GET_SR_TYPE (addr);
960       reloc.r_length = BFD_MACH_O_GET_SR_LENGTH (addr);
961       reloc.r_pcrel = addr & BFD_MACH_O_SR_PCREL;
962       reloc.r_scattered = 1;
963     }
964   else
965     {
966       unsigned int num = BFD_MACH_O_GET_R_SYMBOLNUM (symnum);
967       res->addend = 0;
968       res->address = addr;
969       if (symnum & BFD_MACH_O_R_EXTERN)
970         {
971           sym = syms + num;
972           reloc.r_extern = 1;
973         }
974       else
975         {
976           BFD_ASSERT (num != 0);
977           BFD_ASSERT (num <= mdata->nsects);
978           sym = mdata->sections[num - 1]->bfdsection->symbol_ptr_ptr;
979           /* For a symbol defined in section S, the addend (stored in the
980              binary) contains the address of the section.  To comply with
981              bfd conventio, substract the section address.
982              Use the address from the header, so that the user can modify
983              the vma of the section.  */
984           res->addend = -mdata->sections[num - 1]->addr;
985           reloc.r_extern = 0;
986         }
987       res->sym_ptr_ptr = sym;
988       reloc.r_type = BFD_MACH_O_GET_R_TYPE (symnum);
989       reloc.r_length = BFD_MACH_O_GET_R_LENGTH (symnum);
990       reloc.r_pcrel = (symnum & BFD_MACH_O_R_PCREL) ? 1 : 0;
991       reloc.r_scattered = 0;
992     }
993   
994   if (!(*bed->_bfd_mach_o_swap_reloc_in)(res, &reloc))
995     return -1;
996   return 0;
997 }
998
999 static int
1000 bfd_mach_o_canonicalize_relocs (bfd *abfd, unsigned long filepos,
1001                                 unsigned long count,
1002                                 arelent *res, asymbol **syms)
1003 {
1004   unsigned long i;
1005   struct mach_o_reloc_info_external *native_relocs;
1006   bfd_size_type native_size;
1007
1008   /* Allocate and read relocs.  */
1009   native_size = count * BFD_MACH_O_RELENT_SIZE;
1010   native_relocs =
1011     (struct mach_o_reloc_info_external *) bfd_malloc (native_size);
1012   if (native_relocs == NULL)
1013     return -1;
1014
1015   if (bfd_seek (abfd, filepos, SEEK_SET) != 0
1016       || bfd_bread (native_relocs, native_size, abfd) != native_size)
1017     goto err;
1018
1019   for (i = 0; i < count; i++)
1020     {
1021       if (bfd_mach_o_canonicalize_one_reloc (abfd, &native_relocs[i],
1022                                              &res[i], syms) < 0)
1023         goto err;
1024     }
1025   free (native_relocs);
1026   return i;
1027  err:
1028   free (native_relocs);
1029   return -1;
1030 }
1031
1032 long
1033 bfd_mach_o_canonicalize_reloc (bfd *abfd, asection *asect,
1034                                arelent **rels, asymbol **syms)
1035 {
1036   bfd_mach_o_backend_data *bed = bfd_mach_o_get_backend_data (abfd);
1037   unsigned long i;
1038   arelent *res;
1039
1040   if (asect->reloc_count == 0)
1041     return 0;
1042
1043   /* No need to go further if we don't know how to read relocs.  */
1044   if (bed->_bfd_mach_o_swap_reloc_in == NULL)
1045     return 0;
1046
1047   if (asect->relocation == NULL)
1048     {
1049       res = bfd_malloc (asect->reloc_count * sizeof (arelent));
1050       if (res == NULL)
1051         return -1;
1052
1053       if (bfd_mach_o_canonicalize_relocs (abfd, asect->rel_filepos,
1054                                           asect->reloc_count, res, syms) < 0)
1055         {
1056           free (res);
1057           return -1;
1058         }
1059       asect->relocation = res;
1060     }
1061
1062   res = asect->relocation;
1063   for (i = 0; i < asect->reloc_count; i++)
1064     rels[i] = &res[i];
1065   rels[i] = NULL;
1066
1067   return i;
1068 }
1069
1070 long
1071 bfd_mach_o_get_dynamic_reloc_upper_bound (bfd *abfd)
1072 {
1073   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
1074
1075   if (mdata->dysymtab == NULL)
1076     return 1;
1077   return (mdata->dysymtab->nextrel + mdata->dysymtab->nlocrel + 1)
1078     * sizeof (arelent *);
1079 }
1080
1081 long
1082 bfd_mach_o_canonicalize_dynamic_reloc (bfd *abfd, arelent **rels,
1083                                        struct bfd_symbol **syms)
1084 {
1085   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
1086   bfd_mach_o_dysymtab_command *dysymtab = mdata->dysymtab;
1087   bfd_mach_o_backend_data *bed = bfd_mach_o_get_backend_data (abfd);
1088   unsigned long i;
1089   arelent *res;
1090
1091   if (dysymtab == NULL)
1092     return 0;
1093   if (dysymtab->nextrel == 0 && dysymtab->nlocrel == 0)
1094     return 0;
1095
1096   /* No need to go further if we don't know how to read relocs.  */
1097   if (bed->_bfd_mach_o_swap_reloc_in == NULL)
1098     return 0;
1099
1100   if (mdata->dyn_reloc_cache == NULL)
1101     {
1102       res = bfd_malloc ((dysymtab->nextrel + dysymtab->nlocrel)
1103                         * sizeof (arelent));
1104       if (res == NULL)
1105         return -1;
1106
1107       if (bfd_mach_o_canonicalize_relocs (abfd, dysymtab->extreloff,
1108                                           dysymtab->nextrel, res, syms) < 0)
1109         {
1110           free (res);
1111           return -1;
1112         }
1113
1114       if (bfd_mach_o_canonicalize_relocs (abfd, dysymtab->locreloff,
1115                                           dysymtab->nlocrel,
1116                                           res + dysymtab->nextrel, syms) < 0)
1117         {
1118           free (res);
1119           return -1;
1120         }
1121
1122       mdata->dyn_reloc_cache = res;
1123     }
1124
1125   res = mdata->dyn_reloc_cache;
1126   for (i = 0; i < dysymtab->nextrel + dysymtab->nlocrel; i++)
1127     rels[i] = &res[i];
1128   rels[i] = NULL;
1129   return i;
1130 }
1131
1132 static bfd_boolean
1133 bfd_mach_o_write_relocs (bfd *abfd, bfd_mach_o_section *section)
1134 {
1135   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
1136   unsigned int i;
1137   arelent **entries;
1138   asection *sec;
1139   bfd_mach_o_backend_data *bed = bfd_mach_o_get_backend_data (abfd);
1140
1141   sec = section->bfdsection;
1142   if (sec->reloc_count == 0)
1143     return TRUE;
1144
1145   if (bed->_bfd_mach_o_swap_reloc_out == NULL)
1146     return TRUE;
1147
1148   /* Allocate relocation room.  */
1149   mdata->filelen = FILE_ALIGN(mdata->filelen, 2);
1150   section->nreloc = sec->reloc_count;
1151   sec->rel_filepos = mdata->filelen;
1152   section->reloff = sec->rel_filepos;
1153   mdata->filelen += sec->reloc_count * BFD_MACH_O_RELENT_SIZE;
1154
1155   if (bfd_seek (abfd, section->reloff, SEEK_SET) != 0)
1156     return FALSE;
1157
1158   /* Convert and write.  */
1159   entries = section->bfdsection->orelocation;
1160   for (i = 0; i < section->nreloc; i++)
1161     {
1162       arelent *rel = entries[i];
1163       struct mach_o_reloc_info_external raw;
1164       bfd_mach_o_reloc_info info, *pinfo = &info;
1165
1166       /* Convert relocation to an intermediate representation.  */
1167       if (!(*bed->_bfd_mach_o_swap_reloc_out) (rel, pinfo))
1168         return FALSE;
1169
1170       /* Lower the relocation info.  */
1171       if (pinfo->r_scattered)
1172         {
1173           unsigned long v;
1174
1175           v = BFD_MACH_O_SR_SCATTERED
1176             | (pinfo->r_pcrel ? BFD_MACH_O_SR_PCREL : 0)
1177             | BFD_MACH_O_SET_SR_LENGTH(pinfo->r_length)
1178             | BFD_MACH_O_SET_SR_TYPE(pinfo->r_type)
1179             | BFD_MACH_O_SET_SR_ADDRESS(pinfo->r_address);
1180           /* Note: scattered relocs have field in reverse order...  */
1181           bfd_put_32 (abfd, v, raw.r_address);
1182           bfd_put_32 (abfd, pinfo->r_value, raw.r_symbolnum);
1183         }
1184       else
1185         {
1186           unsigned long v;
1187
1188           bfd_put_32 (abfd, pinfo->r_address, raw.r_address);
1189           v = BFD_MACH_O_SET_R_SYMBOLNUM (pinfo->r_value)
1190             | (pinfo->r_pcrel ? BFD_MACH_O_R_PCREL : 0)
1191             | BFD_MACH_O_SET_R_LENGTH (pinfo->r_length)
1192             | (pinfo->r_extern ? BFD_MACH_O_R_EXTERN : 0)
1193             | BFD_MACH_O_SET_R_TYPE (pinfo->r_type);
1194           bfd_put_32 (abfd, v, raw.r_symbolnum);
1195         }
1196
1197       if (bfd_bwrite (&raw, BFD_MACH_O_RELENT_SIZE, abfd)
1198           != BFD_MACH_O_RELENT_SIZE)
1199         return FALSE;
1200     }
1201   return TRUE;
1202 }
1203
1204 static int
1205 bfd_mach_o_write_section_32 (bfd *abfd, bfd_mach_o_section *section)
1206 {
1207   struct mach_o_section_32_external raw;
1208
1209   memcpy (raw.sectname, section->sectname, 16);
1210   memcpy (raw.segname, section->segname, 16);
1211   bfd_h_put_32 (abfd, section->addr, raw.addr);
1212   bfd_h_put_32 (abfd, section->size, raw.size);
1213   bfd_h_put_32 (abfd, section->offset, raw.offset);
1214   bfd_h_put_32 (abfd, section->align, raw.align);
1215   bfd_h_put_32 (abfd, section->reloff, raw.reloff);
1216   bfd_h_put_32 (abfd, section->nreloc, raw.nreloc);
1217   bfd_h_put_32 (abfd, section->flags, raw.flags);
1218   bfd_h_put_32 (abfd, section->reserved1, raw.reserved1);
1219   bfd_h_put_32 (abfd, section->reserved2, raw.reserved2);
1220
1221   if (bfd_bwrite (&raw, BFD_MACH_O_SECTION_SIZE, abfd)
1222       != BFD_MACH_O_SECTION_SIZE)
1223     return -1;
1224
1225   return 0;
1226 }
1227
1228 static int
1229 bfd_mach_o_write_section_64 (bfd *abfd, bfd_mach_o_section *section)
1230 {
1231   struct mach_o_section_64_external raw;
1232
1233   memcpy (raw.sectname, section->sectname, 16);
1234   memcpy (raw.segname, section->segname, 16);
1235   bfd_h_put_64 (abfd, section->addr, raw.addr);
1236   bfd_h_put_64 (abfd, section->size, raw.size);
1237   bfd_h_put_32 (abfd, section->offset, raw.offset);
1238   bfd_h_put_32 (abfd, section->align, raw.align);
1239   bfd_h_put_32 (abfd, section->reloff, raw.reloff);
1240   bfd_h_put_32 (abfd, section->nreloc, raw.nreloc);
1241   bfd_h_put_32 (abfd, section->flags, raw.flags);
1242   bfd_h_put_32 (abfd, section->reserved1, raw.reserved1);
1243   bfd_h_put_32 (abfd, section->reserved2, raw.reserved2);
1244   bfd_h_put_32 (abfd, section->reserved3, raw.reserved3);
1245
1246   if (bfd_bwrite (&raw, BFD_MACH_O_SECTION_64_SIZE, abfd)
1247       != BFD_MACH_O_SECTION_64_SIZE)
1248     return -1;
1249
1250   return 0;
1251 }
1252
1253 static int
1254 bfd_mach_o_write_segment_32 (bfd *abfd, bfd_mach_o_load_command *command)
1255 {
1256   struct mach_o_segment_command_32_external raw;
1257   bfd_mach_o_segment_command *seg = &command->command.segment;
1258   bfd_mach_o_section *sec;
1259
1260   BFD_ASSERT (command->type == BFD_MACH_O_LC_SEGMENT);
1261
1262   for (sec = seg->sect_head; sec != NULL; sec = sec->next)
1263     if (!bfd_mach_o_write_relocs (abfd, sec))
1264       return -1;
1265
1266   memcpy (raw.segname, seg->segname, 16);
1267   bfd_h_put_32 (abfd, seg->vmaddr, raw.vmaddr);
1268   bfd_h_put_32 (abfd, seg->vmsize, raw.vmsize);
1269   bfd_h_put_32 (abfd, seg->fileoff, raw.fileoff);
1270   bfd_h_put_32 (abfd, seg->filesize, raw.filesize);
1271   bfd_h_put_32 (abfd, seg->maxprot, raw.maxprot);
1272   bfd_h_put_32 (abfd, seg->initprot, raw.initprot);
1273   bfd_h_put_32 (abfd, seg->nsects, raw.nsects);
1274   bfd_h_put_32 (abfd, seg->flags, raw.flags);
1275   
1276   if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
1277       || bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw))
1278     return -1;
1279
1280   for (sec = seg->sect_head; sec != NULL; sec = sec->next)
1281     if (bfd_mach_o_write_section_32 (abfd, sec))
1282       return -1;
1283
1284   return 0;
1285 }
1286
1287 static int
1288 bfd_mach_o_write_segment_64 (bfd *abfd, bfd_mach_o_load_command *command)
1289 {
1290   struct mach_o_segment_command_64_external raw;
1291   bfd_mach_o_segment_command *seg = &command->command.segment;
1292   bfd_mach_o_section *sec;
1293
1294   BFD_ASSERT (command->type == BFD_MACH_O_LC_SEGMENT_64);
1295
1296   for (sec = seg->sect_head; sec != NULL; sec = sec->next)
1297     if (!bfd_mach_o_write_relocs (abfd, sec))
1298       return -1;
1299
1300   memcpy (raw.segname, seg->segname, 16);
1301   bfd_h_put_64 (abfd, seg->vmaddr, raw.vmaddr);
1302   bfd_h_put_64 (abfd, seg->vmsize, raw.vmsize);
1303   bfd_h_put_64 (abfd, seg->fileoff, raw.fileoff);
1304   bfd_h_put_64 (abfd, seg->filesize, raw.filesize);
1305   bfd_h_put_32 (abfd, seg->maxprot, raw.maxprot);
1306   bfd_h_put_32 (abfd, seg->initprot, raw.initprot);
1307   bfd_h_put_32 (abfd, seg->nsects, raw.nsects);
1308   bfd_h_put_32 (abfd, seg->flags, raw.flags);
1309
1310   if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
1311       || bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw))
1312     return -1;
1313
1314   for (sec = seg->sect_head; sec != NULL; sec = sec->next)
1315     if (bfd_mach_o_write_section_64 (abfd, sec))
1316       return -1;
1317
1318   return 0;
1319 }
1320
1321 static bfd_boolean
1322 bfd_mach_o_write_symtab (bfd *abfd, bfd_mach_o_load_command *command)
1323 {
1324   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
1325   bfd_mach_o_symtab_command *sym = &command->command.symtab;
1326   unsigned long i;
1327   unsigned int wide = bfd_mach_o_wide_p (abfd);
1328   unsigned int symlen = wide ? BFD_MACH_O_NLIST_64_SIZE : BFD_MACH_O_NLIST_SIZE;
1329   struct bfd_strtab_hash *strtab;
1330   asymbol **symbols = bfd_get_outsymbols (abfd);
1331
1332   BFD_ASSERT (command->type == BFD_MACH_O_LC_SYMTAB);
1333
1334   /* Write the symbols first.  */
1335   mdata->filelen = FILE_ALIGN(mdata->filelen, wide ? 3 : 2);
1336   sym->symoff = mdata->filelen;
1337   if (bfd_seek (abfd, sym->symoff, SEEK_SET) != 0)
1338     return FALSE;
1339
1340   sym->nsyms = bfd_get_symcount (abfd);
1341   mdata->filelen += sym->nsyms * symlen;
1342
1343   strtab = _bfd_stringtab_init ();
1344   if (strtab == NULL)
1345     return FALSE;
1346
1347   if (sym->nsyms > 0)
1348     /* Although we don't strictly need to do this, for compatibility with
1349        Darwin system tools, actually output an empty string for the index
1350        0 entry.  */
1351     _bfd_stringtab_add (strtab, "", TRUE, FALSE);
1352
1353   for (i = 0; i < sym->nsyms; i++)
1354     {
1355       bfd_size_type str_index;
1356       bfd_mach_o_asymbol *s = (bfd_mach_o_asymbol *)symbols[i];
1357
1358       /* For a bare indirect symbol, the system tools expect that the symbol
1359          value will be the string table offset for its referenced counterpart.
1360          
1361          Normally, indirect syms will not be written this way, but rather as
1362          part of the dysymtab command.
1363          
1364          In either case, correct operation depends on the symbol table being
1365          sorted such that the indirect symbols are at the end (since the 
1366          string table index is filled in below).  */
1367
1368       if (IS_MACHO_INDIRECT (s->n_type))
1369         /* A pointer to the referenced symbol will be stored in the udata
1370            field.  Use that to find the string index.  */
1371         s->symbol.value = 
1372             ((bfd_mach_o_asymbol *)s->symbol.udata.p)->symbol.udata.i;
1373      
1374       if (s->symbol.name == 0 || s->symbol.name[0] == '\0')
1375         /* An index of 0 always means the empty string.  */
1376         str_index = 0;
1377       else
1378         {
1379           str_index = _bfd_stringtab_add (strtab, s->symbol.name, TRUE, FALSE);
1380           /* Record the string index.  This can be looked up by an indirect sym
1381              which retains a pointer to its referenced counterpart, until it is
1382              actually output.  */
1383           if (IS_MACHO_INDIRECT (s->n_type))
1384             s->symbol.udata.i = str_index;
1385
1386           if (str_index == (bfd_size_type) -1)
1387             goto err;
1388         }
1389
1390       if (wide)
1391         {
1392           struct mach_o_nlist_64_external raw;
1393
1394           bfd_h_put_32 (abfd, str_index, raw.n_strx);
1395           bfd_h_put_8 (abfd, s->n_type, raw.n_type);
1396           bfd_h_put_8 (abfd, s->n_sect, raw.n_sect);
1397           bfd_h_put_16 (abfd, s->n_desc, raw.n_desc);
1398           bfd_h_put_64 (abfd, s->symbol.section->vma + s->symbol.value,
1399                         raw.n_value);
1400
1401           if (bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw))
1402             goto err;
1403         }
1404       else
1405         {
1406           struct mach_o_nlist_external raw;
1407
1408           bfd_h_put_32 (abfd, str_index, raw.n_strx);
1409           bfd_h_put_8 (abfd, s->n_type, raw.n_type);
1410           bfd_h_put_8 (abfd, s->n_sect, raw.n_sect);
1411           bfd_h_put_16 (abfd, s->n_desc, raw.n_desc);
1412           bfd_h_put_32 (abfd, s->symbol.section->vma + s->symbol.value,
1413                         raw.n_value);
1414
1415           if (bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw))
1416             goto err;
1417         }
1418     }
1419   sym->strsize = _bfd_stringtab_size (strtab);
1420   sym->stroff = mdata->filelen;
1421   mdata->filelen += sym->strsize;
1422
1423   if (_bfd_stringtab_emit (abfd, strtab) != TRUE)
1424     goto err;
1425   _bfd_stringtab_free (strtab);
1426
1427   /* The command.  */
1428   {
1429     struct mach_o_symtab_command_external raw;
1430
1431     bfd_h_put_32 (abfd, sym->symoff, raw.symoff);
1432     bfd_h_put_32 (abfd, sym->nsyms, raw.nsyms);
1433     bfd_h_put_32 (abfd, sym->stroff, raw.stroff);
1434     bfd_h_put_32 (abfd, sym->strsize, raw.strsize);
1435
1436     if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
1437         || bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw))
1438       return FALSE;
1439   }
1440
1441   return TRUE;
1442
1443  err:
1444   _bfd_stringtab_free (strtab);
1445   return FALSE;
1446 }
1447
1448 /* Write a dysymtab command.
1449    TODO: Possibly coalesce writes of smaller objects.  */
1450
1451 static bfd_boolean
1452 bfd_mach_o_write_dysymtab (bfd *abfd, bfd_mach_o_load_command *command)
1453 {
1454   bfd_mach_o_dysymtab_command *cmd = &command->command.dysymtab;
1455
1456   BFD_ASSERT (command->type == BFD_MACH_O_LC_DYSYMTAB);
1457
1458   if (cmd->nmodtab != 0)
1459     {
1460       unsigned int i;
1461
1462       if (bfd_seek (abfd, cmd->modtaboff, SEEK_SET) != 0)
1463         return FALSE;
1464
1465       for (i = 0; i < cmd->nmodtab; i++)
1466         {
1467           bfd_mach_o_dylib_module *module = &cmd->dylib_module[i];
1468           unsigned int iinit;
1469           unsigned int ninit;
1470
1471           iinit = module->iinit & 0xffff;
1472           iinit |= ((module->iterm & 0xffff) << 16);
1473
1474           ninit = module->ninit & 0xffff;
1475           ninit |= ((module->nterm & 0xffff) << 16);
1476
1477           if (bfd_mach_o_wide_p (abfd))
1478             {
1479               struct mach_o_dylib_module_64_external w;
1480
1481               bfd_h_put_32 (abfd, module->module_name_idx, &w.module_name);
1482               bfd_h_put_32 (abfd, module->iextdefsym, &w.iextdefsym);
1483               bfd_h_put_32 (abfd, module->nextdefsym, &w.nextdefsym);
1484               bfd_h_put_32 (abfd, module->irefsym, &w.irefsym);
1485               bfd_h_put_32 (abfd, module->nrefsym, &w.nrefsym);
1486               bfd_h_put_32 (abfd, module->ilocalsym, &w.ilocalsym);
1487               bfd_h_put_32 (abfd, module->nlocalsym, &w.nlocalsym);
1488               bfd_h_put_32 (abfd, module->iextrel, &w.iextrel);
1489               bfd_h_put_32 (abfd, module->nextrel, &w.nextrel);
1490               bfd_h_put_32 (abfd, iinit, &w.iinit_iterm);
1491               bfd_h_put_32 (abfd, ninit, &w.ninit_nterm);
1492               bfd_h_put_64 (abfd, module->objc_module_info_addr,
1493                             &w.objc_module_info_addr);
1494               bfd_h_put_32 (abfd, module->objc_module_info_size,
1495                             &w.objc_module_info_size);
1496
1497               if (bfd_bwrite ((void *) &w, sizeof (w), abfd) != sizeof (w))
1498                 return FALSE;
1499             }
1500           else
1501             {
1502               struct mach_o_dylib_module_external n;
1503
1504               bfd_h_put_32 (abfd, module->module_name_idx, &n.module_name);
1505               bfd_h_put_32 (abfd, module->iextdefsym, &n.iextdefsym);
1506               bfd_h_put_32 (abfd, module->nextdefsym, &n.nextdefsym);
1507               bfd_h_put_32 (abfd, module->irefsym, &n.irefsym);
1508               bfd_h_put_32 (abfd, module->nrefsym, &n.nrefsym);
1509               bfd_h_put_32 (abfd, module->ilocalsym, &n.ilocalsym);
1510               bfd_h_put_32 (abfd, module->nlocalsym, &n.nlocalsym);
1511               bfd_h_put_32 (abfd, module->iextrel, &n.iextrel);
1512               bfd_h_put_32 (abfd, module->nextrel, &n.nextrel);
1513               bfd_h_put_32 (abfd, iinit, &n.iinit_iterm);
1514               bfd_h_put_32 (abfd, ninit, &n.ninit_nterm);
1515               bfd_h_put_32 (abfd, module->objc_module_info_addr,
1516                             &n.objc_module_info_addr);
1517               bfd_h_put_32 (abfd, module->objc_module_info_size,
1518                             &n.objc_module_info_size);
1519
1520               if (bfd_bwrite ((void *) &n, sizeof (n), abfd) != sizeof (n))
1521                 return FALSE;
1522             }
1523         }
1524     }
1525
1526   if (cmd->ntoc != 0)
1527     {
1528       unsigned int i;
1529
1530       if (bfd_seek (abfd, cmd->tocoff, SEEK_SET) != 0)
1531         return FALSE;
1532
1533       for (i = 0; i < cmd->ntoc; i++)
1534         {
1535           struct mach_o_dylib_table_of_contents_external raw;
1536           bfd_mach_o_dylib_table_of_content *toc = &cmd->dylib_toc[i];
1537
1538           bfd_h_put_32 (abfd, toc->symbol_index, &raw.symbol_index);
1539           bfd_h_put_32 (abfd, toc->module_index, &raw.module_index);
1540
1541           if (bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw))
1542             return FALSE;
1543         }
1544     }
1545   
1546   if (cmd->nindirectsyms > 0)
1547     {
1548       unsigned int i;
1549
1550       if (bfd_seek (abfd, cmd->indirectsymoff, SEEK_SET) != 0)
1551         return FALSE;
1552
1553       for (i = 0; i < cmd->nindirectsyms; ++i)
1554         {
1555           unsigned char raw[4];
1556
1557           bfd_h_put_32 (abfd, cmd->indirect_syms[i], &raw);
1558           if (bfd_bwrite (raw, sizeof (raw), abfd) != sizeof (raw))
1559             return FALSE;
1560         }    
1561     }
1562
1563   if (cmd->nextrefsyms != 0)
1564     {
1565       unsigned int i;
1566
1567       if (bfd_seek (abfd, cmd->extrefsymoff, SEEK_SET) != 0)
1568         return FALSE;
1569
1570       for (i = 0; i < cmd->nextrefsyms; i++)
1571         {
1572           unsigned long v;
1573           unsigned char raw[4];
1574           bfd_mach_o_dylib_reference *ref = &cmd->ext_refs[i];
1575
1576           /* Fields isym and flags are written as bit-fields, thus we need
1577              a specific processing for endianness.  */
1578
1579           if (bfd_big_endian (abfd))
1580             {
1581               v = ((ref->isym & 0xffffff) << 8);
1582               v |= ref->flags & 0xff;
1583             }
1584           else
1585             {
1586               v = ref->isym  & 0xffffff;
1587               v |= ((ref->flags & 0xff) << 24);
1588             }
1589
1590           bfd_h_put_32 (abfd, v, raw);
1591           if (bfd_bwrite (raw, sizeof (raw), abfd) != sizeof (raw))
1592             return FALSE;
1593         }
1594     }
1595
1596   /* The command.  */
1597   if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0)
1598     return FALSE;
1599   else
1600     {
1601       struct mach_o_dysymtab_command_external raw;
1602
1603       bfd_h_put_32 (abfd, cmd->ilocalsym, &raw.ilocalsym);
1604       bfd_h_put_32 (abfd, cmd->nlocalsym, &raw.nlocalsym);
1605       bfd_h_put_32 (abfd, cmd->iextdefsym, &raw.iextdefsym);
1606       bfd_h_put_32 (abfd, cmd->nextdefsym, &raw.nextdefsym);
1607       bfd_h_put_32 (abfd, cmd->iundefsym, &raw.iundefsym);
1608       bfd_h_put_32 (abfd, cmd->nundefsym, &raw.nundefsym);
1609       bfd_h_put_32 (abfd, cmd->tocoff, &raw.tocoff);
1610       bfd_h_put_32 (abfd, cmd->ntoc, &raw.ntoc);
1611       bfd_h_put_32 (abfd, cmd->modtaboff, &raw.modtaboff);
1612       bfd_h_put_32 (abfd, cmd->nmodtab, &raw.nmodtab);
1613       bfd_h_put_32 (abfd, cmd->extrefsymoff, &raw.extrefsymoff);
1614       bfd_h_put_32 (abfd, cmd->nextrefsyms, &raw.nextrefsyms);
1615       bfd_h_put_32 (abfd, cmd->indirectsymoff, &raw.indirectsymoff);
1616       bfd_h_put_32 (abfd, cmd->nindirectsyms, &raw.nindirectsyms);
1617       bfd_h_put_32 (abfd, cmd->extreloff, &raw.extreloff);
1618       bfd_h_put_32 (abfd, cmd->nextrel, &raw.nextrel);
1619       bfd_h_put_32 (abfd, cmd->locreloff, &raw.locreloff);
1620       bfd_h_put_32 (abfd, cmd->nlocrel, &raw.nlocrel);
1621
1622       if (bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw))
1623         return FALSE;
1624     }
1625
1626   return TRUE;
1627 }
1628
1629 static unsigned
1630 bfd_mach_o_primary_symbol_sort_key (unsigned type)
1631 {
1632   unsigned mtyp = type & BFD_MACH_O_N_TYPE;
1633
1634   /* Just leave debug symbols where they are (pretend they are local, and
1635      then they will just be sorted on position).  */
1636   if (type & BFD_MACH_O_N_STAB)
1637     return 0;
1638
1639   /* Sort indirects to last.  */
1640   if (mtyp == BFD_MACH_O_N_INDR)
1641     return 3;
1642
1643   /* Local (we should never see an undefined local AFAICT).  */
1644   if (! (type & (BFD_MACH_O_N_EXT | BFD_MACH_O_N_PEXT)))
1645     return 0;
1646
1647   /* Common symbols look like undefined externs.  */
1648   if (mtyp == BFD_MACH_O_N_UNDF)
1649     return 2;
1650
1651   /* A defined symbol that's not indirect or extern.  */
1652   return 1;
1653 }
1654
1655 static int
1656 bfd_mach_o_cf_symbols (const void *a, const void *b)
1657 {
1658   bfd_mach_o_asymbol *sa = *(bfd_mach_o_asymbol **) a;
1659   bfd_mach_o_asymbol *sb = *(bfd_mach_o_asymbol **) b;
1660   unsigned int soa, sob;
1661
1662   soa = bfd_mach_o_primary_symbol_sort_key (sa->n_type);
1663   sob = bfd_mach_o_primary_symbol_sort_key (sb->n_type);
1664   if (soa < sob)
1665     return -1;
1666
1667   if (soa > sob)
1668     return 1;
1669
1670   /* If it's local or stab, just preserve the input order.  */
1671   if (soa == 0)
1672     {
1673       if (sa->symbol.udata.i < sb->symbol.udata.i)
1674         return -1;
1675       if (sa->symbol.udata.i > sb->symbol.udata.i)
1676         return  1;
1677       return 0;
1678     }
1679
1680   /* Unless it's an indirect the second sort key is name.  */
1681   if (soa < 3)
1682     return strcmp (sa->symbol.name, sb->symbol.name);
1683
1684   /* Here be indirect symbols, which have different sort rules.  */
1685
1686   /* Next sort key for indirect, is the section index.  */
1687   if (sa->n_sect < sb->n_sect)
1688     return -1;
1689
1690   if (sa->n_sect > sb->n_sect)
1691     return  1;
1692
1693   /* Last sort key is the order of definition - which should be in line with
1694      the value, since a stub size of 0 is meaninglesss.  */
1695
1696   if (sa->symbol.value < sb->symbol.value)
1697     return -1;
1698
1699   if (sa->symbol.value > sb->symbol.value)
1700     return 1;
1701
1702   /* In the final analysis, this is probably an error ... but leave it alone
1703      for now.  */
1704   return 0;
1705 }
1706
1707 /* When this is finished, return the number of non-indirect symbols.  */
1708
1709 static unsigned int
1710 bfd_mach_o_sort_symbol_table (asymbol **symbols, unsigned int nin)
1711 {
1712   qsort (symbols, (size_t) nin, sizeof (void *), bfd_mach_o_cf_symbols);
1713   
1714   /* Find the last non-indirect symbol.  
1715      There must be at least one non-indirect symbol otherwise there's
1716      nothing for the indirect(s) to refer to.  */
1717   do
1718     { 
1719       bfd_mach_o_asymbol *s = (bfd_mach_o_asymbol *)symbols[nin - 1];
1720       if (IS_MACHO_INDIRECT (s->n_type))
1721         nin--;
1722       else
1723         break;
1724     } while (nin - 1 > 0);
1725   return nin;
1726 }
1727
1728 /* Process the symbols.
1729
1730    This should be OK for single-module files - but it is not likely to work
1731    for multi-module shared libraries.
1732
1733    (a) If the application has not filled in the relevant mach-o fields, make
1734        an estimate.
1735
1736    (b) Order them, like this:
1737         (  i) local.
1738                 (unsorted)
1739         ( ii) external defined
1740                 (by name)
1741         (iii) external undefined
1742                 (by name)
1743         ( iv) common
1744                 (by name)
1745         (  v) indirect 
1746                 (by section)
1747                         (by position within section).
1748
1749    (c) Indirect symbols are moved to the end of the list.  */
1750
1751 static bfd_boolean
1752 bfd_mach_o_mangle_symbols (bfd *abfd, bfd_mach_o_data_struct *mdata)
1753 {
1754   unsigned long i;
1755   asymbol **symbols = bfd_get_outsymbols (abfd);
1756
1757   if (symbols == NULL || bfd_get_symcount (abfd) == 0)
1758     return TRUE;
1759
1760   for (i = 0; i < bfd_get_symcount (abfd); i++)
1761     {
1762       bfd_mach_o_asymbol *s = (bfd_mach_o_asymbol *)symbols[i];
1763
1764       if (s->n_type == BFD_MACH_O_N_UNDF && !(s->symbol.flags & BSF_DEBUGGING))
1765         {
1766           /* As genuine Mach-O symbols type shouldn't be N_UNDF (undefined
1767              symbols should be N_UNDEF | N_EXT), we suppose the back-end
1768              values haven't been set.  */
1769           if (s->symbol.section == bfd_abs_section_ptr)
1770             s->n_type = BFD_MACH_O_N_ABS;
1771           else if (s->symbol.section == bfd_und_section_ptr)
1772             {
1773               s->n_type = BFD_MACH_O_N_UNDF;
1774               if (s->symbol.flags & BSF_WEAK)
1775                 s->n_desc |= BFD_MACH_O_N_WEAK_REF;
1776               /* mach-o automatically makes undefined symbols extern.  */
1777               s->n_type |= BFD_MACH_O_N_EXT;
1778             }
1779           else if (s->symbol.section == bfd_com_section_ptr)
1780             s->n_type = BFD_MACH_O_N_UNDF | BFD_MACH_O_N_EXT;
1781           else
1782             s->n_type = BFD_MACH_O_N_SECT;
1783           
1784           if (s->symbol.flags & BSF_GLOBAL)
1785             s->n_type |= BFD_MACH_O_N_EXT;
1786         }
1787
1788       /* Put the section index in, where required.  */
1789       if ((s->symbol.section != bfd_abs_section_ptr
1790           && s->symbol.section != bfd_und_section_ptr
1791           && s->symbol.section != bfd_com_section_ptr)
1792           || ((s->n_type & BFD_MACH_O_N_STAB) != 0
1793                && s->symbol.name == NULL))
1794         s->n_sect = s->symbol.section->target_index;
1795
1796       /* Unless we're looking at an indirect sym, note the input ordering.
1797          We use this to keep local symbols ordered as per the input.  */
1798       if (! IS_MACHO_INDIRECT (s->n_type))
1799         s->symbol.udata.i = i;
1800     }
1801
1802   /* Sort the symbols and determine how many will remain in the main symbol
1803      table, and how many will be emitted as indirect (assuming that we will
1804      be emitting a dysymtab).  Renumber the sorted symbols so that the right
1805      index will be found during indirection.  */
1806   i = bfd_mach_o_sort_symbol_table (symbols, bfd_get_symcount (abfd));
1807   if (bfd_mach_o_should_emit_dysymtab ())
1808     {
1809       /* Point at the first indirect symbol.  */
1810       if (i < bfd_get_symcount (abfd))
1811         {
1812           mdata->indirect_syms = &symbols[i];
1813           mdata->nindirect = bfd_get_symcount (abfd) - i;
1814           /* This is, essentially, local to the output section of mach-o,
1815              and therefore should be safe.  */
1816           abfd->symcount = i;
1817         }
1818
1819       /* Now setup the counts for each type of symbol.  */
1820       for (i = 0; i < bfd_get_symcount (abfd); ++i)
1821         {
1822           bfd_mach_o_asymbol *s = (bfd_mach_o_asymbol *)symbols[i];
1823           s->symbol.udata.i = i;  /* renumber.  */
1824           if (s->n_type & (BFD_MACH_O_N_EXT | BFD_MACH_O_N_PEXT))
1825             break;
1826         }
1827       mdata->nlocal = i;
1828       for (; i < bfd_get_symcount (abfd); ++i)
1829         {
1830           bfd_mach_o_asymbol *s = (bfd_mach_o_asymbol *)symbols[i];
1831           s->symbol.udata.i = i;  /* renumber.  */
1832           if ((s->n_type & BFD_MACH_O_N_TYPE) == BFD_MACH_O_N_UNDF)
1833             break;
1834         }
1835       mdata->ndefext = i - mdata->nlocal;
1836       mdata->nundefext = bfd_get_symcount (abfd) 
1837                          - mdata->ndefext 
1838                          - mdata->nlocal;
1839       for (; i < bfd_get_symcount (abfd); ++i)
1840         {
1841           bfd_mach_o_asymbol *s = (bfd_mach_o_asymbol *)symbols[i];
1842           s->symbol.udata.i = i;  /* renumber.  */
1843         }
1844     }
1845
1846   return TRUE;
1847 }
1848
1849 /* We build a flat table of sections, which can be re-ordered if necessary.
1850    Fill in the section number and other mach-o-specific data.  */
1851
1852 static bfd_boolean
1853 bfd_mach_o_mangle_sections (bfd *abfd, bfd_mach_o_data_struct *mdata)
1854 {
1855   asection *sec;
1856   unsigned target_index;
1857   unsigned nsect;
1858
1859   nsect = bfd_count_sections (abfd);
1860   
1861   /* Don't do it if it's already set - assume the application knows what it's
1862      doing.  */
1863   if (mdata->nsects == nsect
1864       && (mdata->nsects == 0 || mdata->sections != NULL))
1865     return TRUE;
1866
1867   mdata->nsects = nsect;
1868   mdata->sections = bfd_alloc (abfd, 
1869                                mdata->nsects * sizeof (bfd_mach_o_section *));
1870   if (mdata->sections == NULL)
1871     return FALSE;
1872
1873   /* We need to check that this can be done...  */
1874   if (nsect > 255)
1875     (*_bfd_error_handler) (_("mach-o: there are too many sections (%d)"
1876                              " maximum is 255,\n"), nsect);
1877
1878   /* Create Mach-O sections.
1879      Section type, attribute and align should have been set when the 
1880      section was created - either read in or specified.  */
1881   target_index = 0;
1882   for (sec = abfd->sections; sec; sec = sec->next)
1883     {
1884       unsigned bfd_align = bfd_get_section_alignment (abfd, sec);
1885       bfd_mach_o_section *msect = bfd_mach_o_get_mach_o_section (sec);
1886
1887       mdata->sections[target_index] = msect;
1888
1889       msect->addr = bfd_get_section_vma (abfd, sec);
1890       msect->size = bfd_get_section_size (sec);
1891
1892       /* Use the largest alignment set, in case it was bumped after the 
1893          section was created.  */
1894       msect->align = msect->align > bfd_align ? msect->align : bfd_align;
1895
1896       msect->offset = 0;
1897       sec->target_index = ++target_index;
1898     }
1899
1900   return TRUE;
1901 }
1902
1903 bfd_boolean
1904 bfd_mach_o_write_contents (bfd *abfd)
1905 {
1906   unsigned int i;
1907   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
1908
1909   /* Make the commands, if not already present.  */
1910   if (mdata->header.ncmds == 0)
1911     if (!bfd_mach_o_build_commands (abfd))
1912       return FALSE;
1913
1914   if (!bfd_mach_o_write_header (abfd, &mdata->header))
1915     return FALSE;
1916
1917   for (i = 0; i < mdata->header.ncmds; i++)
1918     {
1919       struct mach_o_load_command_external raw;
1920       bfd_mach_o_load_command *cur = &mdata->commands[i];
1921       unsigned long typeflag;
1922
1923       typeflag = cur->type | (cur->type_required ? BFD_MACH_O_LC_REQ_DYLD : 0);
1924
1925       bfd_h_put_32 (abfd, typeflag, raw.cmd);
1926       bfd_h_put_32 (abfd, cur->len, raw.cmdsize);
1927
1928       if (bfd_seek (abfd, cur->offset, SEEK_SET) != 0
1929           || bfd_bwrite (&raw, BFD_MACH_O_LC_SIZE, abfd) != 8)
1930         return FALSE;
1931
1932       switch (cur->type)
1933         {
1934         case BFD_MACH_O_LC_SEGMENT:
1935           if (bfd_mach_o_write_segment_32 (abfd, cur) != 0)
1936             return FALSE;
1937           break;
1938         case BFD_MACH_O_LC_SEGMENT_64:
1939           if (bfd_mach_o_write_segment_64 (abfd, cur) != 0)
1940             return FALSE;
1941           break;
1942         case BFD_MACH_O_LC_SYMTAB:
1943           if (!bfd_mach_o_write_symtab (abfd, cur))
1944             return FALSE;
1945           break;
1946         case BFD_MACH_O_LC_DYSYMTAB:
1947           if (!bfd_mach_o_write_dysymtab (abfd, cur))
1948             return FALSE;
1949           break;
1950         case BFD_MACH_O_LC_SYMSEG:
1951           break;
1952         case BFD_MACH_O_LC_THREAD:
1953         case BFD_MACH_O_LC_UNIXTHREAD:
1954           if (bfd_mach_o_write_thread (abfd, cur) != 0)
1955             return FALSE;
1956           break;
1957         case BFD_MACH_O_LC_LOADFVMLIB:
1958         case BFD_MACH_O_LC_IDFVMLIB:
1959         case BFD_MACH_O_LC_IDENT:
1960         case BFD_MACH_O_LC_FVMFILE:
1961         case BFD_MACH_O_LC_PREPAGE:
1962         case BFD_MACH_O_LC_LOAD_DYLIB:
1963         case BFD_MACH_O_LC_LOAD_WEAK_DYLIB:
1964         case BFD_MACH_O_LC_ID_DYLIB:
1965         case BFD_MACH_O_LC_REEXPORT_DYLIB:
1966         case BFD_MACH_O_LC_LOAD_UPWARD_DYLIB:
1967         case BFD_MACH_O_LC_LOAD_DYLINKER:
1968         case BFD_MACH_O_LC_ID_DYLINKER:
1969         case BFD_MACH_O_LC_PREBOUND_DYLIB:
1970         case BFD_MACH_O_LC_ROUTINES:
1971         case BFD_MACH_O_LC_SUB_FRAMEWORK:
1972           break;
1973         default:
1974           (*_bfd_error_handler) (_("unable to write unknown load command 0x%lx"),
1975                                  (unsigned long) cur->type);
1976           return FALSE;
1977         }
1978     }
1979
1980   return TRUE;
1981 }
1982
1983 static void
1984 bfd_mach_o_append_section_to_segment (bfd_mach_o_segment_command *seg,
1985                                       asection *sec)
1986 {
1987   bfd_mach_o_section *s = (bfd_mach_o_section *)sec->used_by_bfd;
1988   if (seg->sect_head == NULL)
1989     seg->sect_head = s;
1990   else
1991     seg->sect_tail->next = s;
1992   seg->sect_tail = s;
1993 }
1994
1995 /* Create section Mach-O flags from BFD flags.  */
1996
1997 static void
1998 bfd_mach_o_set_section_flags_from_bfd (bfd *abfd ATTRIBUTE_UNUSED, asection *sec)
1999 {
2000   flagword bfd_flags;
2001   bfd_mach_o_section *s = bfd_mach_o_get_mach_o_section (sec);
2002
2003   /* Create default flags.  */
2004   bfd_flags = bfd_get_section_flags (abfd, sec);
2005   if ((bfd_flags & SEC_CODE) == SEC_CODE)
2006     s->flags = BFD_MACH_O_S_ATTR_PURE_INSTRUCTIONS
2007       | BFD_MACH_O_S_ATTR_SOME_INSTRUCTIONS
2008       | BFD_MACH_O_S_REGULAR;
2009   else if ((bfd_flags & (SEC_ALLOC | SEC_LOAD)) == SEC_ALLOC)
2010     s->flags = BFD_MACH_O_S_ZEROFILL;
2011   else if (bfd_flags & SEC_DEBUGGING)
2012     s->flags = BFD_MACH_O_S_REGULAR |  BFD_MACH_O_S_ATTR_DEBUG;
2013   else
2014     s->flags = BFD_MACH_O_S_REGULAR;
2015 }
2016
2017 /* Count the number of sections in the list for the segment named.
2018
2019    The special case of NULL or "" for the segment name is valid for
2020    an MH_OBJECT file and means 'all sections available'.  
2021    
2022    Requires that the sections table in mdata be filled in.  
2023
2024    Returns the number of sections (0 is valid).
2025    Any number > 255 signals an invalid section count, although we will,
2026    perhaps, allow the file to be written (in line with Darwin tools up
2027    to XCode 4). 
2028    
2029    A section count of (unsigned long) -1 signals a definite error.  */
2030
2031 static unsigned long
2032 bfd_mach_o_count_sections_for_seg (const char *segment,
2033                                    bfd_mach_o_data_struct *mdata)
2034 {
2035   unsigned i,j;
2036   if (mdata == NULL || mdata->sections == NULL)
2037     return (unsigned long) -1;
2038
2039   /* The MH_OBJECT case, all sections are considered; Although nsects is
2040      is an unsigned long, the maximum valid section count is 255 and this
2041      will have been checked already by mangle_sections.  */
2042   if (segment == NULL || segment[0] == '\0')
2043     return mdata->nsects;
2044
2045   /* Count the number of sections we see in this segment.  */
2046   j = 0;
2047   for (i = 0; i < mdata->nsects; ++i)
2048     {
2049       bfd_mach_o_section *s = mdata->sections[i];
2050       if (strncmp (segment, s->segname, BFD_MACH_O_SEGNAME_SIZE) == 0)
2051         j++;
2052     }
2053   return j;
2054 }
2055
2056 static bfd_boolean
2057 bfd_mach_o_build_seg_command (const char *segment,
2058                               bfd_mach_o_data_struct *mdata,
2059                               bfd_mach_o_segment_command *seg)
2060 {
2061   unsigned i;
2062   int is_mho = (segment == NULL || segment[0] == '\0');
2063
2064   /* Fill segment command.  */
2065   if (is_mho)
2066     memset (seg->segname, 0, sizeof (seg->segname));
2067   else
2068     strncpy (seg->segname, segment, sizeof (seg->segname));
2069
2070   /* TODO: fix this up for non-MH_OBJECT cases.  */
2071   seg->vmaddr = 0;
2072
2073   seg->fileoff = mdata->filelen;
2074   seg->filesize = 0;
2075   seg->maxprot = BFD_MACH_O_PROT_READ | BFD_MACH_O_PROT_WRITE
2076                  | BFD_MACH_O_PROT_EXECUTE;
2077   seg->initprot = seg->maxprot;
2078   seg->flags = 0;
2079   seg->sect_head = NULL;
2080   seg->sect_tail = NULL;
2081
2082   /*  Append sections to the segment.  */
2083
2084   for (i = 0; i < mdata->nsects; ++i)
2085     {
2086       bfd_mach_o_section *s = mdata->sections[i];
2087       asection *sec = s->bfdsection;
2088
2089       /* If we're not making an MH_OBJECT, check whether this section is from
2090          our segment, and skip if not.  Otherwise, just add all sections.  */
2091       if (! is_mho 
2092           && strncmp (segment, s->segname, BFD_MACH_O_SEGNAME_SIZE) != 0)
2093         continue;
2094
2095       bfd_mach_o_append_section_to_segment (seg, sec);
2096
2097       if (s->size == 0)
2098          s->offset = 0;
2099       else
2100        {
2101           mdata->filelen = FILE_ALIGN (mdata->filelen, s->align);
2102           s->offset = mdata->filelen;
2103         }
2104
2105       sec->filepos = s->offset;
2106
2107       mdata->filelen += s->size;
2108     }
2109
2110   seg->filesize = mdata->filelen - seg->fileoff;
2111   seg->vmsize = seg->filesize;
2112
2113   return TRUE;
2114 }
2115
2116 static bfd_boolean
2117 bfd_mach_o_build_dysymtab_command (bfd *abfd,
2118                                    bfd_mach_o_data_struct *mdata,
2119                                    bfd_mach_o_load_command *cmd)
2120 {
2121   bfd_mach_o_dysymtab_command *dsym = &cmd->command.dysymtab;
2122
2123   /* TODO:
2124      We are not going to try and fill these in yet and, moreover, we are
2125      going to bail if they are already set.  */
2126   if (dsym->nmodtab != 0
2127       || dsym->ntoc != 0
2128       || dsym->nextrefsyms != 0)
2129     {
2130       (*_bfd_error_handler) (_("sorry: modtab, toc and extrefsyms are not yet"
2131                                 " implemented for dysymtab commands."));
2132       return FALSE;
2133     }
2134
2135   dsym->ilocalsym = 0;
2136   dsym->nlocalsym = mdata->nlocal;
2137   dsym->iextdefsym = dsym->nlocalsym;
2138   dsym->nextdefsym = mdata->ndefext;
2139   dsym->iundefsym = dsym->nextdefsym + dsym->iextdefsym;
2140   dsym->nundefsym = mdata->nundefext;
2141
2142   if (mdata->nindirect > 0)
2143     {
2144       unsigned i, sect;
2145
2146       mdata->filelen = FILE_ALIGN (mdata->filelen, 2);
2147       dsym->indirectsymoff = mdata->filelen;
2148       mdata->filelen += mdata->nindirect * 4;
2149       
2150       dsym->indirect_syms = bfd_zalloc (abfd, mdata->nindirect * 4);
2151       if (dsym->indirect_syms == NULL)
2152         return FALSE;
2153       dsym->nindirectsyms = mdata->nindirect;
2154       
2155       /* So fill in the indices, and point the section reserved1 fields
2156          at the right one.  */
2157       sect = (unsigned) -1;
2158       for (i = 0; i < mdata->nindirect; ++i)
2159         {
2160           bfd_mach_o_asymbol *s = 
2161                         (bfd_mach_o_asymbol *) mdata->indirect_syms[i];
2162           /* Lookup the index of the referenced symbol.  */
2163           dsym->indirect_syms[i] = 
2164                 ((bfd_mach_o_asymbol *) s->symbol.udata.p)->symbol.udata.i;
2165           if (s->n_sect != sect)
2166             {
2167               /* Mach-o sections are 1-based, but the section table
2168                  is 0-based.  */
2169               bfd_mach_o_section *sc = mdata->sections[s->n_sect-1];
2170               sc->reserved1 = i;
2171               sect = s->n_sect;
2172             }
2173         }
2174     }
2175
2176   return TRUE;
2177 }
2178
2179 /* Build Mach-O load commands (currently assuming an MH_OBJECT file).
2180    TODO: Other file formats, rebuilding symtab/dysymtab commands for strip
2181    and copy functionality.  */
2182
2183 bfd_boolean
2184 bfd_mach_o_build_commands (bfd *abfd)
2185 {
2186   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
2187   unsigned int wide = mach_o_wide_p (&mdata->header);
2188   bfd_mach_o_segment_command *seg;
2189   bfd_mach_o_load_command *cmd;
2190   bfd_mach_o_load_command *symtab_cmd;
2191   unsigned symcind;
2192
2193   /* Return now if commands are already present.  */
2194   if (mdata->header.ncmds)
2195     return FALSE;
2196
2197   /* Fill in the file type, if not already set.  */
2198
2199   if (mdata->header.filetype == 0)
2200     {
2201       if (abfd->flags & EXEC_P)
2202         mdata->header.filetype = BFD_MACH_O_MH_EXECUTE;
2203       else if (abfd->flags & DYNAMIC)
2204         mdata->header.filetype = BFD_MACH_O_MH_DYLIB;
2205       else
2206         mdata->header.filetype = BFD_MACH_O_MH_OBJECT;
2207     }
2208
2209   /* If hasn't already been done, flatten sections list, and sort
2210      if/when required.  Must be done before the symbol table is adjusted,
2211      since that depends on properly numbered sections.  */
2212   if (mdata->nsects == 0 || mdata->sections == NULL)
2213     if (! bfd_mach_o_mangle_sections (abfd, mdata))
2214       return FALSE;
2215
2216   /* Order the symbol table, fill-in/check mach-o specific fields and
2217      partition out any indirect symbols.  */
2218   if (!bfd_mach_o_mangle_symbols (abfd, mdata))
2219     return FALSE;
2220
2221   /* It's valid to have a file with only absolute symbols...  */
2222   if (mdata->nsects > 0)
2223     {
2224       mdata->header.ncmds = 1;
2225       symcind = 1;
2226     }
2227   else
2228     symcind = 0;
2229
2230   /* It's OK to have a file with only section statements.  */
2231   if (bfd_get_symcount (abfd) > 0)
2232     mdata->header.ncmds += 1;
2233
2234   /* Very simple version (only really applicable to MH_OBJECTs):
2235         a command (segment) to contain all the sections,
2236         a command for the symbol table
2237         a n (optional) command for the dysymtab.  
2238
2239      ??? maybe we should assert that this is an MH_OBJECT?  */
2240
2241   if (bfd_mach_o_should_emit_dysymtab ()
2242       && bfd_get_symcount (abfd) > 0)
2243     mdata->header.ncmds += 1;
2244
2245   /* A bit weird, but looks like no content;
2246      as -n empty.s -o empty.o  */
2247   if (mdata->header.ncmds == 0)
2248     return TRUE;
2249
2250   mdata->commands = bfd_zalloc (abfd, mdata->header.ncmds
2251                                 * sizeof (bfd_mach_o_load_command));
2252   if (mdata->commands == NULL)
2253     return FALSE;
2254
2255   if (mdata->nsects > 0)
2256     {  
2257       cmd = &mdata->commands[0];
2258       seg = &cmd->command.segment;
2259
2260       /* Count the segctions in the special blank segment used for MH_OBJECT.  */
2261       seg->nsects = bfd_mach_o_count_sections_for_seg (NULL, mdata);
2262       if (seg->nsects == (unsigned long) -1)
2263         return FALSE;
2264
2265       /* Init segment command.  */
2266       if (wide)
2267         {
2268           cmd->type = BFD_MACH_O_LC_SEGMENT_64;
2269           cmd->offset = BFD_MACH_O_HEADER_64_SIZE;
2270           cmd->len = BFD_MACH_O_LC_SEGMENT_64_SIZE
2271                         + BFD_MACH_O_SECTION_64_SIZE * seg->nsects;
2272         }
2273       else
2274         {
2275           cmd->type = BFD_MACH_O_LC_SEGMENT;
2276           cmd->offset = BFD_MACH_O_HEADER_SIZE;
2277           cmd->len = BFD_MACH_O_LC_SEGMENT_SIZE
2278                         + BFD_MACH_O_SECTION_SIZE * seg->nsects;
2279         }
2280       cmd->type_required = FALSE;
2281       mdata->header.sizeofcmds = cmd->len;
2282       mdata->filelen = cmd->offset + cmd->len;
2283     }
2284
2285   if (bfd_get_symcount (abfd) > 0)
2286     {
2287       /* Init symtab command.  */
2288       symtab_cmd = &mdata->commands[symcind];
2289   
2290       symtab_cmd->type = BFD_MACH_O_LC_SYMTAB;
2291       if (symcind > 0)
2292         symtab_cmd->offset = mdata->commands[0].offset 
2293                              + mdata->commands[0].len;
2294       else
2295         symtab_cmd->offset = 0;
2296       symtab_cmd->len = 6 * 4;
2297       symtab_cmd->type_required = FALSE;
2298   
2299       mdata->header.sizeofcmds += symtab_cmd->len;
2300       mdata->filelen += symtab_cmd->len;
2301     }
2302
2303   /* If required, setup symtab command.  */
2304   if (bfd_mach_o_should_emit_dysymtab ()
2305       && bfd_get_symcount (abfd) > 0)
2306     {
2307       cmd = &mdata->commands[symcind+1];
2308       cmd->type = BFD_MACH_O_LC_DYSYMTAB;
2309       cmd->offset = symtab_cmd->offset + symtab_cmd->len;
2310       cmd->type_required = FALSE;
2311       cmd->len = 18 * 4 + BFD_MACH_O_LC_SIZE;
2312
2313       mdata->header.sizeofcmds += cmd->len;
2314       mdata->filelen += cmd->len;
2315     }
2316
2317   /* So, now we have sized the commands and the filelen set to that.
2318      Now we can build the segment command and set the section file offsets.  */
2319   if (mdata->nsects > 0
2320       && ! bfd_mach_o_build_seg_command (NULL, mdata, seg))
2321     return FALSE;
2322
2323   /* If we're doing a dysymtab, cmd points to its load command.  */
2324   if (bfd_mach_o_should_emit_dysymtab ()
2325       && bfd_get_symcount (abfd) > 0
2326       && ! bfd_mach_o_build_dysymtab_command (abfd, mdata, 
2327                                               &mdata->commands[symcind+1]))
2328     return FALSE;
2329
2330   /* The symtab command is filled in when the symtab is written.  */
2331   return TRUE;
2332 }
2333
2334 /* Set the contents of a section.  */
2335
2336 bfd_boolean
2337 bfd_mach_o_set_section_contents (bfd *abfd,
2338                                  asection *section,
2339                                  const void * location,
2340                                  file_ptr offset,
2341                                  bfd_size_type count)
2342 {
2343   file_ptr pos;
2344
2345   /* Trying to write the first section contents will trigger the creation of
2346      the load commands if they are not already present.  */
2347   if (! abfd->output_has_begun && ! bfd_mach_o_build_commands (abfd))
2348     return FALSE;
2349
2350   if (count == 0)
2351     return TRUE;
2352
2353   pos = section->filepos + offset;
2354   if (bfd_seek (abfd, pos, SEEK_SET) != 0
2355       || bfd_bwrite (location, count, abfd) != count)
2356     return FALSE;
2357
2358   return TRUE;
2359 }
2360
2361 int
2362 bfd_mach_o_sizeof_headers (bfd *a ATTRIBUTE_UNUSED,
2363                            struct bfd_link_info *info ATTRIBUTE_UNUSED)
2364 {
2365   return 0;
2366 }
2367
2368 /* Make an empty symbol.  This is required only because
2369    bfd_make_section_anyway wants to create a symbol for the section.  */
2370
2371 asymbol *
2372 bfd_mach_o_make_empty_symbol (bfd *abfd)
2373 {
2374   asymbol *new_symbol;
2375
2376   new_symbol = bfd_zalloc (abfd, sizeof (bfd_mach_o_asymbol));
2377   if (new_symbol == NULL)
2378     return new_symbol;
2379   new_symbol->the_bfd = abfd;
2380   new_symbol->udata.i = 0;
2381   return new_symbol;
2382 }
2383
2384 static bfd_boolean
2385 bfd_mach_o_read_header (bfd *abfd, bfd_mach_o_header *header)
2386 {
2387   struct mach_o_header_external raw;
2388   unsigned int size;
2389   bfd_vma (*get32) (const void *) = NULL;
2390
2391   /* Just read the magic number.  */
2392   if (bfd_seek (abfd, 0, SEEK_SET) != 0
2393       || bfd_bread (raw.magic, sizeof (raw.magic), abfd) != 4)
2394     return FALSE;
2395
2396   if (bfd_getb32 (raw.magic) == BFD_MACH_O_MH_MAGIC)
2397     {
2398       header->byteorder = BFD_ENDIAN_BIG;
2399       header->magic = BFD_MACH_O_MH_MAGIC;
2400       header->version = 1;
2401       get32 = bfd_getb32;
2402     }
2403   else if (bfd_getl32 (raw.magic) == BFD_MACH_O_MH_MAGIC)
2404     {
2405       header->byteorder = BFD_ENDIAN_LITTLE;
2406       header->magic = BFD_MACH_O_MH_MAGIC;
2407       header->version = 1;
2408       get32 = bfd_getl32;
2409     }
2410   else if (bfd_getb32 (raw.magic) == BFD_MACH_O_MH_MAGIC_64)
2411     {
2412       header->byteorder = BFD_ENDIAN_BIG;
2413       header->magic = BFD_MACH_O_MH_MAGIC_64;
2414       header->version = 2;
2415       get32 = bfd_getb32;
2416     }
2417   else if (bfd_getl32 (raw.magic) == BFD_MACH_O_MH_MAGIC_64)
2418     {
2419       header->byteorder = BFD_ENDIAN_LITTLE;
2420       header->magic = BFD_MACH_O_MH_MAGIC_64;
2421       header->version = 2;
2422       get32 = bfd_getl32;
2423     }
2424   else
2425     {
2426       header->byteorder = BFD_ENDIAN_UNKNOWN;
2427       return FALSE;
2428     }
2429
2430   /* Once the size of the header is known, read the full header.  */
2431   size = mach_o_wide_p (header) ?
2432     BFD_MACH_O_HEADER_64_SIZE : BFD_MACH_O_HEADER_SIZE;
2433
2434   if (bfd_seek (abfd, 0, SEEK_SET) != 0
2435       || bfd_bread (&raw, size, abfd) != size)
2436     return FALSE;
2437
2438   header->cputype = (*get32) (raw.cputype);
2439   header->cpusubtype = (*get32) (raw.cpusubtype);
2440   header->filetype = (*get32) (raw.filetype);
2441   header->ncmds = (*get32) (raw.ncmds);
2442   header->sizeofcmds = (*get32) (raw.sizeofcmds);
2443   header->flags = (*get32) (raw.flags);
2444
2445   if (mach_o_wide_p (header))
2446     header->reserved = (*get32) (raw.reserved);
2447
2448   return TRUE;
2449 }
2450
2451 bfd_boolean
2452 bfd_mach_o_new_section_hook (bfd *abfd, asection *sec)
2453 {
2454   bfd_mach_o_section *s;
2455   unsigned bfdalign = bfd_get_section_alignment (abfd, sec);
2456
2457   s = bfd_mach_o_get_mach_o_section (sec);
2458   if (s == NULL)
2459     {
2460       flagword bfd_flags;
2461       static const mach_o_section_name_xlat * xlat;
2462
2463       s = (bfd_mach_o_section *) bfd_zalloc (abfd, sizeof (*s));
2464       if (s == NULL)
2465         return FALSE;
2466       sec->used_by_bfd = s;
2467       s->bfdsection = sec;
2468
2469       /* Create the Darwin seg/sect name pair from the bfd name.
2470          If this is a canonical name for which a specific paiting exists
2471          there will also be defined flags, type, attribute and alignment
2472          values.  */
2473       xlat = bfd_mach_o_convert_section_name_to_mach_o (abfd, sec, s);
2474       if (xlat != NULL)
2475         {
2476           s->flags = xlat->macho_sectype | xlat->macho_secattr;
2477           s->align = xlat->sectalign > bfdalign ? xlat->sectalign 
2478                                                 : bfdalign;
2479           bfd_set_section_alignment (abfd, sec, s->align);
2480           bfd_flags = bfd_get_section_flags (abfd, sec);
2481           if (bfd_flags == SEC_NO_FLAGS)
2482             bfd_set_section_flags (abfd, sec, xlat->bfd_flags);
2483         }
2484       else
2485         /* Create default flags.  */
2486         bfd_mach_o_set_section_flags_from_bfd (abfd, sec);
2487     }
2488
2489   return _bfd_generic_new_section_hook (abfd, sec);
2490 }
2491
2492 static void
2493 bfd_mach_o_init_section_from_mach_o (bfd *abfd, asection *sec,
2494                                      unsigned long prot)
2495 {
2496   flagword flags;
2497   bfd_mach_o_section *section;
2498
2499   flags = bfd_get_section_flags (abfd, sec);
2500   section = bfd_mach_o_get_mach_o_section (sec);
2501
2502   /* TODO: see if we should use the xlat system for doing this by
2503      preference and fall back to this for unknown sections.  */
2504
2505   if (flags == SEC_NO_FLAGS)
2506     {
2507       /* Try to guess flags.  */
2508       if (section->flags & BFD_MACH_O_S_ATTR_DEBUG)
2509         flags = SEC_DEBUGGING;
2510       else
2511         {
2512           flags = SEC_ALLOC;
2513           if ((section->flags & BFD_MACH_O_SECTION_TYPE_MASK)
2514               != BFD_MACH_O_S_ZEROFILL)
2515             {
2516               flags |= SEC_LOAD;
2517               if (prot & BFD_MACH_O_PROT_EXECUTE)
2518                 flags |= SEC_CODE;
2519               if (prot & BFD_MACH_O_PROT_WRITE)
2520                 flags |= SEC_DATA;
2521               else if (prot & BFD_MACH_O_PROT_READ)
2522                 flags |= SEC_READONLY;
2523             }
2524         }
2525     }
2526   else
2527     {
2528       if ((flags & SEC_DEBUGGING) == 0)
2529         flags |= SEC_ALLOC;
2530     }
2531
2532   if (section->offset != 0)
2533     flags |= SEC_HAS_CONTENTS;
2534   if (section->nreloc != 0)
2535     flags |= SEC_RELOC;
2536
2537   bfd_set_section_flags (abfd, sec, flags);
2538
2539   sec->vma = section->addr;
2540   sec->lma = section->addr;
2541   sec->size = section->size;
2542   sec->filepos = section->offset;
2543   sec->alignment_power = section->align;
2544   sec->segment_mark = 0;
2545   sec->reloc_count = section->nreloc;
2546   sec->rel_filepos = section->reloff;
2547 }
2548
2549 static asection *
2550 bfd_mach_o_make_bfd_section (bfd *abfd,
2551                              const unsigned char *segname,
2552                              const unsigned char *sectname)
2553 {
2554   const char *sname;
2555   flagword flags;
2556
2557   bfd_mach_o_convert_section_name_to_bfd
2558     (abfd, (const char *)segname, (const char *)sectname, &sname, &flags);
2559   if (sname == NULL)
2560     return NULL;
2561
2562   return bfd_make_section_anyway_with_flags (abfd, sname, flags);
2563 }
2564
2565 static asection *
2566 bfd_mach_o_read_section_32 (bfd *abfd,
2567                             unsigned int offset,
2568                             unsigned long prot)
2569 {
2570   struct mach_o_section_32_external raw;
2571   asection *sec;
2572   bfd_mach_o_section *section;
2573
2574   if (bfd_seek (abfd, offset, SEEK_SET) != 0
2575       || (bfd_bread (&raw, BFD_MACH_O_SECTION_SIZE, abfd)
2576           != BFD_MACH_O_SECTION_SIZE))
2577     return NULL;
2578
2579   sec = bfd_mach_o_make_bfd_section (abfd, raw.segname, raw.sectname);
2580   if (sec == NULL)
2581     return NULL;
2582
2583   section = bfd_mach_o_get_mach_o_section (sec);
2584   memcpy (section->segname, raw.segname, sizeof (raw.segname));
2585   section->segname[BFD_MACH_O_SEGNAME_SIZE] = 0;
2586   memcpy (section->sectname, raw.sectname, sizeof (raw.sectname));
2587   section->sectname[BFD_MACH_O_SECTNAME_SIZE] = 0;
2588   section->addr = bfd_h_get_32 (abfd, raw.addr);
2589   section->size = bfd_h_get_32 (abfd, raw.size);
2590   section->offset = bfd_h_get_32 (abfd, raw.offset);
2591   section->align = bfd_h_get_32 (abfd, raw.align);
2592   section->reloff = bfd_h_get_32 (abfd, raw.reloff);
2593   section->nreloc = bfd_h_get_32 (abfd, raw.nreloc);
2594   section->flags = bfd_h_get_32 (abfd, raw.flags);
2595   section->reserved1 = bfd_h_get_32 (abfd, raw.reserved1);
2596   section->reserved2 = bfd_h_get_32 (abfd, raw.reserved2);
2597   section->reserved3 = 0;
2598
2599   bfd_mach_o_init_section_from_mach_o (abfd, sec, prot);
2600
2601   return sec;
2602 }
2603
2604 static asection *
2605 bfd_mach_o_read_section_64 (bfd *abfd,
2606                             unsigned int offset,
2607                             unsigned long prot)
2608 {
2609   struct mach_o_section_64_external raw;
2610   asection *sec;
2611   bfd_mach_o_section *section;
2612
2613   if (bfd_seek (abfd, offset, SEEK_SET) != 0
2614       || (bfd_bread (&raw, BFD_MACH_O_SECTION_64_SIZE, abfd)
2615           != BFD_MACH_O_SECTION_64_SIZE))
2616     return NULL;
2617
2618   sec = bfd_mach_o_make_bfd_section (abfd, raw.segname, raw.sectname);
2619   if (sec == NULL)
2620     return NULL;
2621
2622   section = bfd_mach_o_get_mach_o_section (sec);
2623   memcpy (section->segname, raw.segname, sizeof (raw.segname));
2624   section->segname[BFD_MACH_O_SEGNAME_SIZE] = 0;
2625   memcpy (section->sectname, raw.sectname, sizeof (raw.sectname));
2626   section->sectname[BFD_MACH_O_SECTNAME_SIZE] = 0;
2627   section->addr = bfd_h_get_64 (abfd, raw.addr);
2628   section->size = bfd_h_get_64 (abfd, raw.size);
2629   section->offset = bfd_h_get_32 (abfd, raw.offset);
2630   section->align = bfd_h_get_32 (abfd, raw.align);
2631   section->reloff = bfd_h_get_32 (abfd, raw.reloff);
2632   section->nreloc = bfd_h_get_32 (abfd, raw.nreloc);
2633   section->flags = bfd_h_get_32 (abfd, raw.flags);
2634   section->reserved1 = bfd_h_get_32 (abfd, raw.reserved1);
2635   section->reserved2 = bfd_h_get_32 (abfd, raw.reserved2);
2636   section->reserved3 = bfd_h_get_32 (abfd, raw.reserved3);
2637
2638   bfd_mach_o_init_section_from_mach_o (abfd, sec, prot);
2639
2640   return sec;
2641 }
2642
2643 static asection *
2644 bfd_mach_o_read_section (bfd *abfd,
2645                          unsigned int offset,
2646                          unsigned long prot,
2647                          unsigned int wide)
2648 {
2649   if (wide)
2650     return bfd_mach_o_read_section_64 (abfd, offset, prot);
2651   else
2652     return bfd_mach_o_read_section_32 (abfd, offset, prot);
2653 }
2654
2655 static bfd_boolean
2656 bfd_mach_o_read_symtab_symbol (bfd *abfd,
2657                                bfd_mach_o_symtab_command *sym,
2658                                bfd_mach_o_asymbol *s,
2659                                unsigned long i)
2660 {
2661   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
2662   unsigned int wide = mach_o_wide_p (&mdata->header);
2663   unsigned int symwidth =
2664     wide ? BFD_MACH_O_NLIST_64_SIZE : BFD_MACH_O_NLIST_SIZE;
2665   unsigned int symoff = sym->symoff + (i * symwidth);
2666   struct mach_o_nlist_64_external raw;
2667   unsigned char type = -1;
2668   unsigned char section = -1;
2669   short desc = -1;
2670   symvalue value = -1;
2671   unsigned long stroff = -1;
2672   unsigned int symtype = -1;
2673
2674   BFD_ASSERT (sym->strtab != NULL);
2675
2676   if (bfd_seek (abfd, symoff, SEEK_SET) != 0
2677       || bfd_bread (&raw, symwidth, abfd) != symwidth)
2678     {
2679       (*_bfd_error_handler)
2680         (_("bfd_mach_o_read_symtab_symbol: unable to read %d bytes at %lu"),
2681          symwidth, (unsigned long) symoff);
2682       return FALSE;
2683     }
2684
2685   stroff = bfd_h_get_32 (abfd, raw.n_strx);
2686   type = bfd_h_get_8 (abfd, raw.n_type);
2687   symtype = type & BFD_MACH_O_N_TYPE;
2688   section = bfd_h_get_8 (abfd, raw.n_sect);
2689   desc = bfd_h_get_16 (abfd, raw.n_desc);
2690   if (wide)
2691     value = bfd_h_get_64 (abfd, raw.n_value);
2692   else
2693     value = bfd_h_get_32 (abfd, raw.n_value);
2694
2695   if (stroff >= sym->strsize)
2696     {
2697       (*_bfd_error_handler)
2698         (_("bfd_mach_o_read_symtab_symbol: name out of range (%lu >= %lu)"),
2699          (unsigned long) stroff,
2700          (unsigned long) sym->strsize);
2701       return FALSE;
2702     }
2703
2704   s->symbol.the_bfd = abfd;
2705   s->symbol.name = sym->strtab + stroff;
2706   s->symbol.value = value;
2707   s->symbol.flags = 0x0;
2708   s->symbol.udata.i = 0;
2709   s->n_type = type;
2710   s->n_sect = section;
2711   s->n_desc = desc;
2712
2713   if (type & BFD_MACH_O_N_STAB)
2714     {
2715       s->symbol.flags |= BSF_DEBUGGING;
2716       s->symbol.section = bfd_und_section_ptr;
2717       switch (type)
2718         {
2719         case N_FUN:
2720         case N_STSYM:
2721         case N_LCSYM:
2722         case N_BNSYM:
2723         case N_SLINE:
2724         case N_ENSYM:
2725         case N_ECOMM:
2726         case N_ECOML:
2727         case N_GSYM:
2728           if ((section > 0) && (section <= mdata->nsects))
2729             {
2730               s->symbol.section = mdata->sections[section - 1]->bfdsection;
2731               s->symbol.value =
2732                 s->symbol.value - mdata->sections[section - 1]->addr;
2733             }
2734           break;
2735         }
2736     }
2737   else
2738     {
2739       if (type & BFD_MACH_O_N_PEXT)
2740         s->symbol.flags |= BSF_GLOBAL;
2741
2742       if (type & BFD_MACH_O_N_EXT)
2743         s->symbol.flags |= BSF_GLOBAL;
2744
2745       if (!(type & (BFD_MACH_O_N_PEXT | BFD_MACH_O_N_EXT)))
2746         s->symbol.flags |= BSF_LOCAL;
2747
2748       switch (symtype)
2749         {
2750         case BFD_MACH_O_N_UNDF:
2751           if (type == (BFD_MACH_O_N_UNDF | BFD_MACH_O_N_EXT)
2752               && s->symbol.value != 0)
2753             {
2754               /* A common symbol.  */
2755               s->symbol.section = bfd_com_section_ptr;
2756               s->symbol.flags = BSF_NO_FLAGS;
2757             }
2758           else
2759             {
2760               s->symbol.section = bfd_und_section_ptr;
2761               if (s->n_desc & BFD_MACH_O_N_WEAK_REF)
2762                 s->symbol.flags |= BSF_WEAK;
2763             }
2764           break;
2765         case BFD_MACH_O_N_PBUD:
2766           s->symbol.section = bfd_und_section_ptr;
2767           break;
2768         case BFD_MACH_O_N_ABS:
2769           s->symbol.section = bfd_abs_section_ptr;
2770           break;
2771         case BFD_MACH_O_N_SECT:
2772           if ((section > 0) && (section <= mdata->nsects))
2773             {
2774               s->symbol.section = mdata->sections[section - 1]->bfdsection;
2775               s->symbol.value =
2776                 s->symbol.value - mdata->sections[section - 1]->addr;
2777             }
2778           else
2779             {
2780               /* Mach-O uses 0 to mean "no section"; not an error.  */
2781               if (section != 0)
2782                 {
2783                   (*_bfd_error_handler) (_("bfd_mach_o_read_symtab_symbol: "
2784                                            "symbol \"%s\" specified invalid section %d (max %lu): setting to undefined"),
2785                                          s->symbol.name, section, mdata->nsects);
2786                 }
2787               s->symbol.section = bfd_und_section_ptr;
2788             }
2789           break;
2790         case BFD_MACH_O_N_INDR:
2791           /* FIXME: we don't follow the BFD convention as this indirect symbol
2792              won't be followed by the referenced one.  This looks harmless
2793              unless we start using the linker.  */
2794           s->symbol.flags |= BSF_INDIRECT;
2795           s->symbol.section = bfd_ind_section_ptr;
2796           s->symbol.value = 0;
2797           break;
2798         default:
2799           (*_bfd_error_handler) (_("bfd_mach_o_read_symtab_symbol: "
2800                                    "symbol \"%s\" specified invalid type field 0x%x: setting to undefined"),
2801                                  s->symbol.name, symtype);
2802           s->symbol.section = bfd_und_section_ptr;
2803           break;
2804         }
2805     }
2806
2807   return TRUE;
2808 }
2809
2810 bfd_boolean
2811 bfd_mach_o_read_symtab_strtab (bfd *abfd)
2812 {
2813   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
2814   bfd_mach_o_symtab_command *sym = mdata->symtab;
2815
2816   /* Fail if there is no symtab.  */
2817   if (sym == NULL)
2818     return FALSE;
2819
2820   /* Success if already loaded.  */
2821   if (sym->strtab)
2822     return TRUE;
2823
2824   if (abfd->flags & BFD_IN_MEMORY)
2825     {
2826       struct bfd_in_memory *b;
2827
2828       b = (struct bfd_in_memory *) abfd->iostream;
2829
2830       if ((sym->stroff + sym->strsize) > b->size)
2831         {
2832           bfd_set_error (bfd_error_file_truncated);
2833           return FALSE;
2834         }
2835       sym->strtab = (char *) b->buffer + sym->stroff;
2836     }
2837   else
2838     {
2839       sym->strtab = bfd_alloc (abfd, sym->strsize);
2840       if (sym->strtab == NULL)
2841         return FALSE;
2842
2843       if (bfd_seek (abfd, sym->stroff, SEEK_SET) != 0
2844           || bfd_bread (sym->strtab, sym->strsize, abfd) != sym->strsize)
2845         {
2846           bfd_set_error (bfd_error_file_truncated);
2847           return FALSE;
2848         }
2849     }
2850
2851   return TRUE;
2852 }
2853
2854 bfd_boolean
2855 bfd_mach_o_read_symtab_symbols (bfd *abfd)
2856 {
2857   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
2858   bfd_mach_o_symtab_command *sym = mdata->symtab;
2859   unsigned long i;
2860
2861   if (sym == NULL || sym->symbols)
2862     {
2863       /* Return now if there are no symbols or if already loaded.  */
2864       return TRUE;
2865     }
2866
2867   sym->symbols = bfd_alloc (abfd, sym->nsyms * sizeof (bfd_mach_o_asymbol));
2868
2869   if (sym->symbols == NULL)
2870     {
2871       (*_bfd_error_handler) (_("bfd_mach_o_read_symtab_symbols: unable to allocate memory for symbols"));
2872       return FALSE;
2873     }
2874
2875   if (!bfd_mach_o_read_symtab_strtab (abfd))
2876     return FALSE;
2877
2878   for (i = 0; i < sym->nsyms; i++)
2879     {
2880       if (!bfd_mach_o_read_symtab_symbol (abfd, sym, &sym->symbols[i], i))
2881         return FALSE;
2882     }
2883
2884   return TRUE;
2885 }
2886
2887 static const char *
2888 bfd_mach_o_i386_flavour_string (unsigned int flavour)
2889 {
2890   switch ((int) flavour)
2891     {
2892     case BFD_MACH_O_x86_THREAD_STATE32:    return "x86_THREAD_STATE32";
2893     case BFD_MACH_O_x86_FLOAT_STATE32:     return "x86_FLOAT_STATE32";
2894     case BFD_MACH_O_x86_EXCEPTION_STATE32: return "x86_EXCEPTION_STATE32";
2895     case BFD_MACH_O_x86_THREAD_STATE64:    return "x86_THREAD_STATE64";
2896     case BFD_MACH_O_x86_FLOAT_STATE64:     return "x86_FLOAT_STATE64";
2897     case BFD_MACH_O_x86_EXCEPTION_STATE64: return "x86_EXCEPTION_STATE64";
2898     case BFD_MACH_O_x86_THREAD_STATE:      return "x86_THREAD_STATE";
2899     case BFD_MACH_O_x86_FLOAT_STATE:       return "x86_FLOAT_STATE";
2900     case BFD_MACH_O_x86_EXCEPTION_STATE:   return "x86_EXCEPTION_STATE";
2901     case BFD_MACH_O_x86_DEBUG_STATE32:     return "x86_DEBUG_STATE32";
2902     case BFD_MACH_O_x86_DEBUG_STATE64:     return "x86_DEBUG_STATE64";
2903     case BFD_MACH_O_x86_DEBUG_STATE:       return "x86_DEBUG_STATE";
2904     case BFD_MACH_O_x86_THREAD_STATE_NONE: return "x86_THREAD_STATE_NONE";
2905     default: return "UNKNOWN";
2906     }
2907 }
2908
2909 static const char *
2910 bfd_mach_o_ppc_flavour_string (unsigned int flavour)
2911 {
2912   switch ((int) flavour)
2913     {
2914     case BFD_MACH_O_PPC_THREAD_STATE:      return "PPC_THREAD_STATE";
2915     case BFD_MACH_O_PPC_FLOAT_STATE:       return "PPC_FLOAT_STATE";
2916     case BFD_MACH_O_PPC_EXCEPTION_STATE:   return "PPC_EXCEPTION_STATE";
2917     case BFD_MACH_O_PPC_VECTOR_STATE:      return "PPC_VECTOR_STATE";
2918     case BFD_MACH_O_PPC_THREAD_STATE64:    return "PPC_THREAD_STATE64";
2919     case BFD_MACH_O_PPC_EXCEPTION_STATE64: return "PPC_EXCEPTION_STATE64";
2920     default: return "UNKNOWN";
2921     }
2922 }
2923
2924 static int
2925 bfd_mach_o_read_dylinker (bfd *abfd, bfd_mach_o_load_command *command)
2926 {
2927   bfd_mach_o_dylinker_command *cmd = &command->command.dylinker;
2928   struct mach_o_str_command_external raw;
2929   unsigned int nameoff;
2930
2931   BFD_ASSERT ((command->type == BFD_MACH_O_LC_ID_DYLINKER)
2932               || (command->type == BFD_MACH_O_LC_LOAD_DYLINKER));
2933
2934   if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
2935       || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
2936     return -1;
2937
2938   nameoff = bfd_h_get_32 (abfd, raw.str);
2939
2940   cmd->name_offset = command->offset + nameoff;
2941   cmd->name_len = command->len - nameoff;
2942   cmd->name_str = bfd_alloc (abfd, cmd->name_len);
2943   if (cmd->name_str == NULL)
2944     return -1;
2945   if (bfd_seek (abfd, cmd->name_offset, SEEK_SET) != 0
2946       || bfd_bread (cmd->name_str, cmd->name_len, abfd) != cmd->name_len)
2947     return -1;
2948   return 0;
2949 }
2950
2951 static int
2952 bfd_mach_o_read_dylib (bfd *abfd, bfd_mach_o_load_command *command)
2953 {
2954   bfd_mach_o_dylib_command *cmd = &command->command.dylib;
2955   struct mach_o_dylib_command_external raw;
2956   unsigned int nameoff;
2957
2958   switch (command->type)
2959     {
2960     case BFD_MACH_O_LC_LOAD_DYLIB:
2961     case BFD_MACH_O_LC_LOAD_WEAK_DYLIB:
2962     case BFD_MACH_O_LC_ID_DYLIB:
2963     case BFD_MACH_O_LC_REEXPORT_DYLIB:
2964     case BFD_MACH_O_LC_LOAD_UPWARD_DYLIB:
2965       break;
2966     default:
2967       BFD_FAIL ();
2968       return -1;
2969     }
2970
2971   if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
2972       || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
2973     return -1;
2974
2975   nameoff = bfd_h_get_32 (abfd, raw.name);
2976   cmd->timestamp = bfd_h_get_32 (abfd, raw.timestamp);
2977   cmd->current_version = bfd_h_get_32 (abfd, raw.current_version);
2978   cmd->compatibility_version = bfd_h_get_32 (abfd, raw.compatibility_version);
2979
2980   cmd->name_offset = command->offset + nameoff;
2981   cmd->name_len = command->len - nameoff;
2982   cmd->name_str = bfd_alloc (abfd, cmd->name_len);
2983   if (cmd->name_str == NULL)
2984     return -1;
2985   if (bfd_seek (abfd, cmd->name_offset, SEEK_SET) != 0
2986       || bfd_bread (cmd->name_str, cmd->name_len, abfd) != cmd->name_len)
2987     return -1;
2988   return 0;
2989 }
2990
2991 static int
2992 bfd_mach_o_read_prebound_dylib (bfd *abfd ATTRIBUTE_UNUSED,
2993                                 bfd_mach_o_load_command *command ATTRIBUTE_UNUSED)
2994 {
2995   /* bfd_mach_o_prebound_dylib_command *cmd = &command->command.prebound_dylib; */
2996
2997   BFD_ASSERT (command->type == BFD_MACH_O_LC_PREBOUND_DYLIB);
2998   return 0;
2999 }
3000
3001 static int
3002 bfd_mach_o_read_thread (bfd *abfd, bfd_mach_o_load_command *command)
3003 {
3004   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
3005   bfd_mach_o_thread_command *cmd = &command->command.thread;
3006   unsigned int offset;
3007   unsigned int nflavours;
3008   unsigned int i;
3009
3010   BFD_ASSERT ((command->type == BFD_MACH_O_LC_THREAD)
3011               || (command->type == BFD_MACH_O_LC_UNIXTHREAD));
3012
3013   /* Count the number of threads.  */
3014   offset = 8;
3015   nflavours = 0;
3016   while (offset != command->len)
3017     {
3018       struct mach_o_thread_command_external raw;
3019
3020       if (offset >= command->len)
3021         return -1;
3022
3023       if (bfd_seek (abfd, command->offset + offset, SEEK_SET) != 0
3024           || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
3025         return -1;
3026
3027       offset += sizeof (raw) + bfd_h_get_32 (abfd, raw.count) * 4;
3028       nflavours++;
3029     }
3030
3031   /* Allocate threads.  */
3032   cmd->flavours = bfd_alloc
3033     (abfd, nflavours * sizeof (bfd_mach_o_thread_flavour));
3034   if (cmd->flavours == NULL)
3035     return -1;
3036   cmd->nflavours = nflavours;
3037
3038   offset = 8;
3039   nflavours = 0;
3040   while (offset != command->len)
3041     {
3042       struct mach_o_thread_command_external raw;
3043
3044       if (offset >= command->len)
3045         return -1;
3046
3047       if (nflavours >= cmd->nflavours)
3048         return -1;
3049
3050       if (bfd_seek (abfd, command->offset + offset, SEEK_SET) != 0
3051           || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
3052         return -1;
3053
3054       cmd->flavours[nflavours].flavour = bfd_h_get_32 (abfd, raw.flavour);
3055       cmd->flavours[nflavours].offset = command->offset + offset + sizeof (raw);
3056       cmd->flavours[nflavours].size = bfd_h_get_32 (abfd, raw.count) * 4;
3057       offset += cmd->flavours[nflavours].size + sizeof (raw);
3058       nflavours++;
3059     }
3060
3061   for (i = 0; i < nflavours; i++)
3062     {
3063       asection *bfdsec;
3064       unsigned int snamelen;
3065       char *sname;
3066       const char *flavourstr;
3067       const char *prefix = "LC_THREAD";
3068       unsigned int j = 0;
3069
3070       switch (mdata->header.cputype)
3071         {
3072         case BFD_MACH_O_CPU_TYPE_POWERPC:
3073         case BFD_MACH_O_CPU_TYPE_POWERPC_64:
3074           flavourstr = bfd_mach_o_ppc_flavour_string (cmd->flavours[i].flavour);
3075           break;
3076         case BFD_MACH_O_CPU_TYPE_I386:
3077         case BFD_MACH_O_CPU_TYPE_X86_64:
3078           flavourstr = bfd_mach_o_i386_flavour_string (cmd->flavours[i].flavour);
3079           break;
3080         default:
3081           flavourstr = "UNKNOWN_ARCHITECTURE";
3082           break;
3083         }
3084
3085       snamelen = strlen (prefix) + 1 + 20 + 1 + strlen (flavourstr) + 1;
3086       sname = bfd_alloc (abfd, snamelen);
3087       if (sname == NULL)
3088         return -1;
3089
3090       for (;;)
3091         {
3092           sprintf (sname, "%s.%s.%u", prefix, flavourstr, j);
3093           if (bfd_get_section_by_name (abfd, sname) == NULL)
3094             break;
3095           j++;
3096         }
3097
3098       bfdsec = bfd_make_section_with_flags (abfd, sname, SEC_HAS_CONTENTS);
3099
3100       bfdsec->vma = 0;
3101       bfdsec->lma = 0;
3102       bfdsec->size = cmd->flavours[i].size;
3103       bfdsec->filepos = cmd->flavours[i].offset;
3104       bfdsec->alignment_power = 0x0;
3105
3106       cmd->section = bfdsec;
3107     }
3108
3109   return 0;
3110 }
3111
3112 static int
3113 bfd_mach_o_read_dysymtab (bfd *abfd, bfd_mach_o_load_command *command)
3114 {
3115   bfd_mach_o_dysymtab_command *cmd = &command->command.dysymtab;
3116   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
3117
3118   BFD_ASSERT (command->type == BFD_MACH_O_LC_DYSYMTAB);
3119
3120   {
3121     struct mach_o_dysymtab_command_external raw;
3122
3123     if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
3124         || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
3125       return -1;
3126
3127     cmd->ilocalsym = bfd_h_get_32 (abfd, raw.ilocalsym);
3128     cmd->nlocalsym = bfd_h_get_32 (abfd, raw.nlocalsym);
3129     cmd->iextdefsym = bfd_h_get_32 (abfd, raw.iextdefsym);
3130     cmd->nextdefsym = bfd_h_get_32 (abfd, raw.nextdefsym);
3131     cmd->iundefsym = bfd_h_get_32 (abfd, raw.iundefsym);
3132     cmd->nundefsym = bfd_h_get_32 (abfd, raw.nundefsym);
3133     cmd->tocoff = bfd_h_get_32 (abfd, raw.tocoff);
3134     cmd->ntoc = bfd_h_get_32 (abfd, raw.ntoc);
3135     cmd->modtaboff = bfd_h_get_32 (abfd, raw.modtaboff);
3136     cmd->nmodtab = bfd_h_get_32 (abfd, raw.nmodtab);
3137     cmd->extrefsymoff = bfd_h_get_32 (abfd, raw.extrefsymoff);
3138     cmd->nextrefsyms = bfd_h_get_32 (abfd, raw.nextrefsyms);
3139     cmd->indirectsymoff = bfd_h_get_32 (abfd, raw.indirectsymoff);
3140     cmd->nindirectsyms = bfd_h_get_32 (abfd, raw.nindirectsyms);
3141     cmd->extreloff = bfd_h_get_32 (abfd, raw.extreloff);
3142     cmd->nextrel = bfd_h_get_32 (abfd, raw.nextrel);
3143     cmd->locreloff = bfd_h_get_32 (abfd, raw.locreloff);
3144     cmd->nlocrel = bfd_h_get_32 (abfd, raw.nlocrel);
3145   }
3146
3147   if (cmd->nmodtab != 0)
3148     {
3149       unsigned int i;
3150       int wide = bfd_mach_o_wide_p (abfd);
3151       unsigned int module_len = wide ? 56 : 52;
3152
3153       cmd->dylib_module =
3154         bfd_alloc (abfd, cmd->nmodtab * sizeof (bfd_mach_o_dylib_module));
3155       if (cmd->dylib_module == NULL)
3156         return -1;
3157
3158       if (bfd_seek (abfd, cmd->modtaboff, SEEK_SET) != 0)
3159         return -1;
3160
3161       for (i = 0; i < cmd->nmodtab; i++)
3162         {
3163           bfd_mach_o_dylib_module *module = &cmd->dylib_module[i];
3164           unsigned long v;
3165           unsigned char buf[56];
3166
3167           if (bfd_bread ((void *) buf, module_len, abfd) != module_len)
3168             return -1;
3169
3170           module->module_name_idx = bfd_h_get_32 (abfd, buf + 0);
3171           module->iextdefsym = bfd_h_get_32 (abfd, buf + 4);
3172           module->nextdefsym = bfd_h_get_32 (abfd, buf + 8);
3173           module->irefsym = bfd_h_get_32 (abfd, buf + 12);
3174           module->nrefsym = bfd_h_get_32 (abfd, buf + 16);
3175           module->ilocalsym = bfd_h_get_32 (abfd, buf + 20);
3176           module->nlocalsym = bfd_h_get_32 (abfd, buf + 24);
3177           module->iextrel = bfd_h_get_32 (abfd, buf + 28);
3178           module->nextrel = bfd_h_get_32 (abfd, buf + 32);
3179           v = bfd_h_get_32 (abfd, buf +36);
3180           module->iinit = v & 0xffff;
3181           module->iterm = (v >> 16) & 0xffff;
3182           v = bfd_h_get_32 (abfd, buf + 40);
3183           module->ninit = v & 0xffff;
3184           module->nterm = (v >> 16) & 0xffff;
3185           if (wide)
3186             {
3187               module->objc_module_info_size = bfd_h_get_32 (abfd, buf + 44);
3188               module->objc_module_info_addr = bfd_h_get_64 (abfd, buf + 48);
3189             }
3190           else
3191             {
3192               module->objc_module_info_addr = bfd_h_get_32 (abfd, buf + 44);
3193               module->objc_module_info_size = bfd_h_get_32 (abfd, buf + 48);
3194             }
3195         }
3196     }
3197
3198   if (cmd->ntoc != 0)
3199     {
3200       unsigned int i;
3201
3202       cmd->dylib_toc = bfd_alloc
3203         (abfd, cmd->ntoc * sizeof (bfd_mach_o_dylib_table_of_content));
3204       if (cmd->dylib_toc == NULL)
3205         return -1;
3206
3207       if (bfd_seek (abfd, cmd->tocoff, SEEK_SET) != 0)
3208         return -1;
3209
3210       for (i = 0; i < cmd->ntoc; i++)
3211         {
3212           struct mach_o_dylib_table_of_contents_external raw;
3213           bfd_mach_o_dylib_table_of_content *toc = &cmd->dylib_toc[i];
3214
3215           if (bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
3216             return -1;
3217
3218           toc->symbol_index = bfd_h_get_32 (abfd, raw.symbol_index);
3219           toc->module_index = bfd_h_get_32 (abfd, raw.module_index);
3220         }
3221     }
3222
3223   if (cmd->nindirectsyms != 0)
3224     {
3225       unsigned int i;
3226
3227       cmd->indirect_syms = bfd_alloc
3228         (abfd, cmd->nindirectsyms * sizeof (unsigned int));
3229       if (cmd->indirect_syms == NULL)
3230         return -1;
3231
3232       if (bfd_seek (abfd, cmd->indirectsymoff, SEEK_SET) != 0)
3233         return -1;
3234
3235       for (i = 0; i < cmd->nindirectsyms; i++)
3236         {
3237           unsigned char raw[4];
3238           unsigned int *is = &cmd->indirect_syms[i];
3239
3240           if (bfd_bread (raw, sizeof (raw), abfd) != sizeof (raw))
3241             return -1;
3242
3243           *is = bfd_h_get_32 (abfd, raw);
3244         }
3245     }
3246
3247   if (cmd->nextrefsyms != 0)
3248     {
3249       unsigned long v;
3250       unsigned int i;
3251
3252       cmd->ext_refs = bfd_alloc
3253         (abfd, cmd->nextrefsyms * sizeof (bfd_mach_o_dylib_reference));
3254       if (cmd->ext_refs == NULL)
3255         return -1;
3256
3257       if (bfd_seek (abfd, cmd->extrefsymoff, SEEK_SET) != 0)
3258         return -1;
3259
3260       for (i = 0; i < cmd->nextrefsyms; i++)
3261         {
3262           unsigned char raw[4];
3263           bfd_mach_o_dylib_reference *ref = &cmd->ext_refs[i];
3264
3265           if (bfd_bread (raw, sizeof (raw), abfd) != sizeof (raw))
3266             return -1;
3267
3268           /* Fields isym and flags are written as bit-fields, thus we need
3269              a specific processing for endianness.  */
3270           v = bfd_h_get_32 (abfd, raw);
3271           if (bfd_big_endian (abfd))
3272             {
3273               ref->isym = (v >> 8) & 0xffffff;
3274               ref->flags = v & 0xff;
3275             }
3276           else
3277             {
3278               ref->isym = v & 0xffffff;
3279               ref->flags = (v >> 24) & 0xff;
3280             }
3281         }
3282     }
3283
3284   if (mdata->dysymtab)
3285     return -1;
3286   mdata->dysymtab = cmd;
3287
3288   return 0;
3289 }
3290
3291 static int
3292 bfd_mach_o_read_symtab (bfd *abfd, bfd_mach_o_load_command *command)
3293 {
3294   bfd_mach_o_symtab_command *symtab = &command->command.symtab;
3295   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
3296   struct mach_o_symtab_command_external raw;
3297
3298   BFD_ASSERT (command->type == BFD_MACH_O_LC_SYMTAB);
3299
3300   if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
3301       || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
3302     return -1;
3303
3304   symtab->symoff = bfd_h_get_32 (abfd, raw.symoff);
3305   symtab->nsyms = bfd_h_get_32 (abfd, raw.nsyms);
3306   symtab->stroff = bfd_h_get_32 (abfd, raw.stroff);
3307   symtab->strsize = bfd_h_get_32 (abfd, raw.strsize);
3308   symtab->symbols = NULL;
3309   symtab->strtab = NULL;
3310
3311   if (symtab->nsyms != 0)
3312     abfd->flags |= HAS_SYMS;
3313
3314   if (mdata->symtab)
3315     return -1;
3316   mdata->symtab = symtab;
3317   return 0;
3318 }
3319
3320 static int
3321 bfd_mach_o_read_uuid (bfd *abfd, bfd_mach_o_load_command *command)
3322 {
3323   bfd_mach_o_uuid_command *cmd = &command->command.uuid;
3324
3325   BFD_ASSERT (command->type == BFD_MACH_O_LC_UUID);
3326
3327   if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
3328       || bfd_bread (cmd->uuid, 16, abfd) != 16)
3329     return -1;
3330
3331   return 0;
3332 }
3333
3334 static int
3335 bfd_mach_o_read_linkedit (bfd *abfd, bfd_mach_o_load_command *command)
3336 {
3337   bfd_mach_o_linkedit_command *cmd = &command->command.linkedit;
3338   struct mach_o_linkedit_data_command_external raw;
3339
3340   if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
3341       || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
3342     return -1;
3343
3344   cmd->dataoff = bfd_get_32 (abfd, raw.dataoff);
3345   cmd->datasize = bfd_get_32 (abfd, raw.datasize);
3346   return 0;
3347 }
3348
3349 static int
3350 bfd_mach_o_read_str (bfd *abfd, bfd_mach_o_load_command *command)
3351 {
3352   bfd_mach_o_str_command *cmd = &command->command.str;
3353   struct mach_o_str_command_external raw;
3354   unsigned long off;
3355
3356   if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
3357       || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
3358     return -1;
3359
3360   off = bfd_get_32 (abfd, raw.str);
3361   cmd->stroff = command->offset + off;
3362   cmd->str_len = command->len - off;
3363   cmd->str = bfd_alloc (abfd, cmd->str_len);
3364   if (cmd->str == NULL)
3365     return -1;
3366   if (bfd_seek (abfd, cmd->stroff, SEEK_SET) != 0
3367       || bfd_bread ((void *) cmd->str, cmd->str_len, abfd) != cmd->str_len)
3368     return -1;
3369   return 0;
3370 }
3371
3372 static int
3373 bfd_mach_o_read_dyld_info (bfd *abfd, bfd_mach_o_load_command *command)
3374 {
3375   bfd_mach_o_dyld_info_command *cmd = &command->command.dyld_info;
3376   struct mach_o_dyld_info_command_external raw;
3377
3378   if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
3379       || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
3380     return -1;
3381
3382   cmd->rebase_off = bfd_get_32 (abfd, raw.rebase_off);
3383   cmd->rebase_size = bfd_get_32 (abfd, raw.rebase_size);
3384   cmd->bind_off = bfd_get_32 (abfd, raw.bind_off);
3385   cmd->bind_size = bfd_get_32 (abfd, raw.bind_size);
3386   cmd->weak_bind_off = bfd_get_32 (abfd, raw.weak_bind_off);
3387   cmd->weak_bind_size = bfd_get_32 (abfd, raw.weak_bind_size);
3388   cmd->lazy_bind_off = bfd_get_32 (abfd, raw.lazy_bind_off);
3389   cmd->lazy_bind_size = bfd_get_32 (abfd, raw.lazy_bind_size);
3390   cmd->export_off = bfd_get_32 (abfd, raw.export_off);
3391   cmd->export_size = bfd_get_32 (abfd, raw.export_size);
3392   return 0;
3393 }
3394
3395 static bfd_boolean
3396 bfd_mach_o_read_version_min (bfd *abfd, bfd_mach_o_load_command *command)
3397 {
3398   bfd_mach_o_version_min_command *cmd = &command->command.version_min;
3399   struct mach_o_version_min_command_external raw;
3400   unsigned int ver;
3401
3402   if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
3403       || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
3404     return FALSE;
3405
3406   ver = bfd_get_32 (abfd, raw.version);
3407   cmd->rel = ver >> 16;
3408   cmd->maj = ver >> 8;
3409   cmd->min = ver;
3410   cmd->reserved = bfd_get_32 (abfd, raw.reserved);
3411   return TRUE;
3412 }
3413
3414 static int
3415 bfd_mach_o_read_segment (bfd *abfd,
3416                          bfd_mach_o_load_command *command,
3417                          unsigned int wide)
3418 {
3419   bfd_mach_o_segment_command *seg = &command->command.segment;
3420   unsigned long i;
3421
3422   if (wide)
3423     {
3424       struct mach_o_segment_command_64_external raw;
3425
3426       BFD_ASSERT (command->type == BFD_MACH_O_LC_SEGMENT_64);
3427
3428       if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
3429           || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
3430         return -1;
3431
3432       memcpy (seg->segname, raw.segname, 16);
3433       seg->segname[16] = '\0';
3434
3435       seg->vmaddr = bfd_h_get_64 (abfd, raw.vmaddr);
3436       seg->vmsize = bfd_h_get_64 (abfd, raw.vmsize);
3437       seg->fileoff = bfd_h_get_64 (abfd, raw.fileoff);
3438       seg->filesize = bfd_h_get_64 (abfd, raw.filesize);
3439       seg->maxprot = bfd_h_get_32 (abfd, raw.maxprot);
3440       seg->initprot = bfd_h_get_32 (abfd, raw.initprot);
3441       seg->nsects = bfd_h_get_32 (abfd, raw.nsects);
3442       seg->flags = bfd_h_get_32 (abfd, raw.flags);
3443     }
3444   else
3445     {
3446       struct mach_o_segment_command_32_external raw;
3447
3448       BFD_ASSERT (command->type == BFD_MACH_O_LC_SEGMENT);
3449
3450       if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
3451           || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
3452         return -1;
3453
3454       memcpy (seg->segname, raw.segname, 16);
3455       seg->segname[16] = '\0';
3456
3457       seg->vmaddr = bfd_h_get_32 (abfd, raw.vmaddr);
3458       seg->vmsize = bfd_h_get_32 (abfd, raw.vmsize);
3459       seg->fileoff = bfd_h_get_32 (abfd, raw.fileoff);
3460       seg->filesize = bfd_h_get_32 (abfd, raw.filesize);
3461       seg->maxprot = bfd_h_get_32 (abfd, raw.maxprot);
3462       seg->initprot = bfd_h_get_32 (abfd, raw.initprot);
3463       seg->nsects = bfd_h_get_32 (abfd, raw.nsects);
3464       seg->flags = bfd_h_get_32 (abfd, raw.flags);
3465     }
3466   seg->sect_head = NULL;
3467   seg->sect_tail = NULL;
3468
3469   for (i = 0; i < seg->nsects; i++)
3470     {
3471       bfd_vma segoff;
3472       asection *sec;
3473
3474       if (wide)
3475         segoff = command->offset + BFD_MACH_O_LC_SEGMENT_64_SIZE
3476           + (i * BFD_MACH_O_SECTION_64_SIZE);
3477       else
3478         segoff = command->offset + BFD_MACH_O_LC_SEGMENT_SIZE
3479           + (i * BFD_MACH_O_SECTION_SIZE);
3480
3481       sec = bfd_mach_o_read_section (abfd, segoff, seg->initprot, wide);
3482       if (sec == NULL)
3483         return -1;
3484
3485       bfd_mach_o_append_section_to_segment (seg, sec);
3486     }
3487
3488   return 0;
3489 }
3490
3491 static int
3492 bfd_mach_o_read_segment_32 (bfd *abfd, bfd_mach_o_load_command *command)
3493 {
3494   return bfd_mach_o_read_segment (abfd, command, 0);
3495 }
3496
3497 static int
3498 bfd_mach_o_read_segment_64 (bfd *abfd, bfd_mach_o_load_command *command)
3499 {
3500   return bfd_mach_o_read_segment (abfd, command, 1);
3501 }
3502
3503 static int
3504 bfd_mach_o_read_command (bfd *abfd, bfd_mach_o_load_command *command)
3505 {
3506   struct mach_o_load_command_external raw;
3507   unsigned int cmd;
3508
3509   /* Read command type and length.  */
3510   if (bfd_seek (abfd, command->offset, SEEK_SET) != 0
3511       || bfd_bread (&raw, BFD_MACH_O_LC_SIZE, abfd) != BFD_MACH_O_LC_SIZE)
3512     return -1;
3513
3514   cmd = bfd_h_get_32 (abfd, raw.cmd);
3515   command->type =  cmd & ~BFD_MACH_O_LC_REQ_DYLD;
3516   command->type_required = cmd & BFD_MACH_O_LC_REQ_DYLD ? TRUE : FALSE;
3517   command->len = bfd_h_get_32 (abfd, raw.cmdsize);
3518
3519   switch (command->type)
3520     {
3521     case BFD_MACH_O_LC_SEGMENT:
3522       if (bfd_mach_o_read_segment_32 (abfd, command) != 0)
3523         return -1;
3524       break;
3525     case BFD_MACH_O_LC_SEGMENT_64:
3526       if (bfd_mach_o_read_segment_64 (abfd, command) != 0)
3527         return -1;
3528       break;
3529     case BFD_MACH_O_LC_SYMTAB:
3530       if (bfd_mach_o_read_symtab (abfd, command) != 0)
3531         return -1;
3532       break;
3533     case BFD_MACH_O_LC_SYMSEG:
3534       break;
3535     case BFD_MACH_O_LC_THREAD:
3536     case BFD_MACH_O_LC_UNIXTHREAD:
3537       if (bfd_mach_o_read_thread (abfd, command) != 0)
3538         return -1;
3539       break;
3540     case BFD_MACH_O_LC_LOAD_DYLINKER:
3541     case BFD_MACH_O_LC_ID_DYLINKER:
3542       if (bfd_mach_o_read_dylinker (abfd, command) != 0)
3543         return -1;
3544       break;
3545     case BFD_MACH_O_LC_LOAD_DYLIB:
3546     case BFD_MACH_O_LC_ID_DYLIB:
3547     case BFD_MACH_O_LC_LOAD_WEAK_DYLIB:
3548     case BFD_MACH_O_LC_REEXPORT_DYLIB:
3549     case BFD_MACH_O_LC_LOAD_UPWARD_DYLIB:
3550       if (bfd_mach_o_read_dylib (abfd, command) != 0)
3551         return -1;
3552       break;
3553     case BFD_MACH_O_LC_PREBOUND_DYLIB:
3554       if (bfd_mach_o_read_prebound_dylib (abfd, command) != 0)
3555         return -1;
3556       break;
3557     case BFD_MACH_O_LC_LOADFVMLIB:
3558     case BFD_MACH_O_LC_IDFVMLIB:
3559     case BFD_MACH_O_LC_IDENT:
3560     case BFD_MACH_O_LC_FVMFILE:
3561     case BFD_MACH_O_LC_PREPAGE:
3562     case BFD_MACH_O_LC_ROUTINES:
3563     case BFD_MACH_O_LC_ROUTINES_64:
3564       break;
3565     case BFD_MACH_O_LC_SUB_FRAMEWORK:
3566     case BFD_MACH_O_LC_SUB_UMBRELLA:
3567     case BFD_MACH_O_LC_SUB_LIBRARY:
3568     case BFD_MACH_O_LC_SUB_CLIENT:
3569     case BFD_MACH_O_LC_RPATH:
3570       if (bfd_mach_o_read_str (abfd, command) != 0)
3571         return -1;
3572       break;
3573     case BFD_MACH_O_LC_DYSYMTAB:
3574       if (bfd_mach_o_read_dysymtab (abfd, command) != 0)
3575         return -1;
3576       break;
3577     case BFD_MACH_O_LC_TWOLEVEL_HINTS:
3578     case BFD_MACH_O_LC_PREBIND_CKSUM:
3579       break;
3580     case BFD_MACH_O_LC_UUID:
3581       if (bfd_mach_o_read_uuid (abfd, command) != 0)
3582         return -1;
3583       break;
3584     case BFD_MACH_O_LC_CODE_SIGNATURE:
3585     case BFD_MACH_O_LC_SEGMENT_SPLIT_INFO:
3586     case BFD_MACH_O_LC_FUNCTION_STARTS:
3587       if (bfd_mach_o_read_linkedit (abfd, command) != 0)
3588         return -1;
3589       break;
3590     case BFD_MACH_O_LC_DYLD_INFO:
3591       if (bfd_mach_o_read_dyld_info (abfd, command) != 0)
3592         return -1;
3593       break;
3594     case BFD_MACH_O_LC_VERSION_MIN_MACOSX:
3595     case BFD_MACH_O_LC_VERSION_MIN_IPHONEOS:
3596       if (!bfd_mach_o_read_version_min (abfd, command))
3597         return -1;
3598       break;
3599     default:
3600       (*_bfd_error_handler)(_("%B: unable to read unknown load command 0x%lx"),
3601          abfd, (unsigned long) command->type);
3602       break;
3603     }
3604
3605   return 0;
3606 }
3607
3608 static void
3609 bfd_mach_o_flatten_sections (bfd *abfd)
3610 {
3611   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
3612   long csect = 0;
3613   unsigned long i;
3614
3615   /* Count total number of sections.  */
3616   mdata->nsects = 0;
3617
3618   for (i = 0; i < mdata->header.ncmds; i++)
3619     {
3620       if (mdata->commands[i].type == BFD_MACH_O_LC_SEGMENT
3621           || mdata->commands[i].type == BFD_MACH_O_LC_SEGMENT_64)
3622         {
3623           bfd_mach_o_segment_command *seg;
3624
3625           seg = &mdata->commands[i].command.segment;
3626           mdata->nsects += seg->nsects;
3627         }
3628     }
3629
3630   /* Allocate sections array.  */
3631   mdata->sections = bfd_alloc (abfd,
3632                                mdata->nsects * sizeof (bfd_mach_o_section *));
3633
3634   /* Fill the array.  */
3635   csect = 0;
3636
3637   for (i = 0; i < mdata->header.ncmds; i++)
3638     {
3639       if (mdata->commands[i].type == BFD_MACH_O_LC_SEGMENT
3640           || mdata->commands[i].type == BFD_MACH_O_LC_SEGMENT_64)
3641         {
3642           bfd_mach_o_segment_command *seg;
3643           bfd_mach_o_section *sec;
3644
3645           seg = &mdata->commands[i].command.segment;
3646           BFD_ASSERT (csect + seg->nsects <= mdata->nsects);
3647
3648           for (sec = seg->sect_head; sec != NULL; sec = sec->next)
3649             mdata->sections[csect++] = sec;
3650         }
3651     }
3652 }
3653
3654 static bfd_boolean
3655 bfd_mach_o_scan_start_address (bfd *abfd)
3656 {
3657   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
3658   bfd_mach_o_thread_command *cmd = NULL;
3659   unsigned long i;
3660
3661   for (i = 0; i < mdata->header.ncmds; i++)
3662     if ((mdata->commands[i].type == BFD_MACH_O_LC_THREAD) ||
3663         (mdata->commands[i].type == BFD_MACH_O_LC_UNIXTHREAD))
3664       {
3665         cmd = &mdata->commands[i].command.thread;
3666         break;
3667       }
3668
3669   if (cmd == NULL)
3670     return FALSE;
3671
3672   /* FIXME: create a subtarget hook ?  */
3673   for (i = 0; i < cmd->nflavours; i++)
3674     {
3675       if ((mdata->header.cputype == BFD_MACH_O_CPU_TYPE_I386)
3676           && (cmd->flavours[i].flavour
3677               == (unsigned long) BFD_MACH_O_x86_THREAD_STATE32))
3678         {
3679           unsigned char buf[4];
3680
3681           if (bfd_seek (abfd, cmd->flavours[i].offset + 40, SEEK_SET) != 0
3682               || bfd_bread (buf, 4, abfd) != 4)
3683             return FALSE;
3684
3685           abfd->start_address = bfd_h_get_32 (abfd, buf);
3686         }
3687       else if ((mdata->header.cputype == BFD_MACH_O_CPU_TYPE_POWERPC)
3688                && (cmd->flavours[i].flavour == BFD_MACH_O_PPC_THREAD_STATE))
3689         {
3690           unsigned char buf[4];
3691
3692           if (bfd_seek (abfd, cmd->flavours[i].offset + 0, SEEK_SET) != 0
3693               || bfd_bread (buf, 4, abfd) != 4)
3694             return FALSE;
3695
3696           abfd->start_address = bfd_h_get_32 (abfd, buf);
3697         }
3698       else if ((mdata->header.cputype == BFD_MACH_O_CPU_TYPE_POWERPC_64)
3699                && (cmd->flavours[i].flavour == BFD_MACH_O_PPC_THREAD_STATE64))
3700         {
3701           unsigned char buf[8];
3702
3703           if (bfd_seek (abfd, cmd->flavours[i].offset + 0, SEEK_SET) != 0
3704               || bfd_bread (buf, 8, abfd) != 8)
3705             return FALSE;
3706
3707           abfd->start_address = bfd_h_get_64 (abfd, buf);
3708         }
3709       else if ((mdata->header.cputype == BFD_MACH_O_CPU_TYPE_X86_64)
3710                && (cmd->flavours[i].flavour == BFD_MACH_O_x86_THREAD_STATE64))
3711         {
3712           unsigned char buf[8];
3713
3714           if (bfd_seek (abfd, cmd->flavours[i].offset + (16 * 8), SEEK_SET) != 0
3715               || bfd_bread (buf, 8, abfd) != 8)
3716             return FALSE;
3717
3718           abfd->start_address = bfd_h_get_64 (abfd, buf);
3719         }
3720     }
3721
3722   return TRUE;
3723 }
3724
3725 bfd_boolean
3726 bfd_mach_o_set_arch_mach (bfd *abfd,
3727                           enum bfd_architecture arch,
3728                           unsigned long machine)
3729 {
3730   bfd_mach_o_backend_data *bed = bfd_mach_o_get_backend_data (abfd);
3731
3732   /* If this isn't the right architecture for this backend, and this
3733      isn't the generic backend, fail.  */
3734   if (arch != bed->arch
3735       && arch != bfd_arch_unknown
3736       && bed->arch != bfd_arch_unknown)
3737     return FALSE;
3738
3739   return bfd_default_set_arch_mach (abfd, arch, machine);
3740 }
3741
3742 static bfd_boolean
3743 bfd_mach_o_scan (bfd *abfd,
3744                  bfd_mach_o_header *header,
3745                  bfd_mach_o_data_struct *mdata)
3746 {
3747   unsigned int i;
3748   enum bfd_architecture cputype;
3749   unsigned long cpusubtype;
3750   unsigned int hdrsize;
3751
3752   hdrsize = mach_o_wide_p (header) ?
3753     BFD_MACH_O_HEADER_64_SIZE : BFD_MACH_O_HEADER_SIZE;
3754
3755   mdata->header = *header;
3756
3757   abfd->flags = abfd->flags & BFD_IN_MEMORY;
3758   switch (header->filetype)
3759     {
3760     case BFD_MACH_O_MH_OBJECT:
3761       abfd->flags |= HAS_RELOC;
3762       break;
3763     case BFD_MACH_O_MH_EXECUTE:
3764       abfd->flags |= EXEC_P;
3765       break;
3766     case BFD_MACH_O_MH_DYLIB:
3767     case BFD_MACH_O_MH_BUNDLE:
3768       abfd->flags |= DYNAMIC;
3769       break;
3770     }
3771
3772   abfd->tdata.mach_o_data = mdata;
3773
3774   bfd_mach_o_convert_architecture (header->cputype, header->cpusubtype,
3775                                    &cputype, &cpusubtype);
3776   if (cputype == bfd_arch_unknown)
3777     {
3778       (*_bfd_error_handler)
3779         (_("bfd_mach_o_scan: unknown architecture 0x%lx/0x%lx"),
3780          header->cputype, header->cpusubtype);
3781       return FALSE;
3782     }
3783
3784   bfd_set_arch_mach (abfd, cputype, cpusubtype);
3785
3786   if (header->ncmds != 0)
3787     {
3788       mdata->commands = bfd_alloc
3789         (abfd, header->ncmds * sizeof (bfd_mach_o_load_command));
3790       if (mdata->commands == NULL)
3791         return FALSE;
3792
3793       for (i = 0; i < header->ncmds; i++)
3794         {
3795           bfd_mach_o_load_command *cur = &mdata->commands[i];
3796
3797           if (i == 0)
3798             cur->offset = hdrsize;
3799           else
3800             {
3801               bfd_mach_o_load_command *prev = &mdata->commands[i - 1];
3802               cur->offset = prev->offset + prev->len;
3803             }
3804
3805           if (bfd_mach_o_read_command (abfd, cur) < 0)
3806             return FALSE;
3807         }
3808     }
3809
3810   if (bfd_mach_o_scan_start_address (abfd) < 0)
3811     return FALSE;
3812
3813   bfd_mach_o_flatten_sections (abfd);
3814   return TRUE;
3815 }
3816
3817 bfd_boolean
3818 bfd_mach_o_mkobject_init (bfd *abfd)
3819 {
3820   bfd_mach_o_data_struct *mdata = NULL;
3821
3822   mdata = bfd_alloc (abfd, sizeof (bfd_mach_o_data_struct));
3823   if (mdata == NULL)
3824     return FALSE;
3825   abfd->tdata.mach_o_data = mdata;
3826
3827   mdata->header.magic = 0;
3828   mdata->header.cputype = 0;
3829   mdata->header.cpusubtype = 0;
3830   mdata->header.filetype = 0;
3831   mdata->header.ncmds = 0;
3832   mdata->header.sizeofcmds = 0;
3833   mdata->header.flags = 0;
3834   mdata->header.byteorder = BFD_ENDIAN_UNKNOWN;
3835   mdata->commands = NULL;
3836   mdata->nsects = 0;
3837   mdata->sections = NULL;
3838   mdata->dyn_reloc_cache = NULL;
3839
3840   return TRUE;
3841 }
3842
3843 static bfd_boolean
3844 bfd_mach_o_gen_mkobject (bfd *abfd)
3845 {
3846   bfd_mach_o_data_struct *mdata;
3847
3848   if (!bfd_mach_o_mkobject_init (abfd))
3849     return FALSE;
3850
3851   mdata = bfd_mach_o_get_data (abfd);
3852   mdata->header.magic = BFD_MACH_O_MH_MAGIC;
3853   mdata->header.cputype = 0;
3854   mdata->header.cpusubtype = 0;
3855   mdata->header.byteorder = abfd->xvec->byteorder;
3856   mdata->header.version = 1;
3857
3858   return TRUE;
3859 }
3860
3861 const bfd_target *
3862 bfd_mach_o_header_p (bfd *abfd,
3863                      bfd_mach_o_filetype filetype,
3864                      bfd_mach_o_cpu_type cputype)
3865 {
3866   struct bfd_preserve preserve;
3867   bfd_mach_o_header header;
3868
3869   preserve.marker = NULL;
3870   if (!bfd_mach_o_read_header (abfd, &header))
3871     goto wrong;
3872
3873   if (! (header.byteorder == BFD_ENDIAN_BIG
3874          || header.byteorder == BFD_ENDIAN_LITTLE))
3875     {
3876       (*_bfd_error_handler) (_("unknown header byte-order value 0x%lx"),
3877                              (unsigned long) header.byteorder);
3878       goto wrong;
3879     }
3880
3881   if (! ((header.byteorder == BFD_ENDIAN_BIG
3882           && abfd->xvec->byteorder == BFD_ENDIAN_BIG
3883           && abfd->xvec->header_byteorder == BFD_ENDIAN_BIG)
3884          || (header.byteorder == BFD_ENDIAN_LITTLE
3885              && abfd->xvec->byteorder == BFD_ENDIAN_LITTLE
3886              && abfd->xvec->header_byteorder == BFD_ENDIAN_LITTLE)))
3887     goto wrong;
3888
3889   /* Check cputype and filetype.
3890      In case of wildcard, do not accept magics that are handled by existing
3891      targets.  */
3892   if (cputype)
3893     {
3894       if (header.cputype != cputype)
3895         goto wrong;
3896     }
3897   if (filetype)
3898     {
3899       if (header.filetype != filetype)
3900         goto wrong;
3901     }
3902   else
3903     {
3904       switch (header.filetype)
3905         {
3906         case BFD_MACH_O_MH_CORE:
3907           /* Handled by core_p */
3908           goto wrong;
3909         default:
3910           break;
3911         }
3912     }
3913
3914   preserve.marker = bfd_zalloc (abfd, sizeof (bfd_mach_o_data_struct));
3915   if (preserve.marker == NULL
3916       || !bfd_preserve_save (abfd, &preserve))
3917     goto fail;
3918
3919   if (!bfd_mach_o_scan (abfd, &header,
3920                         (bfd_mach_o_data_struct *) preserve.marker))
3921     goto wrong;
3922
3923   bfd_preserve_finish (abfd, &preserve);
3924   return abfd->xvec;
3925
3926  wrong:
3927   bfd_set_error (bfd_error_wrong_format);
3928
3929  fail:
3930   if (preserve.marker != NULL)
3931     bfd_preserve_restore (abfd, &preserve);
3932   return NULL;
3933 }
3934
3935 static const bfd_target *
3936 bfd_mach_o_gen_object_p (bfd *abfd)
3937 {
3938   return bfd_mach_o_header_p (abfd, 0, 0);
3939 }
3940
3941 static const bfd_target *
3942 bfd_mach_o_gen_core_p (bfd *abfd)
3943 {
3944   return bfd_mach_o_header_p (abfd, BFD_MACH_O_MH_CORE, 0);
3945 }
3946
3947 typedef struct mach_o_fat_archentry
3948 {
3949   unsigned long cputype;
3950   unsigned long cpusubtype;
3951   unsigned long offset;
3952   unsigned long size;
3953   unsigned long align;
3954 } mach_o_fat_archentry;
3955
3956 typedef struct mach_o_fat_data_struct
3957 {
3958   unsigned long magic;
3959   unsigned long nfat_arch;
3960   mach_o_fat_archentry *archentries;
3961 } mach_o_fat_data_struct;
3962
3963 const bfd_target *
3964 bfd_mach_o_archive_p (bfd *abfd)
3965 {
3966   mach_o_fat_data_struct *adata = NULL;
3967   struct mach_o_fat_header_external hdr;
3968   unsigned long i;
3969
3970   if (bfd_seek (abfd, 0, SEEK_SET) != 0
3971       || bfd_bread (&hdr, sizeof (hdr), abfd) != sizeof (hdr))
3972     goto error;
3973
3974   adata = bfd_alloc (abfd, sizeof (mach_o_fat_data_struct));
3975   if (adata == NULL)
3976     goto error;
3977
3978   adata->magic = bfd_getb32 (hdr.magic);
3979   adata->nfat_arch = bfd_getb32 (hdr.nfat_arch);
3980   if (adata->magic != 0xcafebabe)
3981     goto error;
3982   /* Avoid matching Java bytecode files, which have the same magic number.
3983      In the Java bytecode file format this field contains the JVM version,
3984      which starts at 43.0.  */
3985   if (adata->nfat_arch > 30)
3986     goto error;
3987
3988   adata->archentries =
3989     bfd_alloc (abfd, adata->nfat_arch * sizeof (mach_o_fat_archentry));
3990   if (adata->archentries == NULL)
3991     goto error;
3992
3993   for (i = 0; i < adata->nfat_arch; i++)
3994     {
3995       struct mach_o_fat_arch_external arch;
3996       if (bfd_bread (&arch, sizeof (arch), abfd) != sizeof (arch))
3997         goto error;
3998       adata->archentries[i].cputype = bfd_getb32 (arch.cputype);
3999       adata->archentries[i].cpusubtype = bfd_getb32 (arch.cpusubtype);
4000       adata->archentries[i].offset = bfd_getb32 (arch.offset);
4001       adata->archentries[i].size = bfd_getb32 (arch.size);
4002       adata->archentries[i].align = bfd_getb32 (arch.align);
4003     }
4004
4005   abfd->tdata.mach_o_fat_data = adata;
4006   return abfd->xvec;
4007
4008  error:
4009   if (adata != NULL)
4010     bfd_release (abfd, adata);
4011   bfd_set_error (bfd_error_wrong_format);
4012   return NULL;
4013 }
4014
4015 bfd *
4016 bfd_mach_o_openr_next_archived_file (bfd *archive, bfd *prev)
4017 {
4018   mach_o_fat_data_struct *adata;
4019   mach_o_fat_archentry *entry = NULL;
4020   unsigned long i;
4021   bfd *nbfd;
4022   enum bfd_architecture arch_type;
4023   unsigned long arch_subtype;
4024
4025   adata = (mach_o_fat_data_struct *) archive->tdata.mach_o_fat_data;
4026   BFD_ASSERT (adata != NULL);
4027
4028   /* Find index of previous entry.  */
4029   if (prev == NULL)
4030     i = 0;      /* Start at first one.  */
4031   else
4032     {
4033       for (i = 0; i < adata->nfat_arch; i++)
4034         {
4035           if (adata->archentries[i].offset == prev->origin)
4036             break;
4037         }
4038
4039       if (i == adata->nfat_arch)
4040         {
4041           /* Not found.  */
4042           bfd_set_error (bfd_error_bad_value);
4043           return NULL;
4044         }
4045     i++;        /* Get next entry.  */
4046   }
4047
4048   if (i >= adata->nfat_arch)
4049     {
4050       bfd_set_error (bfd_error_no_more_archived_files);
4051       return NULL;
4052     }
4053
4054   entry = &adata->archentries[i];
4055   nbfd = _bfd_new_bfd_contained_in (archive);
4056   if (nbfd == NULL)
4057     return NULL;
4058
4059   nbfd->origin = entry->offset;
4060
4061   bfd_mach_o_convert_architecture (entry->cputype, entry->cpusubtype,
4062                                    &arch_type, &arch_subtype);
4063
4064   /* Create the member filename. Use ARCH_NAME.  */
4065   nbfd->filename = bfd_printable_arch_mach (arch_type, arch_subtype);
4066   nbfd->iostream = NULL;
4067   bfd_set_arch_mach (nbfd, arch_type, arch_subtype);
4068
4069   return nbfd;
4070 }
4071
4072 /* If ABFD format is FORMAT and architecture is ARCH, return it.
4073    If ABFD is a fat image containing a member that corresponds to FORMAT
4074    and ARCH, returns it.
4075    In other case, returns NULL.
4076    This function allows transparent uses of fat images.  */
4077 bfd *
4078 bfd_mach_o_fat_extract (bfd *abfd,
4079                         bfd_format format,
4080                         const bfd_arch_info_type *arch)
4081 {
4082   bfd *res;
4083   mach_o_fat_data_struct *adata;
4084   unsigned int i;
4085
4086   if (bfd_check_format (abfd, format))
4087     {
4088       if (bfd_get_arch_info (abfd) == arch)
4089         return abfd;
4090       return NULL;
4091     }
4092   if (!bfd_check_format (abfd, bfd_archive)
4093       || abfd->xvec != &mach_o_fat_vec)
4094     return NULL;
4095
4096   /* This is a Mach-O fat image.  */
4097   adata = (mach_o_fat_data_struct *) abfd->tdata.mach_o_fat_data;
4098   BFD_ASSERT (adata != NULL);
4099
4100   for (i = 0; i < adata->nfat_arch; i++)
4101     {
4102       struct mach_o_fat_archentry *e = &adata->archentries[i];
4103       enum bfd_architecture cpu_type;
4104       unsigned long cpu_subtype;
4105
4106       bfd_mach_o_convert_architecture (e->cputype, e->cpusubtype,
4107                                        &cpu_type, &cpu_subtype);
4108       if (cpu_type != arch->arch || cpu_subtype != arch->mach)
4109         continue;
4110
4111       /* The architecture is found.  */
4112       res = _bfd_new_bfd_contained_in (abfd);
4113       if (res == NULL)
4114         return NULL;
4115
4116       res->origin = e->offset;
4117
4118       res->filename = bfd_printable_arch_mach (cpu_type, cpu_subtype);
4119       res->iostream = NULL;
4120
4121       if (bfd_check_format (res, format))
4122         {
4123           BFD_ASSERT (bfd_get_arch_info (res) == arch);
4124           return res;
4125         }
4126       bfd_close (res);
4127       return NULL;
4128     }
4129
4130   return NULL;
4131 }
4132
4133 int
4134 bfd_mach_o_lookup_command (bfd *abfd,
4135                            bfd_mach_o_load_command_type type,
4136                            bfd_mach_o_load_command **mcommand)
4137 {
4138   struct mach_o_data_struct *md = bfd_mach_o_get_data (abfd);
4139   bfd_mach_o_load_command *ncmd = NULL;
4140   unsigned int i, num;
4141
4142   BFD_ASSERT (md != NULL);
4143   BFD_ASSERT (mcommand != NULL);
4144
4145   num = 0;
4146   for (i = 0; i < md->header.ncmds; i++)
4147     {
4148       struct bfd_mach_o_load_command *cmd = &md->commands[i];
4149
4150       if (cmd->type != type)
4151         continue;
4152
4153       if (num == 0)
4154         ncmd = cmd;
4155       num++;
4156     }
4157
4158   *mcommand = ncmd;
4159   return num;
4160 }
4161
4162 unsigned long
4163 bfd_mach_o_stack_addr (enum bfd_mach_o_cpu_type type)
4164 {
4165   switch (type)
4166     {
4167     case BFD_MACH_O_CPU_TYPE_MC680x0:
4168       return 0x04000000;
4169     case BFD_MACH_O_CPU_TYPE_MC88000:
4170       return 0xffffe000;
4171     case BFD_MACH_O_CPU_TYPE_POWERPC:
4172       return 0xc0000000;
4173     case BFD_MACH_O_CPU_TYPE_I386:
4174       return 0xc0000000;
4175     case BFD_MACH_O_CPU_TYPE_SPARC:
4176       return 0xf0000000;
4177     case BFD_MACH_O_CPU_TYPE_I860:
4178       return 0;
4179     case BFD_MACH_O_CPU_TYPE_HPPA:
4180       return 0xc0000000 - 0x04000000;
4181     default:
4182       return 0;
4183     }
4184 }
4185
4186 /* The following two tables should be kept, as far as possible, in order of
4187    most frequently used entries to optimize their use from gas.  */
4188
4189 const bfd_mach_o_xlat_name bfd_mach_o_section_type_name[] =
4190 {
4191   { "regular", BFD_MACH_O_S_REGULAR},
4192   { "coalesced", BFD_MACH_O_S_COALESCED},
4193   { "zerofill", BFD_MACH_O_S_ZEROFILL},
4194   { "cstring_literals", BFD_MACH_O_S_CSTRING_LITERALS},
4195   { "4byte_literals", BFD_MACH_O_S_4BYTE_LITERALS},
4196   { "8byte_literals", BFD_MACH_O_S_8BYTE_LITERALS},
4197   { "16byte_literals", BFD_MACH_O_S_16BYTE_LITERALS},
4198   { "literal_pointers", BFD_MACH_O_S_LITERAL_POINTERS},
4199   { "mod_init_func_pointers", BFD_MACH_O_S_MOD_INIT_FUNC_POINTERS},
4200   { "mod_fini_func_pointers", BFD_MACH_O_S_MOD_FINI_FUNC_POINTERS},
4201   { "gb_zerofill", BFD_MACH_O_S_GB_ZEROFILL},
4202   { "interposing", BFD_MACH_O_S_INTERPOSING},
4203   { "dtrace_dof", BFD_MACH_O_S_DTRACE_DOF},
4204   { "non_lazy_symbol_pointers", BFD_MACH_O_S_NON_LAZY_SYMBOL_POINTERS},
4205   { "lazy_symbol_pointers", BFD_MACH_O_S_LAZY_SYMBOL_POINTERS},
4206   { "symbol_stubs", BFD_MACH_O_S_SYMBOL_STUBS},
4207   { "lazy_dylib_symbol_pointers", BFD_MACH_O_S_LAZY_DYLIB_SYMBOL_POINTERS},
4208   { NULL, 0}
4209 };
4210
4211 const bfd_mach_o_xlat_name bfd_mach_o_section_attribute_name[] =
4212 {
4213   { "pure_instructions", BFD_MACH_O_S_ATTR_PURE_INSTRUCTIONS },
4214   { "some_instructions", BFD_MACH_O_S_ATTR_SOME_INSTRUCTIONS },
4215   { "loc_reloc", BFD_MACH_O_S_ATTR_LOC_RELOC },
4216   { "ext_reloc", BFD_MACH_O_S_ATTR_EXT_RELOC },
4217   { "debug", BFD_MACH_O_S_ATTR_DEBUG },
4218   { "live_support", BFD_MACH_O_S_ATTR_LIVE_SUPPORT },
4219   { "no_dead_strip", BFD_MACH_O_S_ATTR_NO_DEAD_STRIP },
4220   { "strip_static_syms", BFD_MACH_O_S_ATTR_STRIP_STATIC_SYMS },
4221   { "no_toc", BFD_MACH_O_S_ATTR_NO_TOC },
4222   { "self_modifying_code", BFD_MACH_O_S_SELF_MODIFYING_CODE },
4223   { "modifying_code", BFD_MACH_O_S_SELF_MODIFYING_CODE },
4224   { NULL, 0}
4225 };
4226
4227 /* Get the section type from NAME.  Return 256 if NAME is unknown.  */
4228
4229 unsigned int
4230 bfd_mach_o_get_section_type_from_name (bfd *abfd, const char *name)
4231 {
4232   const bfd_mach_o_xlat_name *x;
4233   bfd_mach_o_backend_data *bed = bfd_mach_o_get_backend_data (abfd);
4234
4235   for (x = bfd_mach_o_section_type_name; x->name; x++)
4236     if (strcmp (x->name, name) == 0)
4237       {
4238         /* We found it... does the target support it?  */
4239         if (bed->bfd_mach_o_section_type_valid_for_target == NULL
4240             || bed->bfd_mach_o_section_type_valid_for_target (x->val))
4241           return x->val; /* OK.  */
4242         else
4243           break; /* Not supported.  */
4244       }
4245   /* Maximum section ID = 0xff.  */
4246   return 256;
4247 }
4248
4249 /* Get the section attribute from NAME.  Return -1 if NAME is unknown.  */
4250
4251 unsigned int
4252 bfd_mach_o_get_section_attribute_from_name (const char *name)
4253 {
4254   const bfd_mach_o_xlat_name *x;
4255
4256   for (x = bfd_mach_o_section_attribute_name; x->name; x++)
4257     if (strcmp (x->name, name) == 0)
4258       return x->val;
4259   return (unsigned int)-1;
4260 }
4261
4262 int
4263 bfd_mach_o_core_fetch_environment (bfd *abfd,
4264                                    unsigned char **rbuf,
4265                                    unsigned int *rlen)
4266 {
4267   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
4268   unsigned long stackaddr = bfd_mach_o_stack_addr (mdata->header.cputype);
4269   unsigned int i = 0;
4270
4271   for (i = 0; i < mdata->header.ncmds; i++)
4272     {
4273       bfd_mach_o_load_command *cur = &mdata->commands[i];
4274       bfd_mach_o_segment_command *seg = NULL;
4275
4276       if (cur->type != BFD_MACH_O_LC_SEGMENT)
4277         continue;
4278
4279       seg = &cur->command.segment;
4280
4281       if ((seg->vmaddr + seg->vmsize) == stackaddr)
4282         {
4283           unsigned long start = seg->fileoff;
4284           unsigned long end = seg->fileoff + seg->filesize;
4285           unsigned char *buf = bfd_malloc (1024);
4286           unsigned long size = 1024;
4287
4288           for (;;)
4289             {
4290               bfd_size_type nread = 0;
4291               unsigned long offset;
4292               int found_nonnull = 0;
4293
4294               if (size > (end - start))
4295                 size = (end - start);
4296
4297               buf = bfd_realloc_or_free (buf, size);
4298               if (buf == NULL)
4299                 return -1;
4300
4301               if (bfd_seek (abfd, end - size, SEEK_SET) != 0)
4302                 {
4303                   free (buf);
4304                   return -1;
4305                 }
4306
4307               nread = bfd_bread (buf, size, abfd);
4308
4309               if (nread != size)
4310                 {
4311                   free (buf);
4312                   return -1;
4313                 }
4314
4315               for (offset = 4; offset <= size; offset += 4)
4316                 {
4317                   unsigned long val;
4318
4319                   val = *((unsigned long *) (buf + size - offset));
4320                   if (! found_nonnull)
4321                     {
4322                       if (val != 0)
4323                         found_nonnull = 1;
4324                     }
4325                   else if (val == 0x0)
4326                     {
4327                       unsigned long bottom;
4328                       unsigned long top;
4329
4330                       bottom = seg->fileoff + seg->filesize - offset;
4331                       top = seg->fileoff + seg->filesize - 4;
4332                       *rbuf = bfd_malloc (top - bottom);
4333                       *rlen = top - bottom;
4334
4335                       memcpy (*rbuf, buf + size - *rlen, *rlen);
4336                       free (buf);
4337                       return 0;
4338                     }
4339                 }
4340
4341               if (size == (end - start))
4342                 break;
4343
4344               size *= 2;
4345             }
4346
4347           free (buf);
4348         }
4349     }
4350
4351   return -1;
4352 }
4353
4354 char *
4355 bfd_mach_o_core_file_failing_command (bfd *abfd)
4356 {
4357   unsigned char *buf = NULL;
4358   unsigned int len = 0;
4359   int ret = -1;
4360
4361   ret = bfd_mach_o_core_fetch_environment (abfd, &buf, &len);
4362   if (ret < 0)
4363     return NULL;
4364
4365   return (char *) buf;
4366 }
4367
4368 int
4369 bfd_mach_o_core_file_failing_signal (bfd *abfd ATTRIBUTE_UNUSED)
4370 {
4371   return 0;
4372 }
4373
4374 static bfd_mach_o_uuid_command *
4375 bfd_mach_o_lookup_uuid_command (bfd *abfd)
4376 {
4377   bfd_mach_o_load_command *uuid_cmd;
4378   int ncmd = bfd_mach_o_lookup_command (abfd, BFD_MACH_O_LC_UUID, &uuid_cmd);
4379   if (ncmd != 1)
4380     return FALSE;
4381   return &uuid_cmd->command.uuid;
4382 }
4383
4384 /* Return true if ABFD is a dSYM file and its UUID matches UUID_CMD. */
4385
4386 static bfd_boolean
4387 bfd_mach_o_dsym_for_uuid_p (bfd *abfd, const bfd_mach_o_uuid_command *uuid_cmd)
4388 {
4389   bfd_mach_o_uuid_command *dsym_uuid_cmd;
4390
4391   BFD_ASSERT (abfd);
4392   BFD_ASSERT (uuid_cmd);
4393
4394   if (!bfd_check_format (abfd, bfd_object))
4395     return FALSE;
4396
4397   if (bfd_get_flavour (abfd) != bfd_target_mach_o_flavour
4398       || bfd_mach_o_get_data (abfd) == NULL
4399       || bfd_mach_o_get_data (abfd)->header.filetype != BFD_MACH_O_MH_DSYM)
4400     return FALSE;
4401
4402   dsym_uuid_cmd = bfd_mach_o_lookup_uuid_command (abfd);
4403   if (dsym_uuid_cmd == NULL)
4404     return FALSE;
4405
4406   if (memcmp (uuid_cmd->uuid, dsym_uuid_cmd->uuid,
4407               sizeof (uuid_cmd->uuid)) != 0)
4408     return FALSE;
4409
4410   return TRUE;
4411 }
4412
4413 /* Find a BFD in DSYM_FILENAME which matches ARCH and UUID_CMD.
4414    The caller is responsible for closing the returned BFD object and
4415    its my_archive if the returned BFD is in a fat dSYM. */
4416
4417 static bfd *
4418 bfd_mach_o_find_dsym (const char *dsym_filename,
4419                       const bfd_mach_o_uuid_command *uuid_cmd,
4420                       const bfd_arch_info_type *arch)
4421 {
4422   bfd *base_dsym_bfd, *dsym_bfd;
4423
4424   BFD_ASSERT (uuid_cmd);
4425
4426   base_dsym_bfd = bfd_openr (dsym_filename, NULL);
4427   if (base_dsym_bfd == NULL)
4428     return NULL;
4429
4430   dsym_bfd = bfd_mach_o_fat_extract (base_dsym_bfd, bfd_object, arch);
4431   if (bfd_mach_o_dsym_for_uuid_p (dsym_bfd, uuid_cmd))
4432     return dsym_bfd;
4433
4434   bfd_close (dsym_bfd);
4435   if (base_dsym_bfd != dsym_bfd)
4436     bfd_close (base_dsym_bfd);
4437
4438   return NULL;
4439 }
4440
4441 /* Return a BFD created from a dSYM file for ABFD.
4442    The caller is responsible for closing the returned BFD object, its
4443    filename, and its my_archive if the returned BFD is in a fat dSYM. */
4444
4445 static bfd *
4446 bfd_mach_o_follow_dsym (bfd *abfd)
4447 {
4448   char *dsym_filename;
4449   bfd_mach_o_uuid_command *uuid_cmd;
4450   bfd *dsym_bfd, *base_bfd = abfd;
4451   const char *base_basename;
4452
4453   if (abfd == NULL || bfd_get_flavour (abfd) != bfd_target_mach_o_flavour)
4454     return NULL;
4455
4456   if (abfd->my_archive)
4457     base_bfd = abfd->my_archive;
4458   /* BFD may have been opened from a stream. */
4459   if (base_bfd->filename == NULL)
4460     {
4461       bfd_set_error (bfd_error_invalid_operation);
4462       return NULL;
4463     }
4464   base_basename = lbasename (base_bfd->filename);
4465
4466   uuid_cmd = bfd_mach_o_lookup_uuid_command (abfd);
4467   if (uuid_cmd == NULL)
4468     return NULL;
4469
4470   /* TODO: We assume the DWARF file has the same as the binary's.
4471      It seems apple's GDB checks all files in the dSYM bundle directory.
4472      http://opensource.apple.com/source/gdb/gdb-1708/src/gdb/macosx/macosx-tdep.c
4473   */
4474   dsym_filename = (char *)bfd_malloc (strlen (base_bfd->filename)
4475                                        + strlen (dsym_subdir) + 1
4476                                        + strlen (base_basename) + 1);
4477   sprintf (dsym_filename, "%s%s/%s",
4478            base_bfd->filename, dsym_subdir, base_basename);
4479
4480   dsym_bfd = bfd_mach_o_find_dsym (dsym_filename, uuid_cmd,
4481                                    bfd_get_arch_info (abfd));
4482   if (dsym_bfd == NULL)
4483     free (dsym_filename);
4484
4485   return dsym_bfd;
4486 }
4487
4488 bfd_boolean
4489 bfd_mach_o_find_nearest_line (bfd *abfd,
4490                               asection *section,
4491                               asymbol **symbols,
4492                               bfd_vma offset,
4493                               const char **filename_ptr,
4494                               const char **functionname_ptr,
4495                               unsigned int *line_ptr)
4496 {
4497   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
4498   if (mdata == NULL)
4499     return FALSE;
4500   switch (mdata->header.filetype)
4501     {
4502     case BFD_MACH_O_MH_OBJECT:
4503       break;
4504     case BFD_MACH_O_MH_EXECUTE:
4505     case BFD_MACH_O_MH_DYLIB:
4506     case BFD_MACH_O_MH_BUNDLE:
4507     case BFD_MACH_O_MH_KEXT_BUNDLE:
4508       if (mdata->dwarf2_find_line_info == NULL)
4509         {
4510           mdata->dsym_bfd = bfd_mach_o_follow_dsym (abfd);
4511           /* When we couldn't find dSYM for this binary, we look for
4512              the debug information in the binary itself. In this way,
4513              we won't try finding separated dSYM again because
4514              mdata->dwarf2_find_line_info will be filled. */
4515           if (! mdata->dsym_bfd)
4516             break;
4517           if (! _bfd_dwarf2_slurp_debug_info (abfd, mdata->dsym_bfd,
4518                                               dwarf_debug_sections, symbols,
4519                                               &mdata->dwarf2_find_line_info))
4520             return FALSE;
4521         }
4522       break;
4523     default:
4524       return FALSE;
4525     }
4526   if (_bfd_dwarf2_find_nearest_line (abfd, dwarf_debug_sections,
4527                                      section, symbols, offset,
4528                                      filename_ptr, functionname_ptr,
4529                                      line_ptr, 0,
4530                                      &mdata->dwarf2_find_line_info))
4531     return TRUE;
4532   return FALSE;
4533 }
4534
4535 bfd_boolean
4536 bfd_mach_o_close_and_cleanup (bfd *abfd)
4537 {
4538   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
4539   if (bfd_get_format (abfd) == bfd_object && mdata != NULL)
4540     {
4541       _bfd_dwarf2_cleanup_debug_info (abfd, &mdata->dwarf2_find_line_info);
4542       bfd_mach_o_free_cached_info (abfd);
4543       if (mdata->dsym_bfd != NULL)
4544         {
4545           bfd *fat_bfd = mdata->dsym_bfd->my_archive;
4546           char *dsym_filename = (char *)(fat_bfd
4547                                          ? fat_bfd->filename
4548                                          : mdata->dsym_bfd->filename);
4549           bfd_close (mdata->dsym_bfd);
4550           mdata->dsym_bfd = NULL;
4551           if (fat_bfd)
4552             bfd_close (fat_bfd);
4553           free (dsym_filename);
4554         }
4555     }
4556
4557   return _bfd_generic_close_and_cleanup (abfd);
4558 }
4559
4560 bfd_boolean bfd_mach_o_free_cached_info (bfd *abfd)
4561 {
4562   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
4563   asection *asect;
4564   free (mdata->dyn_reloc_cache);
4565   mdata->dyn_reloc_cache = NULL;
4566   for (asect = abfd->sections; asect != NULL; asect = asect->next)
4567     {
4568       free (asect->relocation);
4569       asect->relocation = NULL;
4570     }
4571
4572   return TRUE;
4573 }
4574
4575 #define bfd_mach_o_bfd_reloc_type_lookup _bfd_norelocs_bfd_reloc_type_lookup 
4576 #define bfd_mach_o_bfd_reloc_name_lookup _bfd_norelocs_bfd_reloc_name_lookup
4577
4578 #define bfd_mach_o_swap_reloc_in NULL
4579 #define bfd_mach_o_swap_reloc_out NULL
4580 #define bfd_mach_o_print_thread NULL
4581 #define bfd_mach_o_tgt_seg_table NULL
4582 #define bfd_mach_o_section_type_valid_for_tgt NULL
4583
4584 #define TARGET_NAME             mach_o_be_vec
4585 #define TARGET_STRING           "mach-o-be"
4586 #define TARGET_ARCHITECTURE     bfd_arch_unknown
4587 #define TARGET_BIG_ENDIAN       1
4588 #define TARGET_ARCHIVE          0
4589 #define TARGET_PRIORITY         1
4590 #include "mach-o-target.c"
4591
4592 #undef TARGET_NAME
4593 #undef TARGET_STRING
4594 #undef TARGET_ARCHITECTURE
4595 #undef TARGET_BIG_ENDIAN
4596 #undef TARGET_ARCHIVE
4597 #undef TARGET_PRIORITY
4598
4599 #define TARGET_NAME             mach_o_le_vec
4600 #define TARGET_STRING           "mach-o-le"
4601 #define TARGET_ARCHITECTURE     bfd_arch_unknown
4602 #define TARGET_BIG_ENDIAN       0
4603 #define TARGET_ARCHIVE          0
4604 #define TARGET_PRIORITY         1
4605
4606 #include "mach-o-target.c"
4607
4608 #undef TARGET_NAME
4609 #undef TARGET_STRING
4610 #undef TARGET_ARCHITECTURE
4611 #undef TARGET_BIG_ENDIAN
4612 #undef TARGET_ARCHIVE
4613 #undef TARGET_PRIORITY
4614
4615 /* Not yet handled: creating an archive.  */
4616 #define bfd_mach_o_mkarchive                      _bfd_noarchive_mkarchive
4617
4618 /* Not used.  */
4619 #define bfd_mach_o_read_ar_hdr                    _bfd_noarchive_read_ar_hdr
4620 #define bfd_mach_o_write_ar_hdr                   _bfd_noarchive_write_ar_hdr
4621 #define bfd_mach_o_slurp_armap                    _bfd_noarchive_slurp_armap
4622 #define bfd_mach_o_slurp_extended_name_table      _bfd_noarchive_slurp_extended_name_table
4623 #define bfd_mach_o_construct_extended_name_table  _bfd_noarchive_construct_extended_name_table
4624 #define bfd_mach_o_truncate_arname                _bfd_noarchive_truncate_arname
4625 #define bfd_mach_o_write_armap                    _bfd_noarchive_write_armap
4626 #define bfd_mach_o_get_elt_at_index               _bfd_noarchive_get_elt_at_index
4627 #define bfd_mach_o_generic_stat_arch_elt          _bfd_noarchive_generic_stat_arch_elt
4628 #define bfd_mach_o_update_armap_timestamp         _bfd_noarchive_update_armap_timestamp
4629
4630 #define TARGET_NAME             mach_o_fat_vec
4631 #define TARGET_STRING           "mach-o-fat"
4632 #define TARGET_ARCHITECTURE     bfd_arch_unknown
4633 #define TARGET_BIG_ENDIAN       1
4634 #define TARGET_ARCHIVE          1
4635 #define TARGET_PRIORITY         0
4636
4637 #include "mach-o-target.c"
4638
4639 #undef TARGET_NAME
4640 #undef TARGET_STRING
4641 #undef TARGET_ARCHITECTURE
4642 #undef TARGET_BIG_ENDIAN
4643 #undef TARGET_ARCHIVE
4644 #undef TARGET_PRIORITY