0a614c30ce169a85ab840826cbea84d101ce2ef1
[platform/upstream/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
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
33 #define bfd_mach_o_object_p bfd_mach_o_gen_object_p
34 #define bfd_mach_o_core_p bfd_mach_o_gen_core_p
35 #define bfd_mach_o_mkobject bfd_mach_o_gen_mkobject
36
37 #define FILE_ALIGN(off, algn) \
38   (((off) + ((file_ptr) 1 << (algn)) - 1) & ((file_ptr) -1 << (algn)))
39
40 unsigned int
41 bfd_mach_o_version (bfd *abfd)
42 {
43   bfd_mach_o_data_struct *mdata = NULL;
44
45   BFD_ASSERT (bfd_mach_o_valid (abfd));
46   mdata = bfd_mach_o_get_data (abfd);
47
48   return mdata->header.version;
49 }
50
51 bfd_boolean
52 bfd_mach_o_valid (bfd *abfd)
53 {
54   if (abfd == NULL || abfd->xvec == NULL)
55     return FALSE;
56
57   if (abfd->xvec->flavour != bfd_target_mach_o_flavour)
58     return FALSE;
59
60   if (bfd_mach_o_get_data (abfd) == NULL)
61     return FALSE;
62   return TRUE;
63 }
64
65 static INLINE bfd_boolean
66 mach_o_wide_p (bfd_mach_o_header *header)
67 {
68   switch (header->version)
69     {
70     case 1:
71       return FALSE;
72     case 2:
73       return TRUE;
74     default:
75       BFD_FAIL ();
76       return FALSE;
77     }
78 }
79
80 static INLINE bfd_boolean
81 bfd_mach_o_wide_p (bfd *abfd)
82 {
83   return mach_o_wide_p (&bfd_mach_o_get_data (abfd)->header);
84 }
85       
86 /* Tables to translate well known Mach-O segment/section names to bfd
87    names.  Use of canonical names (such as .text or .debug_frame) is required
88    by gdb.  */
89
90 struct mach_o_section_name_xlat
91 {
92   const char *bfd_name;
93   const char *mach_o_name;
94   flagword flags;
95 };
96
97 static const struct mach_o_section_name_xlat dwarf_section_names_xlat[] =
98   {
99     { ".debug_frame",    "__debug_frame",    SEC_DEBUGGING },
100     { ".debug_info",     "__debug_info",     SEC_DEBUGGING },
101     { ".debug_abbrev",   "__debug_abbrev",   SEC_DEBUGGING },
102     { ".debug_aranges",  "__debug_aranges",  SEC_DEBUGGING },
103     { ".debug_macinfo",  "__debug_macinfo",  SEC_DEBUGGING },
104     { ".debug_line",     "__debug_line",     SEC_DEBUGGING },
105     { ".debug_loc",      "__debug_loc",      SEC_DEBUGGING },
106     { ".debug_pubnames", "__debug_pubnames", SEC_DEBUGGING },
107     { ".debug_pubtypes", "__debug_pubtypes", SEC_DEBUGGING },
108     { ".debug_str",      "__debug_str",      SEC_DEBUGGING },
109     { ".debug_ranges",   "__debug_ranges",   SEC_DEBUGGING },
110     { NULL, NULL, 0}
111   };
112
113 static const struct mach_o_section_name_xlat text_section_names_xlat[] =
114   {
115     { ".text",     "__text",      SEC_CODE | SEC_LOAD },
116     { ".const",    "__const",     SEC_READONLY | SEC_DATA | SEC_LOAD },
117     { ".cstring",  "__cstring",   SEC_READONLY | SEC_DATA | SEC_LOAD },
118     { ".eh_frame", "__eh_frame",  SEC_READONLY | SEC_LOAD },
119     { NULL, NULL, 0}
120   };
121
122 static const struct mach_o_section_name_xlat data_section_names_xlat[] =
123   {
124     { ".data",                "__data",          SEC_DATA | SEC_LOAD },
125     { ".const_data",          "__const",         SEC_DATA | SEC_LOAD },
126     { ".dyld",                "__dyld",          SEC_DATA | SEC_LOAD },
127     { ".lazy_symbol_ptr",     "__la_symbol_ptr", SEC_DATA | SEC_LOAD },
128     { ".non_lazy_symbol_ptr", "__nl_symbol_ptr", SEC_DATA | SEC_LOAD },
129     { ".bss",                 "__bss",           SEC_NO_FLAGS },
130     { NULL, NULL, 0}
131   };
132
133 struct mach_o_segment_name_xlat
134 {
135   /* Segment name.  */
136   const char *segname;
137
138   /* List of known sections for the segment.  */
139   const struct mach_o_section_name_xlat *sections;
140 };
141
142 /* List of known segment names.  */
143
144 static const struct mach_o_segment_name_xlat segsec_names_xlat[] =
145   {
146     { "__TEXT", text_section_names_xlat },
147     { "__DATA", data_section_names_xlat },
148     { "__DWARF", dwarf_section_names_xlat },
149     { NULL, NULL }
150   };
151
152 /* Mach-O to bfd names.  */
153
154 void
155 bfd_mach_o_normalize_section_name (const char *segname, const char *sectname,
156                                    const char **name, flagword *flags)
157 {
158   const struct mach_o_segment_name_xlat *seg;
159
160   *name = NULL;
161   *flags = SEC_NO_FLAGS;
162
163   for (seg = segsec_names_xlat; seg->segname; seg++)
164     {
165       if (strncmp (seg->segname, segname, BFD_MACH_O_SEGNAME_SIZE) == 0)
166         {
167           const struct mach_o_section_name_xlat *sec;
168
169           for (sec = seg->sections; sec->mach_o_name; sec++)
170             {
171               if (strncmp (sec->mach_o_name, sectname,
172                            BFD_MACH_O_SECTNAME_SIZE) == 0)
173                 {
174                   *name = sec->bfd_name;
175                   *flags = sec->flags;
176                   return;
177                 }
178             }
179           return;
180         }
181     }
182 }
183
184 /* Convert Mach-O section name to BFD.  Try to use standard names, otherwise
185    forge a new name.  SEGNAME and SECTNAME are 16 bytes strings.  */
186
187 static void
188 bfd_mach_o_convert_section_name_to_bfd
189   (bfd *abfd, const char *segname, const char *sectname,
190    const char **name, flagword *flags)
191 {
192   char *res;
193   unsigned int len;
194   const char *pfx = "";
195
196   /* First search for a canonical name.  */
197   bfd_mach_o_normalize_section_name (segname, sectname, name, flags);
198
199   /* Return now if found.  */
200   if (*name)
201     return;
202
203   len = 16 + 1 + 16 + 1;
204
205   /* Put "LC_SEGMENT." prefix if the segment name is weird (ie doesn't start
206      with an underscore.  */
207   if (segname[0] != '_')
208     {
209       static const char seg_pfx[] = "LC_SEGMENT.";
210
211       pfx = seg_pfx;
212       len += sizeof (seg_pfx) - 1;
213     }
214
215   res = bfd_alloc (abfd, len);
216   if (res == NULL)
217     return;
218   snprintf (res, len, "%s%.16s.%.16s", pfx, segname, sectname);
219   *name = res;
220   *flags = SEC_NO_FLAGS;
221 }
222
223 /* Convert a bfd section name to a Mach-O segment + section name.  */
224
225 static void
226 bfd_mach_o_convert_section_name_to_mach_o (bfd *abfd ATTRIBUTE_UNUSED,
227                                            asection *sect,
228                                            bfd_mach_o_section *section)
229 {
230   const struct mach_o_segment_name_xlat *seg;
231   const char *name = bfd_get_section_name (abfd, sect);
232   const char *dot;
233   unsigned int len;
234   unsigned int seglen;
235   unsigned int seclen;
236
237   /* List of well known names.  They all start with a dot.  */
238   if (name[0] == '.')
239     for (seg = segsec_names_xlat; seg->segname; seg++)
240       {
241         const struct mach_o_section_name_xlat *sec;
242
243         for (sec = seg->sections; sec->mach_o_name; sec++)
244           {
245             if (strcmp (sec->bfd_name, name) == 0)
246               {
247                 strcpy (section->segname, seg->segname);
248                 strcpy (section->sectname, sec->mach_o_name);
249                 return;
250               }
251           }
252       }
253
254   /* Strip LC_SEGMENT. prefix.  */
255   if (strncmp (name, "LC_SEGMENT.", 11) == 0)
256     name += 11;
257
258   /* Find a dot.  */
259   dot = strchr (name, '.');
260   len = strlen (name);
261
262   /* Try to split name into segment and section names.  */
263   if (dot && dot != name)
264     {
265       seglen = dot - name;
266       seclen = len - (dot + 1 - name);
267
268       if (seglen < 16 && seclen < 16)
269         {
270           memcpy (section->segname, name, seglen);
271           section->segname[seglen] = 0;
272           memcpy (section->sectname, dot + 1, seclen);
273           section->sectname[seclen] = 0;
274           return;
275         }
276     }
277
278   if (len > 16)
279     len = 16;
280   memcpy (section->segname, name, len);
281   section->segname[len] = 0;
282   memcpy (section->sectname, name, len);
283   section->sectname[len] = 0;
284 }
285
286 /* Return the size of an entry for section SEC.
287    Must be called only for symbol pointer section and symbol stubs
288    sections.  */
289
290 unsigned int
291 bfd_mach_o_section_get_entry_size (bfd *abfd, bfd_mach_o_section *sec)
292 {
293   switch (sec->flags & BFD_MACH_O_SECTION_TYPE_MASK)
294     {
295     case BFD_MACH_O_S_NON_LAZY_SYMBOL_POINTERS:
296     case BFD_MACH_O_S_LAZY_SYMBOL_POINTERS:
297       return bfd_mach_o_wide_p (abfd) ? 8 : 4;
298     case BFD_MACH_O_S_SYMBOL_STUBS:
299       return sec->reserved2;
300     default:
301       BFD_FAIL ();
302       return 0;
303     }
304 }
305
306 /* Return the number of indirect symbols for a section.
307    Must be called only for symbol pointer section and symbol stubs
308    sections.  */
309
310 unsigned int
311 bfd_mach_o_section_get_nbr_indirect (bfd *abfd, bfd_mach_o_section *sec)
312 {
313   unsigned int elsz;
314
315   elsz = bfd_mach_o_section_get_entry_size (abfd, sec);
316   if (elsz == 0)
317     return 0;
318   else
319     return sec->size / elsz;
320 }
321
322
323 /* Copy any private info we understand from the input symbol
324    to the output symbol.  */
325
326 bfd_boolean
327 bfd_mach_o_bfd_copy_private_symbol_data (bfd *ibfd ATTRIBUTE_UNUSED,
328                                          asymbol *isymbol ATTRIBUTE_UNUSED,
329                                          bfd *obfd ATTRIBUTE_UNUSED,
330                                          asymbol *osymbol ATTRIBUTE_UNUSED)
331 {
332   return TRUE;
333 }
334
335 /* Copy any private info we understand from the input section
336    to the output section.  */
337
338 bfd_boolean
339 bfd_mach_o_bfd_copy_private_section_data (bfd *ibfd ATTRIBUTE_UNUSED,
340                                           asection *isection ATTRIBUTE_UNUSED,
341                                           bfd *obfd ATTRIBUTE_UNUSED,
342                                           asection *osection ATTRIBUTE_UNUSED)
343 {
344   return TRUE;
345 }
346
347 /* Copy any private info we understand from the input bfd
348    to the output bfd.  */
349
350 bfd_boolean
351 bfd_mach_o_bfd_copy_private_bfd_data (bfd *ibfd, bfd *obfd)
352 {
353   if (bfd_get_flavour (ibfd) != bfd_target_mach_o_flavour
354       || bfd_get_flavour (obfd) != bfd_target_mach_o_flavour)
355     return TRUE;
356
357   BFD_ASSERT (bfd_mach_o_valid (ibfd));
358   BFD_ASSERT (bfd_mach_o_valid (obfd));
359
360   /* FIXME: copy commands.  */
361
362   return TRUE;
363 }
364
365 /* Count the total number of symbols.  */
366
367 static long
368 bfd_mach_o_count_symbols (bfd *abfd)
369 {
370   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
371
372   if (mdata->symtab == NULL)
373     return 0;
374   return mdata->symtab->nsyms;
375 }
376
377 long
378 bfd_mach_o_get_symtab_upper_bound (bfd *abfd)
379 {
380   long nsyms = bfd_mach_o_count_symbols (abfd);
381
382   return ((nsyms + 1) * sizeof (asymbol *));
383 }
384
385 long
386 bfd_mach_o_canonicalize_symtab (bfd *abfd, asymbol **alocation)
387 {
388   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
389   long nsyms = bfd_mach_o_count_symbols (abfd);
390   bfd_mach_o_symtab_command *sym = mdata->symtab;
391   unsigned long j;
392
393   if (nsyms < 0)
394     return nsyms;
395
396   if (nsyms == 0)
397     {
398       /* Do not try to read symbols if there are none.  */
399       alocation[0] = NULL;
400       return 0;
401     }
402
403   if (!bfd_mach_o_read_symtab_symbols (abfd))
404     {
405       (*_bfd_error_handler)
406         (_("bfd_mach_o_canonicalize_symtab: unable to load symbols"));
407       return 0;
408     }
409
410   BFD_ASSERT (sym->symbols != NULL);
411
412   for (j = 0; j < sym->nsyms; j++)
413     alocation[j] = &sym->symbols[j].symbol;
414
415   alocation[j] = NULL;
416
417   return nsyms;
418 }
419
420 long
421 bfd_mach_o_get_synthetic_symtab (bfd *abfd,
422                                  long symcount ATTRIBUTE_UNUSED,
423                                  asymbol **syms ATTRIBUTE_UNUSED,
424                                  long dynsymcount ATTRIBUTE_UNUSED,
425                                  asymbol **dynsyms ATTRIBUTE_UNUSED,
426                                  asymbol **ret)
427 {
428   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
429   bfd_mach_o_dysymtab_command *dysymtab = mdata->dysymtab;
430   bfd_mach_o_symtab_command *symtab = mdata->symtab;
431   asymbol *s;
432   unsigned long count, i, j, n;
433   size_t size;
434   char *names;
435   char *nul_name;
436
437   *ret = NULL;
438
439   if (dysymtab == NULL || symtab == NULL || symtab->symbols == NULL)
440     return 0;
441
442   if (dysymtab->nindirectsyms == 0)
443     return 0;
444
445   count = dysymtab->nindirectsyms;
446   size = count * sizeof (asymbol) + 1;
447
448   for (j = 0; j < count; j++)
449     {
450       unsigned int isym = dysymtab->indirect_syms[j];
451               
452       if (isym < symtab->nsyms && symtab->symbols[isym].symbol.name)
453         size += strlen (symtab->symbols[isym].symbol.name) + sizeof ("$stub");
454     }
455
456   s = *ret = (asymbol *) bfd_malloc (size);
457   if (s == NULL)
458     return -1;
459   names = (char *) (s + count);
460   nul_name = names;
461   *names++ = 0;
462   
463   n = 0;
464   for (i = 0; i < mdata->nsects; i++)
465     {
466       bfd_mach_o_section *sec = mdata->sections[i];
467       unsigned int first, last;
468       bfd_vma addr;
469       bfd_vma entry_size;
470       
471       switch (sec->flags & BFD_MACH_O_SECTION_TYPE_MASK)
472         {
473         case BFD_MACH_O_S_NON_LAZY_SYMBOL_POINTERS:
474         case BFD_MACH_O_S_LAZY_SYMBOL_POINTERS:
475         case BFD_MACH_O_S_SYMBOL_STUBS:
476           first = sec->reserved1;
477           last = first + bfd_mach_o_section_get_nbr_indirect (abfd, sec);
478           addr = sec->addr;
479           entry_size = bfd_mach_o_section_get_entry_size (abfd, sec);
480           for (j = first; j < last; j++)
481             {
482               unsigned int isym = dysymtab->indirect_syms[j];
483
484               s->flags = BSF_GLOBAL | BSF_SYNTHETIC;
485               s->section = sec->bfdsection;
486               s->value = addr - sec->addr;
487               s->udata.p = NULL;
488               
489               if (isym < symtab->nsyms
490                   && symtab->symbols[isym].symbol.name)
491                 {
492                   const char *sym = symtab->symbols[isym].symbol.name;
493                   size_t len;
494
495                   s->name = names;
496                   len = strlen (sym);
497                   memcpy (names, sym, len);
498                   names += len;
499                   memcpy (names, "$stub", sizeof ("$stub"));
500                   names += sizeof ("$stub");
501                 }
502               else
503                 s->name = nul_name;
504
505               addr += entry_size;
506               s++;
507               n++;
508             }
509           break;
510         default:
511           break;
512         }
513     }
514
515   return n;
516 }
517
518 void
519 bfd_mach_o_get_symbol_info (bfd *abfd ATTRIBUTE_UNUSED,
520                             asymbol *symbol,
521                             symbol_info *ret)
522 {
523   bfd_symbol_info (symbol, ret);
524 }
525
526 void
527 bfd_mach_o_print_symbol (bfd *abfd,
528                          void * afile,
529                          asymbol *symbol,
530                          bfd_print_symbol_type how)
531 {
532   FILE *file = (FILE *) afile;
533   const char *name;
534   bfd_mach_o_asymbol *asym = (bfd_mach_o_asymbol *)symbol;
535
536   switch (how)
537     {
538     case bfd_print_symbol_name:
539       fprintf (file, "%s", symbol->name);
540       break;
541     default:
542       bfd_print_symbol_vandf (abfd, (void *) file, symbol);
543       if (asym->n_type & BFD_MACH_O_N_STAB)
544         name = bfd_get_stab_name (asym->n_type);
545       else
546         switch (asym->n_type & BFD_MACH_O_N_TYPE)
547           {
548           case BFD_MACH_O_N_UNDF:
549             if (symbol->value == 0)
550               name = "UND";
551             else
552               name = "COM";
553             break;
554           case BFD_MACH_O_N_ABS:
555             name = "ABS";
556             break;
557           case BFD_MACH_O_N_INDR:
558             name = "INDR";
559             break;
560           case BFD_MACH_O_N_PBUD:
561             name = "PBUD";
562             break;
563           case BFD_MACH_O_N_SECT:
564             name = "SECT";
565             break;
566           default:
567             name = "???";
568             break;
569           }
570       if (name == NULL)
571         name = "";
572       fprintf (file, " %02x %-6s %02x %04x",
573                asym->n_type, name, asym->n_sect, asym->n_desc);
574       if ((asym->n_type & BFD_MACH_O_N_STAB) == 0
575           && (asym->n_type & BFD_MACH_O_N_TYPE) == BFD_MACH_O_N_SECT)
576         fprintf (file, " [%s]", symbol->section->name);
577       fprintf (file, " %s", symbol->name);
578     }
579 }
580
581 static void
582 bfd_mach_o_convert_architecture (bfd_mach_o_cpu_type mtype,
583                                  bfd_mach_o_cpu_subtype msubtype ATTRIBUTE_UNUSED,
584                                  enum bfd_architecture *type,
585                                  unsigned long *subtype)
586 {
587   *subtype = bfd_arch_unknown;
588
589   switch (mtype)
590     {
591     case BFD_MACH_O_CPU_TYPE_VAX: *type = bfd_arch_vax; break;
592     case BFD_MACH_O_CPU_TYPE_MC680x0: *type = bfd_arch_m68k; break;
593     case BFD_MACH_O_CPU_TYPE_I386:
594       *type = bfd_arch_i386;
595       *subtype = bfd_mach_i386_i386;
596       break;
597     case BFD_MACH_O_CPU_TYPE_X86_64:
598       *type = bfd_arch_i386;
599       *subtype = bfd_mach_x86_64;
600       break;
601     case BFD_MACH_O_CPU_TYPE_MIPS: *type = bfd_arch_mips; break;
602     case BFD_MACH_O_CPU_TYPE_MC98000: *type = bfd_arch_m98k; break;
603     case BFD_MACH_O_CPU_TYPE_HPPA: *type = bfd_arch_hppa; break;
604     case BFD_MACH_O_CPU_TYPE_ARM: *type = bfd_arch_arm; break;
605     case BFD_MACH_O_CPU_TYPE_MC88000: *type = bfd_arch_m88k; break;
606     case BFD_MACH_O_CPU_TYPE_SPARC:
607       *type = bfd_arch_sparc;
608       *subtype = bfd_mach_sparc;
609       break;
610     case BFD_MACH_O_CPU_TYPE_I860: *type = bfd_arch_i860; break;
611     case BFD_MACH_O_CPU_TYPE_ALPHA: *type = bfd_arch_alpha; break;
612     case BFD_MACH_O_CPU_TYPE_POWERPC:
613       *type = bfd_arch_powerpc;
614       *subtype = bfd_mach_ppc;
615       break;
616     case BFD_MACH_O_CPU_TYPE_POWERPC_64:
617       *type = bfd_arch_powerpc;
618       *subtype = bfd_mach_ppc64;
619       break;
620     default:
621       *type = bfd_arch_unknown;
622       break;
623     }
624 }
625
626 static bfd_boolean
627 bfd_mach_o_write_header (bfd *abfd, bfd_mach_o_header *header)
628 {
629   struct mach_o_header_external raw;
630   unsigned int size;
631
632   size = mach_o_wide_p (header) ?
633     BFD_MACH_O_HEADER_64_SIZE : BFD_MACH_O_HEADER_SIZE;
634
635   bfd_h_put_32 (abfd, header->magic, raw.magic);
636   bfd_h_put_32 (abfd, header->cputype, raw.cputype);
637   bfd_h_put_32 (abfd, header->cpusubtype, raw.cpusubtype);
638   bfd_h_put_32 (abfd, header->filetype, raw.filetype);
639   bfd_h_put_32 (abfd, header->ncmds, raw.ncmds);
640   bfd_h_put_32 (abfd, header->sizeofcmds, raw.sizeofcmds);
641   bfd_h_put_32 (abfd, header->flags, raw.flags);
642
643   if (mach_o_wide_p (header))
644     bfd_h_put_32 (abfd, header->reserved, raw.reserved);
645
646   if (bfd_seek (abfd, 0, SEEK_SET) != 0
647       || bfd_bwrite (&raw, size, abfd) != size)
648     return FALSE;
649
650   return TRUE;
651 }
652
653 static int
654 bfd_mach_o_write_thread (bfd *abfd, bfd_mach_o_load_command *command)
655 {
656   bfd_mach_o_thread_command *cmd = &command->command.thread;
657   unsigned int i;
658   struct mach_o_thread_command_external raw;
659   unsigned int offset;
660
661   BFD_ASSERT ((command->type == BFD_MACH_O_LC_THREAD)
662               || (command->type == BFD_MACH_O_LC_UNIXTHREAD));
663
664   offset = 8;
665   for (i = 0; i < cmd->nflavours; i++)
666     {
667       BFD_ASSERT ((cmd->flavours[i].size % 4) == 0);
668       BFD_ASSERT (cmd->flavours[i].offset ==
669                   (command->offset + offset + BFD_MACH_O_LC_SIZE));
670
671       bfd_h_put_32 (abfd, cmd->flavours[i].flavour, raw.flavour);
672       bfd_h_put_32 (abfd, (cmd->flavours[i].size / 4), raw.count);
673
674       if (bfd_seek (abfd, command->offset + offset, SEEK_SET) != 0
675           || bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw))
676         return -1;
677
678       offset += cmd->flavours[i].size + sizeof (raw);
679     }
680
681   return 0;
682 }
683
684 long
685 bfd_mach_o_get_reloc_upper_bound (bfd *abfd ATTRIBUTE_UNUSED,
686                                   asection *asect)
687 {
688   return (asect->reloc_count + 1) * sizeof (arelent *);
689 }
690
691 static int
692 bfd_mach_o_canonicalize_one_reloc (bfd *abfd,
693                                    struct mach_o_reloc_info_external *raw,
694                                    arelent *res, asymbol **syms)
695 {
696   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
697   bfd_mach_o_backend_data *bed = bfd_mach_o_get_backend_data (abfd);
698   bfd_mach_o_reloc_info reloc;
699   bfd_vma addr;
700   bfd_vma symnum;
701   asymbol **sym;
702
703   addr = bfd_get_32 (abfd, raw->r_address);
704   symnum = bfd_get_32 (abfd, raw->r_symbolnum);
705   
706   if (addr & BFD_MACH_O_SR_SCATTERED)
707     {
708       unsigned int j;
709
710       /* Scattered relocation.
711          Extract section and offset from r_value.  */
712       res->sym_ptr_ptr = NULL;
713       res->addend = 0;
714       for (j = 0; j < mdata->nsects; j++)
715         {
716           bfd_mach_o_section *sect = mdata->sections[j];
717           if (symnum >= sect->addr && symnum < sect->addr + sect->size)
718             {
719               res->sym_ptr_ptr = sect->bfdsection->symbol_ptr_ptr;
720               res->addend = symnum - sect->addr;
721               break;
722             }
723         }
724       res->address = BFD_MACH_O_GET_SR_ADDRESS (addr);
725       reloc.r_type = BFD_MACH_O_GET_SR_TYPE (addr);
726       reloc.r_length = BFD_MACH_O_GET_SR_LENGTH (addr);
727       reloc.r_pcrel = addr & BFD_MACH_O_SR_PCREL;
728       reloc.r_scattered = 1;
729     }
730   else
731     {
732       unsigned int num = BFD_MACH_O_GET_R_SYMBOLNUM (symnum);
733       res->addend = 0;
734       res->address = addr;
735       if (symnum & BFD_MACH_O_R_EXTERN)
736         {
737           sym = syms + num;
738           reloc.r_extern = 1;
739         }
740       else
741         {
742           BFD_ASSERT (num != 0);
743           BFD_ASSERT (num <= mdata->nsects);
744           sym = mdata->sections[num - 1]->bfdsection->symbol_ptr_ptr;
745           /* For a symbol defined in section S, the addend (stored in the
746              binary) contains the address of the section.  To comply with
747              bfd conventio, substract the section address.
748              Use the address from the header, so that the user can modify
749              the vma of the section.  */
750           res->addend = -mdata->sections[num - 1]->addr;
751           reloc.r_extern = 0;
752         }
753       res->sym_ptr_ptr = sym;
754       reloc.r_type = BFD_MACH_O_GET_R_TYPE (symnum);
755       reloc.r_length = BFD_MACH_O_GET_R_LENGTH (symnum);
756       reloc.r_pcrel = (symnum & BFD_MACH_O_R_PCREL) ? 1 : 0;
757       reloc.r_scattered = 0;
758     }
759   
760   if (!(*bed->_bfd_mach_o_swap_reloc_in)(res, &reloc))
761     return -1;
762   return 0;
763 }
764
765 static int
766 bfd_mach_o_canonicalize_relocs (bfd *abfd, unsigned long filepos,
767                                 unsigned long count,
768                                 arelent *res, asymbol **syms)
769 {
770   unsigned long i;
771   struct mach_o_reloc_info_external *native_relocs;
772   bfd_size_type native_size;
773
774   /* Allocate and read relocs.  */
775   native_size = count * BFD_MACH_O_RELENT_SIZE;
776   native_relocs =
777     (struct mach_o_reloc_info_external *) bfd_malloc (native_size);
778   if (native_relocs == NULL)
779     return -1;
780
781   if (bfd_seek (abfd, filepos, SEEK_SET) != 0
782       || bfd_bread (native_relocs, native_size, abfd) != native_size)
783     goto err;
784
785   for (i = 0; i < count; i++)
786     {
787       if (bfd_mach_o_canonicalize_one_reloc (abfd, &native_relocs[i],
788                                              &res[i], syms) < 0)
789         goto err;
790     }
791   free (native_relocs);
792   return i;
793  err:
794   free (native_relocs);
795   return -1;
796 }
797
798 long
799 bfd_mach_o_canonicalize_reloc (bfd *abfd, asection *asect,
800                                arelent **rels, asymbol **syms)
801 {
802   bfd_mach_o_backend_data *bed = bfd_mach_o_get_backend_data (abfd);
803   unsigned long i;
804   arelent *res;
805
806   if (asect->reloc_count == 0)
807     return 0;
808
809   /* No need to go further if we don't know how to read relocs.  */
810   if (bed->_bfd_mach_o_swap_reloc_in == NULL)
811     return 0;
812
813   res = bfd_malloc (asect->reloc_count * sizeof (arelent));
814   if (res == NULL)
815     return -1;
816
817   if (bfd_mach_o_canonicalize_relocs (abfd, asect->rel_filepos,
818                                       asect->reloc_count, res, syms) < 0)
819     {
820       free (res);
821       return -1;
822     }
823
824   for (i = 0; i < asect->reloc_count; i++)
825     rels[i] = &res[i];
826   rels[i] = NULL;
827   asect->relocation = res;
828
829   return i;
830 }
831
832 long
833 bfd_mach_o_get_dynamic_reloc_upper_bound (bfd *abfd)
834 {
835   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
836
837   if (mdata->dysymtab == NULL)
838     return 1;
839   return (mdata->dysymtab->nextrel + mdata->dysymtab->nlocrel)
840     * sizeof (arelent *);
841 }
842
843 long
844 bfd_mach_o_canonicalize_dynamic_reloc (bfd *abfd, arelent **rels,
845                                        struct bfd_symbol **syms)
846 {
847   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
848   bfd_mach_o_dysymtab_command *dysymtab = mdata->dysymtab;
849   bfd_mach_o_backend_data *bed = bfd_mach_o_get_backend_data (abfd);
850   unsigned long i;
851   arelent *res;
852
853   if (dysymtab == NULL)
854     return 0;
855   if (dysymtab->nextrel == 0 && dysymtab->nlocrel == 0)
856     return 0;
857
858   /* No need to go further if we don't know how to read relocs.  */
859   if (bed->_bfd_mach_o_swap_reloc_in == NULL)
860     return 0;
861
862   res = bfd_malloc ((dysymtab->nextrel + dysymtab->nlocrel) * sizeof (arelent));
863   if (res == NULL)
864     return -1;
865
866   if (bfd_mach_o_canonicalize_relocs (abfd, dysymtab->extreloff,
867                                       dysymtab->nextrel, res, syms) < 0)
868     {
869       free (res);
870       return -1;
871     }
872
873   if (bfd_mach_o_canonicalize_relocs (abfd, dysymtab->locreloff,
874                                       dysymtab->nlocrel,
875                                       res + dysymtab->nextrel, syms) < 0)
876     {
877       free (res);
878       return -1;
879     }
880
881   for (i = 0; i < dysymtab->nextrel + dysymtab->nlocrel; i++)
882     rels[i] = &res[i];
883   rels[i] = NULL;
884   return i;
885 }
886
887 static bfd_boolean
888 bfd_mach_o_write_relocs (bfd *abfd, bfd_mach_o_section *section)
889 {
890   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
891   unsigned int i;
892   arelent **entries;
893   asection *sec;
894   bfd_mach_o_backend_data *bed = bfd_mach_o_get_backend_data (abfd);
895
896   sec = section->bfdsection;
897   if (sec->reloc_count == 0)
898     return TRUE;
899
900   if (bed->_bfd_mach_o_swap_reloc_out == NULL)
901     return TRUE;
902
903   /* Allocate relocation room.  */
904   mdata->filelen = FILE_ALIGN(mdata->filelen, 2);
905   section->nreloc = sec->reloc_count;
906   sec->rel_filepos = mdata->filelen;
907   section->reloff = sec->rel_filepos;
908   mdata->filelen += sec->reloc_count * BFD_MACH_O_RELENT_SIZE;
909
910   if (bfd_seek (abfd, section->reloff, SEEK_SET) != 0)
911     return FALSE;
912
913   /* Convert and write.  */
914   entries = section->bfdsection->orelocation;
915   for (i = 0; i < section->nreloc; i++)
916     {
917       arelent *rel = entries[i];
918       struct mach_o_reloc_info_external raw;
919       bfd_mach_o_reloc_info info, *pinfo = &info;
920
921       /* Convert relocation to an intermediate representation.  */
922       if (!(*bed->_bfd_mach_o_swap_reloc_out) (rel, pinfo))
923         return FALSE;
924
925       /* Lower the relocation info.  */
926       if (pinfo->r_scattered)
927         {
928           unsigned long v;
929
930           v = BFD_MACH_O_SR_SCATTERED
931             | (pinfo->r_pcrel ? BFD_MACH_O_SR_PCREL : 0)
932             | BFD_MACH_O_SET_SR_LENGTH(pinfo->r_length)
933             | BFD_MACH_O_SET_SR_TYPE(pinfo->r_type)
934             | BFD_MACH_O_SET_SR_ADDRESS(pinfo->r_address);
935           /* Note: scattered relocs have field in reverse order...  */
936           bfd_put_32 (abfd, v, raw.r_address);
937           bfd_put_32 (abfd, pinfo->r_value, raw.r_symbolnum);
938         }
939       else
940         {
941           unsigned long v;
942
943           bfd_put_32 (abfd, pinfo->r_address, raw.r_address);
944           v = BFD_MACH_O_SET_R_SYMBOLNUM (pinfo->r_value)
945             | (pinfo->r_pcrel ? BFD_MACH_O_R_PCREL : 0)
946             | BFD_MACH_O_SET_R_LENGTH (pinfo->r_length)
947             | (pinfo->r_extern ? BFD_MACH_O_R_EXTERN : 0)
948             | BFD_MACH_O_SET_R_TYPE (pinfo->r_type);
949           bfd_put_32 (abfd, v, raw.r_symbolnum);
950         }
951
952       if (bfd_bwrite (&raw, BFD_MACH_O_RELENT_SIZE, abfd)
953           != BFD_MACH_O_RELENT_SIZE)
954         return FALSE;
955     }
956   return TRUE;
957 }
958
959 static int
960 bfd_mach_o_write_section_32 (bfd *abfd, bfd_mach_o_section *section)
961 {
962   struct mach_o_section_32_external raw;
963
964   memcpy (raw.sectname, section->sectname, 16);
965   memcpy (raw.segname, section->segname, 16);
966   bfd_h_put_32 (abfd, section->addr, raw.addr);
967   bfd_h_put_32 (abfd, section->size, raw.size);
968   bfd_h_put_32 (abfd, section->offset, raw.offset);
969   bfd_h_put_32 (abfd, section->align, raw.align);
970   bfd_h_put_32 (abfd, section->reloff, raw.reloff);
971   bfd_h_put_32 (abfd, section->nreloc, raw.nreloc);
972   bfd_h_put_32 (abfd, section->flags, raw.flags);
973   bfd_h_put_32 (abfd, section->reserved1, raw.reserved1);
974   bfd_h_put_32 (abfd, section->reserved2, raw.reserved2);
975
976   if (bfd_bwrite (&raw, BFD_MACH_O_SECTION_SIZE, abfd)
977       != BFD_MACH_O_SECTION_SIZE)
978     return -1;
979
980   return 0;
981 }
982
983 static int
984 bfd_mach_o_write_section_64 (bfd *abfd, bfd_mach_o_section *section)
985 {
986   struct mach_o_section_64_external raw;
987
988   memcpy (raw.sectname, section->sectname, 16);
989   memcpy (raw.segname, section->segname, 16);
990   bfd_h_put_64 (abfd, section->addr, raw.addr);
991   bfd_h_put_64 (abfd, section->size, raw.size);
992   bfd_h_put_32 (abfd, section->offset, raw.offset);
993   bfd_h_put_32 (abfd, section->align, raw.align);
994   bfd_h_put_32 (abfd, section->reloff, raw.reloff);
995   bfd_h_put_32 (abfd, section->nreloc, raw.nreloc);
996   bfd_h_put_32 (abfd, section->flags, raw.flags);
997   bfd_h_put_32 (abfd, section->reserved1, raw.reserved1);
998   bfd_h_put_32 (abfd, section->reserved2, raw.reserved2);
999   bfd_h_put_32 (abfd, section->reserved3, raw.reserved3);
1000
1001   if (bfd_bwrite (&raw, BFD_MACH_O_SECTION_64_SIZE, abfd)
1002       != BFD_MACH_O_SECTION_64_SIZE)
1003     return -1;
1004
1005   return 0;
1006 }
1007
1008 static int
1009 bfd_mach_o_write_segment_32 (bfd *abfd, bfd_mach_o_load_command *command)
1010 {
1011   struct mach_o_segment_command_32_external raw;
1012   bfd_mach_o_segment_command *seg = &command->command.segment;
1013   bfd_mach_o_section *sec;
1014
1015   BFD_ASSERT (command->type == BFD_MACH_O_LC_SEGMENT);
1016
1017   for (sec = seg->sect_head; sec != NULL; sec = sec->next)
1018     if (!bfd_mach_o_write_relocs (abfd, sec))
1019       return -1;
1020
1021   memcpy (raw.segname, seg->segname, 16);
1022   bfd_h_put_32 (abfd, seg->vmaddr, raw.vmaddr);
1023   bfd_h_put_32 (abfd, seg->vmsize, raw.vmsize);
1024   bfd_h_put_32 (abfd, seg->fileoff, raw.fileoff);
1025   bfd_h_put_32 (abfd, seg->filesize, raw.filesize);
1026   bfd_h_put_32 (abfd, seg->maxprot, raw.maxprot);
1027   bfd_h_put_32 (abfd, seg->initprot, raw.initprot);
1028   bfd_h_put_32 (abfd, seg->nsects, raw.nsects);
1029   bfd_h_put_32 (abfd, seg->flags, raw.flags);
1030   
1031   if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
1032       || bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw))
1033     return -1;
1034
1035   for (sec = seg->sect_head; sec != NULL; sec = sec->next)
1036     if (bfd_mach_o_write_section_32 (abfd, sec))
1037       return -1;
1038
1039   return 0;
1040 }
1041
1042 static int
1043 bfd_mach_o_write_segment_64 (bfd *abfd, bfd_mach_o_load_command *command)
1044 {
1045   struct mach_o_segment_command_64_external raw;
1046   bfd_mach_o_segment_command *seg = &command->command.segment;
1047   bfd_mach_o_section *sec;
1048
1049   BFD_ASSERT (command->type == BFD_MACH_O_LC_SEGMENT_64);
1050
1051   for (sec = seg->sect_head; sec != NULL; sec = sec->next)
1052     if (!bfd_mach_o_write_relocs (abfd, sec))
1053       return -1;
1054
1055   memcpy (raw.segname, seg->segname, 16);
1056   bfd_h_put_64 (abfd, seg->vmaddr, raw.vmaddr);
1057   bfd_h_put_64 (abfd, seg->vmsize, raw.vmsize);
1058   bfd_h_put_64 (abfd, seg->fileoff, raw.fileoff);
1059   bfd_h_put_64 (abfd, seg->filesize, raw.filesize);
1060   bfd_h_put_32 (abfd, seg->maxprot, raw.maxprot);
1061   bfd_h_put_32 (abfd, seg->initprot, raw.initprot);
1062   bfd_h_put_32 (abfd, seg->nsects, raw.nsects);
1063   bfd_h_put_32 (abfd, seg->flags, raw.flags);
1064
1065   if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
1066       || bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw))
1067     return -1;
1068
1069   for (sec = seg->sect_head; sec != NULL; sec = sec->next)
1070     if (bfd_mach_o_write_section_64 (abfd, sec))
1071       return -1;
1072
1073   return 0;
1074 }
1075
1076 static bfd_boolean
1077 bfd_mach_o_write_symtab (bfd *abfd, bfd_mach_o_load_command *command)
1078 {
1079   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
1080   bfd_mach_o_symtab_command *sym = &command->command.symtab;
1081   unsigned long i;
1082   unsigned int wide = bfd_mach_o_wide_p (abfd);
1083   unsigned int symlen = wide ? BFD_MACH_O_NLIST_64_SIZE : BFD_MACH_O_NLIST_SIZE;
1084   struct bfd_strtab_hash *strtab;
1085   asymbol **symbols = bfd_get_outsymbols (abfd);
1086
1087   BFD_ASSERT (command->type == BFD_MACH_O_LC_SYMTAB);
1088
1089   /* Write the symbols first.  */
1090   mdata->filelen = FILE_ALIGN(mdata->filelen, wide ? 3 : 2);
1091   sym->symoff = mdata->filelen;
1092   if (bfd_seek (abfd, sym->symoff, SEEK_SET) != 0)
1093     return FALSE;
1094
1095   sym->nsyms = bfd_get_symcount (abfd);
1096   mdata->filelen += sym->nsyms * symlen;
1097
1098   strtab = _bfd_stringtab_init ();
1099   if (strtab == NULL)
1100     return FALSE;
1101
1102   for (i = 0; i < sym->nsyms; i++)
1103     {
1104       bfd_size_type str_index;
1105       bfd_mach_o_asymbol *s = (bfd_mach_o_asymbol *)symbols[i];
1106
1107       /* Compute name index.  */
1108       /* An index of 0 always means the empty string.  */
1109       if (s->symbol.name == 0 || s->symbol.name[0] == '\0')
1110         str_index = 0;
1111       else
1112         {
1113           str_index = _bfd_stringtab_add (strtab, s->symbol.name, TRUE, FALSE);
1114           if (str_index == (bfd_size_type) -1)
1115             goto err;
1116         }
1117
1118       if (wide)
1119         {
1120           struct mach_o_nlist_64_external raw;
1121
1122           bfd_h_put_32 (abfd, str_index, raw.n_strx);
1123           bfd_h_put_8 (abfd, s->n_type, raw.n_type);
1124           bfd_h_put_8 (abfd, s->n_sect, raw.n_sect);
1125           bfd_h_put_16 (abfd, s->n_desc, raw.n_desc);
1126           bfd_h_put_64 (abfd, s->symbol.section->vma + s->symbol.value,
1127                         raw.n_value);
1128
1129           if (bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw))
1130             goto err;
1131         }
1132       else
1133         {
1134           struct mach_o_nlist_external raw;
1135
1136           bfd_h_put_32 (abfd, str_index, raw.n_strx);
1137           bfd_h_put_8 (abfd, s->n_type, raw.n_type);
1138           bfd_h_put_8 (abfd, s->n_sect, raw.n_sect);
1139           bfd_h_put_16 (abfd, s->n_desc, raw.n_desc);
1140           bfd_h_put_32 (abfd, s->symbol.section->vma + s->symbol.value,
1141                         raw.n_value);
1142
1143           if (bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw))
1144             goto err;
1145         }
1146     }
1147   sym->strsize = _bfd_stringtab_size (strtab);
1148   sym->stroff = mdata->filelen;
1149   mdata->filelen += sym->strsize;
1150
1151   if (_bfd_stringtab_emit (abfd, strtab) != TRUE)
1152     goto err;
1153   _bfd_stringtab_free (strtab);
1154
1155   /* The command.  */
1156   {
1157     struct mach_o_symtab_command_external raw;
1158
1159     bfd_h_put_32 (abfd, sym->symoff, raw.symoff);
1160     bfd_h_put_32 (abfd, sym->nsyms, raw.nsyms);
1161     bfd_h_put_32 (abfd, sym->stroff, raw.stroff);
1162     bfd_h_put_32 (abfd, sym->strsize, raw.strsize);
1163
1164     if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
1165         || bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw))
1166       return FALSE;
1167   }
1168
1169   return TRUE;
1170
1171  err:
1172   _bfd_stringtab_free (strtab);
1173   return FALSE;
1174 }
1175
1176 /* Process the symbols and generate Mach-O specific fields.
1177    Number them.  */
1178
1179 static bfd_boolean
1180 bfd_mach_o_mangle_symbols (bfd *abfd)
1181 {
1182   unsigned long i;
1183   asymbol **symbols = bfd_get_outsymbols (abfd);
1184
1185   for (i = 0; i < bfd_get_symcount (abfd); i++)
1186     {
1187       bfd_mach_o_asymbol *s = (bfd_mach_o_asymbol *)symbols[i];
1188
1189       if (s->n_type == BFD_MACH_O_N_UNDF && !(s->symbol.flags & BSF_DEBUGGING))
1190         {
1191           /* As genuine Mach-O symbols type shouldn't be N_UNDF (undefined
1192              symbols should be N_UNDEF | N_EXT), we suppose the back-end
1193              values haven't been set.  */
1194           if (s->symbol.section == bfd_abs_section_ptr)
1195             s->n_type = BFD_MACH_O_N_ABS;
1196           else if (s->symbol.section == bfd_und_section_ptr)
1197             {
1198               s->n_type = BFD_MACH_O_N_UNDF;
1199               if (s->symbol.flags & BSF_WEAK)
1200                 s->n_desc |= BFD_MACH_O_N_WEAK_REF;
1201             }
1202           else if (s->symbol.section == bfd_com_section_ptr)
1203             s->n_type = BFD_MACH_O_N_UNDF | BFD_MACH_O_N_EXT;
1204           else
1205             s->n_type = BFD_MACH_O_N_SECT;
1206           
1207           if (s->symbol.flags & BSF_GLOBAL)
1208             s->n_type |= BFD_MACH_O_N_EXT;
1209         }
1210
1211       /* Compute section index.  */
1212       if (s->symbol.section != bfd_abs_section_ptr
1213           && s->symbol.section != bfd_und_section_ptr
1214           && s->symbol.section != bfd_com_section_ptr)
1215         s->n_sect = s->symbol.section->target_index;
1216
1217       /* Number symbols.  */
1218       s->symbol.udata.i = i;
1219     }
1220   return TRUE;
1221 }
1222
1223 bfd_boolean
1224 bfd_mach_o_write_contents (bfd *abfd)
1225 {
1226   unsigned int i;
1227   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
1228
1229   if (mdata->header.ncmds == 0)
1230     if (!bfd_mach_o_build_commands (abfd))
1231       return FALSE;
1232
1233   /* Now write header information.  */
1234   if (mdata->header.filetype == 0)
1235     {
1236       if (abfd->flags & EXEC_P)
1237         mdata->header.filetype = BFD_MACH_O_MH_EXECUTE;
1238       else if (abfd->flags & DYNAMIC)
1239         mdata->header.filetype = BFD_MACH_O_MH_DYLIB;
1240       else
1241         mdata->header.filetype = BFD_MACH_O_MH_OBJECT;
1242     }
1243   if (!bfd_mach_o_write_header (abfd, &mdata->header))
1244     return FALSE;
1245
1246   /* Assign a number to each symbols.  */
1247   if (!bfd_mach_o_mangle_symbols (abfd))
1248     return FALSE;
1249
1250   for (i = 0; i < mdata->header.ncmds; i++)
1251     {
1252       struct mach_o_load_command_external raw;
1253       bfd_mach_o_load_command *cur = &mdata->commands[i];
1254       unsigned long typeflag;
1255
1256       typeflag = cur->type | (cur->type_required ? BFD_MACH_O_LC_REQ_DYLD : 0);
1257
1258       bfd_h_put_32 (abfd, typeflag, raw.cmd);
1259       bfd_h_put_32 (abfd, cur->len, raw.cmdsize);
1260
1261       if (bfd_seek (abfd, cur->offset, SEEK_SET) != 0
1262           || bfd_bwrite (&raw, BFD_MACH_O_LC_SIZE, abfd) != 8)
1263         return FALSE;
1264
1265       switch (cur->type)
1266         {
1267         case BFD_MACH_O_LC_SEGMENT:
1268           if (bfd_mach_o_write_segment_32 (abfd, cur) != 0)
1269             return FALSE;
1270           break;
1271         case BFD_MACH_O_LC_SEGMENT_64:
1272           if (bfd_mach_o_write_segment_64 (abfd, cur) != 0)
1273             return FALSE;
1274           break;
1275         case BFD_MACH_O_LC_SYMTAB:
1276           if (!bfd_mach_o_write_symtab (abfd, cur))
1277             return FALSE;
1278           break;
1279         case BFD_MACH_O_LC_SYMSEG:
1280           break;
1281         case BFD_MACH_O_LC_THREAD:
1282         case BFD_MACH_O_LC_UNIXTHREAD:
1283           if (bfd_mach_o_write_thread (abfd, cur) != 0)
1284             return FALSE;
1285           break;
1286         case BFD_MACH_O_LC_LOADFVMLIB:
1287         case BFD_MACH_O_LC_IDFVMLIB:
1288         case BFD_MACH_O_LC_IDENT:
1289         case BFD_MACH_O_LC_FVMFILE:
1290         case BFD_MACH_O_LC_PREPAGE:
1291         case BFD_MACH_O_LC_DYSYMTAB:
1292         case BFD_MACH_O_LC_LOAD_DYLIB:
1293         case BFD_MACH_O_LC_LOAD_WEAK_DYLIB:
1294         case BFD_MACH_O_LC_ID_DYLIB:
1295         case BFD_MACH_O_LC_REEXPORT_DYLIB:
1296         case BFD_MACH_O_LC_LOAD_UPWARD_DYLIB:
1297         case BFD_MACH_O_LC_LOAD_DYLINKER:
1298         case BFD_MACH_O_LC_ID_DYLINKER:
1299         case BFD_MACH_O_LC_PREBOUND_DYLIB:
1300         case BFD_MACH_O_LC_ROUTINES:
1301         case BFD_MACH_O_LC_SUB_FRAMEWORK:
1302           break;
1303         default:
1304           (*_bfd_error_handler) (_("unable to write unknown load command 0x%lx"),
1305                                  (unsigned long) cur->type);
1306           return FALSE;
1307         }
1308     }
1309
1310   return TRUE;
1311 }
1312
1313 static void
1314 bfd_mach_o_append_section_to_segment (bfd_mach_o_segment_command *seg,
1315                                       asection *sec)
1316 {
1317   bfd_mach_o_section *s = (bfd_mach_o_section *)sec->used_by_bfd;
1318   if (seg->sect_head == NULL)
1319     seg->sect_head = s;
1320   else
1321     seg->sect_tail->next = s;
1322   seg->sect_tail = s;
1323 }
1324
1325 /* Create section Mach-O flags from BFD flags.  */
1326
1327 static void
1328 bfd_mach_o_set_section_flags_from_bfd (bfd *abfd ATTRIBUTE_UNUSED, asection *sec)
1329 {
1330   flagword bfd_flags;
1331   bfd_mach_o_section *s = bfd_mach_o_get_mach_o_section (sec);
1332
1333   /* Create default flags.  */
1334   bfd_flags = bfd_get_section_flags (abfd, sec);
1335   if ((bfd_flags & SEC_CODE) == SEC_CODE)
1336     s->flags = BFD_MACH_O_S_ATTR_PURE_INSTRUCTIONS
1337       | BFD_MACH_O_S_ATTR_SOME_INSTRUCTIONS
1338       | BFD_MACH_O_S_REGULAR;
1339   else if ((bfd_flags & (SEC_ALLOC | SEC_LOAD)) == SEC_ALLOC)
1340     s->flags = BFD_MACH_O_S_ZEROFILL;
1341   else if (bfd_flags & SEC_DEBUGGING)
1342     s->flags = BFD_MACH_O_S_REGULAR |  BFD_MACH_O_S_ATTR_DEBUG;
1343   else
1344     s->flags = BFD_MACH_O_S_REGULAR;
1345 }
1346
1347 /* Build Mach-O load commands from the sections.  */
1348
1349 bfd_boolean
1350 bfd_mach_o_build_commands (bfd *abfd)
1351 {
1352   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
1353   unsigned int wide = mach_o_wide_p (&mdata->header);
1354   bfd_mach_o_segment_command *seg;
1355   asection *sec;
1356   bfd_mach_o_load_command *cmd;
1357   bfd_mach_o_load_command *symtab_cmd;
1358   int target_index;
1359
1360   /* Return now if commands are already built.  */
1361   if (mdata->header.ncmds)
1362     return FALSE;
1363
1364   /* Very simple version: a command (segment) to contain all the sections and
1365      a command for the symbol table.  */
1366   mdata->header.ncmds = 2;
1367   mdata->commands = bfd_alloc (abfd, mdata->header.ncmds
1368                                * sizeof (bfd_mach_o_load_command));
1369   if (mdata->commands == NULL)
1370     return FALSE;
1371   cmd = &mdata->commands[0];
1372   seg = &cmd->command.segment;
1373
1374   seg->nsects = bfd_count_sections (abfd);
1375
1376   /* Set segment command.  */
1377   if (wide)
1378     {
1379       cmd->type = BFD_MACH_O_LC_SEGMENT_64;
1380       cmd->offset = BFD_MACH_O_HEADER_64_SIZE;
1381       cmd->len = BFD_MACH_O_LC_SEGMENT_64_SIZE
1382         + BFD_MACH_O_SECTION_64_SIZE * seg->nsects;
1383     }
1384   else
1385     {
1386       cmd->type = BFD_MACH_O_LC_SEGMENT;
1387       cmd->offset = BFD_MACH_O_HEADER_SIZE;
1388       cmd->len = BFD_MACH_O_LC_SEGMENT_SIZE
1389         + BFD_MACH_O_SECTION_SIZE * seg->nsects;
1390     }
1391   cmd->type_required = FALSE;
1392   mdata->header.sizeofcmds = cmd->len;
1393   mdata->filelen = cmd->offset + cmd->len;
1394
1395   /* Set symtab command.  */
1396   symtab_cmd = &mdata->commands[1];
1397   
1398   symtab_cmd->type = BFD_MACH_O_LC_SYMTAB;
1399   symtab_cmd->offset = cmd->offset + cmd->len;
1400   symtab_cmd->len = 6 * 4;
1401   symtab_cmd->type_required = FALSE;
1402   
1403   mdata->header.sizeofcmds += symtab_cmd->len;
1404   mdata->filelen += symtab_cmd->len;
1405
1406   /* Fill segment command.  */
1407   memset (seg->segname, 0, sizeof (seg->segname));
1408   seg->vmaddr = 0;
1409   seg->fileoff = mdata->filelen;
1410   seg->filesize = 0;
1411   seg->maxprot = BFD_MACH_O_PROT_READ | BFD_MACH_O_PROT_WRITE
1412     | BFD_MACH_O_PROT_EXECUTE;
1413   seg->initprot = seg->maxprot;
1414   seg->flags = 0;
1415   seg->sect_head = NULL;
1416   seg->sect_tail = NULL;
1417
1418   /* Create Mach-O sections.  */
1419   target_index = 0;
1420   for (sec = abfd->sections; sec; sec = sec->next)
1421     {
1422       bfd_mach_o_section *msect = bfd_mach_o_get_mach_o_section (sec);
1423
1424       bfd_mach_o_append_section_to_segment (seg, sec);
1425
1426       if (msect->flags == 0)
1427         {
1428           /* We suppose it hasn't been set.  Convert from BFD flags.  */
1429           bfd_mach_o_set_section_flags_from_bfd (abfd, sec);
1430         }
1431       msect->addr = bfd_get_section_vma (abfd, sec);
1432       msect->size = bfd_get_section_size (sec);
1433       msect->align = bfd_get_section_alignment (abfd, sec);
1434
1435       if (msect->size != 0)
1436         {
1437           mdata->filelen = FILE_ALIGN (mdata->filelen, msect->align);
1438           msect->offset = mdata->filelen;
1439         }
1440       else
1441         msect->offset = 0;
1442
1443       sec->filepos = msect->offset;
1444       sec->target_index = ++target_index;
1445
1446       mdata->filelen += msect->size;
1447     }
1448   seg->filesize = mdata->filelen - seg->fileoff;
1449   seg->vmsize = seg->filesize;
1450
1451   return TRUE;
1452 }
1453
1454 /* Set the contents of a section.  */
1455
1456 bfd_boolean
1457 bfd_mach_o_set_section_contents (bfd *abfd,
1458                                  asection *section,
1459                                  const void * location,
1460                                  file_ptr offset,
1461                                  bfd_size_type count)
1462 {
1463   file_ptr pos;
1464
1465   /* This must be done first, because bfd_set_section_contents is
1466      going to set output_has_begun to TRUE.  */
1467   if (! abfd->output_has_begun && ! bfd_mach_o_build_commands (abfd))
1468     return FALSE;
1469
1470   if (count == 0)
1471     return TRUE;
1472
1473   pos = section->filepos + offset;
1474   if (bfd_seek (abfd, pos, SEEK_SET) != 0
1475       || bfd_bwrite (location, count, abfd) != count)
1476     return FALSE;
1477
1478   return TRUE;
1479 }
1480
1481 int
1482 bfd_mach_o_sizeof_headers (bfd *a ATTRIBUTE_UNUSED,
1483                            struct bfd_link_info *info ATTRIBUTE_UNUSED)
1484 {
1485   return 0;
1486 }
1487
1488 /* Make an empty symbol.  This is required only because
1489    bfd_make_section_anyway wants to create a symbol for the section.  */
1490
1491 asymbol *
1492 bfd_mach_o_make_empty_symbol (bfd *abfd)
1493 {
1494   asymbol *new_symbol;
1495
1496   new_symbol = bfd_zalloc (abfd, sizeof (bfd_mach_o_asymbol));
1497   if (new_symbol == NULL)
1498     return new_symbol;
1499   new_symbol->the_bfd = abfd;
1500   new_symbol->udata.i = 0;
1501   return new_symbol;
1502 }
1503
1504 static bfd_boolean
1505 bfd_mach_o_read_header (bfd *abfd, bfd_mach_o_header *header)
1506 {
1507   struct mach_o_header_external raw;
1508   unsigned int size;
1509   bfd_vma (*get32) (const void *) = NULL;
1510
1511   /* Just read the magic number.  */
1512   if (bfd_seek (abfd, 0, SEEK_SET) != 0
1513       || bfd_bread (raw.magic, sizeof (raw.magic), abfd) != 4)
1514     return FALSE;
1515
1516   if (bfd_getb32 (raw.magic) == BFD_MACH_O_MH_MAGIC)
1517     {
1518       header->byteorder = BFD_ENDIAN_BIG;
1519       header->magic = BFD_MACH_O_MH_MAGIC;
1520       header->version = 1;
1521       get32 = bfd_getb32;
1522     }
1523   else if (bfd_getl32 (raw.magic) == BFD_MACH_O_MH_MAGIC)
1524     {
1525       header->byteorder = BFD_ENDIAN_LITTLE;
1526       header->magic = BFD_MACH_O_MH_MAGIC;
1527       header->version = 1;
1528       get32 = bfd_getl32;
1529     }
1530   else if (bfd_getb32 (raw.magic) == BFD_MACH_O_MH_MAGIC_64)
1531     {
1532       header->byteorder = BFD_ENDIAN_BIG;
1533       header->magic = BFD_MACH_O_MH_MAGIC_64;
1534       header->version = 2;
1535       get32 = bfd_getb32;
1536     }
1537   else if (bfd_getl32 (raw.magic) == BFD_MACH_O_MH_MAGIC_64)
1538     {
1539       header->byteorder = BFD_ENDIAN_LITTLE;
1540       header->magic = BFD_MACH_O_MH_MAGIC_64;
1541       header->version = 2;
1542       get32 = bfd_getl32;
1543     }
1544   else
1545     {
1546       header->byteorder = BFD_ENDIAN_UNKNOWN;
1547       return FALSE;
1548     }
1549
1550   /* Once the size of the header is known, read the full header.  */
1551   size = mach_o_wide_p (header) ?
1552     BFD_MACH_O_HEADER_64_SIZE : BFD_MACH_O_HEADER_SIZE;
1553
1554   if (bfd_seek (abfd, 0, SEEK_SET) != 0
1555       || bfd_bread (&raw, size, abfd) != size)
1556     return FALSE;
1557
1558   header->cputype = (*get32) (raw.cputype);
1559   header->cpusubtype = (*get32) (raw.cpusubtype);
1560   header->filetype = (*get32) (raw.filetype);
1561   header->ncmds = (*get32) (raw.ncmds);
1562   header->sizeofcmds = (*get32) (raw.sizeofcmds);
1563   header->flags = (*get32) (raw.flags);
1564
1565   if (mach_o_wide_p (header))
1566     header->reserved = (*get32) (raw.reserved);
1567
1568   return TRUE;
1569 }
1570
1571 bfd_boolean
1572 bfd_mach_o_new_section_hook (bfd *abfd, asection *sec)
1573 {
1574   bfd_mach_o_section *s;
1575
1576   s = bfd_mach_o_get_mach_o_section (sec);
1577   if (s == NULL)
1578     {
1579       flagword bfd_flags;
1580
1581       s = (bfd_mach_o_section *) bfd_zalloc (abfd, sizeof (*s));
1582       if (s == NULL)
1583         return FALSE;
1584       sec->used_by_bfd = s;
1585       s->bfdsection = sec;
1586
1587       /* Create default name.  */
1588       bfd_mach_o_convert_section_name_to_mach_o (abfd, sec, s);
1589
1590       /* Create default flags.  */
1591       bfd_flags = bfd_get_section_flags (abfd, sec);
1592       if ((bfd_flags & SEC_CODE) == SEC_CODE)
1593         s->flags = BFD_MACH_O_S_ATTR_PURE_INSTRUCTIONS
1594           | BFD_MACH_O_S_ATTR_SOME_INSTRUCTIONS
1595           | BFD_MACH_O_S_REGULAR;
1596       else if ((bfd_flags & (SEC_ALLOC | SEC_LOAD)) == SEC_ALLOC)
1597         s->flags = BFD_MACH_O_S_ZEROFILL;
1598       else if (bfd_flags & SEC_DEBUGGING)
1599         s->flags = BFD_MACH_O_S_REGULAR |  BFD_MACH_O_S_ATTR_DEBUG;
1600       else
1601         s->flags = BFD_MACH_O_S_REGULAR;
1602     }
1603
1604   return _bfd_generic_new_section_hook (abfd, sec);
1605 }
1606
1607 static void
1608 bfd_mach_o_init_section_from_mach_o (bfd *abfd, asection *sec,
1609                                      unsigned long prot)
1610 {
1611   flagword flags;
1612   bfd_mach_o_section *section;
1613
1614   flags = bfd_get_section_flags (abfd, sec);
1615   section = bfd_mach_o_get_mach_o_section (sec);
1616
1617   if (flags == SEC_NO_FLAGS)
1618     {
1619       /* Try to guess flags.  */
1620       if (section->flags & BFD_MACH_O_S_ATTR_DEBUG)
1621         flags = SEC_DEBUGGING;
1622       else
1623         {
1624           flags = SEC_ALLOC;
1625           if ((section->flags & BFD_MACH_O_SECTION_TYPE_MASK)
1626               != BFD_MACH_O_S_ZEROFILL)
1627             {
1628               flags |= SEC_LOAD;
1629               if (prot & BFD_MACH_O_PROT_EXECUTE)
1630                 flags |= SEC_CODE;
1631               if (prot & BFD_MACH_O_PROT_WRITE)
1632                 flags |= SEC_DATA;
1633               else if (prot & BFD_MACH_O_PROT_READ)
1634                 flags |= SEC_READONLY;
1635             }
1636         }
1637     }
1638   else
1639     {
1640       if ((flags & SEC_DEBUGGING) == 0)
1641         flags |= SEC_ALLOC;
1642     }
1643
1644   if (section->offset != 0)
1645     flags |= SEC_HAS_CONTENTS;
1646   if (section->nreloc != 0)
1647     flags |= SEC_RELOC;
1648
1649   bfd_set_section_flags (abfd, sec, flags);
1650
1651   sec->vma = section->addr;
1652   sec->lma = section->addr;
1653   sec->size = section->size;
1654   sec->filepos = section->offset;
1655   sec->alignment_power = section->align;
1656   sec->segment_mark = 0;
1657   sec->reloc_count = section->nreloc;
1658   sec->rel_filepos = section->reloff;
1659 }
1660
1661 static asection *
1662 bfd_mach_o_make_bfd_section (bfd *abfd,
1663                              const unsigned char *segname,
1664                              const unsigned char *sectname)
1665 {
1666   const char *sname;
1667   flagword flags;
1668
1669   bfd_mach_o_convert_section_name_to_bfd
1670     (abfd, (const char *)segname, (const char *)sectname, &sname, &flags);
1671   if (sname == NULL)
1672     return NULL;
1673
1674   return bfd_make_section_anyway_with_flags (abfd, sname, flags);
1675 }
1676
1677 static asection *
1678 bfd_mach_o_read_section_32 (bfd *abfd,
1679                             unsigned int offset,
1680                             unsigned long prot)
1681 {
1682   struct mach_o_section_32_external raw;
1683   asection *sec;
1684   bfd_mach_o_section *section;
1685
1686   if (bfd_seek (abfd, offset, SEEK_SET) != 0
1687       || (bfd_bread (&raw, BFD_MACH_O_SECTION_SIZE, abfd)
1688           != BFD_MACH_O_SECTION_SIZE))
1689     return NULL;
1690
1691   sec = bfd_mach_o_make_bfd_section (abfd, raw.segname, raw.sectname);
1692   if (sec == NULL)
1693     return NULL;
1694
1695   section = bfd_mach_o_get_mach_o_section (sec);
1696   memcpy (section->segname, raw.segname, sizeof (raw.segname));
1697   section->segname[BFD_MACH_O_SEGNAME_SIZE] = 0;
1698   memcpy (section->sectname, raw.sectname, sizeof (raw.sectname));
1699   section->sectname[BFD_MACH_O_SECTNAME_SIZE] = 0;
1700   section->addr = bfd_h_get_32 (abfd, raw.addr);
1701   section->size = bfd_h_get_32 (abfd, raw.size);
1702   section->offset = bfd_h_get_32 (abfd, raw.offset);
1703   section->align = bfd_h_get_32 (abfd, raw.align);
1704   section->reloff = bfd_h_get_32 (abfd, raw.reloff);
1705   section->nreloc = bfd_h_get_32 (abfd, raw.nreloc);
1706   section->flags = bfd_h_get_32 (abfd, raw.flags);
1707   section->reserved1 = bfd_h_get_32 (abfd, raw.reserved1);
1708   section->reserved2 = bfd_h_get_32 (abfd, raw.reserved2);
1709   section->reserved3 = 0;
1710
1711   bfd_mach_o_init_section_from_mach_o (abfd, sec, prot);
1712
1713   return sec;
1714 }
1715
1716 static asection *
1717 bfd_mach_o_read_section_64 (bfd *abfd,
1718                             unsigned int offset,
1719                             unsigned long prot)
1720 {
1721   struct mach_o_section_64_external raw;
1722   asection *sec;
1723   bfd_mach_o_section *section;
1724
1725   if (bfd_seek (abfd, offset, SEEK_SET) != 0
1726       || (bfd_bread (&raw, BFD_MACH_O_SECTION_64_SIZE, abfd)
1727           != BFD_MACH_O_SECTION_64_SIZE))
1728     return NULL;
1729
1730   sec = bfd_mach_o_make_bfd_section (abfd, raw.segname, raw.sectname);
1731   if (sec == NULL)
1732     return NULL;
1733
1734   section = bfd_mach_o_get_mach_o_section (sec);
1735   memcpy (section->segname, raw.segname, sizeof (raw.segname));
1736   section->segname[BFD_MACH_O_SEGNAME_SIZE] = 0;
1737   memcpy (section->sectname, raw.sectname, sizeof (raw.sectname));
1738   section->sectname[BFD_MACH_O_SECTNAME_SIZE] = 0;
1739   section->addr = bfd_h_get_64 (abfd, raw.addr);
1740   section->size = bfd_h_get_64 (abfd, raw.size);
1741   section->offset = bfd_h_get_32 (abfd, raw.offset);
1742   section->align = bfd_h_get_32 (abfd, raw.align);
1743   section->reloff = bfd_h_get_32 (abfd, raw.reloff);
1744   section->nreloc = bfd_h_get_32 (abfd, raw.nreloc);
1745   section->flags = bfd_h_get_32 (abfd, raw.flags);
1746   section->reserved1 = bfd_h_get_32 (abfd, raw.reserved1);
1747   section->reserved2 = bfd_h_get_32 (abfd, raw.reserved2);
1748   section->reserved3 = bfd_h_get_32 (abfd, raw.reserved3);
1749
1750   bfd_mach_o_init_section_from_mach_o (abfd, sec, prot);
1751
1752   return sec;
1753 }
1754
1755 static asection *
1756 bfd_mach_o_read_section (bfd *abfd,
1757                          unsigned int offset,
1758                          unsigned long prot,
1759                          unsigned int wide)
1760 {
1761   if (wide)
1762     return bfd_mach_o_read_section_64 (abfd, offset, prot);
1763   else
1764     return bfd_mach_o_read_section_32 (abfd, offset, prot);
1765 }
1766
1767 static bfd_boolean
1768 bfd_mach_o_read_symtab_symbol (bfd *abfd,
1769                                bfd_mach_o_symtab_command *sym,
1770                                bfd_mach_o_asymbol *s,
1771                                unsigned long i)
1772 {
1773   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
1774   unsigned int wide = mach_o_wide_p (&mdata->header);
1775   unsigned int symwidth =
1776     wide ? BFD_MACH_O_NLIST_64_SIZE : BFD_MACH_O_NLIST_SIZE;
1777   unsigned int symoff = sym->symoff + (i * symwidth);
1778   struct mach_o_nlist_64_external raw;
1779   unsigned char type = -1;
1780   unsigned char section = -1;
1781   short desc = -1;
1782   symvalue value = -1;
1783   unsigned long stroff = -1;
1784   unsigned int symtype = -1;
1785
1786   BFD_ASSERT (sym->strtab != NULL);
1787
1788   if (bfd_seek (abfd, symoff, SEEK_SET) != 0
1789       || bfd_bread (&raw, symwidth, abfd) != symwidth)
1790     {
1791       (*_bfd_error_handler)
1792         (_("bfd_mach_o_read_symtab_symbol: unable to read %d bytes at %lu"),
1793          symwidth, (unsigned long) symoff);
1794       return FALSE;
1795     }
1796
1797   stroff = bfd_h_get_32 (abfd, raw.n_strx);
1798   type = bfd_h_get_8 (abfd, raw.n_type);
1799   symtype = type & BFD_MACH_O_N_TYPE;
1800   section = bfd_h_get_8 (abfd, raw.n_sect);
1801   desc = bfd_h_get_16 (abfd, raw.n_desc);
1802   if (wide)
1803     value = bfd_h_get_64 (abfd, raw.n_value);
1804   else
1805     value = bfd_h_get_32 (abfd, raw.n_value);
1806
1807   if (stroff >= sym->strsize)
1808     {
1809       (*_bfd_error_handler)
1810         (_("bfd_mach_o_read_symtab_symbol: name out of range (%lu >= %lu)"),
1811          (unsigned long) stroff,
1812          (unsigned long) sym->strsize);
1813       return FALSE;
1814     }
1815
1816   s->symbol.the_bfd = abfd;
1817   s->symbol.name = sym->strtab + stroff;
1818   s->symbol.value = value;
1819   s->symbol.flags = 0x0;
1820   s->symbol.udata.i = 0;
1821   s->n_type = type;
1822   s->n_sect = section;
1823   s->n_desc = desc;
1824
1825   if (type & BFD_MACH_O_N_STAB)
1826     {
1827       s->symbol.flags |= BSF_DEBUGGING;
1828       s->symbol.section = bfd_und_section_ptr;
1829       switch (type)
1830         {
1831         case N_FUN:
1832         case N_STSYM:
1833         case N_LCSYM:
1834         case N_BNSYM:
1835         case N_SLINE:
1836         case N_ENSYM:
1837         case N_ECOMM:
1838         case N_ECOML:
1839         case N_GSYM:
1840           if ((section > 0) && (section <= mdata->nsects))
1841             {
1842               s->symbol.section = mdata->sections[section - 1]->bfdsection;
1843               s->symbol.value =
1844                 s->symbol.value - mdata->sections[section - 1]->addr;
1845             }
1846           break;
1847         }
1848     }
1849   else
1850     {
1851       if (type & BFD_MACH_O_N_PEXT)
1852         s->symbol.flags |= BSF_GLOBAL;
1853
1854       if (type & BFD_MACH_O_N_EXT)
1855         s->symbol.flags |= BSF_GLOBAL;
1856
1857       if (!(type & (BFD_MACH_O_N_PEXT | BFD_MACH_O_N_EXT)))
1858         s->symbol.flags |= BSF_LOCAL;
1859
1860       switch (symtype)
1861         {
1862         case BFD_MACH_O_N_UNDF:
1863           if (type == (BFD_MACH_O_N_UNDF | BFD_MACH_O_N_EXT)
1864               && s->symbol.value != 0)
1865             {
1866               /* A common symbol.  */
1867               s->symbol.section = bfd_com_section_ptr;
1868               s->symbol.flags = BSF_NO_FLAGS;
1869             }
1870           else
1871             {
1872               s->symbol.section = bfd_und_section_ptr;
1873               if (s->n_desc & BFD_MACH_O_N_WEAK_REF)
1874                 s->symbol.flags |= BSF_WEAK;
1875             }
1876           break;
1877         case BFD_MACH_O_N_PBUD:
1878           s->symbol.section = bfd_und_section_ptr;
1879           break;
1880         case BFD_MACH_O_N_ABS:
1881           s->symbol.section = bfd_abs_section_ptr;
1882           break;
1883         case BFD_MACH_O_N_SECT:
1884           if ((section > 0) && (section <= mdata->nsects))
1885             {
1886               s->symbol.section = mdata->sections[section - 1]->bfdsection;
1887               s->symbol.value =
1888                 s->symbol.value - mdata->sections[section - 1]->addr;
1889             }
1890           else
1891             {
1892               /* Mach-O uses 0 to mean "no section"; not an error.  */
1893               if (section != 0)
1894                 {
1895                   (*_bfd_error_handler) (_("bfd_mach_o_read_symtab_symbol: "
1896                                            "symbol \"%s\" specified invalid section %d (max %lu): setting to undefined"),
1897                                          s->symbol.name, section, mdata->nsects);
1898                 }
1899               s->symbol.section = bfd_und_section_ptr;
1900             }
1901           break;
1902         case BFD_MACH_O_N_INDR:
1903           /* FIXME: we don't follow the BFD convention as this indirect symbol
1904              won't be followed by the referenced one.  This looks harmless
1905              unless we start using the linker.  */
1906           s->symbol.flags |= BSF_INDIRECT;
1907           s->symbol.section = bfd_ind_section_ptr;
1908           s->symbol.value = 0;
1909           break;
1910         default:
1911           (*_bfd_error_handler) (_("bfd_mach_o_read_symtab_symbol: "
1912                                    "symbol \"%s\" specified invalid type field 0x%x: setting to undefined"),
1913                                  s->symbol.name, symtype);
1914           s->symbol.section = bfd_und_section_ptr;
1915           break;
1916         }
1917     }
1918
1919   return TRUE;
1920 }
1921
1922 bfd_boolean
1923 bfd_mach_o_read_symtab_strtab (bfd *abfd)
1924 {
1925   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
1926   bfd_mach_o_symtab_command *sym = mdata->symtab;
1927
1928   /* Fail if there is no symtab.  */
1929   if (sym == NULL)
1930     return FALSE;
1931
1932   /* Success if already loaded.  */
1933   if (sym->strtab)
1934     return TRUE;
1935
1936   if (abfd->flags & BFD_IN_MEMORY)
1937     {
1938       struct bfd_in_memory *b;
1939
1940       b = (struct bfd_in_memory *) abfd->iostream;
1941
1942       if ((sym->stroff + sym->strsize) > b->size)
1943         {
1944           bfd_set_error (bfd_error_file_truncated);
1945           return FALSE;
1946         }
1947       sym->strtab = (char *) b->buffer + sym->stroff;
1948     }
1949   else
1950     {
1951       sym->strtab = bfd_alloc (abfd, sym->strsize);
1952       if (sym->strtab == NULL)
1953         return FALSE;
1954
1955       if (bfd_seek (abfd, sym->stroff, SEEK_SET) != 0
1956           || bfd_bread (sym->strtab, sym->strsize, abfd) != sym->strsize)
1957         {
1958           bfd_set_error (bfd_error_file_truncated);
1959           return FALSE;
1960         }
1961     }
1962
1963   return TRUE;
1964 }
1965
1966 bfd_boolean
1967 bfd_mach_o_read_symtab_symbols (bfd *abfd)
1968 {
1969   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
1970   bfd_mach_o_symtab_command *sym = mdata->symtab;
1971   unsigned long i;
1972
1973   if (sym == NULL || sym->symbols)
1974     {
1975       /* Return now if there are no symbols or if already loaded.  */
1976       return TRUE;
1977     }
1978
1979   sym->symbols = bfd_alloc (abfd, sym->nsyms * sizeof (bfd_mach_o_asymbol));
1980
1981   if (sym->symbols == NULL)
1982     {
1983       (*_bfd_error_handler) (_("bfd_mach_o_read_symtab_symbols: unable to allocate memory for symbols"));
1984       return FALSE;
1985     }
1986
1987   if (!bfd_mach_o_read_symtab_strtab (abfd))
1988     return FALSE;
1989
1990   for (i = 0; i < sym->nsyms; i++)
1991     {
1992       if (!bfd_mach_o_read_symtab_symbol (abfd, sym, &sym->symbols[i], i))
1993         return FALSE;
1994     }
1995
1996   return TRUE;
1997 }
1998
1999 static const char *
2000 bfd_mach_o_i386_flavour_string (unsigned int flavour)
2001 {
2002   switch ((int) flavour)
2003     {
2004     case BFD_MACH_O_x86_THREAD_STATE32:    return "x86_THREAD_STATE32";
2005     case BFD_MACH_O_x86_FLOAT_STATE32:     return "x86_FLOAT_STATE32";
2006     case BFD_MACH_O_x86_EXCEPTION_STATE32: return "x86_EXCEPTION_STATE32";
2007     case BFD_MACH_O_x86_THREAD_STATE64:    return "x86_THREAD_STATE64";
2008     case BFD_MACH_O_x86_FLOAT_STATE64:     return "x86_FLOAT_STATE64";
2009     case BFD_MACH_O_x86_EXCEPTION_STATE64: return "x86_EXCEPTION_STATE64";
2010     case BFD_MACH_O_x86_THREAD_STATE:      return "x86_THREAD_STATE";
2011     case BFD_MACH_O_x86_FLOAT_STATE:       return "x86_FLOAT_STATE";
2012     case BFD_MACH_O_x86_EXCEPTION_STATE:   return "x86_EXCEPTION_STATE";
2013     case BFD_MACH_O_x86_DEBUG_STATE32:     return "x86_DEBUG_STATE32";
2014     case BFD_MACH_O_x86_DEBUG_STATE64:     return "x86_DEBUG_STATE64";
2015     case BFD_MACH_O_x86_DEBUG_STATE:       return "x86_DEBUG_STATE";
2016     case BFD_MACH_O_x86_THREAD_STATE_NONE: return "x86_THREAD_STATE_NONE";
2017     default: return "UNKNOWN";
2018     }
2019 }
2020
2021 static const char *
2022 bfd_mach_o_ppc_flavour_string (unsigned int flavour)
2023 {
2024   switch ((int) flavour)
2025     {
2026     case BFD_MACH_O_PPC_THREAD_STATE:      return "PPC_THREAD_STATE";
2027     case BFD_MACH_O_PPC_FLOAT_STATE:       return "PPC_FLOAT_STATE";
2028     case BFD_MACH_O_PPC_EXCEPTION_STATE:   return "PPC_EXCEPTION_STATE";
2029     case BFD_MACH_O_PPC_VECTOR_STATE:      return "PPC_VECTOR_STATE";
2030     case BFD_MACH_O_PPC_THREAD_STATE64:    return "PPC_THREAD_STATE64";
2031     case BFD_MACH_O_PPC_EXCEPTION_STATE64: return "PPC_EXCEPTION_STATE64";
2032     default: return "UNKNOWN";
2033     }
2034 }
2035
2036 static int
2037 bfd_mach_o_read_dylinker (bfd *abfd, bfd_mach_o_load_command *command)
2038 {
2039   bfd_mach_o_dylinker_command *cmd = &command->command.dylinker;
2040   struct mach_o_str_command_external raw;
2041   unsigned int nameoff;
2042
2043   BFD_ASSERT ((command->type == BFD_MACH_O_LC_ID_DYLINKER)
2044               || (command->type == BFD_MACH_O_LC_LOAD_DYLINKER));
2045
2046   if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
2047       || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
2048     return -1;
2049
2050   nameoff = bfd_h_get_32 (abfd, raw.str);
2051
2052   cmd->name_offset = command->offset + nameoff;
2053   cmd->name_len = command->len - nameoff;
2054   cmd->name_str = bfd_alloc (abfd, cmd->name_len);
2055   if (cmd->name_str == NULL)
2056     return -1;
2057   if (bfd_seek (abfd, cmd->name_offset, SEEK_SET) != 0
2058       || bfd_bread (cmd->name_str, cmd->name_len, abfd) != cmd->name_len)
2059     return -1;
2060   return 0;
2061 }
2062
2063 static int
2064 bfd_mach_o_read_dylib (bfd *abfd, bfd_mach_o_load_command *command)
2065 {
2066   bfd_mach_o_dylib_command *cmd = &command->command.dylib;
2067   struct mach_o_dylib_command_external raw;
2068   unsigned int nameoff;
2069
2070   switch (command->type)
2071     {
2072     case BFD_MACH_O_LC_LOAD_DYLIB:
2073     case BFD_MACH_O_LC_LOAD_WEAK_DYLIB:
2074     case BFD_MACH_O_LC_ID_DYLIB:
2075     case BFD_MACH_O_LC_REEXPORT_DYLIB:
2076     case BFD_MACH_O_LC_LOAD_UPWARD_DYLIB:
2077       break;
2078     default:
2079       BFD_FAIL ();
2080       return -1;
2081     }
2082
2083   if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
2084       || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
2085     return -1;
2086
2087   nameoff = bfd_h_get_32 (abfd, raw.name);
2088   cmd->timestamp = bfd_h_get_32 (abfd, raw.timestamp);
2089   cmd->current_version = bfd_h_get_32 (abfd, raw.current_version);
2090   cmd->compatibility_version = bfd_h_get_32 (abfd, raw.compatibility_version);
2091
2092   cmd->name_offset = command->offset + nameoff;
2093   cmd->name_len = command->len - nameoff;
2094   cmd->name_str = bfd_alloc (abfd, cmd->name_len);
2095   if (cmd->name_str == NULL)
2096     return -1;
2097   if (bfd_seek (abfd, cmd->name_offset, SEEK_SET) != 0
2098       || bfd_bread (cmd->name_str, cmd->name_len, abfd) != cmd->name_len)
2099     return -1;
2100   return 0;
2101 }
2102
2103 static int
2104 bfd_mach_o_read_prebound_dylib (bfd *abfd ATTRIBUTE_UNUSED,
2105                                 bfd_mach_o_load_command *command ATTRIBUTE_UNUSED)
2106 {
2107   /* bfd_mach_o_prebound_dylib_command *cmd = &command->command.prebound_dylib; */
2108
2109   BFD_ASSERT (command->type == BFD_MACH_O_LC_PREBOUND_DYLIB);
2110   return 0;
2111 }
2112
2113 static int
2114 bfd_mach_o_read_thread (bfd *abfd, bfd_mach_o_load_command *command)
2115 {
2116   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
2117   bfd_mach_o_thread_command *cmd = &command->command.thread;
2118   unsigned int offset;
2119   unsigned int nflavours;
2120   unsigned int i;
2121
2122   BFD_ASSERT ((command->type == BFD_MACH_O_LC_THREAD)
2123               || (command->type == BFD_MACH_O_LC_UNIXTHREAD));
2124
2125   /* Count the number of threads.  */
2126   offset = 8;
2127   nflavours = 0;
2128   while (offset != command->len)
2129     {
2130       struct mach_o_thread_command_external raw;
2131
2132       if (offset >= command->len)
2133         return -1;
2134
2135       if (bfd_seek (abfd, command->offset + offset, SEEK_SET) != 0
2136           || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
2137         return -1;
2138
2139       offset += sizeof (raw) + bfd_h_get_32 (abfd, raw.count) * 4;
2140       nflavours++;
2141     }
2142
2143   /* Allocate threads.  */
2144   cmd->flavours = bfd_alloc
2145     (abfd, nflavours * sizeof (bfd_mach_o_thread_flavour));
2146   if (cmd->flavours == NULL)
2147     return -1;
2148   cmd->nflavours = nflavours;
2149
2150   offset = 8;
2151   nflavours = 0;
2152   while (offset != command->len)
2153     {
2154       struct mach_o_thread_command_external raw;
2155
2156       if (offset >= command->len)
2157         return -1;
2158
2159       if (nflavours >= cmd->nflavours)
2160         return -1;
2161
2162       if (bfd_seek (abfd, command->offset + offset, SEEK_SET) != 0
2163           || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
2164         return -1;
2165
2166       cmd->flavours[nflavours].flavour = bfd_h_get_32 (abfd, raw.flavour);
2167       cmd->flavours[nflavours].offset = command->offset + offset + sizeof (raw);
2168       cmd->flavours[nflavours].size = bfd_h_get_32 (abfd, raw.count) * 4;
2169       offset += cmd->flavours[nflavours].size + sizeof (raw);
2170       nflavours++;
2171     }
2172
2173   for (i = 0; i < nflavours; i++)
2174     {
2175       asection *bfdsec;
2176       unsigned int snamelen;
2177       char *sname;
2178       const char *flavourstr;
2179       const char *prefix = "LC_THREAD";
2180       unsigned int j = 0;
2181
2182       switch (mdata->header.cputype)
2183         {
2184         case BFD_MACH_O_CPU_TYPE_POWERPC:
2185         case BFD_MACH_O_CPU_TYPE_POWERPC_64:
2186           flavourstr = bfd_mach_o_ppc_flavour_string (cmd->flavours[i].flavour);
2187           break;
2188         case BFD_MACH_O_CPU_TYPE_I386:
2189         case BFD_MACH_O_CPU_TYPE_X86_64:
2190           flavourstr = bfd_mach_o_i386_flavour_string (cmd->flavours[i].flavour);
2191           break;
2192         default:
2193           flavourstr = "UNKNOWN_ARCHITECTURE";
2194           break;
2195         }
2196
2197       snamelen = strlen (prefix) + 1 + 20 + 1 + strlen (flavourstr) + 1;
2198       sname = bfd_alloc (abfd, snamelen);
2199       if (sname == NULL)
2200         return -1;
2201
2202       for (;;)
2203         {
2204           sprintf (sname, "%s.%s.%u", prefix, flavourstr, j);
2205           if (bfd_get_section_by_name (abfd, sname) == NULL)
2206             break;
2207           j++;
2208         }
2209
2210       bfdsec = bfd_make_section_with_flags (abfd, sname, SEC_HAS_CONTENTS);
2211
2212       bfdsec->vma = 0;
2213       bfdsec->lma = 0;
2214       bfdsec->size = cmd->flavours[i].size;
2215       bfdsec->filepos = cmd->flavours[i].offset;
2216       bfdsec->alignment_power = 0x0;
2217
2218       cmd->section = bfdsec;
2219     }
2220
2221   return 0;
2222 }
2223
2224 static int
2225 bfd_mach_o_read_dysymtab (bfd *abfd, bfd_mach_o_load_command *command)
2226 {
2227   bfd_mach_o_dysymtab_command *cmd = &command->command.dysymtab;
2228   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
2229
2230   BFD_ASSERT (command->type == BFD_MACH_O_LC_DYSYMTAB);
2231
2232   {
2233     struct mach_o_dysymtab_command_external raw;
2234
2235     if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
2236         || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
2237       return -1;
2238
2239     cmd->ilocalsym = bfd_h_get_32 (abfd, raw.ilocalsym);
2240     cmd->nlocalsym = bfd_h_get_32 (abfd, raw.nlocalsym);
2241     cmd->iextdefsym = bfd_h_get_32 (abfd, raw.iextdefsym);
2242     cmd->nextdefsym = bfd_h_get_32 (abfd, raw.nextdefsym);
2243     cmd->iundefsym = bfd_h_get_32 (abfd, raw.iundefsym);
2244     cmd->nundefsym = bfd_h_get_32 (abfd, raw.nundefsym);
2245     cmd->tocoff = bfd_h_get_32 (abfd, raw.tocoff);
2246     cmd->ntoc = bfd_h_get_32 (abfd, raw.ntoc);
2247     cmd->modtaboff = bfd_h_get_32 (abfd, raw.modtaboff);
2248     cmd->nmodtab = bfd_h_get_32 (abfd, raw.nmodtab);
2249     cmd->extrefsymoff = bfd_h_get_32 (abfd, raw.extrefsymoff);
2250     cmd->nextrefsyms = bfd_h_get_32 (abfd, raw.nextrefsyms);
2251     cmd->indirectsymoff = bfd_h_get_32 (abfd, raw.indirectsymoff);
2252     cmd->nindirectsyms = bfd_h_get_32 (abfd, raw.nindirectsyms);
2253     cmd->extreloff = bfd_h_get_32 (abfd, raw.extreloff);
2254     cmd->nextrel = bfd_h_get_32 (abfd, raw.nextrel);
2255     cmd->locreloff = bfd_h_get_32 (abfd, raw.locreloff);
2256     cmd->nlocrel = bfd_h_get_32 (abfd, raw.nlocrel);
2257   }
2258
2259   if (cmd->nmodtab != 0)
2260     {
2261       unsigned int i;
2262       int wide = bfd_mach_o_wide_p (abfd);
2263       unsigned int module_len = wide ? 56 : 52;
2264
2265       cmd->dylib_module =
2266         bfd_alloc (abfd, cmd->nmodtab * sizeof (bfd_mach_o_dylib_module));
2267       if (cmd->dylib_module == NULL)
2268         return -1;
2269
2270       if (bfd_seek (abfd, cmd->modtaboff, SEEK_SET) != 0)
2271         return -1;
2272
2273       for (i = 0; i < cmd->nmodtab; i++)
2274         {
2275           bfd_mach_o_dylib_module *module = &cmd->dylib_module[i];
2276           unsigned long v;
2277           unsigned char buf[56];
2278
2279           if (bfd_bread ((void *) buf, module_len, abfd) != module_len)
2280             return -1;
2281
2282           module->module_name_idx = bfd_h_get_32 (abfd, buf + 0);
2283           module->iextdefsym = bfd_h_get_32 (abfd, buf + 4);
2284           module->nextdefsym = bfd_h_get_32 (abfd, buf + 8);
2285           module->irefsym = bfd_h_get_32 (abfd, buf + 12);
2286           module->nrefsym = bfd_h_get_32 (abfd, buf + 16);
2287           module->ilocalsym = bfd_h_get_32 (abfd, buf + 20);
2288           module->nlocalsym = bfd_h_get_32 (abfd, buf + 24);
2289           module->iextrel = bfd_h_get_32 (abfd, buf + 28);
2290           module->nextrel = bfd_h_get_32 (abfd, buf + 32);
2291           v = bfd_h_get_32 (abfd, buf +36);
2292           module->iinit = v & 0xffff;
2293           module->iterm = (v >> 16) & 0xffff;
2294           v = bfd_h_get_32 (abfd, buf + 40);
2295           module->ninit = v & 0xffff;
2296           module->nterm = (v >> 16) & 0xffff;
2297           if (wide)
2298             {
2299               module->objc_module_info_size = bfd_h_get_32 (abfd, buf + 44);
2300               module->objc_module_info_addr = bfd_h_get_64 (abfd, buf + 48);
2301             }
2302           else
2303             {
2304               module->objc_module_info_addr = bfd_h_get_32 (abfd, buf + 44);
2305               module->objc_module_info_size = bfd_h_get_32 (abfd, buf + 48);
2306             }
2307         }
2308     }
2309
2310   if (cmd->ntoc != 0)
2311     {
2312       unsigned int i;
2313
2314       cmd->dylib_toc = bfd_alloc
2315         (abfd, cmd->ntoc * sizeof (bfd_mach_o_dylib_table_of_content));
2316       if (cmd->dylib_toc == NULL)
2317         return -1;
2318
2319       if (bfd_seek (abfd, cmd->tocoff, SEEK_SET) != 0)
2320         return -1;
2321
2322       for (i = 0; i < cmd->ntoc; i++)
2323         {
2324           struct mach_o_dylib_table_of_contents_external raw;
2325           bfd_mach_o_dylib_table_of_content *toc = &cmd->dylib_toc[i];
2326
2327           if (bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
2328             return -1;
2329
2330           toc->symbol_index = bfd_h_get_32 (abfd, raw.symbol_index);
2331           toc->module_index = bfd_h_get_32 (abfd, raw.module_index);
2332         }
2333     }
2334
2335   if (cmd->nindirectsyms != 0)
2336     {
2337       unsigned int i;
2338
2339       cmd->indirect_syms = bfd_alloc
2340         (abfd, cmd->nindirectsyms * sizeof (unsigned int));
2341       if (cmd->indirect_syms == NULL)
2342         return -1;
2343
2344       if (bfd_seek (abfd, cmd->indirectsymoff, SEEK_SET) != 0)
2345         return -1;
2346
2347       for (i = 0; i < cmd->nindirectsyms; i++)
2348         {
2349           unsigned char raw[4];
2350           unsigned int *is = &cmd->indirect_syms[i];
2351
2352           if (bfd_bread (raw, sizeof (raw), abfd) != sizeof (raw))
2353             return -1;
2354
2355           *is = bfd_h_get_32 (abfd, raw);
2356         }
2357     }
2358
2359   if (cmd->nextrefsyms != 0)
2360     {
2361       unsigned long v;
2362       unsigned int i;
2363
2364       cmd->ext_refs = bfd_alloc
2365         (abfd, cmd->nextrefsyms * sizeof (bfd_mach_o_dylib_reference));
2366       if (cmd->ext_refs == NULL)
2367         return -1;
2368
2369       if (bfd_seek (abfd, cmd->extrefsymoff, SEEK_SET) != 0)
2370         return -1;
2371
2372       for (i = 0; i < cmd->nextrefsyms; i++)
2373         {
2374           unsigned char raw[4];
2375           bfd_mach_o_dylib_reference *ref = &cmd->ext_refs[i];
2376
2377           if (bfd_bread (raw, sizeof (raw), abfd) != sizeof (raw))
2378             return -1;
2379
2380           /* Fields isym and flags are written as bit-fields, thus we need
2381              a specific processing for endianness.  */
2382           v = bfd_h_get_32 (abfd, raw);
2383           if (bfd_big_endian (abfd))
2384             {
2385               ref->isym = (v >> 8) & 0xffffff;
2386               ref->flags = v & 0xff;
2387             }
2388           else
2389             {
2390               ref->isym = v & 0xffffff;
2391               ref->flags = (v >> 24) & 0xff;
2392             }
2393         }
2394     }
2395
2396   if (mdata->dysymtab)
2397     return -1;
2398   mdata->dysymtab = cmd;
2399
2400   return 0;
2401 }
2402
2403 static int
2404 bfd_mach_o_read_symtab (bfd *abfd, bfd_mach_o_load_command *command)
2405 {
2406   bfd_mach_o_symtab_command *symtab = &command->command.symtab;
2407   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
2408   struct mach_o_symtab_command_external raw;
2409
2410   BFD_ASSERT (command->type == BFD_MACH_O_LC_SYMTAB);
2411
2412   if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
2413       || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
2414     return -1;
2415
2416   symtab->symoff = bfd_h_get_32 (abfd, raw.symoff);
2417   symtab->nsyms = bfd_h_get_32 (abfd, raw.nsyms);
2418   symtab->stroff = bfd_h_get_32 (abfd, raw.stroff);
2419   symtab->strsize = bfd_h_get_32 (abfd, raw.strsize);
2420   symtab->symbols = NULL;
2421   symtab->strtab = NULL;
2422
2423   if (symtab->nsyms != 0)
2424     abfd->flags |= HAS_SYMS;
2425
2426   if (mdata->symtab)
2427     return -1;
2428   mdata->symtab = symtab;
2429   return 0;
2430 }
2431
2432 static int
2433 bfd_mach_o_read_uuid (bfd *abfd, bfd_mach_o_load_command *command)
2434 {
2435   bfd_mach_o_uuid_command *cmd = &command->command.uuid;
2436
2437   BFD_ASSERT (command->type == BFD_MACH_O_LC_UUID);
2438
2439   if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
2440       || bfd_bread (cmd->uuid, 16, abfd) != 16)
2441     return -1;
2442
2443   return 0;
2444 }
2445
2446 static int
2447 bfd_mach_o_read_linkedit (bfd *abfd, bfd_mach_o_load_command *command)
2448 {
2449   bfd_mach_o_linkedit_command *cmd = &command->command.linkedit;
2450   struct mach_o_linkedit_data_command_external raw;
2451
2452   if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
2453       || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
2454     return -1;
2455
2456   cmd->dataoff = bfd_get_32 (abfd, raw.dataoff);
2457   cmd->datasize = bfd_get_32 (abfd, raw.datasize);
2458   return 0;
2459 }
2460
2461 static int
2462 bfd_mach_o_read_str (bfd *abfd, bfd_mach_o_load_command *command)
2463 {
2464   bfd_mach_o_str_command *cmd = &command->command.str;
2465   struct mach_o_str_command_external raw;
2466   unsigned long off;
2467
2468   if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
2469       || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
2470     return -1;
2471
2472   off = bfd_get_32 (abfd, raw.str);
2473   cmd->stroff = command->offset + off;
2474   cmd->str_len = command->len - off;
2475   cmd->str = bfd_alloc (abfd, cmd->str_len);
2476   if (cmd->str == NULL)
2477     return -1;
2478   if (bfd_seek (abfd, cmd->stroff, SEEK_SET) != 0
2479       || bfd_bread ((void *) cmd->str, cmd->str_len, abfd) != cmd->str_len)
2480     return -1;
2481   return 0;
2482 }
2483
2484 static int
2485 bfd_mach_o_read_dyld_info (bfd *abfd, bfd_mach_o_load_command *command)
2486 {
2487   bfd_mach_o_dyld_info_command *cmd = &command->command.dyld_info;
2488   struct mach_o_dyld_info_command_external raw;
2489
2490   if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
2491       || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
2492     return -1;
2493
2494   cmd->rebase_off = bfd_get_32 (abfd, raw.rebase_off);
2495   cmd->rebase_size = bfd_get_32 (abfd, raw.rebase_size);
2496   cmd->bind_off = bfd_get_32 (abfd, raw.bind_off);
2497   cmd->bind_size = bfd_get_32 (abfd, raw.bind_size);
2498   cmd->weak_bind_off = bfd_get_32 (abfd, raw.weak_bind_off);
2499   cmd->weak_bind_size = bfd_get_32 (abfd, raw.weak_bind_size);
2500   cmd->lazy_bind_off = bfd_get_32 (abfd, raw.lazy_bind_off);
2501   cmd->lazy_bind_size = bfd_get_32 (abfd, raw.lazy_bind_size);
2502   cmd->export_off = bfd_get_32 (abfd, raw.export_off);
2503   cmd->export_size = bfd_get_32 (abfd, raw.export_size);
2504   return 0;
2505 }
2506
2507 static bfd_boolean
2508 bfd_mach_o_read_version_min (bfd *abfd, bfd_mach_o_load_command *command)
2509 {
2510   bfd_mach_o_version_min_command *cmd = &command->command.version_min;
2511   struct mach_o_version_min_command_external raw;
2512   unsigned int ver;
2513
2514   if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
2515       || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
2516     return FALSE;
2517
2518   ver = bfd_get_32 (abfd, raw.version);
2519   cmd->rel = ver >> 16;
2520   cmd->maj = ver >> 8;
2521   cmd->min = ver;
2522   cmd->reserved = bfd_get_32 (abfd, raw.reserved);
2523   return TRUE;
2524 }
2525
2526 static int
2527 bfd_mach_o_read_segment (bfd *abfd,
2528                          bfd_mach_o_load_command *command,
2529                          unsigned int wide)
2530 {
2531   bfd_mach_o_segment_command *seg = &command->command.segment;
2532   unsigned long i;
2533
2534   if (wide)
2535     {
2536       struct mach_o_segment_command_64_external raw;
2537
2538       BFD_ASSERT (command->type == BFD_MACH_O_LC_SEGMENT_64);
2539
2540       if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
2541           || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
2542         return -1;
2543
2544       memcpy (seg->segname, raw.segname, 16);
2545       seg->segname[16] = '\0';
2546
2547       seg->vmaddr = bfd_h_get_64 (abfd, raw.vmaddr);
2548       seg->vmsize = bfd_h_get_64 (abfd, raw.vmsize);
2549       seg->fileoff = bfd_h_get_64 (abfd, raw.fileoff);
2550       seg->filesize = bfd_h_get_64 (abfd, raw.filesize);
2551       seg->maxprot = bfd_h_get_32 (abfd, raw.maxprot);
2552       seg->initprot = bfd_h_get_32 (abfd, raw.initprot);
2553       seg->nsects = bfd_h_get_32 (abfd, raw.nsects);
2554       seg->flags = bfd_h_get_32 (abfd, raw.flags);
2555     }
2556   else
2557     {
2558       struct mach_o_segment_command_32_external raw;
2559
2560       BFD_ASSERT (command->type == BFD_MACH_O_LC_SEGMENT);
2561
2562       if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
2563           || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
2564         return -1;
2565
2566       memcpy (seg->segname, raw.segname, 16);
2567       seg->segname[16] = '\0';
2568
2569       seg->vmaddr = bfd_h_get_32 (abfd, raw.vmaddr);
2570       seg->vmsize = bfd_h_get_32 (abfd, raw.vmsize);
2571       seg->fileoff = bfd_h_get_32 (abfd, raw.fileoff);
2572       seg->filesize = bfd_h_get_32 (abfd, raw.filesize);
2573       seg->maxprot = bfd_h_get_32 (abfd, raw.maxprot);
2574       seg->initprot = bfd_h_get_32 (abfd, raw.initprot);
2575       seg->nsects = bfd_h_get_32 (abfd, raw.nsects);
2576       seg->flags = bfd_h_get_32 (abfd, raw.flags);
2577     }
2578   seg->sect_head = NULL;
2579   seg->sect_tail = NULL;
2580
2581   for (i = 0; i < seg->nsects; i++)
2582     {
2583       bfd_vma segoff;
2584       asection *sec;
2585
2586       if (wide)
2587         segoff = command->offset + BFD_MACH_O_LC_SEGMENT_64_SIZE
2588           + (i * BFD_MACH_O_SECTION_64_SIZE);
2589       else
2590         segoff = command->offset + BFD_MACH_O_LC_SEGMENT_SIZE
2591           + (i * BFD_MACH_O_SECTION_SIZE);
2592
2593       sec = bfd_mach_o_read_section (abfd, segoff, seg->initprot, wide);
2594       if (sec == NULL)
2595         return -1;
2596
2597       bfd_mach_o_append_section_to_segment (seg, sec);
2598     }
2599
2600   return 0;
2601 }
2602
2603 static int
2604 bfd_mach_o_read_segment_32 (bfd *abfd, bfd_mach_o_load_command *command)
2605 {
2606   return bfd_mach_o_read_segment (abfd, command, 0);
2607 }
2608
2609 static int
2610 bfd_mach_o_read_segment_64 (bfd *abfd, bfd_mach_o_load_command *command)
2611 {
2612   return bfd_mach_o_read_segment (abfd, command, 1);
2613 }
2614
2615 static int
2616 bfd_mach_o_read_command (bfd *abfd, bfd_mach_o_load_command *command)
2617 {
2618   struct mach_o_load_command_external raw;
2619   unsigned int cmd;
2620
2621   /* Read command type and length.  */
2622   if (bfd_seek (abfd, command->offset, SEEK_SET) != 0
2623       || bfd_bread (&raw, BFD_MACH_O_LC_SIZE, abfd) != BFD_MACH_O_LC_SIZE)
2624     return -1;
2625
2626   cmd = bfd_h_get_32 (abfd, raw.cmd);
2627   command->type =  cmd & ~BFD_MACH_O_LC_REQ_DYLD;
2628   command->type_required = cmd & BFD_MACH_O_LC_REQ_DYLD ? TRUE : FALSE;
2629   command->len = bfd_h_get_32 (abfd, raw.cmdsize);
2630
2631   switch (command->type)
2632     {
2633     case BFD_MACH_O_LC_SEGMENT:
2634       if (bfd_mach_o_read_segment_32 (abfd, command) != 0)
2635         return -1;
2636       break;
2637     case BFD_MACH_O_LC_SEGMENT_64:
2638       if (bfd_mach_o_read_segment_64 (abfd, command) != 0)
2639         return -1;
2640       break;
2641     case BFD_MACH_O_LC_SYMTAB:
2642       if (bfd_mach_o_read_symtab (abfd, command) != 0)
2643         return -1;
2644       break;
2645     case BFD_MACH_O_LC_SYMSEG:
2646       break;
2647     case BFD_MACH_O_LC_THREAD:
2648     case BFD_MACH_O_LC_UNIXTHREAD:
2649       if (bfd_mach_o_read_thread (abfd, command) != 0)
2650         return -1;
2651       break;
2652     case BFD_MACH_O_LC_LOAD_DYLINKER:
2653     case BFD_MACH_O_LC_ID_DYLINKER:
2654       if (bfd_mach_o_read_dylinker (abfd, command) != 0)
2655         return -1;
2656       break;
2657     case BFD_MACH_O_LC_LOAD_DYLIB:
2658     case BFD_MACH_O_LC_ID_DYLIB:
2659     case BFD_MACH_O_LC_LOAD_WEAK_DYLIB:
2660     case BFD_MACH_O_LC_REEXPORT_DYLIB:
2661     case BFD_MACH_O_LC_LOAD_UPWARD_DYLIB:
2662       if (bfd_mach_o_read_dylib (abfd, command) != 0)
2663         return -1;
2664       break;
2665     case BFD_MACH_O_LC_PREBOUND_DYLIB:
2666       if (bfd_mach_o_read_prebound_dylib (abfd, command) != 0)
2667         return -1;
2668       break;
2669     case BFD_MACH_O_LC_LOADFVMLIB:
2670     case BFD_MACH_O_LC_IDFVMLIB:
2671     case BFD_MACH_O_LC_IDENT:
2672     case BFD_MACH_O_LC_FVMFILE:
2673     case BFD_MACH_O_LC_PREPAGE:
2674     case BFD_MACH_O_LC_ROUTINES:
2675     case BFD_MACH_O_LC_ROUTINES_64:
2676       break;
2677     case BFD_MACH_O_LC_SUB_FRAMEWORK:
2678     case BFD_MACH_O_LC_SUB_UMBRELLA:
2679     case BFD_MACH_O_LC_SUB_LIBRARY:
2680     case BFD_MACH_O_LC_SUB_CLIENT:
2681     case BFD_MACH_O_LC_RPATH:
2682       if (bfd_mach_o_read_str (abfd, command) != 0)
2683         return -1;
2684       break;
2685     case BFD_MACH_O_LC_DYSYMTAB:
2686       if (bfd_mach_o_read_dysymtab (abfd, command) != 0)
2687         return -1;
2688       break;
2689     case BFD_MACH_O_LC_TWOLEVEL_HINTS:
2690     case BFD_MACH_O_LC_PREBIND_CKSUM:
2691       break;
2692     case BFD_MACH_O_LC_UUID:
2693       if (bfd_mach_o_read_uuid (abfd, command) != 0)
2694         return -1;
2695       break;
2696     case BFD_MACH_O_LC_CODE_SIGNATURE:
2697     case BFD_MACH_O_LC_SEGMENT_SPLIT_INFO:
2698     case BFD_MACH_O_LC_FUNCTION_STARTS:
2699       if (bfd_mach_o_read_linkedit (abfd, command) != 0)
2700         return -1;
2701       break;
2702     case BFD_MACH_O_LC_DYLD_INFO:
2703       if (bfd_mach_o_read_dyld_info (abfd, command) != 0)
2704         return -1;
2705       break;
2706     case BFD_MACH_O_LC_VERSION_MIN_MACOSX:
2707     case BFD_MACH_O_LC_VERSION_MIN_IPHONEOS:
2708       if (!bfd_mach_o_read_version_min (abfd, command))
2709         return -1;
2710       break;
2711     default:
2712       (*_bfd_error_handler)(_("%B: unable to read unknown load command 0x%lx"),
2713          abfd, (unsigned long) command->type);
2714       break;
2715     }
2716
2717   return 0;
2718 }
2719
2720 static void
2721 bfd_mach_o_flatten_sections (bfd *abfd)
2722 {
2723   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
2724   long csect = 0;
2725   unsigned long i;
2726
2727   /* Count total number of sections.  */
2728   mdata->nsects = 0;
2729
2730   for (i = 0; i < mdata->header.ncmds; i++)
2731     {
2732       if (mdata->commands[i].type == BFD_MACH_O_LC_SEGMENT
2733           || mdata->commands[i].type == BFD_MACH_O_LC_SEGMENT_64)
2734         {
2735           bfd_mach_o_segment_command *seg;
2736
2737           seg = &mdata->commands[i].command.segment;
2738           mdata->nsects += seg->nsects;
2739         }
2740     }
2741
2742   /* Allocate sections array.  */
2743   mdata->sections = bfd_alloc (abfd,
2744                                mdata->nsects * sizeof (bfd_mach_o_section *));
2745
2746   /* Fill the array.  */
2747   csect = 0;
2748
2749   for (i = 0; i < mdata->header.ncmds; i++)
2750     {
2751       if (mdata->commands[i].type == BFD_MACH_O_LC_SEGMENT
2752           || mdata->commands[i].type == BFD_MACH_O_LC_SEGMENT_64)
2753         {
2754           bfd_mach_o_segment_command *seg;
2755           bfd_mach_o_section *sec;
2756
2757           seg = &mdata->commands[i].command.segment;
2758           BFD_ASSERT (csect + seg->nsects <= mdata->nsects);
2759
2760           for (sec = seg->sect_head; sec != NULL; sec = sec->next)
2761             mdata->sections[csect++] = sec;
2762         }
2763     }
2764 }
2765
2766 static bfd_boolean
2767 bfd_mach_o_scan_start_address (bfd *abfd)
2768 {
2769   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
2770   bfd_mach_o_thread_command *cmd = NULL;
2771   unsigned long i;
2772
2773   for (i = 0; i < mdata->header.ncmds; i++)
2774     if ((mdata->commands[i].type == BFD_MACH_O_LC_THREAD) ||
2775         (mdata->commands[i].type == BFD_MACH_O_LC_UNIXTHREAD))
2776       {
2777         cmd = &mdata->commands[i].command.thread;
2778         break;
2779       }
2780
2781   if (cmd == NULL)
2782     return FALSE;
2783
2784   /* FIXME: create a subtarget hook ?  */
2785   for (i = 0; i < cmd->nflavours; i++)
2786     {
2787       if ((mdata->header.cputype == BFD_MACH_O_CPU_TYPE_I386)
2788           && (cmd->flavours[i].flavour
2789               == (unsigned long) BFD_MACH_O_x86_THREAD_STATE32))
2790         {
2791           unsigned char buf[4];
2792
2793           if (bfd_seek (abfd, cmd->flavours[i].offset + 40, SEEK_SET) != 0
2794               || bfd_bread (buf, 4, abfd) != 4)
2795             return FALSE;
2796
2797           abfd->start_address = bfd_h_get_32 (abfd, buf);
2798         }
2799       else if ((mdata->header.cputype == BFD_MACH_O_CPU_TYPE_POWERPC)
2800                && (cmd->flavours[i].flavour == BFD_MACH_O_PPC_THREAD_STATE))
2801         {
2802           unsigned char buf[4];
2803
2804           if (bfd_seek (abfd, cmd->flavours[i].offset + 0, SEEK_SET) != 0
2805               || bfd_bread (buf, 4, abfd) != 4)
2806             return FALSE;
2807
2808           abfd->start_address = bfd_h_get_32 (abfd, buf);
2809         }
2810       else if ((mdata->header.cputype == BFD_MACH_O_CPU_TYPE_POWERPC_64)
2811                && (cmd->flavours[i].flavour == BFD_MACH_O_PPC_THREAD_STATE64))
2812         {
2813           unsigned char buf[8];
2814
2815           if (bfd_seek (abfd, cmd->flavours[i].offset + 0, SEEK_SET) != 0
2816               || bfd_bread (buf, 8, abfd) != 8)
2817             return FALSE;
2818
2819           abfd->start_address = bfd_h_get_64 (abfd, buf);
2820         }
2821       else if ((mdata->header.cputype == BFD_MACH_O_CPU_TYPE_X86_64)
2822                && (cmd->flavours[i].flavour == BFD_MACH_O_x86_THREAD_STATE64))
2823         {
2824           unsigned char buf[8];
2825
2826           if (bfd_seek (abfd, cmd->flavours[i].offset + (16 * 8), SEEK_SET) != 0
2827               || bfd_bread (buf, 8, abfd) != 8)
2828             return FALSE;
2829
2830           abfd->start_address = bfd_h_get_64 (abfd, buf);
2831         }
2832     }
2833
2834   return TRUE;
2835 }
2836
2837 bfd_boolean
2838 bfd_mach_o_set_arch_mach (bfd *abfd,
2839                           enum bfd_architecture arch,
2840                           unsigned long machine)
2841 {
2842   bfd_mach_o_backend_data *bed = bfd_mach_o_get_backend_data (abfd);
2843
2844   /* If this isn't the right architecture for this backend, and this
2845      isn't the generic backend, fail.  */
2846   if (arch != bed->arch
2847       && arch != bfd_arch_unknown
2848       && bed->arch != bfd_arch_unknown)
2849     return FALSE;
2850
2851   return bfd_default_set_arch_mach (abfd, arch, machine);
2852 }
2853
2854 static bfd_boolean
2855 bfd_mach_o_scan (bfd *abfd,
2856                  bfd_mach_o_header *header,
2857                  bfd_mach_o_data_struct *mdata)
2858 {
2859   unsigned int i;
2860   enum bfd_architecture cputype;
2861   unsigned long cpusubtype;
2862   unsigned int hdrsize;
2863
2864   hdrsize = mach_o_wide_p (header) ?
2865     BFD_MACH_O_HEADER_64_SIZE : BFD_MACH_O_HEADER_SIZE;
2866
2867   mdata->header = *header;
2868
2869   abfd->flags = abfd->flags & BFD_IN_MEMORY;
2870   switch (header->filetype)
2871     {
2872     case BFD_MACH_O_MH_OBJECT:
2873       abfd->flags |= HAS_RELOC;
2874       break;
2875     case BFD_MACH_O_MH_EXECUTE:
2876       abfd->flags |= EXEC_P;
2877       break;
2878     case BFD_MACH_O_MH_DYLIB:
2879     case BFD_MACH_O_MH_BUNDLE:
2880       abfd->flags |= DYNAMIC;
2881       break;
2882     }
2883
2884   abfd->tdata.mach_o_data = mdata;
2885
2886   bfd_mach_o_convert_architecture (header->cputype, header->cpusubtype,
2887                                    &cputype, &cpusubtype);
2888   if (cputype == bfd_arch_unknown)
2889     {
2890       (*_bfd_error_handler)
2891         (_("bfd_mach_o_scan: unknown architecture 0x%lx/0x%lx"),
2892          header->cputype, header->cpusubtype);
2893       return FALSE;
2894     }
2895
2896   bfd_set_arch_mach (abfd, cputype, cpusubtype);
2897
2898   if (header->ncmds != 0)
2899     {
2900       mdata->commands = bfd_alloc
2901         (abfd, header->ncmds * sizeof (bfd_mach_o_load_command));
2902       if (mdata->commands == NULL)
2903         return FALSE;
2904
2905       for (i = 0; i < header->ncmds; i++)
2906         {
2907           bfd_mach_o_load_command *cur = &mdata->commands[i];
2908
2909           if (i == 0)
2910             cur->offset = hdrsize;
2911           else
2912             {
2913               bfd_mach_o_load_command *prev = &mdata->commands[i - 1];
2914               cur->offset = prev->offset + prev->len;
2915             }
2916
2917           if (bfd_mach_o_read_command (abfd, cur) < 0)
2918             return FALSE;
2919         }
2920     }
2921
2922   if (bfd_mach_o_scan_start_address (abfd) < 0)
2923     return FALSE;
2924
2925   bfd_mach_o_flatten_sections (abfd);
2926   return TRUE;
2927 }
2928
2929 bfd_boolean
2930 bfd_mach_o_mkobject_init (bfd *abfd)
2931 {
2932   bfd_mach_o_data_struct *mdata = NULL;
2933
2934   mdata = bfd_alloc (abfd, sizeof (bfd_mach_o_data_struct));
2935   if (mdata == NULL)
2936     return FALSE;
2937   abfd->tdata.mach_o_data = mdata;
2938
2939   mdata->header.magic = 0;
2940   mdata->header.cputype = 0;
2941   mdata->header.cpusubtype = 0;
2942   mdata->header.filetype = 0;
2943   mdata->header.ncmds = 0;
2944   mdata->header.sizeofcmds = 0;
2945   mdata->header.flags = 0;
2946   mdata->header.byteorder = BFD_ENDIAN_UNKNOWN;
2947   mdata->commands = NULL;
2948   mdata->nsects = 0;
2949   mdata->sections = NULL;
2950
2951   return TRUE;
2952 }
2953
2954 static bfd_boolean
2955 bfd_mach_o_gen_mkobject (bfd *abfd)
2956 {
2957   bfd_mach_o_data_struct *mdata;
2958
2959   if (!bfd_mach_o_mkobject_init (abfd))
2960     return FALSE;
2961
2962   mdata = bfd_mach_o_get_data (abfd);
2963   mdata->header.magic = BFD_MACH_O_MH_MAGIC;
2964   mdata->header.cputype = 0;
2965   mdata->header.cpusubtype = 0;
2966   mdata->header.byteorder = abfd->xvec->byteorder;
2967   mdata->header.version = 1;
2968
2969   return TRUE;
2970 }
2971
2972 const bfd_target *
2973 bfd_mach_o_header_p (bfd *abfd,
2974                      bfd_mach_o_filetype filetype,
2975                      bfd_mach_o_cpu_type cputype)
2976 {
2977   struct bfd_preserve preserve;
2978   bfd_mach_o_header header;
2979
2980   preserve.marker = NULL;
2981   if (!bfd_mach_o_read_header (abfd, &header))
2982     goto wrong;
2983
2984   if (! (header.byteorder == BFD_ENDIAN_BIG
2985          || header.byteorder == BFD_ENDIAN_LITTLE))
2986     {
2987       (*_bfd_error_handler) (_("unknown header byte-order value 0x%lx"),
2988                              (unsigned long) header.byteorder);
2989       goto wrong;
2990     }
2991
2992   if (! ((header.byteorder == BFD_ENDIAN_BIG
2993           && abfd->xvec->byteorder == BFD_ENDIAN_BIG
2994           && abfd->xvec->header_byteorder == BFD_ENDIAN_BIG)
2995          || (header.byteorder == BFD_ENDIAN_LITTLE
2996              && abfd->xvec->byteorder == BFD_ENDIAN_LITTLE
2997              && abfd->xvec->header_byteorder == BFD_ENDIAN_LITTLE)))
2998     goto wrong;
2999
3000   /* Check cputype and filetype.
3001      In case of wildcard, do not accept magics that are handled by existing
3002      targets.  */
3003   if (cputype)
3004     {
3005       if (header.cputype != cputype)
3006         goto wrong;
3007     }
3008   else
3009     {
3010       switch (header.cputype)
3011         {
3012         case BFD_MACH_O_CPU_TYPE_I386:
3013           /* Handled by mach-o-i386 */
3014           goto wrong;
3015         default:
3016           break;
3017         }
3018     }
3019   if (filetype)
3020     {
3021       if (header.filetype != filetype)
3022         goto wrong;
3023     }
3024   else
3025     {
3026       switch (header.filetype)
3027         {
3028         case BFD_MACH_O_MH_CORE:
3029           /* Handled by core_p */
3030           goto wrong;
3031         default:
3032           break;
3033         }
3034     }
3035
3036   preserve.marker = bfd_zalloc (abfd, sizeof (bfd_mach_o_data_struct));
3037   if (preserve.marker == NULL
3038       || !bfd_preserve_save (abfd, &preserve))
3039     goto fail;
3040
3041   if (!bfd_mach_o_scan (abfd, &header,
3042                         (bfd_mach_o_data_struct *) preserve.marker))
3043     goto wrong;
3044
3045   bfd_preserve_finish (abfd, &preserve);
3046   return abfd->xvec;
3047
3048  wrong:
3049   bfd_set_error (bfd_error_wrong_format);
3050
3051  fail:
3052   if (preserve.marker != NULL)
3053     bfd_preserve_restore (abfd, &preserve);
3054   return NULL;
3055 }
3056
3057 static const bfd_target *
3058 bfd_mach_o_gen_object_p (bfd *abfd)
3059 {
3060   return bfd_mach_o_header_p (abfd, 0, 0);
3061 }
3062
3063 static const bfd_target *
3064 bfd_mach_o_gen_core_p (bfd *abfd)
3065 {
3066   return bfd_mach_o_header_p (abfd, BFD_MACH_O_MH_CORE, 0);
3067 }
3068
3069 typedef struct mach_o_fat_archentry
3070 {
3071   unsigned long cputype;
3072   unsigned long cpusubtype;
3073   unsigned long offset;
3074   unsigned long size;
3075   unsigned long align;
3076 } mach_o_fat_archentry;
3077
3078 typedef struct mach_o_fat_data_struct
3079 {
3080   unsigned long magic;
3081   unsigned long nfat_arch;
3082   mach_o_fat_archentry *archentries;
3083 } mach_o_fat_data_struct;
3084
3085 const bfd_target *
3086 bfd_mach_o_archive_p (bfd *abfd)
3087 {
3088   mach_o_fat_data_struct *adata = NULL;
3089   struct mach_o_fat_header_external hdr;
3090   unsigned long i;
3091
3092   if (bfd_seek (abfd, 0, SEEK_SET) != 0
3093       || bfd_bread (&hdr, sizeof (hdr), abfd) != sizeof (hdr))
3094     goto error;
3095
3096   adata = bfd_alloc (abfd, sizeof (mach_o_fat_data_struct));
3097   if (adata == NULL)
3098     goto error;
3099
3100   adata->magic = bfd_getb32 (hdr.magic);
3101   adata->nfat_arch = bfd_getb32 (hdr.nfat_arch);
3102   if (adata->magic != 0xcafebabe)
3103     goto error;
3104   /* Avoid matching Java bytecode files, which have the same magic number.
3105      In the Java bytecode file format this field contains the JVM version,
3106      which starts at 43.0.  */
3107   if (adata->nfat_arch > 30)
3108     goto error;
3109
3110   adata->archentries =
3111     bfd_alloc (abfd, adata->nfat_arch * sizeof (mach_o_fat_archentry));
3112   if (adata->archentries == NULL)
3113     goto error;
3114
3115   for (i = 0; i < adata->nfat_arch; i++)
3116     {
3117       struct mach_o_fat_arch_external arch;
3118       if (bfd_bread (&arch, sizeof (arch), abfd) != sizeof (arch))
3119         goto error;
3120       adata->archentries[i].cputype = bfd_getb32 (arch.cputype);
3121       adata->archentries[i].cpusubtype = bfd_getb32 (arch.cpusubtype);
3122       adata->archentries[i].offset = bfd_getb32 (arch.offset);
3123       adata->archentries[i].size = bfd_getb32 (arch.size);
3124       adata->archentries[i].align = bfd_getb32 (arch.align);
3125     }
3126
3127   abfd->tdata.mach_o_fat_data = adata;
3128   return abfd->xvec;
3129
3130  error:
3131   if (adata != NULL)
3132     bfd_release (abfd, adata);
3133   bfd_set_error (bfd_error_wrong_format);
3134   return NULL;
3135 }
3136
3137 bfd *
3138 bfd_mach_o_openr_next_archived_file (bfd *archive, bfd *prev)
3139 {
3140   mach_o_fat_data_struct *adata;
3141   mach_o_fat_archentry *entry = NULL;
3142   unsigned long i;
3143   bfd *nbfd;
3144   enum bfd_architecture arch_type;
3145   unsigned long arch_subtype;
3146
3147   adata = (mach_o_fat_data_struct *) archive->tdata.mach_o_fat_data;
3148   BFD_ASSERT (adata != NULL);
3149
3150   /* Find index of previous entry.  */
3151   if (prev == NULL)
3152     i = 0;      /* Start at first one.  */
3153   else
3154     {
3155       for (i = 0; i < adata->nfat_arch; i++)
3156         {
3157           if (adata->archentries[i].offset == prev->origin)
3158             break;
3159         }
3160
3161       if (i == adata->nfat_arch)
3162         {
3163           /* Not found.  */
3164           bfd_set_error (bfd_error_bad_value);
3165           return NULL;
3166         }
3167     i++;        /* Get next entry.  */
3168   }
3169
3170   if (i >= adata->nfat_arch)
3171     {
3172       bfd_set_error (bfd_error_no_more_archived_files);
3173       return NULL;
3174     }
3175
3176   entry = &adata->archentries[i];
3177   nbfd = _bfd_new_bfd_contained_in (archive);
3178   if (nbfd == NULL)
3179     return NULL;
3180
3181   nbfd->origin = entry->offset;
3182
3183   bfd_mach_o_convert_architecture (entry->cputype, entry->cpusubtype,
3184                                    &arch_type, &arch_subtype);
3185
3186   /* Create the member filename. Use ARCH_NAME.  */
3187   nbfd->filename = bfd_printable_arch_mach (arch_type, arch_subtype);
3188   nbfd->iostream = NULL;
3189   bfd_set_arch_mach (nbfd, arch_type, arch_subtype);
3190
3191   return nbfd;
3192 }
3193
3194 /* If ABFD format is FORMAT and architecture is ARCH, return it.
3195    If ABFD is a fat image containing a member that corresponds to FORMAT
3196    and ARCH, returns it.
3197    In other case, returns NULL.
3198    This function allows transparent uses of fat images.  */
3199 bfd *
3200 bfd_mach_o_fat_extract (bfd *abfd,
3201                         bfd_format format,
3202                         const bfd_arch_info_type *arch)
3203 {
3204   bfd *res;
3205   mach_o_fat_data_struct *adata;
3206   unsigned int i;
3207
3208   if (bfd_check_format (abfd, format))
3209     {
3210       if (bfd_get_arch_info (abfd) == arch)
3211         return abfd;
3212       return NULL;
3213     }
3214   if (!bfd_check_format (abfd, bfd_archive)
3215       || abfd->xvec != &mach_o_fat_vec)
3216     return NULL;
3217
3218   /* This is a Mach-O fat image.  */
3219   adata = (mach_o_fat_data_struct *) abfd->tdata.mach_o_fat_data;
3220   BFD_ASSERT (adata != NULL);
3221
3222   for (i = 0; i < adata->nfat_arch; i++)
3223     {
3224       struct mach_o_fat_archentry *e = &adata->archentries[i];
3225       enum bfd_architecture cpu_type;
3226       unsigned long cpu_subtype;
3227
3228       bfd_mach_o_convert_architecture (e->cputype, e->cpusubtype,
3229                                        &cpu_type, &cpu_subtype);
3230       if (cpu_type != arch->arch || cpu_subtype != arch->mach)
3231         continue;
3232
3233       /* The architecture is found.  */
3234       res = _bfd_new_bfd_contained_in (abfd);
3235       if (res == NULL)
3236         return NULL;
3237
3238       res->origin = e->offset;
3239
3240       res->filename = bfd_printable_arch_mach (cpu_type, cpu_subtype);
3241       res->iostream = NULL;
3242
3243       if (bfd_check_format (res, format))
3244         {
3245           BFD_ASSERT (bfd_get_arch_info (res) == arch);
3246           return res;
3247         }
3248       bfd_close (res);
3249       return NULL;
3250     }
3251
3252   return NULL;
3253 }
3254
3255 int
3256 bfd_mach_o_lookup_command (bfd *abfd,
3257                            bfd_mach_o_load_command_type type,
3258                            bfd_mach_o_load_command **mcommand)
3259 {
3260   struct mach_o_data_struct *md = bfd_mach_o_get_data (abfd);
3261   bfd_mach_o_load_command *ncmd = NULL;
3262   unsigned int i, num;
3263
3264   BFD_ASSERT (md != NULL);
3265   BFD_ASSERT (mcommand != NULL);
3266
3267   num = 0;
3268   for (i = 0; i < md->header.ncmds; i++)
3269     {
3270       struct bfd_mach_o_load_command *cmd = &md->commands[i];
3271
3272       if (cmd->type != type)
3273         continue;
3274
3275       if (num == 0)
3276         ncmd = cmd;
3277       num++;
3278     }
3279
3280   *mcommand = ncmd;
3281   return num;
3282 }
3283
3284 unsigned long
3285 bfd_mach_o_stack_addr (enum bfd_mach_o_cpu_type type)
3286 {
3287   switch (type)
3288     {
3289     case BFD_MACH_O_CPU_TYPE_MC680x0:
3290       return 0x04000000;
3291     case BFD_MACH_O_CPU_TYPE_MC88000:
3292       return 0xffffe000;
3293     case BFD_MACH_O_CPU_TYPE_POWERPC:
3294       return 0xc0000000;
3295     case BFD_MACH_O_CPU_TYPE_I386:
3296       return 0xc0000000;
3297     case BFD_MACH_O_CPU_TYPE_SPARC:
3298       return 0xf0000000;
3299     case BFD_MACH_O_CPU_TYPE_I860:
3300       return 0;
3301     case BFD_MACH_O_CPU_TYPE_HPPA:
3302       return 0xc0000000 - 0x04000000;
3303     default:
3304       return 0;
3305     }
3306 }
3307
3308 const bfd_mach_o_xlat_name bfd_mach_o_section_type_name[] =
3309 {
3310   { "regular", BFD_MACH_O_S_REGULAR},
3311   { "zerofill", BFD_MACH_O_S_ZEROFILL},
3312   { "cstring_literals", BFD_MACH_O_S_CSTRING_LITERALS},
3313   { "4byte_literals", BFD_MACH_O_S_4BYTE_LITERALS},
3314   { "8byte_literals", BFD_MACH_O_S_8BYTE_LITERALS},
3315   { "literal_pointers", BFD_MACH_O_S_LITERAL_POINTERS},
3316   { "non_lazy_symbol_pointers", BFD_MACH_O_S_NON_LAZY_SYMBOL_POINTERS},
3317   { "lazy_symbol_pointers", BFD_MACH_O_S_LAZY_SYMBOL_POINTERS},
3318   { "symbol_stubs", BFD_MACH_O_S_SYMBOL_STUBS},
3319   { "mod_init_func_pointers", BFD_MACH_O_S_MOD_INIT_FUNC_POINTERS},
3320   { "mod_fini_func_pointers", BFD_MACH_O_S_MOD_FINI_FUNC_POINTERS},
3321   { "coalesced", BFD_MACH_O_S_COALESCED},
3322   { "gb_zerofill", BFD_MACH_O_S_GB_ZEROFILL},
3323   { "interposing", BFD_MACH_O_S_INTERPOSING},
3324   { "16byte_literals", BFD_MACH_O_S_16BYTE_LITERALS},
3325   { "dtrace_dof", BFD_MACH_O_S_DTRACE_DOF},
3326   { "lazy_dylib_symbol_pointers", BFD_MACH_O_S_LAZY_DYLIB_SYMBOL_POINTERS},
3327   { NULL, 0}
3328 };
3329
3330 const bfd_mach_o_xlat_name bfd_mach_o_section_attribute_name[] =
3331 {
3332   { "loc_reloc", BFD_MACH_O_S_ATTR_LOC_RELOC },
3333   { "ext_reloc", BFD_MACH_O_S_ATTR_EXT_RELOC },
3334   { "some_instructions", BFD_MACH_O_S_ATTR_SOME_INSTRUCTIONS },
3335   { "debug", BFD_MACH_O_S_ATTR_DEBUG },
3336   { "modifying_code", BFD_MACH_O_S_SELF_MODIFYING_CODE },
3337   { "live_support", BFD_MACH_O_S_ATTR_LIVE_SUPPORT },
3338   { "no_dead_strip", BFD_MACH_O_S_ATTR_NO_DEAD_STRIP },
3339   { "strip_static_syms", BFD_MACH_O_S_ATTR_STRIP_STATIC_SYMS },
3340   { "no_toc", BFD_MACH_O_S_ATTR_NO_TOC },
3341   { "pure_instructions", BFD_MACH_O_S_ATTR_PURE_INSTRUCTIONS },
3342   { NULL, 0}
3343 };
3344
3345 /* Get the section type from NAME.  Return -1 if NAME is unknown.  */
3346
3347 unsigned int
3348 bfd_mach_o_get_section_type_from_name (const char *name)
3349 {
3350   const bfd_mach_o_xlat_name *x;
3351
3352   for (x = bfd_mach_o_section_type_name; x->name; x++)
3353     if (strcmp (x->name, name) == 0)
3354       return x->val;
3355   return (unsigned int)-1;
3356 }
3357
3358 /* Get the section attribute from NAME.  Return -1 if NAME is unknown.  */
3359
3360 unsigned int
3361 bfd_mach_o_get_section_attribute_from_name (const char *name)
3362 {
3363   const bfd_mach_o_xlat_name *x;
3364
3365   for (x = bfd_mach_o_section_attribute_name; x->name; x++)
3366     if (strcmp (x->name, name) == 0)
3367       return x->val;
3368   return (unsigned int)-1;
3369 }
3370
3371 int
3372 bfd_mach_o_core_fetch_environment (bfd *abfd,
3373                                    unsigned char **rbuf,
3374                                    unsigned int *rlen)
3375 {
3376   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
3377   unsigned long stackaddr = bfd_mach_o_stack_addr (mdata->header.cputype);
3378   unsigned int i = 0;
3379
3380   for (i = 0; i < mdata->header.ncmds; i++)
3381     {
3382       bfd_mach_o_load_command *cur = &mdata->commands[i];
3383       bfd_mach_o_segment_command *seg = NULL;
3384
3385       if (cur->type != BFD_MACH_O_LC_SEGMENT)
3386         continue;
3387
3388       seg = &cur->command.segment;
3389
3390       if ((seg->vmaddr + seg->vmsize) == stackaddr)
3391         {
3392           unsigned long start = seg->fileoff;
3393           unsigned long end = seg->fileoff + seg->filesize;
3394           unsigned char *buf = bfd_malloc (1024);
3395           unsigned long size = 1024;
3396
3397           for (;;)
3398             {
3399               bfd_size_type nread = 0;
3400               unsigned long offset;
3401               int found_nonnull = 0;
3402
3403               if (size > (end - start))
3404                 size = (end - start);
3405
3406               buf = bfd_realloc_or_free (buf, size);
3407               if (buf == NULL)
3408                 return -1;
3409
3410               if (bfd_seek (abfd, end - size, SEEK_SET) != 0)
3411                 {
3412                   free (buf);
3413                   return -1;
3414                 }
3415
3416               nread = bfd_bread (buf, size, abfd);
3417
3418               if (nread != size)
3419                 {
3420                   free (buf);
3421                   return -1;
3422                 }
3423
3424               for (offset = 4; offset <= size; offset += 4)
3425                 {
3426                   unsigned long val;
3427
3428                   val = *((unsigned long *) (buf + size - offset));
3429                   if (! found_nonnull)
3430                     {
3431                       if (val != 0)
3432                         found_nonnull = 1;
3433                     }
3434                   else if (val == 0x0)
3435                     {
3436                       unsigned long bottom;
3437                       unsigned long top;
3438
3439                       bottom = seg->fileoff + seg->filesize - offset;
3440                       top = seg->fileoff + seg->filesize - 4;
3441                       *rbuf = bfd_malloc (top - bottom);
3442                       *rlen = top - bottom;
3443
3444                       memcpy (*rbuf, buf + size - *rlen, *rlen);
3445                       free (buf);
3446                       return 0;
3447                     }
3448                 }
3449
3450               if (size == (end - start))
3451                 break;
3452
3453               size *= 2;
3454             }
3455
3456           free (buf);
3457         }
3458     }
3459
3460   return -1;
3461 }
3462
3463 char *
3464 bfd_mach_o_core_file_failing_command (bfd *abfd)
3465 {
3466   unsigned char *buf = NULL;
3467   unsigned int len = 0;
3468   int ret = -1;
3469
3470   ret = bfd_mach_o_core_fetch_environment (abfd, &buf, &len);
3471   if (ret < 0)
3472     return NULL;
3473
3474   return (char *) buf;
3475 }
3476
3477 int
3478 bfd_mach_o_core_file_failing_signal (bfd *abfd ATTRIBUTE_UNUSED)
3479 {
3480   return 0;
3481 }
3482
3483 #define bfd_mach_o_bfd_reloc_type_lookup _bfd_norelocs_bfd_reloc_type_lookup 
3484 #define bfd_mach_o_bfd_reloc_name_lookup _bfd_norelocs_bfd_reloc_name_lookup
3485
3486 #define bfd_mach_o_swap_reloc_in NULL
3487 #define bfd_mach_o_swap_reloc_out NULL
3488 #define bfd_mach_o_print_thread NULL
3489
3490 #define TARGET_NAME             mach_o_be_vec
3491 #define TARGET_STRING           "mach-o-be"
3492 #define TARGET_ARCHITECTURE     bfd_arch_unknown
3493 #define TARGET_BIG_ENDIAN       1
3494 #define TARGET_ARCHIVE          0
3495 #include "mach-o-target.c"
3496
3497 #undef TARGET_NAME
3498 #undef TARGET_STRING
3499 #undef TARGET_ARCHITECTURE
3500 #undef TARGET_BIG_ENDIAN
3501 #undef TARGET_ARCHIVE
3502
3503 #define TARGET_NAME             mach_o_le_vec
3504 #define TARGET_STRING           "mach-o-le"
3505 #define TARGET_ARCHITECTURE     bfd_arch_unknown
3506 #define TARGET_BIG_ENDIAN       0
3507 #define TARGET_ARCHIVE          0
3508
3509 #include "mach-o-target.c"
3510
3511 #undef TARGET_NAME
3512 #undef TARGET_STRING
3513 #undef TARGET_ARCHITECTURE
3514 #undef TARGET_BIG_ENDIAN
3515 #undef TARGET_ARCHIVE
3516
3517 /* Not yet handled: creating an archive.  */
3518 #define bfd_mach_o_mkarchive                      _bfd_noarchive_mkarchive
3519
3520 /* Not used.  */
3521 #define bfd_mach_o_read_ar_hdr                    _bfd_noarchive_read_ar_hdr
3522 #define bfd_mach_o_write_ar_hdr                   _bfd_noarchive_write_ar_hdr
3523 #define bfd_mach_o_slurp_armap                    _bfd_noarchive_slurp_armap
3524 #define bfd_mach_o_slurp_extended_name_table      _bfd_noarchive_slurp_extended_name_table
3525 #define bfd_mach_o_construct_extended_name_table  _bfd_noarchive_construct_extended_name_table
3526 #define bfd_mach_o_truncate_arname                _bfd_noarchive_truncate_arname
3527 #define bfd_mach_o_write_armap                    _bfd_noarchive_write_armap
3528 #define bfd_mach_o_get_elt_at_index               _bfd_noarchive_get_elt_at_index
3529 #define bfd_mach_o_generic_stat_arch_elt          _bfd_noarchive_generic_stat_arch_elt
3530 #define bfd_mach_o_update_armap_timestamp         _bfd_noarchive_update_armap_timestamp
3531
3532 #define TARGET_NAME             mach_o_fat_vec
3533 #define TARGET_STRING           "mach-o-fat"
3534 #define TARGET_ARCHITECTURE     bfd_arch_unknown
3535 #define TARGET_BIG_ENDIAN       1
3536 #define TARGET_ARCHIVE          1
3537
3538 #include "mach-o-target.c"
3539
3540 #undef TARGET_NAME
3541 #undef TARGET_STRING
3542 #undef TARGET_ARCHITECTURE
3543 #undef TARGET_BIG_ENDIAN
3544 #undef TARGET_ARCHIVE