1 /* Mach-O support for BFD.
2 Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
4 Free Software Foundation, Inc.
6 This file is part of BFD, the Binary File Descriptor library.
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
21 MA 02110-1301, USA. */
27 #include "libiberty.h"
28 #include "aout/stab_gnu.h"
31 #define bfd_mach_o_object_p bfd_mach_o_gen_object_p
32 #define bfd_mach_o_core_p bfd_mach_o_gen_core_p
33 #define bfd_mach_o_mkobject bfd_mach_o_gen_mkobject
35 #define FILE_ALIGN(off, algn) \
36 (((off) + ((file_ptr) 1 << (algn)) - 1) & ((file_ptr) -1 << (algn)))
38 static int bfd_mach_o_read_symtab_symbols (bfd *);
41 bfd_mach_o_version (bfd *abfd)
43 bfd_mach_o_data_struct *mdata = NULL;
45 BFD_ASSERT (bfd_mach_o_valid (abfd));
46 mdata = bfd_mach_o_get_data (abfd);
48 return mdata->header.version;
52 bfd_mach_o_valid (bfd *abfd)
54 if (abfd == NULL || abfd->xvec == NULL)
57 if (abfd->xvec->flavour != bfd_target_mach_o_flavour)
60 if (bfd_mach_o_get_data (abfd) == NULL)
65 static INLINE bfd_boolean
66 mach_o_wide_p (bfd_mach_o_header *header)
68 switch (header->version)
80 static INLINE bfd_boolean
81 bfd_mach_o_wide_p (bfd *abfd)
83 return mach_o_wide_p (&bfd_mach_o_get_data (abfd)->header);
86 /* Tables to translate well known Mach-O segment/section names to bfd
87 names. Use of canonical names (such as .text or .debug_frame) is required
90 struct mach_o_section_name_xlat
93 const char *mach_o_name;
97 static const struct mach_o_section_name_xlat dwarf_section_names_xlat[] =
99 { ".debug_frame", "__debug_frame", SEC_DEBUGGING },
100 { ".debug_info", "__debug_info", SEC_DEBUGGING },
101 { ".debug_abbrev", "__debug_abbrev", SEC_DEBUGGING },
102 { ".debug_aranges", "__debug_aranges", SEC_DEBUGGING },
103 { ".debug_macinfo", "__debug_macinfo", SEC_DEBUGGING },
104 { ".debug_line", "__debug_line", SEC_DEBUGGING },
105 { ".debug_loc", "__debug_loc", SEC_DEBUGGING },
106 { ".debug_pubnames", "__debug_pubnames", SEC_DEBUGGING },
107 { ".debug_pubtypes", "__debug_pubtypes", SEC_DEBUGGING },
108 { ".debug_str", "__debug_str", SEC_DEBUGGING },
109 { ".debug_ranges", "__debug_ranges", SEC_DEBUGGING },
113 static const struct mach_o_section_name_xlat text_section_names_xlat[] =
115 { ".text", "__text", SEC_CODE | SEC_LOAD },
116 { ".const", "__const", SEC_READONLY | SEC_DATA | SEC_LOAD },
117 { ".cstring", "__cstring", SEC_READONLY | SEC_DATA | SEC_LOAD },
118 { ".eh_frame", "__eh_frame", SEC_READONLY | SEC_LOAD },
122 static const struct mach_o_section_name_xlat data_section_names_xlat[] =
124 { ".data", "__data", SEC_DATA | SEC_LOAD },
125 { ".const_data", "__const", SEC_DATA | SEC_LOAD },
126 { ".dyld", "__dyld", SEC_DATA | SEC_LOAD },
127 { ".lazy_symbol_ptr", "__la_symbol_ptr", SEC_DATA | SEC_LOAD },
128 { ".non_lazy_symbol_ptr", "__nl_symbol_ptr", SEC_DATA | SEC_LOAD },
129 { ".bss", "__bss", SEC_NO_FLAGS },
133 struct mach_o_segment_name_xlat
136 const struct mach_o_section_name_xlat *sections;
139 static const struct mach_o_segment_name_xlat segsec_names_xlat[] =
141 { "__DWARF", dwarf_section_names_xlat },
142 { "__TEXT", text_section_names_xlat },
143 { "__DATA", data_section_names_xlat },
148 /* Mach-O to bfd names. */
151 bfd_mach_o_convert_section_name_to_bfd (bfd *abfd, bfd_mach_o_section *section,
152 char **name, flagword *flags)
154 const struct mach_o_segment_name_xlat *seg;
157 const char *pfx = "";
160 *flags = SEC_NO_FLAGS;
162 for (seg = segsec_names_xlat; seg->segname; seg++)
164 if (strcmp (seg->segname, section->segname) == 0)
166 const struct mach_o_section_name_xlat *sec;
168 for (sec = seg->sections; sec->mach_o_name; sec++)
170 if (strcmp (sec->mach_o_name, section->sectname) == 0)
172 len = strlen (sec->bfd_name);
173 res = bfd_alloc (abfd, len + 1);
177 strcpy (res, sec->bfd_name);
186 len = strlen (section->segname) + 1
187 + strlen (section->sectname) + 1;
189 /* Put "LC_SEGMENT." prefix if the segment name is weird (ie doesn't start
190 with an underscore. */
191 if (section->segname[0] != '_')
193 static const char seg_pfx[] = "LC_SEGMENT.";
196 len += sizeof (seg_pfx) - 1;
199 res = bfd_alloc (abfd, len);
202 snprintf (res, len, "%s%s.%s", pfx, section->segname, section->sectname);
206 /* Convert a bfd section name to a Mach-O segment + section name. */
209 bfd_mach_o_convert_section_name_to_mach_o (bfd *abfd ATTRIBUTE_UNUSED,
211 bfd_mach_o_section *section)
213 const struct mach_o_segment_name_xlat *seg;
214 const char *name = bfd_get_section_name (abfd, sect);
220 /* List of well known names. They all start with a dot. */
222 for (seg = segsec_names_xlat; seg->segname; seg++)
224 const struct mach_o_section_name_xlat *sec;
226 for (sec = seg->sections; sec->mach_o_name; sec++)
228 if (strcmp (sec->bfd_name, name) == 0)
230 strcpy (section->segname, seg->segname);
231 strcpy (section->sectname, sec->mach_o_name);
237 /* Strip LC_SEGMENT. prefix. */
238 if (strncmp (name, "LC_SEGMENT.", 11) == 0)
242 dot = strchr (name, '.');
245 /* Try to split name into segment and section names. */
246 if (dot && dot != name)
249 seclen = len - (dot + 1 - name);
251 if (seglen < 16 && seclen < 16)
253 memcpy (section->segname, name, seglen);
254 section->segname[seglen] = 0;
255 memcpy (section->sectname, dot + 1, seclen);
256 section->sectname[seclen] = 0;
263 memcpy (section->segname, name, len);
264 section->segname[len] = 0;
265 memcpy (section->sectname, name, len);
266 section->sectname[len] = 0;
269 /* Return the size of an entry for section SEC.
270 Must be called only for symbol pointer section and symbol stubs
274 bfd_mach_o_section_get_entry_size (bfd *abfd, bfd_mach_o_section *sec)
276 switch (sec->flags & BFD_MACH_O_SECTION_TYPE_MASK)
278 case BFD_MACH_O_S_NON_LAZY_SYMBOL_POINTERS:
279 case BFD_MACH_O_S_LAZY_SYMBOL_POINTERS:
280 return bfd_mach_o_wide_p (abfd) ? 8 : 4;
281 case BFD_MACH_O_S_SYMBOL_STUBS:
282 return sec->reserved2;
289 /* Return the number of indirect symbols for a section.
290 Must be called only for symbol pointer section and symbol stubs
294 bfd_mach_o_section_get_nbr_indirect (bfd *abfd, bfd_mach_o_section *sec)
298 elsz = bfd_mach_o_section_get_entry_size (abfd, sec);
302 return sec->size / elsz;
306 /* Copy any private info we understand from the input symbol
307 to the output symbol. */
310 bfd_mach_o_bfd_copy_private_symbol_data (bfd *ibfd ATTRIBUTE_UNUSED,
311 asymbol *isymbol ATTRIBUTE_UNUSED,
312 bfd *obfd ATTRIBUTE_UNUSED,
313 asymbol *osymbol ATTRIBUTE_UNUSED)
318 /* Copy any private info we understand from the input section
319 to the output section. */
322 bfd_mach_o_bfd_copy_private_section_data (bfd *ibfd ATTRIBUTE_UNUSED,
323 asection *isection ATTRIBUTE_UNUSED,
324 bfd *obfd ATTRIBUTE_UNUSED,
325 asection *osection ATTRIBUTE_UNUSED)
330 /* Copy any private info we understand from the input bfd
331 to the output bfd. */
334 bfd_mach_o_bfd_copy_private_bfd_data (bfd *ibfd, bfd *obfd)
336 if (bfd_get_flavour (ibfd) != bfd_target_mach_o_flavour
337 || bfd_get_flavour (obfd) != bfd_target_mach_o_flavour)
340 BFD_ASSERT (bfd_mach_o_valid (ibfd));
341 BFD_ASSERT (bfd_mach_o_valid (obfd));
343 /* FIXME: copy commands. */
348 /* Count the total number of symbols. */
351 bfd_mach_o_count_symbols (bfd *abfd)
353 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
355 if (mdata->symtab == NULL)
357 return mdata->symtab->nsyms;
361 bfd_mach_o_get_symtab_upper_bound (bfd *abfd)
363 long nsyms = bfd_mach_o_count_symbols (abfd);
365 return ((nsyms + 1) * sizeof (asymbol *));
369 bfd_mach_o_canonicalize_symtab (bfd *abfd, asymbol **alocation)
371 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
372 long nsyms = bfd_mach_o_count_symbols (abfd);
373 bfd_mach_o_symtab_command *sym = mdata->symtab;
379 if (bfd_mach_o_read_symtab_symbols (abfd) != 0)
381 (*_bfd_error_handler) (_("bfd_mach_o_canonicalize_symtab: unable to load symbols"));
385 BFD_ASSERT (sym->symbols != NULL);
387 for (j = 0; j < sym->nsyms; j++)
388 alocation[j] = &sym->symbols[j].symbol;
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,
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;
407 unsigned long count, i, j, n;
414 if (dysymtab == NULL || symtab == NULL || symtab->symbols == NULL)
417 if (dysymtab->nindirectsyms == 0)
420 count = dysymtab->nindirectsyms;
421 size = count * sizeof (asymbol) + 1;
423 for (j = 0; j < count; j++)
425 unsigned int isym = dysymtab->indirect_syms[j];
427 if (isym < symtab->nsyms && symtab->symbols[isym].symbol.name)
428 size += strlen (symtab->symbols[isym].symbol.name) + sizeof ("$stub");
431 s = *ret = (asymbol *) bfd_malloc (size);
434 names = (char *) (s + count);
439 for (i = 0; i < mdata->nsects; i++)
441 bfd_mach_o_section *sec = mdata->sections[i];
442 unsigned int first, last;
446 switch (sec->flags & BFD_MACH_O_SECTION_TYPE_MASK)
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);
454 entry_size = bfd_mach_o_section_get_entry_size (abfd, sec);
455 for (j = first; j < last; j++)
457 unsigned int isym = dysymtab->indirect_syms[j];
459 s->flags = BSF_GLOBAL | BSF_SYNTHETIC;
460 s->section = sec->bfdsection;
461 s->value = addr - sec->addr;
464 if (isym < symtab->nsyms
465 && symtab->symbols[isym].symbol.name)
467 const char *sym = symtab->symbols[isym].symbol.name;
472 memcpy (names, sym, len);
474 memcpy (names, "$stub", sizeof ("$stub"));
475 names += sizeof ("$stub");
494 bfd_mach_o_get_symbol_info (bfd *abfd ATTRIBUTE_UNUSED,
498 bfd_symbol_info (symbol, ret);
502 bfd_mach_o_print_symbol (bfd *abfd,
505 bfd_print_symbol_type how)
507 FILE *file = (FILE *) afile;
509 bfd_mach_o_asymbol *asym = (bfd_mach_o_asymbol *)symbol;
513 case bfd_print_symbol_name:
514 fprintf (file, "%s", symbol->name);
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);
521 switch (asym->n_type & BFD_MACH_O_N_TYPE)
523 case BFD_MACH_O_N_UNDF:
526 case BFD_MACH_O_N_ABS:
529 case BFD_MACH_O_N_INDR:
532 case BFD_MACH_O_N_PBUD:
535 case BFD_MACH_O_N_SECT:
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);
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)
559 *subtype = bfd_arch_unknown;
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;
569 case BFD_MACH_O_CPU_TYPE_X86_64:
570 *type = bfd_arch_i386;
571 *subtype = bfd_mach_x86_64;
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;
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;
588 case BFD_MACH_O_CPU_TYPE_POWERPC_64:
589 *type = bfd_arch_powerpc;
590 *subtype = bfd_mach_ppc64;
593 *type = bfd_arch_unknown;
599 bfd_mach_o_write_header (bfd *abfd, bfd_mach_o_header *header)
601 unsigned char buf[32];
604 size = mach_o_wide_p (header) ?
605 BFD_MACH_O_HEADER_64_SIZE : BFD_MACH_O_HEADER_SIZE;
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);
615 if (mach_o_wide_p (header))
616 bfd_h_put_32 (abfd, header->reserved, buf + 28);
618 if (bfd_seek (abfd, 0, SEEK_SET) != 0
619 || bfd_bwrite ((void *) buf, size, abfd) != size)
626 bfd_mach_o_write_thread (bfd *abfd, bfd_mach_o_load_command *command)
628 bfd_mach_o_thread_command *cmd = &command->command.thread;
630 unsigned char buf[8];
633 BFD_ASSERT ((command->type == BFD_MACH_O_LC_THREAD)
634 || (command->type == BFD_MACH_O_LC_UNIXTHREAD));
637 for (i = 0; i < cmd->nflavours; i++)
639 BFD_ASSERT ((cmd->flavours[i].size % 4) == 0);
640 BFD_ASSERT (cmd->flavours[i].offset == (command->offset + offset + 8));
642 bfd_h_put_32 (abfd, cmd->flavours[i].flavour, buf);
643 bfd_h_put_32 (abfd, (cmd->flavours[i].size / 4), buf + 4);
645 if (bfd_seek (abfd, command->offset + offset, SEEK_SET) != 0
646 || bfd_bwrite ((void *) buf, 8, abfd) != 8)
649 offset += cmd->flavours[i].size + 8;
656 bfd_mach_o_get_reloc_upper_bound (bfd *abfd ATTRIBUTE_UNUSED,
659 return (asect->reloc_count + 1) * sizeof (arelent *);
663 bfd_mach_o_canonicalize_one_reloc (bfd *abfd, char *buf,
664 arelent *res, asymbol **syms)
666 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
667 bfd_mach_o_backend_data *bed = bfd_mach_o_get_backend_data (abfd);
668 bfd_mach_o_reloc_info reloc;
673 addr = bfd_get_32 (abfd, buf + 0);
674 symnum = bfd_get_32 (abfd, buf + 4);
676 if (addr & BFD_MACH_O_SR_SCATTERED)
680 /* Scattered relocation.
681 Extract section and offset from r_value. */
682 res->sym_ptr_ptr = NULL;
684 for (j = 0; j < mdata->nsects; j++)
686 bfd_mach_o_section *sect = mdata->sections[j];
687 if (symnum >= sect->addr && symnum < sect->addr + sect->size)
689 res->sym_ptr_ptr = sect->bfdsection->symbol_ptr_ptr;
690 res->addend = symnum - sect->addr;
694 res->address = BFD_MACH_O_GET_SR_ADDRESS (addr);
695 reloc.r_type = BFD_MACH_O_GET_SR_TYPE (addr);
696 reloc.r_length = BFD_MACH_O_GET_SR_LENGTH (addr);
697 reloc.r_pcrel = addr & BFD_MACH_O_SR_PCREL;
698 reloc.r_scattered = 1;
702 unsigned int num = BFD_MACH_O_GET_R_SYMBOLNUM (symnum);
705 if (symnum & BFD_MACH_O_R_EXTERN)
712 BFD_ASSERT (num != 0);
713 BFD_ASSERT (num <= mdata->nsects);
714 sym = mdata->sections[num - 1]->bfdsection->symbol_ptr_ptr;
715 /* For a symbol defined in section S, the addend (stored in the
716 binary) contains the address of the section. To comply with
717 bfd conventio, substract the section address.
718 Use the address from the header, so that the user can modify
719 the vma of the section. */
720 res->addend = -mdata->sections[num - 1]->addr;
723 res->sym_ptr_ptr = sym;
724 reloc.r_type = BFD_MACH_O_GET_R_TYPE (symnum);
725 reloc.r_length = BFD_MACH_O_GET_R_LENGTH (symnum);
726 reloc.r_pcrel = (symnum & BFD_MACH_O_R_PCREL) ? 1 : 0;
727 reloc.r_scattered = 0;
730 if (!(*bed->_bfd_mach_o_swap_reloc_in)(res, &reloc))
736 bfd_mach_o_canonicalize_relocs (bfd *abfd, unsigned long filepos,
738 arelent *res, asymbol **syms)
742 bfd_size_type native_size;
744 /* Allocate and read relocs. */
745 native_size = count * BFD_MACH_O_RELENT_SIZE;
746 native_relocs = bfd_malloc (native_size);
747 if (native_relocs == NULL)
750 if (bfd_seek (abfd, filepos, SEEK_SET) != 0
751 || bfd_bread (native_relocs, native_size, abfd) != native_size)
754 for (i = 0; i < count; i++)
756 char *buf = native_relocs + BFD_MACH_O_RELENT_SIZE * i;
758 if (bfd_mach_o_canonicalize_one_reloc (abfd, buf, &res[i], syms) < 0)
761 free (native_relocs);
764 free (native_relocs);
769 bfd_mach_o_canonicalize_reloc (bfd *abfd, asection *asect,
770 arelent **rels, asymbol **syms)
772 bfd_mach_o_backend_data *bed = bfd_mach_o_get_backend_data (abfd);
776 if (asect->reloc_count == 0)
779 /* No need to go further if we don't know how to read relocs. */
780 if (bed->_bfd_mach_o_swap_reloc_in == NULL)
783 res = bfd_malloc (asect->reloc_count * sizeof (arelent));
787 if (bfd_mach_o_canonicalize_relocs (abfd, asect->rel_filepos,
788 asect->reloc_count, res, syms) < 0)
794 for (i = 0; i < asect->reloc_count; i++)
797 asect->relocation = res;
803 bfd_mach_o_get_dynamic_reloc_upper_bound (bfd *abfd)
805 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
807 if (mdata->dysymtab == NULL)
809 return (mdata->dysymtab->nextrel + mdata->dysymtab->nlocrel)
810 * sizeof (arelent *);
814 bfd_mach_o_canonicalize_dynamic_reloc (bfd *abfd, arelent **rels,
815 struct bfd_symbol **syms)
817 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
818 bfd_mach_o_dysymtab_command *dysymtab = mdata->dysymtab;
819 bfd_mach_o_backend_data *bed = bfd_mach_o_get_backend_data (abfd);
823 if (dysymtab == NULL)
825 if (dysymtab->nextrel == 0 && dysymtab->nlocrel == 0)
828 /* No need to go further if we don't know how to read relocs. */
829 if (bed->_bfd_mach_o_swap_reloc_in == NULL)
832 res = bfd_malloc ((dysymtab->nextrel + dysymtab->nlocrel) * sizeof (arelent));
836 if (bfd_mach_o_canonicalize_relocs (abfd, dysymtab->extreloff,
837 dysymtab->nextrel, res, syms) < 0)
843 if (bfd_mach_o_canonicalize_relocs (abfd, dysymtab->locreloff,
845 res + dysymtab->nextrel, syms) < 0)
851 for (i = 0; i < dysymtab->nextrel + dysymtab->nlocrel; i++)
858 bfd_mach_o_write_relocs (bfd *abfd, bfd_mach_o_section *section)
860 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
864 bfd_mach_o_backend_data *bed = bfd_mach_o_get_backend_data (abfd);
866 sec = section->bfdsection;
867 if (sec->reloc_count == 0)
870 if (bed->_bfd_mach_o_swap_reloc_out == NULL)
873 /* Allocate relocation room. */
874 mdata->filelen = FILE_ALIGN(mdata->filelen, 2);
875 section->nreloc = sec->reloc_count;
876 sec->rel_filepos = mdata->filelen;
877 section->reloff = sec->rel_filepos;
878 mdata->filelen += sec->reloc_count * BFD_MACH_O_RELENT_SIZE;
880 if (bfd_seek (abfd, section->reloff, SEEK_SET) != 0)
883 /* Convert and write. */
884 entries = section->bfdsection->orelocation;
885 for (i = 0; i < section->nreloc; i++)
887 arelent *rel = entries[i];
889 bfd_mach_o_reloc_info info, *pinfo = &info;
891 /* Convert relocation to an intermediate representation. */
892 if (!(*bed->_bfd_mach_o_swap_reloc_out) (rel, pinfo))
895 /* Lower the relocation info. */
896 if (pinfo->r_scattered)
900 v = BFD_MACH_O_SR_SCATTERED
901 | (pinfo->r_pcrel ? BFD_MACH_O_SR_PCREL : 0)
902 | BFD_MACH_O_SET_SR_LENGTH(pinfo->r_length)
903 | BFD_MACH_O_SET_SR_TYPE(pinfo->r_type)
904 | BFD_MACH_O_SET_SR_ADDRESS(pinfo->r_address);
905 bfd_put_32 (abfd, v, buf);
906 bfd_put_32 (abfd, pinfo->r_value, buf + 4);
912 bfd_put_32 (abfd, pinfo->r_address, buf);
913 v = BFD_MACH_O_SET_R_SYMBOLNUM (pinfo->r_value)
914 | (pinfo->r_pcrel ? BFD_MACH_O_R_PCREL : 0)
915 | BFD_MACH_O_SET_R_LENGTH (pinfo->r_length)
916 | (pinfo->r_extern ? BFD_MACH_O_R_EXTERN : 0)
917 | BFD_MACH_O_SET_R_TYPE (pinfo->r_type);
918 bfd_put_32 (abfd, v, buf + 4);
921 if (bfd_bwrite ((void *) buf, BFD_MACH_O_RELENT_SIZE, abfd)
922 != BFD_MACH_O_RELENT_SIZE)
929 bfd_mach_o_write_section_32 (bfd *abfd, bfd_mach_o_section *section)
931 unsigned char buf[BFD_MACH_O_SECTION_SIZE];
933 memcpy (buf, section->sectname, 16);
934 memcpy (buf + 16, section->segname, 16);
935 bfd_h_put_32 (abfd, section->addr, buf + 32);
936 bfd_h_put_32 (abfd, section->size, buf + 36);
937 bfd_h_put_32 (abfd, section->offset, buf + 40);
938 bfd_h_put_32 (abfd, section->align, buf + 44);
939 bfd_h_put_32 (abfd, section->reloff, buf + 48);
940 bfd_h_put_32 (abfd, section->nreloc, buf + 52);
941 bfd_h_put_32 (abfd, section->flags, buf + 56);
942 bfd_h_put_32 (abfd, section->reserved1, buf + 60);
943 bfd_h_put_32 (abfd, section->reserved2, buf + 64);
945 if (bfd_bwrite ((void *) buf, BFD_MACH_O_SECTION_SIZE, abfd)
946 != BFD_MACH_O_SECTION_SIZE)
953 bfd_mach_o_write_section_64 (bfd *abfd, bfd_mach_o_section *section)
955 unsigned char buf[BFD_MACH_O_SECTION_64_SIZE];
957 memcpy (buf, section->sectname, 16);
958 memcpy (buf + 16, section->segname, 16);
959 bfd_h_put_64 (abfd, section->addr, buf + 32);
960 bfd_h_put_64 (abfd, section->size, buf + 40);
961 bfd_h_put_32 (abfd, section->offset, buf + 48);
962 bfd_h_put_32 (abfd, section->align, buf + 52);
963 bfd_h_put_32 (abfd, section->reloff, buf + 56);
964 bfd_h_put_32 (abfd, section->nreloc, buf + 60);
965 bfd_h_put_32 (abfd, section->flags, buf + 64);
966 bfd_h_put_32 (abfd, section->reserved1, buf + 68);
967 bfd_h_put_32 (abfd, section->reserved2, buf + 72);
968 bfd_h_put_32 (abfd, section->reserved3, buf + 76);
970 if (bfd_bwrite ((void *) buf, BFD_MACH_O_SECTION_64_SIZE, abfd)
971 != BFD_MACH_O_SECTION_64_SIZE)
978 bfd_mach_o_write_segment_32 (bfd *abfd, bfd_mach_o_load_command *command)
980 unsigned char buf[BFD_MACH_O_LC_SEGMENT_SIZE];
981 bfd_mach_o_segment_command *seg = &command->command.segment;
984 BFD_ASSERT (command->type == BFD_MACH_O_LC_SEGMENT);
986 for (i = 0; i < seg->nsects; i++)
987 if (!bfd_mach_o_write_relocs (abfd, &seg->sections[i]))
990 memcpy (buf, seg->segname, 16);
991 bfd_h_put_32 (abfd, seg->vmaddr, buf + 16);
992 bfd_h_put_32 (abfd, seg->vmsize, buf + 20);
993 bfd_h_put_32 (abfd, seg->fileoff, buf + 24);
994 bfd_h_put_32 (abfd, seg->filesize, buf + 28);
995 bfd_h_put_32 (abfd, seg->maxprot, buf + 32);
996 bfd_h_put_32 (abfd, seg->initprot, buf + 36);
997 bfd_h_put_32 (abfd, seg->nsects, buf + 40);
998 bfd_h_put_32 (abfd, seg->flags, buf + 44);
1000 if (bfd_seek (abfd, command->offset + 8, SEEK_SET) != 0
1001 || (bfd_bwrite ((void *) buf, BFD_MACH_O_LC_SEGMENT_SIZE - 8, abfd)
1002 != BFD_MACH_O_LC_SEGMENT_SIZE - 8))
1005 for (i = 0; i < seg->nsects; i++)
1006 if (bfd_mach_o_write_section_32 (abfd, &seg->sections[i]))
1013 bfd_mach_o_write_segment_64 (bfd *abfd, bfd_mach_o_load_command *command)
1015 unsigned char buf[BFD_MACH_O_LC_SEGMENT_64_SIZE];
1016 bfd_mach_o_segment_command *seg = &command->command.segment;
1019 BFD_ASSERT (command->type == BFD_MACH_O_LC_SEGMENT_64);
1021 for (i = 0; i < seg->nsects; i++)
1022 if (!bfd_mach_o_write_relocs (abfd, &seg->sections[i]))
1025 memcpy (buf, seg->segname, 16);
1026 bfd_h_put_64 (abfd, seg->vmaddr, buf + 16);
1027 bfd_h_put_64 (abfd, seg->vmsize, buf + 24);
1028 bfd_h_put_64 (abfd, seg->fileoff, buf + 32);
1029 bfd_h_put_64 (abfd, seg->filesize, buf + 40);
1030 bfd_h_put_32 (abfd, seg->maxprot, buf + 48);
1031 bfd_h_put_32 (abfd, seg->initprot, buf + 52);
1032 bfd_h_put_32 (abfd, seg->nsects, buf + 56);
1033 bfd_h_put_32 (abfd, seg->flags, buf + 60);
1035 if (bfd_seek (abfd, command->offset + 8, SEEK_SET) != 0
1036 || (bfd_bwrite ((void *) buf, BFD_MACH_O_LC_SEGMENT_64_SIZE - 8, abfd)
1037 != BFD_MACH_O_LC_SEGMENT_64_SIZE - 8))
1040 for (i = 0; i < seg->nsects; i++)
1041 if (bfd_mach_o_write_section_64 (abfd, &seg->sections[i]))
1048 bfd_mach_o_write_symtab (bfd *abfd, bfd_mach_o_load_command *command)
1050 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
1051 bfd_mach_o_symtab_command *sym = &command->command.symtab;
1052 unsigned char buf[16];
1054 unsigned int wide = bfd_mach_o_wide_p (abfd);
1055 unsigned int symlen = wide ? BFD_MACH_O_NLIST_64_SIZE : BFD_MACH_O_NLIST_SIZE;
1056 struct bfd_strtab_hash *strtab;
1057 asymbol **symbols = bfd_get_outsymbols (abfd);
1059 BFD_ASSERT (command->type == BFD_MACH_O_LC_SYMTAB);
1061 /* Write the symbols first. */
1062 mdata->filelen = FILE_ALIGN(mdata->filelen, wide ? 3 : 2);
1063 sym->symoff = mdata->filelen;
1064 if (bfd_seek (abfd, sym->symoff, SEEK_SET) != 0)
1067 sym->nsyms = bfd_get_symcount (abfd);
1068 mdata->filelen += sym->nsyms * symlen;
1070 strtab = _bfd_stringtab_init ();
1074 for (i = 0; i < sym->nsyms; i++)
1076 bfd_size_type str_index;
1077 bfd_mach_o_asymbol *s = (bfd_mach_o_asymbol *)symbols[i];
1079 /* Compute name index. */
1080 /* An index of 0 always means the empty string. */
1081 if (s->symbol.name == 0 || s->symbol.name[0] == '\0')
1085 str_index = _bfd_stringtab_add (strtab, s->symbol.name, TRUE, FALSE);
1086 if (str_index == (bfd_size_type) -1)
1089 bfd_h_put_32 (abfd, str_index, buf);
1090 bfd_h_put_8 (abfd, s->n_type, buf + 4);
1091 bfd_h_put_8 (abfd, s->n_sect, buf + 5);
1092 bfd_h_put_16 (abfd, s->n_desc, buf + 6);
1094 bfd_h_put_64 (abfd, s->symbol.section->vma + s->symbol.value, buf + 8);
1096 bfd_h_put_32 (abfd, s->symbol.section->vma + s->symbol.value, buf + 8);
1098 if (bfd_bwrite ((void *) buf, symlen, abfd) != symlen)
1101 sym->strsize = _bfd_stringtab_size (strtab);
1102 sym->stroff = mdata->filelen;
1103 mdata->filelen += sym->strsize;
1105 if (_bfd_stringtab_emit (abfd, strtab) != TRUE)
1107 _bfd_stringtab_free (strtab);
1110 bfd_h_put_32 (abfd, sym->symoff, buf);
1111 bfd_h_put_32 (abfd, sym->nsyms, buf + 4);
1112 bfd_h_put_32 (abfd, sym->stroff, buf + 8);
1113 bfd_h_put_32 (abfd, sym->strsize, buf + 12);
1115 if (bfd_seek (abfd, command->offset + 8, SEEK_SET) != 0
1116 || bfd_bwrite ((void *) buf, 16, abfd) != 16)
1122 _bfd_stringtab_free (strtab);
1126 /* Process the symbols and generate Mach-O specific fields.
1130 bfd_mach_o_mangle_symbols (bfd *abfd)
1133 asymbol **symbols = bfd_get_outsymbols (abfd);
1135 for (i = 0; i < bfd_get_symcount (abfd); i++)
1137 bfd_mach_o_asymbol *s = (bfd_mach_o_asymbol *)symbols[i];
1139 if (s->n_type == BFD_MACH_O_N_UNDF && !(s->symbol.flags & BSF_DEBUGGING))
1141 /* As genuine Mach-O symbols type shouldn't be N_UNDF (undefined
1142 symbols should be N_UNDEF | N_EXT), we suppose the back-end
1143 values haven't been set. */
1144 if (s->symbol.section == bfd_abs_section_ptr)
1145 s->n_type = BFD_MACH_O_N_ABS;
1146 else if (s->symbol.section == bfd_und_section_ptr)
1148 s->n_type = BFD_MACH_O_N_UNDF;
1149 if (s->symbol.flags & BSF_WEAK)
1150 s->n_desc |= BFD_MACH_O_N_WEAK_REF;
1152 else if (s->symbol.section == bfd_com_section_ptr)
1153 s->n_type = BFD_MACH_O_N_UNDF | BFD_MACH_O_N_EXT;
1155 s->n_type = BFD_MACH_O_N_SECT;
1157 if (s->symbol.flags & BSF_GLOBAL)
1158 s->n_type |= BFD_MACH_O_N_EXT;
1161 /* Compute section index. */
1162 if (s->symbol.section != bfd_abs_section_ptr
1163 && s->symbol.section != bfd_und_section_ptr
1164 && s->symbol.section != bfd_com_section_ptr)
1165 s->n_sect = s->symbol.section->target_index;
1167 /* Number symbols. */
1168 s->symbol.udata.i = i;
1174 bfd_mach_o_write_contents (bfd *abfd)
1177 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
1179 if (mdata->header.ncmds == 0)
1180 if (!bfd_mach_o_build_commands (abfd))
1183 /* Now write header information. */
1184 if (mdata->header.filetype == 0)
1186 if (abfd->flags & EXEC_P)
1187 mdata->header.filetype = BFD_MACH_O_MH_EXECUTE;
1188 else if (abfd->flags & DYNAMIC)
1189 mdata->header.filetype = BFD_MACH_O_MH_DYLIB;
1191 mdata->header.filetype = BFD_MACH_O_MH_OBJECT;
1193 if (!bfd_mach_o_write_header (abfd, &mdata->header))
1196 /* Assign a number to each symbols. */
1197 if (!bfd_mach_o_mangle_symbols (abfd))
1200 for (i = 0; i < mdata->header.ncmds; i++)
1202 unsigned char buf[8];
1203 bfd_mach_o_load_command *cur = &mdata->commands[i];
1204 unsigned long typeflag;
1206 typeflag = cur->type | (cur->type_required ? BFD_MACH_O_LC_REQ_DYLD : 0);
1208 bfd_h_put_32 (abfd, typeflag, buf);
1209 bfd_h_put_32 (abfd, cur->len, buf + 4);
1211 if (bfd_seek (abfd, cur->offset, SEEK_SET) != 0
1212 || bfd_bwrite ((void *) buf, 8, abfd) != 8)
1217 case BFD_MACH_O_LC_SEGMENT:
1218 if (bfd_mach_o_write_segment_32 (abfd, cur) != 0)
1221 case BFD_MACH_O_LC_SEGMENT_64:
1222 if (bfd_mach_o_write_segment_64 (abfd, cur) != 0)
1225 case BFD_MACH_O_LC_SYMTAB:
1226 if (!bfd_mach_o_write_symtab (abfd, cur))
1229 case BFD_MACH_O_LC_SYMSEG:
1231 case BFD_MACH_O_LC_THREAD:
1232 case BFD_MACH_O_LC_UNIXTHREAD:
1233 if (bfd_mach_o_write_thread (abfd, cur) != 0)
1236 case BFD_MACH_O_LC_LOADFVMLIB:
1237 case BFD_MACH_O_LC_IDFVMLIB:
1238 case BFD_MACH_O_LC_IDENT:
1239 case BFD_MACH_O_LC_FVMFILE:
1240 case BFD_MACH_O_LC_PREPAGE:
1241 case BFD_MACH_O_LC_DYSYMTAB:
1242 case BFD_MACH_O_LC_LOAD_DYLIB:
1243 case BFD_MACH_O_LC_LOAD_WEAK_DYLIB:
1244 case BFD_MACH_O_LC_ID_DYLIB:
1245 case BFD_MACH_O_LC_REEXPORT_DYLIB:
1246 case BFD_MACH_O_LC_LOAD_DYLINKER:
1247 case BFD_MACH_O_LC_ID_DYLINKER:
1248 case BFD_MACH_O_LC_PREBOUND_DYLIB:
1249 case BFD_MACH_O_LC_ROUTINES:
1250 case BFD_MACH_O_LC_SUB_FRAMEWORK:
1253 (*_bfd_error_handler) (_("unable to write unknown load command 0x%lx"),
1254 (unsigned long) cur->type);
1262 /* Build Mach-O load commands from the sections. */
1265 bfd_mach_o_build_commands (bfd *abfd)
1267 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
1268 unsigned int wide = mach_o_wide_p (&mdata->header);
1269 bfd_mach_o_segment_command *seg;
1270 bfd_mach_o_section *sections;
1272 bfd_mach_o_load_command *cmd;
1273 bfd_mach_o_load_command *symtab_cmd;
1276 /* Return now if commands are already built. */
1277 if (mdata->header.ncmds)
1280 /* Very simple version: 1 command (segment) containing all sections. */
1281 mdata->header.ncmds = 2;
1282 mdata->commands = bfd_alloc (abfd, mdata->header.ncmds
1283 * sizeof (bfd_mach_o_load_command));
1284 if (mdata->commands == NULL)
1286 cmd = &mdata->commands[0];
1287 seg = &cmd->command.segment;
1289 seg->nsects = bfd_count_sections (abfd);
1290 sections = bfd_alloc (abfd, seg->nsects * sizeof (bfd_mach_o_section));
1291 if (sections == NULL)
1293 seg->sections = sections;
1295 /* Set segment command. */
1298 cmd->type = BFD_MACH_O_LC_SEGMENT_64;
1299 cmd->offset = BFD_MACH_O_HEADER_64_SIZE;
1300 cmd->len = BFD_MACH_O_LC_SEGMENT_64_SIZE
1301 + BFD_MACH_O_SECTION_64_SIZE * seg->nsects;
1305 cmd->type = BFD_MACH_O_LC_SEGMENT;
1306 cmd->offset = BFD_MACH_O_HEADER_SIZE;
1307 cmd->len = BFD_MACH_O_LC_SEGMENT_SIZE
1308 + BFD_MACH_O_SECTION_SIZE * seg->nsects;
1310 cmd->type_required = FALSE;
1311 mdata->header.sizeofcmds = cmd->len;
1312 mdata->filelen = cmd->offset + cmd->len;
1314 /* Set symtab command. */
1315 symtab_cmd = &mdata->commands[1];
1317 symtab_cmd->type = BFD_MACH_O_LC_SYMTAB;
1318 symtab_cmd->offset = cmd->offset + cmd->len;
1319 symtab_cmd->len = 6 * 4;
1320 symtab_cmd->type_required = FALSE;
1322 mdata->header.sizeofcmds += symtab_cmd->len;
1323 mdata->filelen += symtab_cmd->len;
1325 /* Fill segment command. */
1326 memset (seg->segname, 0, sizeof (seg->segname));
1328 seg->fileoff = mdata->filelen;
1330 seg->maxprot = BFD_MACH_O_PROT_READ | BFD_MACH_O_PROT_WRITE
1331 | BFD_MACH_O_PROT_EXECUTE;
1332 seg->initprot = seg->maxprot;
1335 /* Create Mach-O sections. */
1337 for (sec = abfd->sections; sec; sec = sec->next)
1339 sections->bfdsection = sec;
1340 bfd_mach_o_convert_section_name_to_mach_o (abfd, sec, sections);
1341 sections->addr = bfd_get_section_vma (abfd, sec);
1342 sections->size = bfd_get_section_size (sec);
1343 sections->align = bfd_get_section_alignment (abfd, sec);
1345 if (sections->size != 0)
1347 mdata->filelen = FILE_ALIGN (mdata->filelen, sections->align);
1348 sections->offset = mdata->filelen;
1351 sections->offset = 0;
1352 sections->reloff = 0;
1353 sections->nreloc = 0;
1354 sections->reserved1 = 0;
1355 sections->reserved2 = 0;
1356 sections->reserved3 = 0;
1358 sec->filepos = sections->offset;
1359 sec->target_index = ++target_index;
1361 mdata->filelen += sections->size;
1364 seg->filesize = mdata->filelen - seg->fileoff;
1365 seg->vmsize = seg->filesize;
1370 /* Set the contents of a section. */
1373 bfd_mach_o_set_section_contents (bfd *abfd,
1375 const void * location,
1377 bfd_size_type count)
1381 /* This must be done first, because bfd_set_section_contents is
1382 going to set output_has_begun to TRUE. */
1383 if (! abfd->output_has_begun && ! bfd_mach_o_build_commands (abfd))
1389 pos = section->filepos + offset;
1390 if (bfd_seek (abfd, pos, SEEK_SET) != 0
1391 || bfd_bwrite (location, count, abfd) != count)
1398 bfd_mach_o_sizeof_headers (bfd *a ATTRIBUTE_UNUSED,
1399 struct bfd_link_info *info ATTRIBUTE_UNUSED)
1404 /* Make an empty symbol. This is required only because
1405 bfd_make_section_anyway wants to create a symbol for the section. */
1408 bfd_mach_o_make_empty_symbol (bfd *abfd)
1410 asymbol *new_symbol;
1412 new_symbol = bfd_zalloc (abfd, sizeof (bfd_mach_o_asymbol));
1413 if (new_symbol == NULL)
1415 new_symbol->the_bfd = abfd;
1416 new_symbol->udata.i = 0;
1421 bfd_mach_o_read_header (bfd *abfd, bfd_mach_o_header *header)
1423 unsigned char buf[32];
1425 bfd_vma (*get32) (const void *) = NULL;
1427 /* Just read the magic number. */
1428 if (bfd_seek (abfd, 0, SEEK_SET) != 0
1429 || bfd_bread ((void *) buf, 4, abfd) != 4)
1432 if (bfd_getb32 (buf) == BFD_MACH_O_MH_MAGIC)
1434 header->byteorder = BFD_ENDIAN_BIG;
1435 header->magic = BFD_MACH_O_MH_MAGIC;
1436 header->version = 1;
1439 else if (bfd_getl32 (buf) == BFD_MACH_O_MH_MAGIC)
1441 header->byteorder = BFD_ENDIAN_LITTLE;
1442 header->magic = BFD_MACH_O_MH_MAGIC;
1443 header->version = 1;
1446 else if (bfd_getb32 (buf) == BFD_MACH_O_MH_MAGIC_64)
1448 header->byteorder = BFD_ENDIAN_BIG;
1449 header->magic = BFD_MACH_O_MH_MAGIC_64;
1450 header->version = 2;
1453 else if (bfd_getl32 (buf) == BFD_MACH_O_MH_MAGIC_64)
1455 header->byteorder = BFD_ENDIAN_LITTLE;
1456 header->magic = BFD_MACH_O_MH_MAGIC_64;
1457 header->version = 2;
1462 header->byteorder = BFD_ENDIAN_UNKNOWN;
1466 /* Once the size of the header is known, read the full header. */
1467 size = mach_o_wide_p (header) ?
1468 BFD_MACH_O_HEADER_64_SIZE : BFD_MACH_O_HEADER_SIZE;
1470 if (bfd_seek (abfd, 0, SEEK_SET) != 0
1471 || bfd_bread ((void *) buf, size, abfd) != size)
1474 header->cputype = (*get32) (buf + 4);
1475 header->cpusubtype = (*get32) (buf + 8);
1476 header->filetype = (*get32) (buf + 12);
1477 header->ncmds = (*get32) (buf + 16);
1478 header->sizeofcmds = (*get32) (buf + 20);
1479 header->flags = (*get32) (buf + 24);
1481 if (mach_o_wide_p (header))
1482 header->reserved = (*get32) (buf + 28);
1488 bfd_mach_o_make_bfd_section (bfd *abfd, bfd_mach_o_section *section,
1495 bfd_mach_o_convert_section_name_to_bfd (abfd, section, &sname, &flags);
1499 if (flags == SEC_NO_FLAGS)
1501 /* Try to guess flags. */
1502 if (section->flags & BFD_MACH_O_S_ATTR_DEBUG)
1503 flags = SEC_DEBUGGING;
1507 if ((section->flags & BFD_MACH_O_SECTION_TYPE_MASK)
1508 != BFD_MACH_O_S_ZEROFILL)
1511 if (prot & BFD_MACH_O_PROT_EXECUTE)
1513 if (prot & BFD_MACH_O_PROT_WRITE)
1515 else if (prot & BFD_MACH_O_PROT_READ)
1516 flags |= SEC_READONLY;
1522 if ((flags & SEC_DEBUGGING) == 0)
1526 if (section->offset != 0)
1527 flags |= SEC_HAS_CONTENTS;
1528 if (section->nreloc != 0)
1531 bfdsec = bfd_make_section_anyway_with_flags (abfd, sname, flags);
1535 bfdsec->vma = section->addr;
1536 bfdsec->lma = section->addr;
1537 bfdsec->size = section->size;
1538 bfdsec->filepos = section->offset;
1539 bfdsec->alignment_power = section->align;
1540 bfdsec->segment_mark = 0;
1541 bfdsec->reloc_count = section->nreloc;
1542 bfdsec->rel_filepos = section->reloff;
1548 bfd_mach_o_read_section_32 (bfd *abfd,
1549 bfd_mach_o_section *section,
1550 unsigned int offset,
1553 unsigned char buf[BFD_MACH_O_SECTION_SIZE];
1555 if (bfd_seek (abfd, offset, SEEK_SET) != 0
1556 || (bfd_bread ((void *) buf, BFD_MACH_O_SECTION_SIZE, abfd)
1557 != BFD_MACH_O_SECTION_SIZE))
1560 memcpy (section->sectname, buf, 16);
1561 section->sectname[16] = '\0';
1562 memcpy (section->segname, buf + 16, 16);
1563 section->segname[16] = '\0';
1564 section->addr = bfd_h_get_32 (abfd, buf + 32);
1565 section->size = bfd_h_get_32 (abfd, buf + 36);
1566 section->offset = bfd_h_get_32 (abfd, buf + 40);
1567 section->align = bfd_h_get_32 (abfd, buf + 44);
1568 section->reloff = bfd_h_get_32 (abfd, buf + 48);
1569 section->nreloc = bfd_h_get_32 (abfd, buf + 52);
1570 section->flags = bfd_h_get_32 (abfd, buf + 56);
1571 section->reserved1 = bfd_h_get_32 (abfd, buf + 60);
1572 section->reserved2 = bfd_h_get_32 (abfd, buf + 64);
1573 section->reserved3 = 0;
1574 section->bfdsection = bfd_mach_o_make_bfd_section (abfd, section, prot);
1576 if (section->bfdsection == NULL)
1583 bfd_mach_o_read_section_64 (bfd *abfd,
1584 bfd_mach_o_section *section,
1585 unsigned int offset,
1588 unsigned char buf[BFD_MACH_O_SECTION_64_SIZE];
1590 if (bfd_seek (abfd, offset, SEEK_SET) != 0
1591 || (bfd_bread ((void *) buf, BFD_MACH_O_SECTION_64_SIZE, abfd)
1592 != BFD_MACH_O_SECTION_64_SIZE))
1595 memcpy (section->sectname, buf, 16);
1596 section->sectname[16] = '\0';
1597 memcpy (section->segname, buf + 16, 16);
1598 section->segname[16] = '\0';
1599 section->addr = bfd_h_get_64 (abfd, buf + 32);
1600 section->size = bfd_h_get_64 (abfd, buf + 40);
1601 section->offset = bfd_h_get_32 (abfd, buf + 48);
1602 section->align = bfd_h_get_32 (abfd, buf + 52);
1603 section->reloff = bfd_h_get_32 (abfd, buf + 56);
1604 section->nreloc = bfd_h_get_32 (abfd, buf + 60);
1605 section->flags = bfd_h_get_32 (abfd, buf + 64);
1606 section->reserved1 = bfd_h_get_32 (abfd, buf + 68);
1607 section->reserved2 = bfd_h_get_32 (abfd, buf + 72);
1608 section->reserved3 = bfd_h_get_32 (abfd, buf + 76);
1609 section->bfdsection = bfd_mach_o_make_bfd_section (abfd, section, prot);
1611 if (section->bfdsection == NULL)
1618 bfd_mach_o_read_section (bfd *abfd,
1619 bfd_mach_o_section *section,
1620 unsigned int offset,
1625 return bfd_mach_o_read_section_64 (abfd, section, offset, prot);
1627 return bfd_mach_o_read_section_32 (abfd, section, offset, prot);
1631 bfd_mach_o_read_symtab_symbol (bfd *abfd,
1632 bfd_mach_o_symtab_command *sym,
1633 bfd_mach_o_asymbol *s,
1636 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
1637 unsigned int wide = mach_o_wide_p (&mdata->header);
1638 unsigned int symwidth =
1639 wide ? BFD_MACH_O_NLIST_64_SIZE : BFD_MACH_O_NLIST_SIZE;
1640 unsigned int symoff = sym->symoff + (i * symwidth);
1641 unsigned char buf[16];
1642 unsigned char type = -1;
1643 unsigned char section = -1;
1645 symvalue value = -1;
1646 unsigned long stroff = -1;
1647 unsigned int symtype = -1;
1649 BFD_ASSERT (sym->strtab != NULL);
1651 if (bfd_seek (abfd, symoff, SEEK_SET) != 0
1652 || bfd_bread ((void *) buf, symwidth, abfd) != symwidth)
1654 (*_bfd_error_handler) (_("bfd_mach_o_read_symtab_symbol: unable to read %d bytes at %lu"),
1655 symwidth, (unsigned long) symoff);
1659 stroff = bfd_h_get_32 (abfd, buf);
1660 type = bfd_h_get_8 (abfd, buf + 4);
1661 symtype = type & BFD_MACH_O_N_TYPE;
1662 section = bfd_h_get_8 (abfd, buf + 5);
1663 desc = bfd_h_get_16 (abfd, buf + 6);
1665 value = bfd_h_get_64 (abfd, buf + 8);
1667 value = bfd_h_get_32 (abfd, buf + 8);
1669 if (stroff >= sym->strsize)
1671 (*_bfd_error_handler) (_("bfd_mach_o_read_symtab_symbol: symbol name out of range (%lu >= %lu)"),
1672 (unsigned long) stroff,
1673 (unsigned long) sym->strsize);
1677 s->symbol.the_bfd = abfd;
1678 s->symbol.name = sym->strtab + stroff;
1679 s->symbol.value = value;
1680 s->symbol.flags = 0x0;
1681 s->symbol.udata.i = 0;
1683 s->n_sect = section;
1686 if (type & BFD_MACH_O_N_STAB)
1688 s->symbol.flags |= BSF_DEBUGGING;
1689 s->symbol.section = bfd_und_section_ptr;
1701 if ((section > 0) && (section <= mdata->nsects))
1703 s->symbol.section = mdata->sections[section - 1]->bfdsection;
1705 s->symbol.value - mdata->sections[section - 1]->addr;
1712 if (type & BFD_MACH_O_N_PEXT)
1713 s->symbol.flags |= BSF_GLOBAL;
1715 if (type & BFD_MACH_O_N_EXT)
1716 s->symbol.flags |= BSF_GLOBAL;
1718 if (!(type & (BFD_MACH_O_N_PEXT | BFD_MACH_O_N_EXT)))
1719 s->symbol.flags |= BSF_LOCAL;
1723 case BFD_MACH_O_N_UNDF:
1724 if (type == (BFD_MACH_O_N_UNDF | BFD_MACH_O_N_EXT)
1725 && s->symbol.value != 0)
1727 /* A common symbol. */
1728 s->symbol.section = bfd_com_section_ptr;
1729 s->symbol.flags = BSF_NO_FLAGS;
1733 s->symbol.section = bfd_und_section_ptr;
1734 if (s->n_desc & BFD_MACH_O_N_WEAK_REF)
1735 s->symbol.flags |= BSF_WEAK;
1738 case BFD_MACH_O_N_PBUD:
1739 s->symbol.section = bfd_und_section_ptr;
1741 case BFD_MACH_O_N_ABS:
1742 s->symbol.section = bfd_abs_section_ptr;
1744 case BFD_MACH_O_N_SECT:
1745 if ((section > 0) && (section <= mdata->nsects))
1747 s->symbol.section = mdata->sections[section - 1]->bfdsection;
1749 s->symbol.value - mdata->sections[section - 1]->addr;
1753 /* Mach-O uses 0 to mean "no section"; not an error. */
1756 (*_bfd_error_handler) (_("bfd_mach_o_read_symtab_symbol: "
1757 "symbol \"%s\" specified invalid section %d (max %lu): setting to undefined"),
1758 s->symbol.name, section, mdata->nsects);
1760 s->symbol.section = bfd_und_section_ptr;
1763 case BFD_MACH_O_N_INDR:
1764 (*_bfd_error_handler) (_("bfd_mach_o_read_symtab_symbol: "
1765 "symbol \"%s\" is unsupported 'indirect' reference: setting to undefined"),
1767 s->symbol.section = bfd_und_section_ptr;
1770 (*_bfd_error_handler) (_("bfd_mach_o_read_symtab_symbol: "
1771 "symbol \"%s\" specified invalid type field 0x%x: setting to undefined"),
1772 s->symbol.name, symtype);
1773 s->symbol.section = bfd_und_section_ptr;
1782 bfd_mach_o_read_symtab_strtab (bfd *abfd)
1784 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
1785 bfd_mach_o_symtab_command *sym = mdata->symtab;
1787 /* Fail if there is no symtab. */
1791 /* Success if already loaded. */
1795 if (abfd->flags & BFD_IN_MEMORY)
1797 struct bfd_in_memory *b;
1799 b = (struct bfd_in_memory *) abfd->iostream;
1801 if ((sym->stroff + sym->strsize) > b->size)
1803 bfd_set_error (bfd_error_file_truncated);
1806 sym->strtab = (char *) b->buffer + sym->stroff;
1810 sym->strtab = bfd_alloc (abfd, sym->strsize);
1811 if (sym->strtab == NULL)
1814 if (bfd_seek (abfd, sym->stroff, SEEK_SET) != 0
1815 || bfd_bread ((void *) sym->strtab, sym->strsize, abfd) != sym->strsize)
1817 bfd_set_error (bfd_error_file_truncated);
1826 bfd_mach_o_read_symtab_symbols (bfd *abfd)
1828 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
1829 bfd_mach_o_symtab_command *sym = mdata->symtab;
1836 sym->symbols = bfd_alloc (abfd, sym->nsyms * sizeof (bfd_mach_o_asymbol));
1838 if (sym->symbols == NULL)
1840 (*_bfd_error_handler) (_("bfd_mach_o_read_symtab_symbols: unable to allocate memory for symbols"));
1844 ret = bfd_mach_o_read_symtab_strtab (abfd);
1848 for (i = 0; i < sym->nsyms; i++)
1850 ret = bfd_mach_o_read_symtab_symbol (abfd, sym, &sym->symbols[i], i);
1859 bfd_mach_o_read_dysymtab_symbol (bfd *abfd,
1860 bfd_mach_o_dysymtab_command *dysym,
1861 bfd_mach_o_symtab_command *sym,
1862 bfd_mach_o_asymbol *s,
1865 unsigned long isymoff = dysym->indirectsymoff + (i * 4);
1866 unsigned long sym_index;
1867 unsigned char buf[4];
1869 BFD_ASSERT (i < dysym->nindirectsyms);
1871 if (bfd_seek (abfd, isymoff, SEEK_SET) != 0
1872 || bfd_bread ((void *) buf, 4, abfd) != 4)
1874 (*_bfd_error_handler) (_("bfd_mach_o_read_dysymtab_symbol: unable to read %lu bytes at %lu"),
1875 (unsigned long) 4, isymoff);
1878 sym_index = bfd_h_get_32 (abfd, buf);
1880 return bfd_mach_o_read_symtab_symbol (abfd, sym, s, sym_index);
1884 bfd_mach_o_i386_flavour_string (unsigned int flavour)
1886 switch ((int) flavour)
1888 case BFD_MACH_O_x86_THREAD_STATE32: return "x86_THREAD_STATE32";
1889 case BFD_MACH_O_x86_FLOAT_STATE32: return "x86_FLOAT_STATE32";
1890 case BFD_MACH_O_x86_EXCEPTION_STATE32: return "x86_EXCEPTION_STATE32";
1891 case BFD_MACH_O_x86_THREAD_STATE64: return "x86_THREAD_STATE64";
1892 case BFD_MACH_O_x86_FLOAT_STATE64: return "x86_FLOAT_STATE64";
1893 case BFD_MACH_O_x86_EXCEPTION_STATE64: return "x86_EXCEPTION_STATE64";
1894 case BFD_MACH_O_x86_THREAD_STATE: return "x86_THREAD_STATE";
1895 case BFD_MACH_O_x86_FLOAT_STATE: return "x86_FLOAT_STATE";
1896 case BFD_MACH_O_x86_EXCEPTION_STATE: return "x86_EXCEPTION_STATE";
1897 case BFD_MACH_O_x86_DEBUG_STATE32: return "x86_DEBUG_STATE32";
1898 case BFD_MACH_O_x86_DEBUG_STATE64: return "x86_DEBUG_STATE64";
1899 case BFD_MACH_O_x86_DEBUG_STATE: return "x86_DEBUG_STATE";
1900 case BFD_MACH_O_x86_THREAD_STATE_NONE: return "x86_THREAD_STATE_NONE";
1901 default: return "UNKNOWN";
1906 bfd_mach_o_ppc_flavour_string (unsigned int flavour)
1908 switch ((int) flavour)
1910 case BFD_MACH_O_PPC_THREAD_STATE: return "PPC_THREAD_STATE";
1911 case BFD_MACH_O_PPC_FLOAT_STATE: return "PPC_FLOAT_STATE";
1912 case BFD_MACH_O_PPC_EXCEPTION_STATE: return "PPC_EXCEPTION_STATE";
1913 case BFD_MACH_O_PPC_VECTOR_STATE: return "PPC_VECTOR_STATE";
1914 case BFD_MACH_O_PPC_THREAD_STATE64: return "PPC_THREAD_STATE64";
1915 case BFD_MACH_O_PPC_EXCEPTION_STATE64: return "PPC_EXCEPTION_STATE64";
1916 default: return "UNKNOWN";
1921 bfd_mach_o_read_dylinker (bfd *abfd, bfd_mach_o_load_command *command)
1923 bfd_mach_o_dylinker_command *cmd = &command->command.dylinker;
1924 unsigned char buf[4];
1925 unsigned int nameoff;
1927 BFD_ASSERT ((command->type == BFD_MACH_O_LC_ID_DYLINKER)
1928 || (command->type == BFD_MACH_O_LC_LOAD_DYLINKER));
1930 if (bfd_seek (abfd, command->offset + 8, SEEK_SET) != 0
1931 || bfd_bread ((void *) buf, 4, abfd) != 4)
1934 nameoff = bfd_h_get_32 (abfd, buf + 0);
1936 cmd->name_offset = command->offset + nameoff;
1937 cmd->name_len = command->len - nameoff;
1938 cmd->name_str = bfd_alloc (abfd, cmd->name_len);
1939 if (cmd->name_str == NULL)
1941 if (bfd_seek (abfd, cmd->name_offset, SEEK_SET) != 0
1942 || bfd_bread (cmd->name_str, cmd->name_len, abfd) != cmd->name_len)
1948 bfd_mach_o_read_dylib (bfd *abfd, bfd_mach_o_load_command *command)
1950 bfd_mach_o_dylib_command *cmd = &command->command.dylib;
1951 unsigned char buf[16];
1952 unsigned int nameoff;
1954 switch (command->type)
1956 case BFD_MACH_O_LC_LOAD_DYLIB:
1957 case BFD_MACH_O_LC_LOAD_WEAK_DYLIB:
1958 case BFD_MACH_O_LC_ID_DYLIB:
1959 case BFD_MACH_O_LC_REEXPORT_DYLIB:
1966 if (bfd_seek (abfd, command->offset + 8, SEEK_SET) != 0
1967 || bfd_bread ((void *) buf, 16, abfd) != 16)
1970 nameoff = bfd_h_get_32 (abfd, buf + 0);
1971 cmd->timestamp = bfd_h_get_32 (abfd, buf + 4);
1972 cmd->current_version = bfd_h_get_32 (abfd, buf + 8);
1973 cmd->compatibility_version = bfd_h_get_32 (abfd, buf + 12);
1975 cmd->name_offset = command->offset + nameoff;
1976 cmd->name_len = command->len - nameoff;
1977 cmd->name_str = bfd_alloc (abfd, cmd->name_len);
1978 if (cmd->name_str == NULL)
1980 if (bfd_seek (abfd, cmd->name_offset, SEEK_SET) != 0
1981 || bfd_bread (cmd->name_str, cmd->name_len, abfd) != cmd->name_len)
1987 bfd_mach_o_read_prebound_dylib (bfd *abfd ATTRIBUTE_UNUSED,
1988 bfd_mach_o_load_command *command ATTRIBUTE_UNUSED)
1990 /* bfd_mach_o_prebound_dylib_command *cmd = &command->command.prebound_dylib; */
1992 BFD_ASSERT (command->type == BFD_MACH_O_LC_PREBOUND_DYLIB);
1997 bfd_mach_o_read_thread (bfd *abfd, bfd_mach_o_load_command *command)
1999 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
2000 bfd_mach_o_thread_command *cmd = &command->command.thread;
2001 unsigned char buf[8];
2002 unsigned int offset;
2003 unsigned int nflavours;
2006 BFD_ASSERT ((command->type == BFD_MACH_O_LC_THREAD)
2007 || (command->type == BFD_MACH_O_LC_UNIXTHREAD));
2009 /* Count the number of threads. */
2012 while (offset != command->len)
2014 if (offset >= command->len)
2017 if (bfd_seek (abfd, command->offset + offset, SEEK_SET) != 0
2018 || bfd_bread ((void *) buf, 8, abfd) != 8)
2021 offset += 8 + bfd_h_get_32 (abfd, buf + 4) * 4;
2025 /* Allocate threads. */
2026 cmd->flavours = bfd_alloc
2027 (abfd, nflavours * sizeof (bfd_mach_o_thread_flavour));
2028 if (cmd->flavours == NULL)
2030 cmd->nflavours = nflavours;
2034 while (offset != command->len)
2036 if (offset >= command->len)
2039 if (nflavours >= cmd->nflavours)
2042 if (bfd_seek (abfd, command->offset + offset, SEEK_SET) != 0
2043 || bfd_bread ((void *) buf, 8, abfd) != 8)
2046 cmd->flavours[nflavours].flavour = bfd_h_get_32 (abfd, buf);
2047 cmd->flavours[nflavours].offset = command->offset + offset + 8;
2048 cmd->flavours[nflavours].size = bfd_h_get_32 (abfd, buf + 4) * 4;
2049 offset += cmd->flavours[nflavours].size + 8;
2053 for (i = 0; i < nflavours; i++)
2056 unsigned int snamelen;
2058 const char *flavourstr;
2059 const char *prefix = "LC_THREAD";
2062 switch (mdata->header.cputype)
2064 case BFD_MACH_O_CPU_TYPE_POWERPC:
2065 case BFD_MACH_O_CPU_TYPE_POWERPC_64:
2066 flavourstr = bfd_mach_o_ppc_flavour_string (cmd->flavours[i].flavour);
2068 case BFD_MACH_O_CPU_TYPE_I386:
2069 case BFD_MACH_O_CPU_TYPE_X86_64:
2070 flavourstr = bfd_mach_o_i386_flavour_string (cmd->flavours[i].flavour);
2073 flavourstr = "UNKNOWN_ARCHITECTURE";
2077 snamelen = strlen (prefix) + 1 + 20 + 1 + strlen (flavourstr) + 1;
2078 sname = bfd_alloc (abfd, snamelen);
2084 sprintf (sname, "%s.%s.%u", prefix, flavourstr, j);
2085 if (bfd_get_section_by_name (abfd, sname) == NULL)
2090 bfdsec = bfd_make_section_with_flags (abfd, sname, SEC_HAS_CONTENTS);
2094 bfdsec->size = cmd->flavours[i].size;
2095 bfdsec->filepos = cmd->flavours[i].offset;
2096 bfdsec->alignment_power = 0x0;
2098 cmd->section = bfdsec;
2105 bfd_mach_o_read_dysymtab (bfd *abfd, bfd_mach_o_load_command *command)
2107 bfd_mach_o_dysymtab_command *cmd = &command->command.dysymtab;
2108 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
2109 unsigned char buf[72];
2111 BFD_ASSERT (command->type == BFD_MACH_O_LC_DYSYMTAB);
2113 if (bfd_seek (abfd, command->offset + 8, SEEK_SET) != 0
2114 || bfd_bread ((void *) buf, 72, abfd) != 72)
2117 cmd->ilocalsym = bfd_h_get_32 (abfd, buf + 0);
2118 cmd->nlocalsym = bfd_h_get_32 (abfd, buf + 4);
2119 cmd->iextdefsym = bfd_h_get_32 (abfd, buf + 8);
2120 cmd->nextdefsym = bfd_h_get_32 (abfd, buf + 12);
2121 cmd->iundefsym = bfd_h_get_32 (abfd, buf + 16);
2122 cmd->nundefsym = bfd_h_get_32 (abfd, buf + 20);
2123 cmd->tocoff = bfd_h_get_32 (abfd, buf + 24);
2124 cmd->ntoc = bfd_h_get_32 (abfd, buf + 28);
2125 cmd->modtaboff = bfd_h_get_32 (abfd, buf + 32);
2126 cmd->nmodtab = bfd_h_get_32 (abfd, buf + 36);
2127 cmd->extrefsymoff = bfd_h_get_32 (abfd, buf + 40);
2128 cmd->nextrefsyms = bfd_h_get_32 (abfd, buf + 44);
2129 cmd->indirectsymoff = bfd_h_get_32 (abfd, buf + 48);
2130 cmd->nindirectsyms = bfd_h_get_32 (abfd, buf + 52);
2131 cmd->extreloff = bfd_h_get_32 (abfd, buf + 56);
2132 cmd->nextrel = bfd_h_get_32 (abfd, buf + 60);
2133 cmd->locreloff = bfd_h_get_32 (abfd, buf + 64);
2134 cmd->nlocrel = bfd_h_get_32 (abfd, buf + 68);
2136 if (cmd->nmodtab != 0)
2139 int wide = bfd_mach_o_wide_p (abfd);
2140 unsigned int module_len = wide ? 56 : 52;
2143 bfd_alloc (abfd, cmd->nmodtab * sizeof (bfd_mach_o_dylib_module));
2144 if (cmd->dylib_module == NULL)
2147 if (bfd_seek (abfd, cmd->modtaboff, SEEK_SET) != 0)
2150 for (i = 0; i < cmd->nmodtab; i++)
2152 bfd_mach_o_dylib_module *module = &cmd->dylib_module[i];
2155 if (bfd_bread ((void *) buf, module_len, abfd) != module_len)
2158 module->module_name_idx = bfd_h_get_32 (abfd, buf + 0);
2159 module->iextdefsym = bfd_h_get_32 (abfd, buf + 4);
2160 module->nextdefsym = bfd_h_get_32 (abfd, buf + 8);
2161 module->irefsym = bfd_h_get_32 (abfd, buf + 12);
2162 module->nrefsym = bfd_h_get_32 (abfd, buf + 16);
2163 module->ilocalsym = bfd_h_get_32 (abfd, buf + 20);
2164 module->nlocalsym = bfd_h_get_32 (abfd, buf + 24);
2165 module->iextrel = bfd_h_get_32 (abfd, buf + 28);
2166 module->nextrel = bfd_h_get_32 (abfd, buf + 32);
2167 v = bfd_h_get_32 (abfd, buf +36);
2168 module->iinit = v & 0xffff;
2169 module->iterm = (v >> 16) & 0xffff;
2170 v = bfd_h_get_32 (abfd, buf + 40);
2171 module->ninit = v & 0xffff;
2172 module->nterm = (v >> 16) & 0xffff;
2175 module->objc_module_info_size = bfd_h_get_32 (abfd, buf + 44);
2176 module->objc_module_info_addr = bfd_h_get_64 (abfd, buf + 48);
2180 module->objc_module_info_addr = bfd_h_get_32 (abfd, buf + 44);
2181 module->objc_module_info_size = bfd_h_get_32 (abfd, buf + 48);
2190 cmd->dylib_toc = bfd_alloc
2191 (abfd, cmd->ntoc * sizeof (bfd_mach_o_dylib_table_of_content));
2192 if (cmd->dylib_toc == NULL)
2195 if (bfd_seek (abfd, cmd->tocoff, SEEK_SET) != 0)
2198 for (i = 0; i < cmd->ntoc; i++)
2200 bfd_mach_o_dylib_table_of_content *toc = &cmd->dylib_toc[i];
2202 if (bfd_bread ((void *) buf, 8, abfd) != 8)
2205 toc->symbol_index = bfd_h_get_32 (abfd, buf + 0);
2206 toc->module_index = bfd_h_get_32 (abfd, buf + 4);
2210 if (cmd->nindirectsyms != 0)
2214 cmd->indirect_syms = bfd_alloc
2215 (abfd, cmd->nindirectsyms * sizeof (unsigned int));
2216 if (cmd->indirect_syms == NULL)
2219 if (bfd_seek (abfd, cmd->indirectsymoff, SEEK_SET) != 0)
2222 for (i = 0; i < cmd->nindirectsyms; i++)
2224 unsigned int *is = &cmd->indirect_syms[i];
2226 if (bfd_bread ((void *) buf, 4, abfd) != 4)
2229 *is = bfd_h_get_32 (abfd, buf + 0);
2233 if (cmd->nextrefsyms != 0)
2238 cmd->ext_refs = bfd_alloc
2239 (abfd, cmd->nextrefsyms * sizeof (bfd_mach_o_dylib_reference));
2240 if (cmd->ext_refs == NULL)
2243 if (bfd_seek (abfd, cmd->extrefsymoff, SEEK_SET) != 0)
2246 for (i = 0; i < cmd->nextrefsyms; i++)
2248 bfd_mach_o_dylib_reference *ref = &cmd->ext_refs[i];
2250 if (bfd_bread ((void *) buf, 4, abfd) != 4)
2253 /* Fields isym and flags are written as bit-fields, thus we need
2254 a specific processing for endianness. */
2255 v = bfd_h_get_32 (abfd, buf + 0);
2256 if (bfd_big_endian (abfd))
2258 ref->isym = (v >> 8) & 0xffffff;
2259 ref->flags = v & 0xff;
2263 ref->isym = v & 0xffffff;
2264 ref->flags = (v >> 24) & 0xff;
2269 if (mdata->dysymtab)
2271 mdata->dysymtab = cmd;
2277 bfd_mach_o_read_symtab (bfd *abfd, bfd_mach_o_load_command *command)
2279 bfd_mach_o_symtab_command *symtab = &command->command.symtab;
2280 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
2281 unsigned char buf[16];
2283 BFD_ASSERT (command->type == BFD_MACH_O_LC_SYMTAB);
2285 if (bfd_seek (abfd, command->offset + 8, SEEK_SET) != 0
2286 || bfd_bread ((void *) buf, 16, abfd) != 16)
2289 symtab->symoff = bfd_h_get_32 (abfd, buf);
2290 symtab->nsyms = bfd_h_get_32 (abfd, buf + 4);
2291 symtab->stroff = bfd_h_get_32 (abfd, buf + 8);
2292 symtab->strsize = bfd_h_get_32 (abfd, buf + 12);
2293 symtab->symbols = NULL;
2294 symtab->strtab = NULL;
2296 if (symtab->nsyms != 0)
2297 abfd->flags |= HAS_SYMS;
2301 mdata->symtab = symtab;
2306 bfd_mach_o_read_uuid (bfd *abfd, bfd_mach_o_load_command *command)
2308 bfd_mach_o_uuid_command *cmd = &command->command.uuid;
2310 BFD_ASSERT (command->type == BFD_MACH_O_LC_UUID);
2312 if (bfd_seek (abfd, command->offset + 8, SEEK_SET) != 0
2313 || bfd_bread ((void *) cmd->uuid, 16, abfd) != 16)
2320 bfd_mach_o_read_linkedit (bfd *abfd, bfd_mach_o_load_command *command)
2322 bfd_mach_o_linkedit_command *cmd = &command->command.linkedit;
2325 if (bfd_seek (abfd, command->offset + 8, SEEK_SET) != 0
2326 || bfd_bread ((void *) buf, 8, abfd) != 8)
2329 cmd->dataoff = bfd_get_32 (abfd, buf + 0);
2330 cmd->datasize = bfd_get_32 (abfd, buf + 4);
2335 bfd_mach_o_read_str (bfd *abfd, bfd_mach_o_load_command *command)
2337 bfd_mach_o_str_command *cmd = &command->command.str;
2341 if (bfd_seek (abfd, command->offset + 8, SEEK_SET) != 0
2342 || bfd_bread ((void *) buf, 4, abfd) != 4)
2345 off = bfd_get_32 (abfd, buf + 0);
2346 cmd->stroff = command->offset + off;
2347 cmd->str_len = command->len - off;
2348 cmd->str = bfd_alloc (abfd, cmd->str_len);
2349 if (cmd->str == NULL)
2351 if (bfd_seek (abfd, cmd->stroff, SEEK_SET) != 0
2352 || bfd_bread ((void *) cmd->str, cmd->str_len, abfd) != cmd->str_len)
2358 bfd_mach_o_read_dyld_info (bfd *abfd, bfd_mach_o_load_command *command)
2360 bfd_mach_o_dyld_info_command *cmd = &command->command.dyld_info;
2363 if (bfd_seek (abfd, command->offset + 8, SEEK_SET) != 0
2364 || bfd_bread ((void *) buf, sizeof (buf), abfd) != sizeof (buf))
2367 cmd->rebase_off = bfd_get_32 (abfd, buf + 0);
2368 cmd->rebase_size = bfd_get_32 (abfd, buf + 4);
2369 cmd->bind_off = bfd_get_32 (abfd, buf + 8);
2370 cmd->bind_size = bfd_get_32 (abfd, buf + 12);
2371 cmd->weak_bind_off = bfd_get_32 (abfd, buf + 16);
2372 cmd->weak_bind_size = bfd_get_32 (abfd, buf + 20);
2373 cmd->lazy_bind_off = bfd_get_32 (abfd, buf + 24);
2374 cmd->lazy_bind_size = bfd_get_32 (abfd, buf + 28);
2375 cmd->export_off = bfd_get_32 (abfd, buf + 32);
2376 cmd->export_size = bfd_get_32 (abfd, buf + 36);
2381 bfd_mach_o_read_segment (bfd *abfd,
2382 bfd_mach_o_load_command *command,
2385 unsigned char buf[64];
2386 bfd_mach_o_segment_command *seg = &command->command.segment;
2391 BFD_ASSERT (command->type == BFD_MACH_O_LC_SEGMENT_64);
2393 if (bfd_seek (abfd, command->offset + 8, SEEK_SET) != 0
2394 || bfd_bread ((void *) buf, 64, abfd) != 64)
2397 memcpy (seg->segname, buf, 16);
2398 seg->segname[16] = '\0';
2400 seg->vmaddr = bfd_h_get_64 (abfd, buf + 16);
2401 seg->vmsize = bfd_h_get_64 (abfd, buf + 24);
2402 seg->fileoff = bfd_h_get_64 (abfd, buf + 32);
2403 seg->filesize = bfd_h_get_64 (abfd, buf + 40);
2404 seg->maxprot = bfd_h_get_32 (abfd, buf + 48);
2405 seg->initprot = bfd_h_get_32 (abfd, buf + 52);
2406 seg->nsects = bfd_h_get_32 (abfd, buf + 56);
2407 seg->flags = bfd_h_get_32 (abfd, buf + 60);
2411 BFD_ASSERT (command->type == BFD_MACH_O_LC_SEGMENT);
2413 if (bfd_seek (abfd, command->offset + 8, SEEK_SET) != 0
2414 || bfd_bread ((void *) buf, 48, abfd) != 48)
2417 memcpy (seg->segname, buf, 16);
2418 seg->segname[16] = '\0';
2420 seg->vmaddr = bfd_h_get_32 (abfd, buf + 16);
2421 seg->vmsize = bfd_h_get_32 (abfd, buf + 20);
2422 seg->fileoff = bfd_h_get_32 (abfd, buf + 24);
2423 seg->filesize = bfd_h_get_32 (abfd, buf + 28);
2424 seg->maxprot = bfd_h_get_32 (abfd, buf + 32);
2425 seg->initprot = bfd_h_get_32 (abfd, buf + 36);
2426 seg->nsects = bfd_h_get_32 (abfd, buf + 40);
2427 seg->flags = bfd_h_get_32 (abfd, buf + 44);
2430 if (seg->nsects != 0)
2432 seg->sections = bfd_alloc (abfd, seg->nsects
2433 * sizeof (bfd_mach_o_section));
2434 if (seg->sections == NULL)
2437 for (i = 0; i < seg->nsects; i++)
2441 segoff = command->offset + BFD_MACH_O_LC_SEGMENT_64_SIZE
2442 + (i * BFD_MACH_O_SECTION_64_SIZE);
2444 segoff = command->offset + BFD_MACH_O_LC_SEGMENT_SIZE
2445 + (i * BFD_MACH_O_SECTION_SIZE);
2447 if (bfd_mach_o_read_section
2448 (abfd, &seg->sections[i], segoff, seg->initprot, wide) != 0)
2457 bfd_mach_o_read_segment_32 (bfd *abfd, bfd_mach_o_load_command *command)
2459 return bfd_mach_o_read_segment (abfd, command, 0);
2463 bfd_mach_o_read_segment_64 (bfd *abfd, bfd_mach_o_load_command *command)
2465 return bfd_mach_o_read_segment (abfd, command, 1);
2469 bfd_mach_o_read_command (bfd *abfd, bfd_mach_o_load_command *command)
2471 unsigned char buf[8];
2473 /* Read command type and length. */
2474 if (bfd_seek (abfd, command->offset, SEEK_SET) != 0
2475 || bfd_bread ((void *) buf, 8, abfd) != 8)
2478 command->type = bfd_h_get_32 (abfd, buf) & ~BFD_MACH_O_LC_REQ_DYLD;
2479 command->type_required = (bfd_h_get_32 (abfd, buf) & BFD_MACH_O_LC_REQ_DYLD
2481 command->len = bfd_h_get_32 (abfd, buf + 4);
2483 switch (command->type)
2485 case BFD_MACH_O_LC_SEGMENT:
2486 if (bfd_mach_o_read_segment_32 (abfd, command) != 0)
2489 case BFD_MACH_O_LC_SEGMENT_64:
2490 if (bfd_mach_o_read_segment_64 (abfd, command) != 0)
2493 case BFD_MACH_O_LC_SYMTAB:
2494 if (bfd_mach_o_read_symtab (abfd, command) != 0)
2497 case BFD_MACH_O_LC_SYMSEG:
2499 case BFD_MACH_O_LC_THREAD:
2500 case BFD_MACH_O_LC_UNIXTHREAD:
2501 if (bfd_mach_o_read_thread (abfd, command) != 0)
2504 case BFD_MACH_O_LC_LOAD_DYLINKER:
2505 case BFD_MACH_O_LC_ID_DYLINKER:
2506 if (bfd_mach_o_read_dylinker (abfd, command) != 0)
2509 case BFD_MACH_O_LC_LOAD_DYLIB:
2510 case BFD_MACH_O_LC_ID_DYLIB:
2511 case BFD_MACH_O_LC_LOAD_WEAK_DYLIB:
2512 case BFD_MACH_O_LC_REEXPORT_DYLIB:
2513 if (bfd_mach_o_read_dylib (abfd, command) != 0)
2516 case BFD_MACH_O_LC_PREBOUND_DYLIB:
2517 if (bfd_mach_o_read_prebound_dylib (abfd, command) != 0)
2520 case BFD_MACH_O_LC_LOADFVMLIB:
2521 case BFD_MACH_O_LC_IDFVMLIB:
2522 case BFD_MACH_O_LC_IDENT:
2523 case BFD_MACH_O_LC_FVMFILE:
2524 case BFD_MACH_O_LC_PREPAGE:
2525 case BFD_MACH_O_LC_ROUTINES:
2527 case BFD_MACH_O_LC_SUB_FRAMEWORK:
2528 case BFD_MACH_O_LC_SUB_UMBRELLA:
2529 case BFD_MACH_O_LC_SUB_LIBRARY:
2530 case BFD_MACH_O_LC_SUB_CLIENT:
2531 case BFD_MACH_O_LC_RPATH:
2532 if (bfd_mach_o_read_str (abfd, command) != 0)
2535 case BFD_MACH_O_LC_DYSYMTAB:
2536 if (bfd_mach_o_read_dysymtab (abfd, command) != 0)
2539 case BFD_MACH_O_LC_TWOLEVEL_HINTS:
2540 case BFD_MACH_O_LC_PREBIND_CKSUM:
2542 case BFD_MACH_O_LC_UUID:
2543 if (bfd_mach_o_read_uuid (abfd, command) != 0)
2546 case BFD_MACH_O_LC_CODE_SIGNATURE:
2547 case BFD_MACH_O_LC_SEGMENT_SPLIT_INFO:
2548 if (bfd_mach_o_read_linkedit (abfd, command) != 0)
2551 case BFD_MACH_O_LC_DYLD_INFO:
2552 if (bfd_mach_o_read_dyld_info (abfd, command) != 0)
2556 (*_bfd_error_handler) (_("unable to read unknown load command 0x%lx"),
2557 (unsigned long) command->type);
2565 bfd_mach_o_flatten_sections (bfd *abfd)
2567 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
2571 /* Count total number of sections. */
2574 for (i = 0; i < mdata->header.ncmds; i++)
2576 if (mdata->commands[i].type == BFD_MACH_O_LC_SEGMENT
2577 || mdata->commands[i].type == BFD_MACH_O_LC_SEGMENT_64)
2579 bfd_mach_o_segment_command *seg;
2581 seg = &mdata->commands[i].command.segment;
2582 mdata->nsects += seg->nsects;
2586 /* Allocate sections array. */
2587 mdata->sections = bfd_alloc (abfd,
2588 mdata->nsects * sizeof (bfd_mach_o_section *));
2590 /* Fill the array. */
2593 for (i = 0; i < mdata->header.ncmds; i++)
2595 if (mdata->commands[i].type == BFD_MACH_O_LC_SEGMENT
2596 || mdata->commands[i].type == BFD_MACH_O_LC_SEGMENT_64)
2598 bfd_mach_o_segment_command *seg;
2600 seg = &mdata->commands[i].command.segment;
2601 BFD_ASSERT (csect + seg->nsects <= mdata->nsects);
2603 for (j = 0; j < seg->nsects; j++)
2604 mdata->sections[csect++] = &seg->sections[j];
2610 bfd_mach_o_scan_start_address (bfd *abfd)
2612 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
2613 bfd_mach_o_thread_command *cmd = NULL;
2616 for (i = 0; i < mdata->header.ncmds; i++)
2618 if ((mdata->commands[i].type == BFD_MACH_O_LC_THREAD) ||
2619 (mdata->commands[i].type == BFD_MACH_O_LC_UNIXTHREAD))
2622 cmd = &mdata->commands[i].command.thread;
2631 for (i = 0; i < cmd->nflavours; i++)
2633 if ((mdata->header.cputype == BFD_MACH_O_CPU_TYPE_I386)
2634 && (cmd->flavours[i].flavour
2635 == (unsigned long) BFD_MACH_O_x86_THREAD_STATE32))
2637 unsigned char buf[4];
2639 if (bfd_seek (abfd, cmd->flavours[i].offset + 40, SEEK_SET) != 0
2640 || bfd_bread (buf, 4, abfd) != 4)
2643 abfd->start_address = bfd_h_get_32 (abfd, buf);
2645 else if ((mdata->header.cputype == BFD_MACH_O_CPU_TYPE_POWERPC)
2646 && (cmd->flavours[i].flavour == BFD_MACH_O_PPC_THREAD_STATE))
2648 unsigned char buf[4];
2650 if (bfd_seek (abfd, cmd->flavours[i].offset + 0, SEEK_SET) != 0
2651 || bfd_bread (buf, 4, abfd) != 4)
2654 abfd->start_address = bfd_h_get_32 (abfd, buf);
2656 else if ((mdata->header.cputype == BFD_MACH_O_CPU_TYPE_POWERPC_64)
2657 && (cmd->flavours[i].flavour == BFD_MACH_O_PPC_THREAD_STATE64))
2659 unsigned char buf[8];
2661 if (bfd_seek (abfd, cmd->flavours[i].offset + 0, SEEK_SET) != 0
2662 || bfd_bread (buf, 8, abfd) != 8)
2665 abfd->start_address = bfd_h_get_64 (abfd, buf);
2667 else if ((mdata->header.cputype == BFD_MACH_O_CPU_TYPE_X86_64)
2668 && (cmd->flavours[i].flavour == BFD_MACH_O_x86_THREAD_STATE64))
2670 unsigned char buf[8];
2672 if (bfd_seek (abfd, cmd->flavours[i].offset + (16 * 8), SEEK_SET) != 0
2673 || bfd_bread (buf, 8, abfd) != 8)
2676 abfd->start_address = bfd_h_get_64 (abfd, buf);
2684 bfd_mach_o_set_arch_mach (bfd *abfd,
2685 enum bfd_architecture arch,
2686 unsigned long machine)
2688 bfd_mach_o_backend_data *bed = bfd_mach_o_get_backend_data (abfd);
2690 /* If this isn't the right architecture for this backend, and this
2691 isn't the generic backend, fail. */
2692 if (arch != bed->arch
2693 && arch != bfd_arch_unknown
2694 && bed->arch != bfd_arch_unknown)
2697 return bfd_default_set_arch_mach (abfd, arch, machine);
2701 bfd_mach_o_scan (bfd *abfd,
2702 bfd_mach_o_header *header,
2703 bfd_mach_o_data_struct *mdata)
2706 enum bfd_architecture cputype;
2707 unsigned long cpusubtype;
2708 unsigned int hdrsize;
2710 hdrsize = mach_o_wide_p (header) ?
2711 BFD_MACH_O_HEADER_64_SIZE : BFD_MACH_O_HEADER_SIZE;
2713 mdata->header = *header;
2715 abfd->flags = abfd->flags & BFD_IN_MEMORY;
2716 switch (header->filetype)
2718 case BFD_MACH_O_MH_OBJECT:
2719 abfd->flags |= HAS_RELOC;
2721 case BFD_MACH_O_MH_EXECUTE:
2722 abfd->flags |= EXEC_P;
2724 case BFD_MACH_O_MH_DYLIB:
2725 case BFD_MACH_O_MH_BUNDLE:
2726 abfd->flags |= DYNAMIC;
2730 abfd->tdata.mach_o_data = mdata;
2732 bfd_mach_o_convert_architecture (header->cputype, header->cpusubtype,
2733 &cputype, &cpusubtype);
2734 if (cputype == bfd_arch_unknown)
2736 (*_bfd_error_handler) (_("bfd_mach_o_scan: unknown architecture 0x%lx/0x%lx"),
2737 header->cputype, header->cpusubtype);
2741 bfd_set_arch_mach (abfd, cputype, cpusubtype);
2743 if (header->ncmds != 0)
2745 mdata->commands = bfd_alloc
2746 (abfd, header->ncmds * sizeof (bfd_mach_o_load_command));
2747 if (mdata->commands == NULL)
2750 for (i = 0; i < header->ncmds; i++)
2752 bfd_mach_o_load_command *cur = &mdata->commands[i];
2755 cur->offset = hdrsize;
2758 bfd_mach_o_load_command *prev = &mdata->commands[i - 1];
2759 cur->offset = prev->offset + prev->len;
2762 if (bfd_mach_o_read_command (abfd, cur) < 0)
2767 if (bfd_mach_o_scan_start_address (abfd) < 0)
2770 bfd_mach_o_flatten_sections (abfd);
2775 bfd_mach_o_mkobject_init (bfd *abfd)
2777 bfd_mach_o_data_struct *mdata = NULL;
2779 mdata = bfd_alloc (abfd, sizeof (bfd_mach_o_data_struct));
2782 abfd->tdata.mach_o_data = mdata;
2784 mdata->header.magic = 0;
2785 mdata->header.cputype = 0;
2786 mdata->header.cpusubtype = 0;
2787 mdata->header.filetype = 0;
2788 mdata->header.ncmds = 0;
2789 mdata->header.sizeofcmds = 0;
2790 mdata->header.flags = 0;
2791 mdata->header.byteorder = BFD_ENDIAN_UNKNOWN;
2792 mdata->commands = NULL;
2794 mdata->sections = NULL;
2800 bfd_mach_o_gen_mkobject (bfd *abfd)
2802 bfd_mach_o_data_struct *mdata;
2804 if (!bfd_mach_o_mkobject_init (abfd))
2807 mdata = bfd_mach_o_get_data (abfd);
2808 mdata->header.magic = BFD_MACH_O_MH_MAGIC;
2809 mdata->header.cputype = 0;
2810 mdata->header.cpusubtype = 0;
2811 mdata->header.byteorder = abfd->xvec->byteorder;
2812 mdata->header.version = 1;
2818 bfd_mach_o_header_p (bfd *abfd,
2819 bfd_mach_o_filetype filetype,
2820 bfd_mach_o_cpu_type cputype)
2822 struct bfd_preserve preserve;
2823 bfd_mach_o_header header;
2825 preserve.marker = NULL;
2826 if (!bfd_mach_o_read_header (abfd, &header))
2829 if (! (header.byteorder == BFD_ENDIAN_BIG
2830 || header.byteorder == BFD_ENDIAN_LITTLE))
2832 (*_bfd_error_handler) (_("unknown header byte-order value 0x%lx"),
2833 (unsigned long) header.byteorder);
2837 if (! ((header.byteorder == BFD_ENDIAN_BIG
2838 && abfd->xvec->byteorder == BFD_ENDIAN_BIG
2839 && abfd->xvec->header_byteorder == BFD_ENDIAN_BIG)
2840 || (header.byteorder == BFD_ENDIAN_LITTLE
2841 && abfd->xvec->byteorder == BFD_ENDIAN_LITTLE
2842 && abfd->xvec->header_byteorder == BFD_ENDIAN_LITTLE)))
2845 /* Check cputype and filetype.
2846 In case of wildcard, do not accept magics that are handled by existing
2850 if (header.cputype != cputype)
2855 switch (header.cputype)
2857 case BFD_MACH_O_CPU_TYPE_I386:
2858 /* Handled by mach-o-i386 */
2866 if (header.filetype != filetype)
2871 switch (header.filetype)
2873 case BFD_MACH_O_MH_CORE:
2874 /* Handled by core_p */
2881 preserve.marker = bfd_zalloc (abfd, sizeof (bfd_mach_o_data_struct));
2882 if (preserve.marker == NULL
2883 || !bfd_preserve_save (abfd, &preserve))
2886 if (bfd_mach_o_scan (abfd, &header,
2887 (bfd_mach_o_data_struct *) preserve.marker) != 0)
2890 bfd_preserve_finish (abfd, &preserve);
2894 bfd_set_error (bfd_error_wrong_format);
2897 if (preserve.marker != NULL)
2898 bfd_preserve_restore (abfd, &preserve);
2902 static const bfd_target *
2903 bfd_mach_o_gen_object_p (bfd *abfd)
2905 return bfd_mach_o_header_p (abfd, 0, 0);
2908 static const bfd_target *
2909 bfd_mach_o_gen_core_p (bfd *abfd)
2911 return bfd_mach_o_header_p (abfd, BFD_MACH_O_MH_CORE, 0);
2914 typedef struct mach_o_fat_archentry
2916 unsigned long cputype;
2917 unsigned long cpusubtype;
2918 unsigned long offset;
2920 unsigned long align;
2921 } mach_o_fat_archentry;
2923 typedef struct mach_o_fat_data_struct
2925 unsigned long magic;
2926 unsigned long nfat_arch;
2927 mach_o_fat_archentry *archentries;
2928 } mach_o_fat_data_struct;
2931 bfd_mach_o_archive_p (bfd *abfd)
2933 mach_o_fat_data_struct *adata = NULL;
2934 unsigned char buf[20];
2937 if (bfd_seek (abfd, 0, SEEK_SET) != 0
2938 || bfd_bread ((void *) buf, 8, abfd) != 8)
2941 adata = bfd_alloc (abfd, sizeof (mach_o_fat_data_struct));
2945 adata->magic = bfd_getb32 (buf);
2946 adata->nfat_arch = bfd_getb32 (buf + 4);
2947 if (adata->magic != 0xcafebabe)
2949 /* Avoid matching Java bytecode files, which have the same magic number.
2950 In the Java bytecode file format this field contains the JVM version,
2951 which starts at 43.0. */
2952 if (adata->nfat_arch > 30)
2955 adata->archentries =
2956 bfd_alloc (abfd, adata->nfat_arch * sizeof (mach_o_fat_archentry));
2957 if (adata->archentries == NULL)
2960 for (i = 0; i < adata->nfat_arch; i++)
2962 if (bfd_seek (abfd, 8 + 20 * i, SEEK_SET) != 0
2963 || bfd_bread ((void *) buf, 20, abfd) != 20)
2965 adata->archentries[i].cputype = bfd_getb32 (buf);
2966 adata->archentries[i].cpusubtype = bfd_getb32 (buf + 4);
2967 adata->archentries[i].offset = bfd_getb32 (buf + 8);
2968 adata->archentries[i].size = bfd_getb32 (buf + 12);
2969 adata->archentries[i].align = bfd_getb32 (buf + 16);
2972 abfd->tdata.mach_o_fat_data = adata;
2977 bfd_release (abfd, adata);
2978 bfd_set_error (bfd_error_wrong_format);
2983 bfd_mach_o_openr_next_archived_file (bfd *archive, bfd *prev)
2985 mach_o_fat_data_struct *adata;
2986 mach_o_fat_archentry *entry = NULL;
2989 enum bfd_architecture arch_type;
2990 unsigned long arch_subtype;
2992 adata = (mach_o_fat_data_struct *) archive->tdata.mach_o_fat_data;
2993 BFD_ASSERT (adata != NULL);
2995 /* Find index of previous entry. */
2997 i = 0; /* Start at first one. */
3000 for (i = 0; i < adata->nfat_arch; i++)
3002 if (adata->archentries[i].offset == prev->origin)
3006 if (i == adata->nfat_arch)
3009 bfd_set_error (bfd_error_bad_value);
3012 i++; /* Get next entry. */
3015 if (i >= adata->nfat_arch)
3017 bfd_set_error (bfd_error_no_more_archived_files);
3021 entry = &adata->archentries[i];
3022 nbfd = _bfd_new_bfd_contained_in (archive);
3026 nbfd->origin = entry->offset;
3028 bfd_mach_o_convert_architecture (entry->cputype, entry->cpusubtype,
3029 &arch_type, &arch_subtype);
3030 /* Create the member filename.
3031 Use FILENAME:ARCH_NAME. */
3034 const char *arch_name;
3035 size_t arch_file_len = strlen (bfd_get_filename (archive));
3037 arch_name = bfd_printable_arch_mach (arch_type, arch_subtype);
3038 s = bfd_malloc (arch_file_len + 1 + strlen (arch_name) + 1);
3041 memcpy (s, bfd_get_filename (archive), arch_file_len);
3042 s[arch_file_len] = ':';
3043 strcpy (s + arch_file_len + 1, arch_name);
3046 nbfd->iostream = NULL;
3047 bfd_set_arch_mach (nbfd, arch_type, arch_subtype);
3052 /* If ABFD format is FORMAT and architecture is ARCH, return it.
3053 If ABFD is a fat image containing a member that corresponds to FORMAT
3054 and ARCH, returns it.
3055 In other case, returns NULL.
3056 This function allows transparent uses of fat images. */
3058 bfd_mach_o_fat_extract (bfd *abfd,
3060 const bfd_arch_info_type *arch)
3063 mach_o_fat_data_struct *adata;
3066 if (bfd_check_format (abfd, format))
3068 if (bfd_get_arch_info (abfd) == arch)
3072 if (!bfd_check_format (abfd, bfd_archive)
3073 || abfd->xvec != &mach_o_fat_vec)
3076 /* This is a Mach-O fat image. */
3077 adata = (mach_o_fat_data_struct *) abfd->tdata.mach_o_fat_data;
3078 BFD_ASSERT (adata != NULL);
3080 for (i = 0; i < adata->nfat_arch; i++)
3082 struct mach_o_fat_archentry *e = &adata->archentries[i];
3083 enum bfd_architecture cpu_type;
3084 unsigned long cpu_subtype;
3086 bfd_mach_o_convert_architecture (e->cputype, e->cpusubtype,
3087 &cpu_type, &cpu_subtype);
3088 if (cpu_type != arch->arch || cpu_subtype != arch->mach)
3091 /* The architecture is found. */
3092 res = _bfd_new_bfd_contained_in (abfd);
3096 res->origin = e->offset;
3098 res->filename = strdup (abfd->filename);
3099 res->iostream = NULL;
3101 if (bfd_check_format (res, format))
3103 BFD_ASSERT (bfd_get_arch_info (res) == arch);
3114 bfd_mach_o_lookup_section (bfd *abfd,
3116 bfd_mach_o_load_command **mcommand,
3117 bfd_mach_o_section **msection)
3119 struct mach_o_data_struct *md = bfd_mach_o_get_data (abfd);
3120 unsigned int i, j, num;
3122 bfd_mach_o_load_command *ncmd = NULL;
3123 bfd_mach_o_section *nsect = NULL;
3125 BFD_ASSERT (mcommand != NULL);
3126 BFD_ASSERT (msection != NULL);
3129 for (i = 0; i < md->header.ncmds; i++)
3131 struct bfd_mach_o_load_command *cmd = &md->commands[i];
3132 struct bfd_mach_o_segment_command *seg = NULL;
3134 if (cmd->type != BFD_MACH_O_LC_SEGMENT
3135 || cmd->type != BFD_MACH_O_LC_SEGMENT_64)
3137 seg = &cmd->command.segment;
3139 for (j = 0; j < seg->nsects; j++)
3141 struct bfd_mach_o_section *sect = &seg->sections[j];
3143 if (sect->bfdsection == section)
3161 bfd_mach_o_lookup_command (bfd *abfd,
3162 bfd_mach_o_load_command_type type,
3163 bfd_mach_o_load_command **mcommand)
3165 struct mach_o_data_struct *md = bfd_mach_o_get_data (abfd);
3166 bfd_mach_o_load_command *ncmd = NULL;
3167 unsigned int i, num;
3169 BFD_ASSERT (md != NULL);
3170 BFD_ASSERT (mcommand != NULL);
3173 for (i = 0; i < md->header.ncmds; i++)
3175 struct bfd_mach_o_load_command *cmd = &md->commands[i];
3177 if (cmd->type != type)
3190 bfd_mach_o_stack_addr (enum bfd_mach_o_cpu_type type)
3194 case BFD_MACH_O_CPU_TYPE_MC680x0:
3196 case BFD_MACH_O_CPU_TYPE_MC88000:
3198 case BFD_MACH_O_CPU_TYPE_POWERPC:
3200 case BFD_MACH_O_CPU_TYPE_I386:
3202 case BFD_MACH_O_CPU_TYPE_SPARC:
3204 case BFD_MACH_O_CPU_TYPE_I860:
3206 case BFD_MACH_O_CPU_TYPE_HPPA:
3207 return 0xc0000000 - 0x04000000;
3213 typedef struct bfd_mach_o_xlat_name
3218 bfd_mach_o_xlat_name;
3221 bfd_mach_o_print_flags (const bfd_mach_o_xlat_name *table,
3227 for (; table->name; table++)
3229 if (table->val & val)
3232 fprintf (file, "+");
3233 fprintf (file, "%s", table->name);
3241 fprintf (file, "+");
3242 fprintf (file, "0x%lx", val);
3246 fprintf (file, "-");
3250 bfd_mach_o_get_name (const bfd_mach_o_xlat_name *table, unsigned long val)
3252 for (; table->name; table++)
3253 if (table->val == val)
3258 static bfd_mach_o_xlat_name bfd_mach_o_cpu_name[] =
3260 { "vax", BFD_MACH_O_CPU_TYPE_VAX },
3261 { "mc680x0", BFD_MACH_O_CPU_TYPE_MC680x0 },
3262 { "i386", BFD_MACH_O_CPU_TYPE_I386 },
3263 { "mips", BFD_MACH_O_CPU_TYPE_MIPS },
3264 { "mc98000", BFD_MACH_O_CPU_TYPE_MC98000 },
3265 { "hppa", BFD_MACH_O_CPU_TYPE_HPPA },
3266 { "arm", BFD_MACH_O_CPU_TYPE_ARM },
3267 { "mc88000", BFD_MACH_O_CPU_TYPE_MC88000 },
3268 { "sparc", BFD_MACH_O_CPU_TYPE_SPARC },
3269 { "i860", BFD_MACH_O_CPU_TYPE_I860 },
3270 { "alpha", BFD_MACH_O_CPU_TYPE_ALPHA },
3271 { "powerpc", BFD_MACH_O_CPU_TYPE_POWERPC },
3272 { "powerpc_64", BFD_MACH_O_CPU_TYPE_POWERPC_64 },
3273 { "x86_64", BFD_MACH_O_CPU_TYPE_X86_64 },
3277 static bfd_mach_o_xlat_name bfd_mach_o_filetype_name[] =
3279 { "object", BFD_MACH_O_MH_OBJECT },
3280 { "execute", BFD_MACH_O_MH_EXECUTE },
3281 { "fvmlib", BFD_MACH_O_MH_FVMLIB },
3282 { "core", BFD_MACH_O_MH_CORE },
3283 { "preload", BFD_MACH_O_MH_PRELOAD },
3284 { "dylib", BFD_MACH_O_MH_DYLIB },
3285 { "dylinker", BFD_MACH_O_MH_DYLINKER },
3286 { "bundle", BFD_MACH_O_MH_BUNDLE },
3287 { "dylib_stub", BFD_MACH_O_MH_DYLIB_STUB },
3288 { "dym", BFD_MACH_O_MH_DSYM },
3289 { "kext_bundle", BFD_MACH_O_MH_KEXT_BUNDLE },
3293 static bfd_mach_o_xlat_name bfd_mach_o_header_flags_name[] =
3295 { "noundefs", BFD_MACH_O_MH_NOUNDEFS },
3296 { "incrlink", BFD_MACH_O_MH_INCRLINK },
3297 { "dyldlink", BFD_MACH_O_MH_DYLDLINK },
3298 { "bindatload", BFD_MACH_O_MH_BINDATLOAD },
3299 { "prebound", BFD_MACH_O_MH_PREBOUND },
3300 { "split_segs", BFD_MACH_O_MH_SPLIT_SEGS },
3301 { "lazy_init", BFD_MACH_O_MH_LAZY_INIT },
3302 { "twolevel", BFD_MACH_O_MH_TWOLEVEL },
3303 { "force_flat", BFD_MACH_O_MH_FORCE_FLAT },
3304 { "nomultidefs", BFD_MACH_O_MH_NOMULTIDEFS },
3305 { "nofixprebinding", BFD_MACH_O_MH_NOFIXPREBINDING },
3306 { "prebindable", BFD_MACH_O_MH_PREBINDABLE },
3307 { "allmodsbound", BFD_MACH_O_MH_ALLMODSBOUND },
3308 { "subsections_via_symbols", BFD_MACH_O_MH_SUBSECTIONS_VIA_SYMBOLS },
3309 { "canonical", BFD_MACH_O_MH_CANONICAL },
3310 { "weak_defines", BFD_MACH_O_MH_WEAK_DEFINES },
3311 { "binds_to_weak", BFD_MACH_O_MH_BINDS_TO_WEAK },
3312 { "allow_stack_execution", BFD_MACH_O_MH_ALLOW_STACK_EXECUTION },
3313 { "root_safe", BFD_MACH_O_MH_ROOT_SAFE },
3314 { "setuid_safe", BFD_MACH_O_MH_SETUID_SAFE },
3315 { "no_reexported_dylibs", BFD_MACH_O_MH_NO_REEXPORTED_DYLIBS },
3316 { "pie", BFD_MACH_O_MH_PIE },
3320 static bfd_mach_o_xlat_name bfd_mach_o_section_type_name[] =
3322 { "regular", BFD_MACH_O_S_REGULAR},
3323 { "zerofill", BFD_MACH_O_S_ZEROFILL},
3324 { "cstring_literals", BFD_MACH_O_S_CSTRING_LITERALS},
3325 { "4byte_literals", BFD_MACH_O_S_4BYTE_LITERALS},
3326 { "8byte_literals", BFD_MACH_O_S_8BYTE_LITERALS},
3327 { "literal_pointers", BFD_MACH_O_S_LITERAL_POINTERS},
3328 { "non_lazy_symbol_pointers", BFD_MACH_O_S_NON_LAZY_SYMBOL_POINTERS},
3329 { "lazy_symbol_pointers", BFD_MACH_O_S_LAZY_SYMBOL_POINTERS},
3330 { "symbol_stubs", BFD_MACH_O_S_SYMBOL_STUBS},
3331 { "mod_init_func_pointers", BFD_MACH_O_S_MOD_INIT_FUNC_POINTERS},
3332 { "mod_fini_func_pointers", BFD_MACH_O_S_MOD_FINI_FUNC_POINTERS},
3333 { "coalesced", BFD_MACH_O_S_COALESCED},
3334 { "gb_zerofill", BFD_MACH_O_S_GB_ZEROFILL},
3335 { "interposing", BFD_MACH_O_S_INTERPOSING},
3336 { "16byte_literals", BFD_MACH_O_S_16BYTE_LITERALS},
3337 { "dtrace_dof", BFD_MACH_O_S_DTRACE_DOF},
3338 { "lazy_dylib_symbol_pointers", BFD_MACH_O_S_LAZY_DYLIB_SYMBOL_POINTERS},
3342 static bfd_mach_o_xlat_name bfd_mach_o_section_attribute_name[] =
3344 { "loc_reloc", BFD_MACH_O_S_ATTR_LOC_RELOC },
3345 { "ext_reloc", BFD_MACH_O_S_ATTR_EXT_RELOC },
3346 { "some_instructions", BFD_MACH_O_S_ATTR_SOME_INSTRUCTIONS },
3347 { "debug", BFD_MACH_O_S_ATTR_DEBUG },
3348 { "modifying_code", BFD_MACH_O_S_SELF_MODIFYING_CODE },
3349 { "live_support", BFD_MACH_O_S_ATTR_LIVE_SUPPORT },
3350 { "no_dead_strip", BFD_MACH_O_S_ATTR_NO_DEAD_STRIP },
3351 { "strip_static_syms", BFD_MACH_O_S_ATTR_STRIP_STATIC_SYMS },
3352 { "no_toc", BFD_MACH_O_S_ATTR_NO_TOC },
3353 { "pure_instructions", BFD_MACH_O_S_ATTR_PURE_INSTRUCTIONS },
3357 static bfd_mach_o_xlat_name bfd_mach_o_load_command_name[] =
3359 { "segment", BFD_MACH_O_LC_SEGMENT},
3360 { "symtab", BFD_MACH_O_LC_SYMTAB},
3361 { "symseg", BFD_MACH_O_LC_SYMSEG},
3362 { "thread", BFD_MACH_O_LC_THREAD},
3363 { "unixthread", BFD_MACH_O_LC_UNIXTHREAD},
3364 { "loadfvmlib", BFD_MACH_O_LC_LOADFVMLIB},
3365 { "idfvmlib", BFD_MACH_O_LC_IDFVMLIB},
3366 { "ident", BFD_MACH_O_LC_IDENT},
3367 { "fvmfile", BFD_MACH_O_LC_FVMFILE},
3368 { "prepage", BFD_MACH_O_LC_PREPAGE},
3369 { "dysymtab", BFD_MACH_O_LC_DYSYMTAB},
3370 { "load_dylib", BFD_MACH_O_LC_LOAD_DYLIB},
3371 { "id_dylib", BFD_MACH_O_LC_ID_DYLIB},
3372 { "load_dylinker", BFD_MACH_O_LC_LOAD_DYLINKER},
3373 { "id_dylinker", BFD_MACH_O_LC_ID_DYLINKER},
3374 { "prebound_dylib", BFD_MACH_O_LC_PREBOUND_DYLIB},
3375 { "routines", BFD_MACH_O_LC_ROUTINES},
3376 { "sub_framework", BFD_MACH_O_LC_SUB_FRAMEWORK},
3377 { "sub_umbrella", BFD_MACH_O_LC_SUB_UMBRELLA},
3378 { "sub_client", BFD_MACH_O_LC_SUB_CLIENT},
3379 { "sub_library", BFD_MACH_O_LC_SUB_LIBRARY},
3380 { "twolevel_hints", BFD_MACH_O_LC_TWOLEVEL_HINTS},
3381 { "prebind_cksum", BFD_MACH_O_LC_PREBIND_CKSUM},
3382 { "load_weak_dylib", BFD_MACH_O_LC_LOAD_WEAK_DYLIB},
3383 { "segment_64", BFD_MACH_O_LC_SEGMENT_64},
3384 { "routines_64", BFD_MACH_O_LC_ROUTINES_64},
3385 { "uuid", BFD_MACH_O_LC_UUID},
3386 { "rpath", BFD_MACH_O_LC_RPATH},
3387 { "code_signature", BFD_MACH_O_LC_CODE_SIGNATURE},
3388 { "segment_split_info", BFD_MACH_O_LC_SEGMENT_SPLIT_INFO},
3389 { "reexport_dylib", BFD_MACH_O_LC_REEXPORT_DYLIB},
3390 { "lazy_load_dylib", BFD_MACH_O_LC_LAZY_LOAD_DYLIB},
3391 { "encryption_info", BFD_MACH_O_LC_ENCRYPTION_INFO},
3392 { "dyld_info", BFD_MACH_O_LC_DYLD_INFO},
3397 bfd_mach_o_print_private_header (bfd *abfd, FILE *file)
3399 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
3400 bfd_mach_o_header *h = &mdata->header;
3402 fputs (_("Mach-O header:\n"), file);
3403 fprintf (file, _(" magic : %08lx\n"), h->magic);
3404 fprintf (file, _(" cputype : %08lx (%s)\n"), h->cputype,
3405 bfd_mach_o_get_name (bfd_mach_o_cpu_name, h->cputype));
3406 fprintf (file, _(" cpusubtype: %08lx\n"), h->cpusubtype);
3407 fprintf (file, _(" filetype : %08lx (%s)\n"),
3409 bfd_mach_o_get_name (bfd_mach_o_filetype_name, h->filetype));
3410 fprintf (file, _(" ncmds : %08lx (%lu)\n"), h->ncmds, h->ncmds);
3411 fprintf (file, _(" sizeofcmds: %08lx\n"), h->sizeofcmds);
3412 fprintf (file, _(" flags : %08lx ("), h->flags);
3413 bfd_mach_o_print_flags (bfd_mach_o_header_flags_name, h->flags, file);
3414 fputs (_(")\n"), file);
3415 fprintf (file, _(" reserved : %08x\n"), h->reserved);
3419 bfd_mach_o_print_section_map (bfd *abfd, FILE *file)
3421 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
3423 unsigned int sec_nbr = 0;
3425 fputs (_("Segments and Sections:\n"), file);
3426 fputs (_(" #: Segment name Section name Address\n"), file);
3428 for (i = 0; i < mdata->header.ncmds; i++)
3430 bfd_mach_o_segment_command *seg;
3432 if (mdata->commands[i].type != BFD_MACH_O_LC_SEGMENT
3433 && mdata->commands[i].type != BFD_MACH_O_LC_SEGMENT_64)
3436 seg = &mdata->commands[i].command.segment;
3438 fprintf (file, "[Segment %-16s ", seg->segname);
3439 fprintf_vma (file, seg->vmaddr);
3440 fprintf (file, "-");
3441 fprintf_vma (file, seg->vmaddr + seg->vmsize - 1);
3443 fputc (seg->initprot & BFD_MACH_O_PROT_READ ? 'r' : '-', file);
3444 fputc (seg->initprot & BFD_MACH_O_PROT_WRITE ? 'w' : '-', file);
3445 fputc (seg->initprot & BFD_MACH_O_PROT_EXECUTE ? 'x' : '-', file);
3446 fprintf (file, "]\n");
3447 for (j = 0; j < seg->nsects; j++)
3449 bfd_mach_o_section *sec = &seg->sections[j];
3450 fprintf (file, "%02u: %-16s %-16s ", ++sec_nbr,
3451 sec->segname, sec->sectname);
3452 fprintf_vma (file, sec->addr);
3453 fprintf (file, " ");
3454 fprintf_vma (file, sec->size);
3455 fprintf (file, " %08lx\n", sec->flags);
3461 bfd_mach_o_print_section (bfd *abfd ATTRIBUTE_UNUSED,
3462 bfd_mach_o_section *sec, FILE *file)
3464 fprintf (file, " Section: %-16s %-16s (bfdname: %s)\n",
3465 sec->sectname, sec->segname, sec->bfdsection->name);
3466 fprintf (file, " addr: ");
3467 fprintf_vma (file, sec->addr);
3468 fprintf (file, " size: ");
3469 fprintf_vma (file, sec->size);
3470 fprintf (file, " offset: ");
3471 fprintf_vma (file, sec->offset);
3472 fprintf (file, "\n");
3473 fprintf (file, " align: %ld", sec->align);
3474 fprintf (file, " nreloc: %lu reloff: ", sec->nreloc);
3475 fprintf_vma (file, sec->reloff);
3476 fprintf (file, "\n");
3477 fprintf (file, " flags: %08lx (type: %s", sec->flags,
3478 bfd_mach_o_get_name (bfd_mach_o_section_type_name,
3479 sec->flags & BFD_MACH_O_SECTION_TYPE_MASK));
3480 fprintf (file, " attr: ");
3481 bfd_mach_o_print_flags (bfd_mach_o_section_attribute_name,
3482 sec->flags & BFD_MACH_O_SECTION_ATTRIBUTES_MASK,
3484 fprintf (file, ")\n");
3485 switch (sec->flags & BFD_MACH_O_SECTION_TYPE_MASK)
3487 case BFD_MACH_O_S_NON_LAZY_SYMBOL_POINTERS:
3488 case BFD_MACH_O_S_LAZY_SYMBOL_POINTERS:
3489 case BFD_MACH_O_S_SYMBOL_STUBS:
3490 fprintf (file, " first indirect sym: %lu", sec->reserved1);
3491 fprintf (file, " (%u entries)",
3492 bfd_mach_o_section_get_nbr_indirect (abfd, sec));
3495 fprintf (file, " reserved1: 0x%lx", sec->reserved1);
3498 switch (sec->flags & BFD_MACH_O_SECTION_TYPE_MASK)
3500 case BFD_MACH_O_S_SYMBOL_STUBS:
3501 fprintf (file, " stub size: %lu", sec->reserved2);
3504 fprintf (file, " reserved2: 0x%lx", sec->reserved2);
3507 fprintf (file, " reserved3: 0x%lx\n", sec->reserved3);
3511 bfd_mach_o_print_segment (bfd *abfd ATTRIBUTE_UNUSED,
3512 bfd_mach_o_load_command *cmd, FILE *file)
3514 bfd_mach_o_segment_command *seg = &cmd->command.segment;
3517 fprintf (file, " name: %s\n", *seg->segname ? seg->segname : "*none*");
3518 fprintf (file, " vmaddr: ");
3519 fprintf_vma (file, seg->vmaddr);
3520 fprintf (file, " vmsize: ");
3521 fprintf_vma (file, seg->vmsize);
3522 fprintf (file, "\n");
3523 fprintf (file, " fileoff: ");
3524 fprintf_vma (file, seg->fileoff);
3525 fprintf (file, " filesize: ");
3526 fprintf_vma (file, (bfd_vma)seg->filesize);
3527 fprintf (file, " endoff: ");
3528 fprintf_vma (file, (bfd_vma)(seg->fileoff + seg->filesize));
3529 fprintf (file, "\n");
3530 fprintf (file, " nsects: %lu ", seg->nsects);
3531 fprintf (file, " flags: %lx\n", seg->flags);
3532 for (i = 0; i < seg->nsects; i++)
3533 bfd_mach_o_print_section (abfd, &seg->sections[i], file);
3537 bfd_mach_o_print_dysymtab (bfd *abfd ATTRIBUTE_UNUSED,
3538 bfd_mach_o_load_command *cmd, FILE *file)
3540 bfd_mach_o_dysymtab_command *dysymtab = &cmd->command.dysymtab;
3541 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
3544 fprintf (file, " local symbols: idx: %10lu num: %-8lu",
3545 dysymtab->ilocalsym, dysymtab->nlocalsym);
3546 fprintf (file, " (nxtidx: %lu)\n",
3547 dysymtab->ilocalsym + dysymtab->nlocalsym);
3548 fprintf (file, " external symbols: idx: %10lu num: %-8lu",
3549 dysymtab->iextdefsym, dysymtab->nextdefsym);
3550 fprintf (file, " (nxtidx: %lu)\n",
3551 dysymtab->iextdefsym + dysymtab->nextdefsym);
3552 fprintf (file, " undefined symbols: idx: %10lu num: %-8lu",
3553 dysymtab->iundefsym, dysymtab->nundefsym);
3554 fprintf (file, " (nxtidx: %lu)\n",
3555 dysymtab->iundefsym + dysymtab->nundefsym);
3556 fprintf (file, " table of content: off: 0x%08lx num: %-8lu",
3557 dysymtab->tocoff, dysymtab->ntoc);
3558 fprintf (file, " (endoff: 0x%08lx)\n",
3560 + dysymtab->ntoc * BFD_MACH_O_TABLE_OF_CONTENT_SIZE);
3561 fprintf (file, " module table: off: 0x%08lx num: %-8lu",
3562 dysymtab->modtaboff, dysymtab->nmodtab);
3563 fprintf (file, " (endoff: 0x%08lx)\n",
3564 dysymtab->modtaboff + dysymtab->nmodtab
3565 * (mach_o_wide_p (&mdata->header) ?
3566 BFD_MACH_O_DYLIB_MODULE_64_SIZE : BFD_MACH_O_DYLIB_MODULE_SIZE));
3567 fprintf (file, " external reference table: off: 0x%08lx num: %-8lu",
3568 dysymtab->extrefsymoff, dysymtab->nextrefsyms);
3569 fprintf (file, " (endoff: 0x%08lx)\n",
3570 dysymtab->extrefsymoff
3571 + dysymtab->nextrefsyms * BFD_MACH_O_REFERENCE_SIZE);
3572 fprintf (file, " indirect symbol table: off: 0x%08lx num: %-8lu",
3573 dysymtab->indirectsymoff, dysymtab->nindirectsyms);
3574 fprintf (file, " (endoff: 0x%08lx)\n",
3575 dysymtab->indirectsymoff
3576 + dysymtab->nindirectsyms * BFD_MACH_O_INDIRECT_SYMBOL_SIZE);
3577 fprintf (file, " external relocation table: off: 0x%08lx num: %-8lu",
3578 dysymtab->extreloff, dysymtab->nextrel);
3579 fprintf (file, " (endoff: 0x%08lx)\n",
3580 dysymtab->extreloff + dysymtab->nextrel * BFD_MACH_O_RELENT_SIZE);
3581 fprintf (file, " local relocation table: off: 0x%08lx num: %-8lu",
3582 dysymtab->locreloff, dysymtab->nlocrel);
3583 fprintf (file, " (endoff: 0x%08lx)\n",
3584 dysymtab->locreloff + dysymtab->nlocrel * BFD_MACH_O_RELENT_SIZE);
3586 if (dysymtab->ntoc > 0
3587 || dysymtab->nindirectsyms > 0
3588 || dysymtab->nextrefsyms > 0)
3590 /* Try to read the symbols to display the toc or indirect symbols. */
3591 bfd_mach_o_read_symtab_symbols (abfd);
3593 else if (dysymtab->nmodtab > 0)
3595 /* Try to read the strtab to display modules name. */
3596 bfd_mach_o_read_symtab_strtab (abfd);
3599 for (i = 0; i < dysymtab->nmodtab; i++)
3601 bfd_mach_o_dylib_module *module = &dysymtab->dylib_module[i];
3602 fprintf (file, " module %u:\n", i);
3603 fprintf (file, " name: %lu", module->module_name_idx);
3604 if (mdata->symtab && mdata->symtab->strtab)
3605 fprintf (file, ": %s",
3606 mdata->symtab->strtab + module->module_name_idx);
3607 fprintf (file, "\n");
3608 fprintf (file, " extdefsym: idx: %8lu num: %lu\n",
3609 module->iextdefsym, module->nextdefsym);
3610 fprintf (file, " refsym: idx: %8lu num: %lu\n",
3611 module->irefsym, module->nrefsym);
3612 fprintf (file, " localsym: idx: %8lu num: %lu\n",
3613 module->ilocalsym, module->nlocalsym);
3614 fprintf (file, " extrel: idx: %8lu num: %lu\n",
3615 module->iextrel, module->nextrel);
3616 fprintf (file, " init: idx: %8u num: %u\n",
3617 module->iinit, module->ninit);
3618 fprintf (file, " term: idx: %8u num: %u\n",
3619 module->iterm, module->nterm);
3620 fprintf (file, " objc_module_info: addr: ");
3621 fprintf_vma (file, module->objc_module_info_addr);
3622 fprintf (file, " size: %lu\n", module->objc_module_info_size);
3625 if (dysymtab->ntoc > 0)
3627 bfd_mach_o_symtab_command *symtab = mdata->symtab;
3629 fprintf (file, " table of content: (symbol/module)\n");
3630 for (i = 0; i < dysymtab->ntoc; i++)
3632 bfd_mach_o_dylib_table_of_content *toc = &dysymtab->dylib_toc[i];
3634 fprintf (file, " %4u: ", i);
3635 if (symtab && symtab->symbols && toc->symbol_index < symtab->nsyms)
3637 const char *name = symtab->symbols[toc->symbol_index].symbol.name;
3638 fprintf (file, "%s (%lu)", name ? name : "*invalid*",
3642 fprintf (file, "%lu", toc->symbol_index);
3644 fprintf (file, " / ");
3645 if (symtab && symtab->strtab
3646 && toc->module_index < dysymtab->nmodtab)
3648 bfd_mach_o_dylib_module *mod;
3649 mod = &dysymtab->dylib_module[toc->module_index];
3650 fprintf (file, "%s (%lu)",
3651 symtab->strtab + mod->module_name_idx,
3655 fprintf (file, "%lu", toc->module_index);
3657 fprintf (file, "\n");
3661 if (dysymtab->nindirectsyms != 0)
3663 fprintf (file, " indirect symbols:\n");
3665 for (i = 0; i < mdata->nsects; i++)
3667 bfd_mach_o_section *sec = mdata->sections[i];
3668 unsigned int j, first, last;
3669 bfd_mach_o_symtab_command *symtab = mdata->symtab;
3673 switch (sec->flags & BFD_MACH_O_SECTION_TYPE_MASK)
3675 case BFD_MACH_O_S_NON_LAZY_SYMBOL_POINTERS:
3676 case BFD_MACH_O_S_LAZY_SYMBOL_POINTERS:
3677 case BFD_MACH_O_S_SYMBOL_STUBS:
3678 first = sec->reserved1;
3679 last = first + bfd_mach_o_section_get_nbr_indirect (abfd, sec);
3681 entry_size = bfd_mach_o_section_get_entry_size (abfd, sec);
3682 fprintf (file, " for section %s.%s:\n",
3683 sec->segname, sec->sectname);
3684 for (j = first; j < last; j++)
3686 unsigned int isym = dysymtab->indirect_syms[j];
3688 fprintf (file, " ");
3689 fprintf_vma (file, addr);
3690 fprintf (file, " %5u: 0x%08x", j, isym);
3691 if (isym & BFD_MACH_O_INDIRECT_SYMBOL_LOCAL)
3692 fprintf (file, " LOCAL");
3693 if (isym & BFD_MACH_O_INDIRECT_SYMBOL_ABS)
3694 fprintf (file, " ABSOLUTE");
3695 if (symtab && symtab->symbols
3696 && isym < symtab->nsyms
3697 && symtab->symbols[isym].symbol.name)
3698 fprintf (file, " %s", symtab->symbols[isym].symbol.name);
3699 fprintf (file, "\n");
3708 if (dysymtab->nextrefsyms > 0)
3710 bfd_mach_o_symtab_command *symtab = mdata->symtab;
3712 fprintf (file, " external reference table: (symbol flags)\n");
3713 for (i = 0; i < dysymtab->nextrefsyms; i++)
3715 bfd_mach_o_dylib_reference *ref = &dysymtab->ext_refs[i];
3717 fprintf (file, " %4u: %5lu 0x%02lx", i, ref->isym, ref->flags);
3718 if (symtab && symtab->symbols
3719 && ref->isym < symtab->nsyms
3720 && symtab->symbols[ref->isym].symbol.name)
3721 fprintf (file, " %s", symtab->symbols[ref->isym].symbol.name);
3722 fprintf (file, "\n");
3729 bfd_mach_o_print_dyld_info (bfd *abfd ATTRIBUTE_UNUSED,
3730 bfd_mach_o_load_command *cmd, FILE *file)
3732 bfd_mach_o_dyld_info_command *info = &cmd->command.dyld_info;
3734 fprintf (file, " rebase: off: 0x%08x size: %-8u\n",
3735 info->rebase_off, info->rebase_size);
3736 fprintf (file, " bind: off: 0x%08x size: %-8u\n",
3737 info->bind_off, info->bind_size);
3738 fprintf (file, " weak bind: off: 0x%08x size: %-8u\n",
3739 info->weak_bind_off, info->weak_bind_size);
3740 fprintf (file, " lazy bind: off: 0x%08x size: %-8u\n",
3741 info->lazy_bind_off, info->lazy_bind_size);
3742 fprintf (file, " export: off: 0x%08x size: %-8u\n",
3743 info->export_off, info->export_size);
3747 bfd_mach_o_bfd_print_private_bfd_data (bfd *abfd, void * ptr)
3749 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
3750 FILE *file = (FILE *) ptr;
3753 bfd_mach_o_print_private_header (abfd, file);
3756 for (i = 0; i < mdata->header.ncmds; i++)
3758 bfd_mach_o_load_command *cmd = &mdata->commands[i];
3760 fprintf (file, "Load command %s:",
3761 bfd_mach_o_get_name (bfd_mach_o_load_command_name, cmd->type));
3764 case BFD_MACH_O_LC_SEGMENT:
3765 case BFD_MACH_O_LC_SEGMENT_64:
3766 bfd_mach_o_print_segment (abfd, cmd, file);
3768 case BFD_MACH_O_LC_UUID:
3770 bfd_mach_o_uuid_command *uuid = &cmd->command.uuid;
3773 for (j = 0; j < sizeof (uuid->uuid); j ++)
3774 fprintf (file, " %02x", uuid->uuid[j]);
3778 case BFD_MACH_O_LC_LOAD_DYLIB:
3779 case BFD_MACH_O_LC_LOAD_WEAK_DYLIB:
3780 case BFD_MACH_O_LC_REEXPORT_DYLIB:
3781 case BFD_MACH_O_LC_ID_DYLIB:
3783 bfd_mach_o_dylib_command *dylib = &cmd->command.dylib;
3784 fprintf (file, " %s\n", dylib->name_str);
3785 fprintf (file, " time stamp: 0x%08lx\n",
3787 fprintf (file, " current version: 0x%08lx\n",
3788 dylib->current_version);
3789 fprintf (file, " comptibility version: 0x%08lx\n",
3790 dylib->compatibility_version);
3793 case BFD_MACH_O_LC_LOAD_DYLINKER:
3794 case BFD_MACH_O_LC_ID_DYLINKER:
3795 fprintf (file, " %s\n", cmd->command.dylinker.name_str);
3797 case BFD_MACH_O_LC_SYMTAB:
3799 bfd_mach_o_symtab_command *symtab = &cmd->command.symtab;
3802 " symoff: 0x%08x nsyms: %8u (endoff: 0x%08x)\n",
3803 symtab->symoff, symtab->nsyms,
3804 symtab->symoff + symtab->nsyms
3805 * (mach_o_wide_p (&mdata->header)
3806 ? BFD_MACH_O_NLIST_64_SIZE : BFD_MACH_O_NLIST_SIZE));
3808 " stroff: 0x%08x strsize: %8u (endoff: 0x%08x)\n",
3809 symtab->stroff, symtab->strsize,
3810 symtab->stroff + symtab->strsize);
3813 case BFD_MACH_O_LC_DYSYMTAB:
3814 fprintf (file, "\n");
3815 bfd_mach_o_print_dysymtab (abfd, cmd, file);
3817 case BFD_MACH_O_LC_CODE_SIGNATURE:
3818 case BFD_MACH_O_LC_SEGMENT_SPLIT_INFO:
3820 bfd_mach_o_linkedit_command *linkedit = &cmd->command.linkedit;
3823 " dataoff: 0x%08lx datasize: 0x%08lx (endoff: 0x%08lx)\n",
3824 linkedit->dataoff, linkedit->datasize,
3825 linkedit->dataoff + linkedit->datasize);
3828 case BFD_MACH_O_LC_SUB_FRAMEWORK:
3829 case BFD_MACH_O_LC_SUB_UMBRELLA:
3830 case BFD_MACH_O_LC_SUB_LIBRARY:
3831 case BFD_MACH_O_LC_SUB_CLIENT:
3832 case BFD_MACH_O_LC_RPATH:
3834 bfd_mach_o_str_command *str = &cmd->command.str;
3835 fprintf (file, " %s\n", str->str);
3838 case BFD_MACH_O_LC_THREAD:
3839 case BFD_MACH_O_LC_UNIXTHREAD:
3841 bfd_mach_o_thread_command *thread = &cmd->command.thread;
3843 bfd_mach_o_backend_data *bed = bfd_mach_o_get_backend_data (abfd);
3845 fprintf (file, " nflavours: %lu\n", thread->nflavours);
3846 for (j = 0; j < thread->nflavours; j++)
3848 bfd_mach_o_thread_flavour *flavour = &thread->flavours[j];
3850 fprintf (file, " %2u: flavour: 0x%08lx offset: 0x%08lx"
3852 j, flavour->flavour, flavour->offset,
3854 if (bed->_bfd_mach_o_print_thread)
3856 char *buf = bfd_malloc (flavour->size);
3859 && bfd_seek (abfd, flavour->offset, SEEK_SET) == 0
3860 && (bfd_bread (buf, flavour->size, abfd)
3862 (*bed->_bfd_mach_o_print_thread)(abfd, flavour,
3869 case BFD_MACH_O_LC_DYLD_INFO:
3870 fprintf (file, "\n");
3871 bfd_mach_o_print_dyld_info (abfd, cmd, file);
3874 fprintf (file, "\n");
3880 bfd_mach_o_print_section_map (abfd, file);
3886 bfd_mach_o_core_fetch_environment (bfd *abfd,
3887 unsigned char **rbuf,
3890 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
3891 unsigned long stackaddr = bfd_mach_o_stack_addr (mdata->header.cputype);
3894 for (i = 0; i < mdata->header.ncmds; i++)
3896 bfd_mach_o_load_command *cur = &mdata->commands[i];
3897 bfd_mach_o_segment_command *seg = NULL;
3899 if (cur->type != BFD_MACH_O_LC_SEGMENT)
3902 seg = &cur->command.segment;
3904 if ((seg->vmaddr + seg->vmsize) == stackaddr)
3906 unsigned long start = seg->fileoff;
3907 unsigned long end = seg->fileoff + seg->filesize;
3908 unsigned char *buf = bfd_malloc (1024);
3909 unsigned long size = 1024;
3913 bfd_size_type nread = 0;
3914 unsigned long offset;
3915 int found_nonnull = 0;
3917 if (size > (end - start))
3918 size = (end - start);
3920 buf = bfd_realloc_or_free (buf, size);
3924 if (bfd_seek (abfd, end - size, SEEK_SET) != 0)
3930 nread = bfd_bread (buf, size, abfd);
3938 for (offset = 4; offset <= size; offset += 4)
3942 val = *((unsigned long *) (buf + size - offset));
3943 if (! found_nonnull)
3948 else if (val == 0x0)
3950 unsigned long bottom;
3953 bottom = seg->fileoff + seg->filesize - offset;
3954 top = seg->fileoff + seg->filesize - 4;
3955 *rbuf = bfd_malloc (top - bottom);
3956 *rlen = top - bottom;
3958 memcpy (*rbuf, buf + size - *rlen, *rlen);
3964 if (size == (end - start))
3978 bfd_mach_o_core_file_failing_command (bfd *abfd)
3980 unsigned char *buf = NULL;
3981 unsigned int len = 0;
3984 ret = bfd_mach_o_core_fetch_environment (abfd, &buf, &len);
3988 return (char *) buf;
3992 bfd_mach_o_core_file_failing_signal (bfd *abfd ATTRIBUTE_UNUSED)
3997 #define bfd_mach_o_bfd_reloc_type_lookup _bfd_norelocs_bfd_reloc_type_lookup
3998 #define bfd_mach_o_bfd_reloc_name_lookup _bfd_norelocs_bfd_reloc_name_lookup
4000 #define bfd_mach_o_swap_reloc_in NULL
4001 #define bfd_mach_o_swap_reloc_out NULL
4002 #define bfd_mach_o_print_thread NULL
4004 #define TARGET_NAME mach_o_be_vec
4005 #define TARGET_STRING "mach-o-be"
4006 #define TARGET_ARCHITECTURE bfd_arch_unknown
4007 #define TARGET_BIG_ENDIAN 1
4008 #define TARGET_ARCHIVE 0
4009 #include "mach-o-target.c"
4012 #undef TARGET_STRING
4013 #undef TARGET_ARCHITECTURE
4014 #undef TARGET_BIG_ENDIAN
4015 #undef TARGET_ARCHIVE
4017 #define TARGET_NAME mach_o_le_vec
4018 #define TARGET_STRING "mach-o-le"
4019 #define TARGET_ARCHITECTURE bfd_arch_unknown
4020 #define TARGET_BIG_ENDIAN 0
4021 #define TARGET_ARCHIVE 0
4023 #include "mach-o-target.c"
4026 #undef TARGET_STRING
4027 #undef TARGET_ARCHITECTURE
4028 #undef TARGET_BIG_ENDIAN
4029 #undef TARGET_ARCHIVE
4031 /* Not yet handled: creating an archive. */
4032 #define bfd_mach_o_mkarchive _bfd_noarchive_mkarchive
4035 #define bfd_mach_o_read_ar_hdr _bfd_noarchive_read_ar_hdr
4036 #define bfd_mach_o_write_ar_hdr _bfd_noarchive_write_ar_hdr
4037 #define bfd_mach_o_slurp_armap _bfd_noarchive_slurp_armap
4038 #define bfd_mach_o_slurp_extended_name_table _bfd_noarchive_slurp_extended_name_table
4039 #define bfd_mach_o_construct_extended_name_table _bfd_noarchive_construct_extended_name_table
4040 #define bfd_mach_o_truncate_arname _bfd_noarchive_truncate_arname
4041 #define bfd_mach_o_write_armap _bfd_noarchive_write_armap
4042 #define bfd_mach_o_get_elt_at_index _bfd_noarchive_get_elt_at_index
4043 #define bfd_mach_o_generic_stat_arch_elt _bfd_noarchive_generic_stat_arch_elt
4044 #define bfd_mach_o_update_armap_timestamp _bfd_noarchive_update_armap_timestamp
4046 #define TARGET_NAME mach_o_fat_vec
4047 #define TARGET_STRING "mach-o-fat"
4048 #define TARGET_ARCHITECTURE bfd_arch_unknown
4049 #define TARGET_BIG_ENDIAN 1
4050 #define TARGET_ARCHIVE 1
4052 #include "mach-o-target.c"
4055 #undef TARGET_STRING
4056 #undef TARGET_ARCHITECTURE
4057 #undef TARGET_BIG_ENDIAN
4058 #undef TARGET_ARCHIVE