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