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;
381 /* Do not try to read symbols if there are none. */
386 if (bfd_mach_o_read_symtab_symbols (abfd) != 0)
388 (*_bfd_error_handler) (_("bfd_mach_o_canonicalize_symtab: unable to load symbols"));
392 BFD_ASSERT (sym->symbols != NULL);
394 for (j = 0; j < sym->nsyms; j++)
395 alocation[j] = &sym->symbols[j].symbol;
403 bfd_mach_o_get_synthetic_symtab (bfd *abfd,
404 long symcount ATTRIBUTE_UNUSED,
405 asymbol **syms ATTRIBUTE_UNUSED,
406 long dynsymcount ATTRIBUTE_UNUSED,
407 asymbol **dynsyms ATTRIBUTE_UNUSED,
410 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
411 bfd_mach_o_dysymtab_command *dysymtab = mdata->dysymtab;
412 bfd_mach_o_symtab_command *symtab = mdata->symtab;
414 unsigned long count, i, j, n;
421 if (dysymtab == NULL || symtab == NULL || symtab->symbols == NULL)
424 if (dysymtab->nindirectsyms == 0)
427 count = dysymtab->nindirectsyms;
428 size = count * sizeof (asymbol) + 1;
430 for (j = 0; j < count; j++)
432 unsigned int isym = dysymtab->indirect_syms[j];
434 if (isym < symtab->nsyms && symtab->symbols[isym].symbol.name)
435 size += strlen (symtab->symbols[isym].symbol.name) + sizeof ("$stub");
438 s = *ret = (asymbol *) bfd_malloc (size);
441 names = (char *) (s + count);
446 for (i = 0; i < mdata->nsects; i++)
448 bfd_mach_o_section *sec = mdata->sections[i];
449 unsigned int first, last;
453 switch (sec->flags & BFD_MACH_O_SECTION_TYPE_MASK)
455 case BFD_MACH_O_S_NON_LAZY_SYMBOL_POINTERS:
456 case BFD_MACH_O_S_LAZY_SYMBOL_POINTERS:
457 case BFD_MACH_O_S_SYMBOL_STUBS:
458 first = sec->reserved1;
459 last = first + bfd_mach_o_section_get_nbr_indirect (abfd, sec);
461 entry_size = bfd_mach_o_section_get_entry_size (abfd, sec);
462 for (j = first; j < last; j++)
464 unsigned int isym = dysymtab->indirect_syms[j];
466 s->flags = BSF_GLOBAL | BSF_SYNTHETIC;
467 s->section = sec->bfdsection;
468 s->value = addr - sec->addr;
471 if (isym < symtab->nsyms
472 && symtab->symbols[isym].symbol.name)
474 const char *sym = symtab->symbols[isym].symbol.name;
479 memcpy (names, sym, len);
481 memcpy (names, "$stub", sizeof ("$stub"));
482 names += sizeof ("$stub");
501 bfd_mach_o_get_symbol_info (bfd *abfd ATTRIBUTE_UNUSED,
505 bfd_symbol_info (symbol, ret);
509 bfd_mach_o_print_symbol (bfd *abfd,
512 bfd_print_symbol_type how)
514 FILE *file = (FILE *) afile;
516 bfd_mach_o_asymbol *asym = (bfd_mach_o_asymbol *)symbol;
520 case bfd_print_symbol_name:
521 fprintf (file, "%s", symbol->name);
524 bfd_print_symbol_vandf (abfd, (void *) file, symbol);
525 if (asym->n_type & BFD_MACH_O_N_STAB)
526 name = bfd_get_stab_name (asym->n_type);
528 switch (asym->n_type & BFD_MACH_O_N_TYPE)
530 case BFD_MACH_O_N_UNDF:
533 case BFD_MACH_O_N_ABS:
536 case BFD_MACH_O_N_INDR:
539 case BFD_MACH_O_N_PBUD:
542 case BFD_MACH_O_N_SECT:
551 fprintf (file, " %02x %-6s %02x %04x",
552 asym->n_type, name, asym->n_sect, asym->n_desc);
553 if ((asym->n_type & BFD_MACH_O_N_STAB) == 0
554 && (asym->n_type & BFD_MACH_O_N_TYPE) == BFD_MACH_O_N_SECT)
555 fprintf (file, " %-5s", symbol->section->name);
556 fprintf (file, " %s", symbol->name);
561 bfd_mach_o_convert_architecture (bfd_mach_o_cpu_type mtype,
562 bfd_mach_o_cpu_subtype msubtype ATTRIBUTE_UNUSED,
563 enum bfd_architecture *type,
564 unsigned long *subtype)
566 *subtype = bfd_arch_unknown;
570 case BFD_MACH_O_CPU_TYPE_VAX: *type = bfd_arch_vax; break;
571 case BFD_MACH_O_CPU_TYPE_MC680x0: *type = bfd_arch_m68k; break;
572 case BFD_MACH_O_CPU_TYPE_I386:
573 *type = bfd_arch_i386;
574 *subtype = bfd_mach_i386_i386;
576 case BFD_MACH_O_CPU_TYPE_X86_64:
577 *type = bfd_arch_i386;
578 *subtype = bfd_mach_x86_64;
580 case BFD_MACH_O_CPU_TYPE_MIPS: *type = bfd_arch_mips; break;
581 case BFD_MACH_O_CPU_TYPE_MC98000: *type = bfd_arch_m98k; break;
582 case BFD_MACH_O_CPU_TYPE_HPPA: *type = bfd_arch_hppa; break;
583 case BFD_MACH_O_CPU_TYPE_ARM: *type = bfd_arch_arm; break;
584 case BFD_MACH_O_CPU_TYPE_MC88000: *type = bfd_arch_m88k; break;
585 case BFD_MACH_O_CPU_TYPE_SPARC:
586 *type = bfd_arch_sparc;
587 *subtype = bfd_mach_sparc;
589 case BFD_MACH_O_CPU_TYPE_I860: *type = bfd_arch_i860; break;
590 case BFD_MACH_O_CPU_TYPE_ALPHA: *type = bfd_arch_alpha; break;
591 case BFD_MACH_O_CPU_TYPE_POWERPC:
592 *type = bfd_arch_powerpc;
593 *subtype = bfd_mach_ppc;
595 case BFD_MACH_O_CPU_TYPE_POWERPC_64:
596 *type = bfd_arch_powerpc;
597 *subtype = bfd_mach_ppc64;
600 *type = bfd_arch_unknown;
606 bfd_mach_o_write_header (bfd *abfd, bfd_mach_o_header *header)
608 unsigned char buf[32];
611 size = mach_o_wide_p (header) ?
612 BFD_MACH_O_HEADER_64_SIZE : BFD_MACH_O_HEADER_SIZE;
614 bfd_h_put_32 (abfd, header->magic, buf + 0);
615 bfd_h_put_32 (abfd, header->cputype, buf + 4);
616 bfd_h_put_32 (abfd, header->cpusubtype, buf + 8);
617 bfd_h_put_32 (abfd, header->filetype, buf + 12);
618 bfd_h_put_32 (abfd, header->ncmds, buf + 16);
619 bfd_h_put_32 (abfd, header->sizeofcmds, buf + 20);
620 bfd_h_put_32 (abfd, header->flags, buf + 24);
622 if (mach_o_wide_p (header))
623 bfd_h_put_32 (abfd, header->reserved, buf + 28);
625 if (bfd_seek (abfd, 0, SEEK_SET) != 0
626 || bfd_bwrite ((void *) buf, size, abfd) != size)
633 bfd_mach_o_write_thread (bfd *abfd, bfd_mach_o_load_command *command)
635 bfd_mach_o_thread_command *cmd = &command->command.thread;
637 unsigned char buf[8];
640 BFD_ASSERT ((command->type == BFD_MACH_O_LC_THREAD)
641 || (command->type == BFD_MACH_O_LC_UNIXTHREAD));
644 for (i = 0; i < cmd->nflavours; i++)
646 BFD_ASSERT ((cmd->flavours[i].size % 4) == 0);
647 BFD_ASSERT (cmd->flavours[i].offset == (command->offset + offset + 8));
649 bfd_h_put_32 (abfd, cmd->flavours[i].flavour, buf);
650 bfd_h_put_32 (abfd, (cmd->flavours[i].size / 4), buf + 4);
652 if (bfd_seek (abfd, command->offset + offset, SEEK_SET) != 0
653 || bfd_bwrite ((void *) buf, 8, abfd) != 8)
656 offset += cmd->flavours[i].size + 8;
663 bfd_mach_o_get_reloc_upper_bound (bfd *abfd ATTRIBUTE_UNUSED,
666 return (asect->reloc_count + 1) * sizeof (arelent *);
670 bfd_mach_o_canonicalize_one_reloc (bfd *abfd, char *buf,
671 arelent *res, asymbol **syms)
673 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
674 bfd_mach_o_backend_data *bed = bfd_mach_o_get_backend_data (abfd);
675 bfd_mach_o_reloc_info reloc;
680 addr = bfd_get_32 (abfd, buf + 0);
681 symnum = bfd_get_32 (abfd, buf + 4);
683 if (addr & BFD_MACH_O_SR_SCATTERED)
687 /* Scattered relocation.
688 Extract section and offset from r_value. */
689 res->sym_ptr_ptr = NULL;
691 for (j = 0; j < mdata->nsects; j++)
693 bfd_mach_o_section *sect = mdata->sections[j];
694 if (symnum >= sect->addr && symnum < sect->addr + sect->size)
696 res->sym_ptr_ptr = sect->bfdsection->symbol_ptr_ptr;
697 res->addend = symnum - sect->addr;
701 res->address = BFD_MACH_O_GET_SR_ADDRESS (addr);
702 reloc.r_type = BFD_MACH_O_GET_SR_TYPE (addr);
703 reloc.r_length = BFD_MACH_O_GET_SR_LENGTH (addr);
704 reloc.r_pcrel = addr & BFD_MACH_O_SR_PCREL;
705 reloc.r_scattered = 1;
709 unsigned int num = BFD_MACH_O_GET_R_SYMBOLNUM (symnum);
712 if (symnum & BFD_MACH_O_R_EXTERN)
719 BFD_ASSERT (num != 0);
720 BFD_ASSERT (num <= mdata->nsects);
721 sym = mdata->sections[num - 1]->bfdsection->symbol_ptr_ptr;
722 /* For a symbol defined in section S, the addend (stored in the
723 binary) contains the address of the section. To comply with
724 bfd conventio, substract the section address.
725 Use the address from the header, so that the user can modify
726 the vma of the section. */
727 res->addend = -mdata->sections[num - 1]->addr;
730 res->sym_ptr_ptr = sym;
731 reloc.r_type = BFD_MACH_O_GET_R_TYPE (symnum);
732 reloc.r_length = BFD_MACH_O_GET_R_LENGTH (symnum);
733 reloc.r_pcrel = (symnum & BFD_MACH_O_R_PCREL) ? 1 : 0;
734 reloc.r_scattered = 0;
737 if (!(*bed->_bfd_mach_o_swap_reloc_in)(res, &reloc))
743 bfd_mach_o_canonicalize_relocs (bfd *abfd, unsigned long filepos,
745 arelent *res, asymbol **syms)
749 bfd_size_type native_size;
751 /* Allocate and read relocs. */
752 native_size = count * BFD_MACH_O_RELENT_SIZE;
753 native_relocs = bfd_malloc (native_size);
754 if (native_relocs == NULL)
757 if (bfd_seek (abfd, filepos, SEEK_SET) != 0
758 || bfd_bread (native_relocs, native_size, abfd) != native_size)
761 for (i = 0; i < count; i++)
763 char *buf = native_relocs + BFD_MACH_O_RELENT_SIZE * i;
765 if (bfd_mach_o_canonicalize_one_reloc (abfd, buf, &res[i], syms) < 0)
768 free (native_relocs);
771 free (native_relocs);
776 bfd_mach_o_canonicalize_reloc (bfd *abfd, asection *asect,
777 arelent **rels, asymbol **syms)
779 bfd_mach_o_backend_data *bed = bfd_mach_o_get_backend_data (abfd);
783 if (asect->reloc_count == 0)
786 /* No need to go further if we don't know how to read relocs. */
787 if (bed->_bfd_mach_o_swap_reloc_in == NULL)
790 res = bfd_malloc (asect->reloc_count * sizeof (arelent));
794 if (bfd_mach_o_canonicalize_relocs (abfd, asect->rel_filepos,
795 asect->reloc_count, res, syms) < 0)
801 for (i = 0; i < asect->reloc_count; i++)
804 asect->relocation = res;
810 bfd_mach_o_get_dynamic_reloc_upper_bound (bfd *abfd)
812 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
814 if (mdata->dysymtab == NULL)
816 return (mdata->dysymtab->nextrel + mdata->dysymtab->nlocrel)
817 * sizeof (arelent *);
821 bfd_mach_o_canonicalize_dynamic_reloc (bfd *abfd, arelent **rels,
822 struct bfd_symbol **syms)
824 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
825 bfd_mach_o_dysymtab_command *dysymtab = mdata->dysymtab;
826 bfd_mach_o_backend_data *bed = bfd_mach_o_get_backend_data (abfd);
830 if (dysymtab == NULL)
832 if (dysymtab->nextrel == 0 && dysymtab->nlocrel == 0)
835 /* No need to go further if we don't know how to read relocs. */
836 if (bed->_bfd_mach_o_swap_reloc_in == NULL)
839 res = bfd_malloc ((dysymtab->nextrel + dysymtab->nlocrel) * sizeof (arelent));
843 if (bfd_mach_o_canonicalize_relocs (abfd, dysymtab->extreloff,
844 dysymtab->nextrel, res, syms) < 0)
850 if (bfd_mach_o_canonicalize_relocs (abfd, dysymtab->locreloff,
852 res + dysymtab->nextrel, syms) < 0)
858 for (i = 0; i < dysymtab->nextrel + dysymtab->nlocrel; i++)
865 bfd_mach_o_write_relocs (bfd *abfd, bfd_mach_o_section *section)
867 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
871 bfd_mach_o_backend_data *bed = bfd_mach_o_get_backend_data (abfd);
873 sec = section->bfdsection;
874 if (sec->reloc_count == 0)
877 if (bed->_bfd_mach_o_swap_reloc_out == NULL)
880 /* Allocate relocation room. */
881 mdata->filelen = FILE_ALIGN(mdata->filelen, 2);
882 section->nreloc = sec->reloc_count;
883 sec->rel_filepos = mdata->filelen;
884 section->reloff = sec->rel_filepos;
885 mdata->filelen += sec->reloc_count * BFD_MACH_O_RELENT_SIZE;
887 if (bfd_seek (abfd, section->reloff, SEEK_SET) != 0)
890 /* Convert and write. */
891 entries = section->bfdsection->orelocation;
892 for (i = 0; i < section->nreloc; i++)
894 arelent *rel = entries[i];
896 bfd_mach_o_reloc_info info, *pinfo = &info;
898 /* Convert relocation to an intermediate representation. */
899 if (!(*bed->_bfd_mach_o_swap_reloc_out) (rel, pinfo))
902 /* Lower the relocation info. */
903 if (pinfo->r_scattered)
907 v = BFD_MACH_O_SR_SCATTERED
908 | (pinfo->r_pcrel ? BFD_MACH_O_SR_PCREL : 0)
909 | BFD_MACH_O_SET_SR_LENGTH(pinfo->r_length)
910 | BFD_MACH_O_SET_SR_TYPE(pinfo->r_type)
911 | BFD_MACH_O_SET_SR_ADDRESS(pinfo->r_address);
912 bfd_put_32 (abfd, v, buf);
913 bfd_put_32 (abfd, pinfo->r_value, buf + 4);
919 bfd_put_32 (abfd, pinfo->r_address, buf);
920 v = BFD_MACH_O_SET_R_SYMBOLNUM (pinfo->r_value)
921 | (pinfo->r_pcrel ? BFD_MACH_O_R_PCREL : 0)
922 | BFD_MACH_O_SET_R_LENGTH (pinfo->r_length)
923 | (pinfo->r_extern ? BFD_MACH_O_R_EXTERN : 0)
924 | BFD_MACH_O_SET_R_TYPE (pinfo->r_type);
925 bfd_put_32 (abfd, v, buf + 4);
928 if (bfd_bwrite ((void *) buf, BFD_MACH_O_RELENT_SIZE, abfd)
929 != BFD_MACH_O_RELENT_SIZE)
936 bfd_mach_o_write_section_32 (bfd *abfd, bfd_mach_o_section *section)
938 unsigned char buf[BFD_MACH_O_SECTION_SIZE];
940 memcpy (buf, section->sectname, 16);
941 memcpy (buf + 16, section->segname, 16);
942 bfd_h_put_32 (abfd, section->addr, buf + 32);
943 bfd_h_put_32 (abfd, section->size, buf + 36);
944 bfd_h_put_32 (abfd, section->offset, buf + 40);
945 bfd_h_put_32 (abfd, section->align, buf + 44);
946 bfd_h_put_32 (abfd, section->reloff, buf + 48);
947 bfd_h_put_32 (abfd, section->nreloc, buf + 52);
948 bfd_h_put_32 (abfd, section->flags, buf + 56);
949 bfd_h_put_32 (abfd, section->reserved1, buf + 60);
950 bfd_h_put_32 (abfd, section->reserved2, buf + 64);
952 if (bfd_bwrite ((void *) buf, BFD_MACH_O_SECTION_SIZE, abfd)
953 != BFD_MACH_O_SECTION_SIZE)
960 bfd_mach_o_write_section_64 (bfd *abfd, bfd_mach_o_section *section)
962 unsigned char buf[BFD_MACH_O_SECTION_64_SIZE];
964 memcpy (buf, section->sectname, 16);
965 memcpy (buf + 16, section->segname, 16);
966 bfd_h_put_64 (abfd, section->addr, buf + 32);
967 bfd_h_put_64 (abfd, section->size, buf + 40);
968 bfd_h_put_32 (abfd, section->offset, buf + 48);
969 bfd_h_put_32 (abfd, section->align, buf + 52);
970 bfd_h_put_32 (abfd, section->reloff, buf + 56);
971 bfd_h_put_32 (abfd, section->nreloc, buf + 60);
972 bfd_h_put_32 (abfd, section->flags, buf + 64);
973 bfd_h_put_32 (abfd, section->reserved1, buf + 68);
974 bfd_h_put_32 (abfd, section->reserved2, buf + 72);
975 bfd_h_put_32 (abfd, section->reserved3, buf + 76);
977 if (bfd_bwrite ((void *) buf, BFD_MACH_O_SECTION_64_SIZE, abfd)
978 != BFD_MACH_O_SECTION_64_SIZE)
985 bfd_mach_o_write_segment_32 (bfd *abfd, bfd_mach_o_load_command *command)
987 unsigned char buf[BFD_MACH_O_LC_SEGMENT_SIZE];
988 bfd_mach_o_segment_command *seg = &command->command.segment;
991 BFD_ASSERT (command->type == BFD_MACH_O_LC_SEGMENT);
993 for (i = 0; i < seg->nsects; i++)
994 if (!bfd_mach_o_write_relocs (abfd, &seg->sections[i]))
997 memcpy (buf, seg->segname, 16);
998 bfd_h_put_32 (abfd, seg->vmaddr, buf + 16);
999 bfd_h_put_32 (abfd, seg->vmsize, buf + 20);
1000 bfd_h_put_32 (abfd, seg->fileoff, buf + 24);
1001 bfd_h_put_32 (abfd, seg->filesize, buf + 28);
1002 bfd_h_put_32 (abfd, seg->maxprot, buf + 32);
1003 bfd_h_put_32 (abfd, seg->initprot, buf + 36);
1004 bfd_h_put_32 (abfd, seg->nsects, buf + 40);
1005 bfd_h_put_32 (abfd, seg->flags, buf + 44);
1007 if (bfd_seek (abfd, command->offset + 8, SEEK_SET) != 0
1008 || (bfd_bwrite ((void *) buf, BFD_MACH_O_LC_SEGMENT_SIZE - 8, abfd)
1009 != BFD_MACH_O_LC_SEGMENT_SIZE - 8))
1012 for (i = 0; i < seg->nsects; i++)
1013 if (bfd_mach_o_write_section_32 (abfd, &seg->sections[i]))
1020 bfd_mach_o_write_segment_64 (bfd *abfd, bfd_mach_o_load_command *command)
1022 unsigned char buf[BFD_MACH_O_LC_SEGMENT_64_SIZE];
1023 bfd_mach_o_segment_command *seg = &command->command.segment;
1026 BFD_ASSERT (command->type == BFD_MACH_O_LC_SEGMENT_64);
1028 for (i = 0; i < seg->nsects; i++)
1029 if (!bfd_mach_o_write_relocs (abfd, &seg->sections[i]))
1032 memcpy (buf, seg->segname, 16);
1033 bfd_h_put_64 (abfd, seg->vmaddr, buf + 16);
1034 bfd_h_put_64 (abfd, seg->vmsize, buf + 24);
1035 bfd_h_put_64 (abfd, seg->fileoff, buf + 32);
1036 bfd_h_put_64 (abfd, seg->filesize, buf + 40);
1037 bfd_h_put_32 (abfd, seg->maxprot, buf + 48);
1038 bfd_h_put_32 (abfd, seg->initprot, buf + 52);
1039 bfd_h_put_32 (abfd, seg->nsects, buf + 56);
1040 bfd_h_put_32 (abfd, seg->flags, buf + 60);
1042 if (bfd_seek (abfd, command->offset + 8, SEEK_SET) != 0
1043 || (bfd_bwrite ((void *) buf, BFD_MACH_O_LC_SEGMENT_64_SIZE - 8, abfd)
1044 != BFD_MACH_O_LC_SEGMENT_64_SIZE - 8))
1047 for (i = 0; i < seg->nsects; i++)
1048 if (bfd_mach_o_write_section_64 (abfd, &seg->sections[i]))
1055 bfd_mach_o_write_symtab (bfd *abfd, bfd_mach_o_load_command *command)
1057 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
1058 bfd_mach_o_symtab_command *sym = &command->command.symtab;
1059 unsigned char buf[16];
1061 unsigned int wide = bfd_mach_o_wide_p (abfd);
1062 unsigned int symlen = wide ? BFD_MACH_O_NLIST_64_SIZE : BFD_MACH_O_NLIST_SIZE;
1063 struct bfd_strtab_hash *strtab;
1064 asymbol **symbols = bfd_get_outsymbols (abfd);
1066 BFD_ASSERT (command->type == BFD_MACH_O_LC_SYMTAB);
1068 /* Write the symbols first. */
1069 mdata->filelen = FILE_ALIGN(mdata->filelen, wide ? 3 : 2);
1070 sym->symoff = mdata->filelen;
1071 if (bfd_seek (abfd, sym->symoff, SEEK_SET) != 0)
1074 sym->nsyms = bfd_get_symcount (abfd);
1075 mdata->filelen += sym->nsyms * symlen;
1077 strtab = _bfd_stringtab_init ();
1081 for (i = 0; i < sym->nsyms; i++)
1083 bfd_size_type str_index;
1084 bfd_mach_o_asymbol *s = (bfd_mach_o_asymbol *)symbols[i];
1086 /* Compute name index. */
1087 /* An index of 0 always means the empty string. */
1088 if (s->symbol.name == 0 || s->symbol.name[0] == '\0')
1092 str_index = _bfd_stringtab_add (strtab, s->symbol.name, TRUE, FALSE);
1093 if (str_index == (bfd_size_type) -1)
1096 bfd_h_put_32 (abfd, str_index, buf);
1097 bfd_h_put_8 (abfd, s->n_type, buf + 4);
1098 bfd_h_put_8 (abfd, s->n_sect, buf + 5);
1099 bfd_h_put_16 (abfd, s->n_desc, buf + 6);
1101 bfd_h_put_64 (abfd, s->symbol.section->vma + s->symbol.value, buf + 8);
1103 bfd_h_put_32 (abfd, s->symbol.section->vma + s->symbol.value, buf + 8);
1105 if (bfd_bwrite ((void *) buf, symlen, abfd) != symlen)
1108 sym->strsize = _bfd_stringtab_size (strtab);
1109 sym->stroff = mdata->filelen;
1110 mdata->filelen += sym->strsize;
1112 if (_bfd_stringtab_emit (abfd, strtab) != TRUE)
1114 _bfd_stringtab_free (strtab);
1117 bfd_h_put_32 (abfd, sym->symoff, buf);
1118 bfd_h_put_32 (abfd, sym->nsyms, buf + 4);
1119 bfd_h_put_32 (abfd, sym->stroff, buf + 8);
1120 bfd_h_put_32 (abfd, sym->strsize, buf + 12);
1122 if (bfd_seek (abfd, command->offset + 8, SEEK_SET) != 0
1123 || bfd_bwrite ((void *) buf, 16, abfd) != 16)
1129 _bfd_stringtab_free (strtab);
1133 /* Process the symbols and generate Mach-O specific fields.
1137 bfd_mach_o_mangle_symbols (bfd *abfd)
1140 asymbol **symbols = bfd_get_outsymbols (abfd);
1142 for (i = 0; i < bfd_get_symcount (abfd); i++)
1144 bfd_mach_o_asymbol *s = (bfd_mach_o_asymbol *)symbols[i];
1146 if (s->n_type == BFD_MACH_O_N_UNDF && !(s->symbol.flags & BSF_DEBUGGING))
1148 /* As genuine Mach-O symbols type shouldn't be N_UNDF (undefined
1149 symbols should be N_UNDEF | N_EXT), we suppose the back-end
1150 values haven't been set. */
1151 if (s->symbol.section == bfd_abs_section_ptr)
1152 s->n_type = BFD_MACH_O_N_ABS;
1153 else if (s->symbol.section == bfd_und_section_ptr)
1155 s->n_type = BFD_MACH_O_N_UNDF;
1156 if (s->symbol.flags & BSF_WEAK)
1157 s->n_desc |= BFD_MACH_O_N_WEAK_REF;
1159 else if (s->symbol.section == bfd_com_section_ptr)
1160 s->n_type = BFD_MACH_O_N_UNDF | BFD_MACH_O_N_EXT;
1162 s->n_type = BFD_MACH_O_N_SECT;
1164 if (s->symbol.flags & BSF_GLOBAL)
1165 s->n_type |= BFD_MACH_O_N_EXT;
1168 /* Compute section index. */
1169 if (s->symbol.section != bfd_abs_section_ptr
1170 && s->symbol.section != bfd_und_section_ptr
1171 && s->symbol.section != bfd_com_section_ptr)
1172 s->n_sect = s->symbol.section->target_index;
1174 /* Number symbols. */
1175 s->symbol.udata.i = i;
1181 bfd_mach_o_write_contents (bfd *abfd)
1184 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
1186 if (mdata->header.ncmds == 0)
1187 if (!bfd_mach_o_build_commands (abfd))
1190 /* Now write header information. */
1191 if (mdata->header.filetype == 0)
1193 if (abfd->flags & EXEC_P)
1194 mdata->header.filetype = BFD_MACH_O_MH_EXECUTE;
1195 else if (abfd->flags & DYNAMIC)
1196 mdata->header.filetype = BFD_MACH_O_MH_DYLIB;
1198 mdata->header.filetype = BFD_MACH_O_MH_OBJECT;
1200 if (!bfd_mach_o_write_header (abfd, &mdata->header))
1203 /* Assign a number to each symbols. */
1204 if (!bfd_mach_o_mangle_symbols (abfd))
1207 for (i = 0; i < mdata->header.ncmds; i++)
1209 unsigned char buf[8];
1210 bfd_mach_o_load_command *cur = &mdata->commands[i];
1211 unsigned long typeflag;
1213 typeflag = cur->type | (cur->type_required ? BFD_MACH_O_LC_REQ_DYLD : 0);
1215 bfd_h_put_32 (abfd, typeflag, buf);
1216 bfd_h_put_32 (abfd, cur->len, buf + 4);
1218 if (bfd_seek (abfd, cur->offset, SEEK_SET) != 0
1219 || bfd_bwrite ((void *) buf, 8, abfd) != 8)
1224 case BFD_MACH_O_LC_SEGMENT:
1225 if (bfd_mach_o_write_segment_32 (abfd, cur) != 0)
1228 case BFD_MACH_O_LC_SEGMENT_64:
1229 if (bfd_mach_o_write_segment_64 (abfd, cur) != 0)
1232 case BFD_MACH_O_LC_SYMTAB:
1233 if (!bfd_mach_o_write_symtab (abfd, cur))
1236 case BFD_MACH_O_LC_SYMSEG:
1238 case BFD_MACH_O_LC_THREAD:
1239 case BFD_MACH_O_LC_UNIXTHREAD:
1240 if (bfd_mach_o_write_thread (abfd, cur) != 0)
1243 case BFD_MACH_O_LC_LOADFVMLIB:
1244 case BFD_MACH_O_LC_IDFVMLIB:
1245 case BFD_MACH_O_LC_IDENT:
1246 case BFD_MACH_O_LC_FVMFILE:
1247 case BFD_MACH_O_LC_PREPAGE:
1248 case BFD_MACH_O_LC_DYSYMTAB:
1249 case BFD_MACH_O_LC_LOAD_DYLIB:
1250 case BFD_MACH_O_LC_LOAD_WEAK_DYLIB:
1251 case BFD_MACH_O_LC_ID_DYLIB:
1252 case BFD_MACH_O_LC_REEXPORT_DYLIB:
1253 case BFD_MACH_O_LC_LOAD_DYLINKER:
1254 case BFD_MACH_O_LC_ID_DYLINKER:
1255 case BFD_MACH_O_LC_PREBOUND_DYLIB:
1256 case BFD_MACH_O_LC_ROUTINES:
1257 case BFD_MACH_O_LC_SUB_FRAMEWORK:
1260 (*_bfd_error_handler) (_("unable to write unknown load command 0x%lx"),
1261 (unsigned long) cur->type);
1269 /* Build Mach-O load commands from the sections. */
1272 bfd_mach_o_build_commands (bfd *abfd)
1274 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
1275 unsigned int wide = mach_o_wide_p (&mdata->header);
1276 bfd_mach_o_segment_command *seg;
1277 bfd_mach_o_section *sections;
1279 bfd_mach_o_load_command *cmd;
1280 bfd_mach_o_load_command *symtab_cmd;
1283 /* Return now if commands are already built. */
1284 if (mdata->header.ncmds)
1287 /* Very simple version: 1 command (segment) containing all sections. */
1288 mdata->header.ncmds = 2;
1289 mdata->commands = bfd_alloc (abfd, mdata->header.ncmds
1290 * sizeof (bfd_mach_o_load_command));
1291 if (mdata->commands == NULL)
1293 cmd = &mdata->commands[0];
1294 seg = &cmd->command.segment;
1296 seg->nsects = bfd_count_sections (abfd);
1297 sections = bfd_alloc (abfd, seg->nsects * sizeof (bfd_mach_o_section));
1298 if (sections == NULL)
1300 seg->sections = sections;
1302 /* Set segment command. */
1305 cmd->type = BFD_MACH_O_LC_SEGMENT_64;
1306 cmd->offset = BFD_MACH_O_HEADER_64_SIZE;
1307 cmd->len = BFD_MACH_O_LC_SEGMENT_64_SIZE
1308 + BFD_MACH_O_SECTION_64_SIZE * seg->nsects;
1312 cmd->type = BFD_MACH_O_LC_SEGMENT;
1313 cmd->offset = BFD_MACH_O_HEADER_SIZE;
1314 cmd->len = BFD_MACH_O_LC_SEGMENT_SIZE
1315 + BFD_MACH_O_SECTION_SIZE * seg->nsects;
1317 cmd->type_required = FALSE;
1318 mdata->header.sizeofcmds = cmd->len;
1319 mdata->filelen = cmd->offset + cmd->len;
1321 /* Set symtab command. */
1322 symtab_cmd = &mdata->commands[1];
1324 symtab_cmd->type = BFD_MACH_O_LC_SYMTAB;
1325 symtab_cmd->offset = cmd->offset + cmd->len;
1326 symtab_cmd->len = 6 * 4;
1327 symtab_cmd->type_required = FALSE;
1329 mdata->header.sizeofcmds += symtab_cmd->len;
1330 mdata->filelen += symtab_cmd->len;
1332 /* Fill segment command. */
1333 memset (seg->segname, 0, sizeof (seg->segname));
1335 seg->fileoff = mdata->filelen;
1337 seg->maxprot = BFD_MACH_O_PROT_READ | BFD_MACH_O_PROT_WRITE
1338 | BFD_MACH_O_PROT_EXECUTE;
1339 seg->initprot = seg->maxprot;
1342 /* Create Mach-O sections. */
1344 for (sec = abfd->sections; sec; sec = sec->next)
1346 sections->bfdsection = sec;
1347 bfd_mach_o_convert_section_name_to_mach_o (abfd, sec, sections);
1348 sections->addr = bfd_get_section_vma (abfd, sec);
1349 sections->size = bfd_get_section_size (sec);
1350 sections->align = bfd_get_section_alignment (abfd, sec);
1352 if (sections->size != 0)
1354 mdata->filelen = FILE_ALIGN (mdata->filelen, sections->align);
1355 sections->offset = mdata->filelen;
1358 sections->offset = 0;
1359 sections->reloff = 0;
1360 sections->nreloc = 0;
1361 sections->reserved1 = 0;
1362 sections->reserved2 = 0;
1363 sections->reserved3 = 0;
1365 sec->filepos = sections->offset;
1366 sec->target_index = ++target_index;
1368 mdata->filelen += sections->size;
1371 seg->filesize = mdata->filelen - seg->fileoff;
1372 seg->vmsize = seg->filesize;
1377 /* Set the contents of a section. */
1380 bfd_mach_o_set_section_contents (bfd *abfd,
1382 const void * location,
1384 bfd_size_type count)
1388 /* This must be done first, because bfd_set_section_contents is
1389 going to set output_has_begun to TRUE. */
1390 if (! abfd->output_has_begun && ! bfd_mach_o_build_commands (abfd))
1396 pos = section->filepos + offset;
1397 if (bfd_seek (abfd, pos, SEEK_SET) != 0
1398 || bfd_bwrite (location, count, abfd) != count)
1405 bfd_mach_o_sizeof_headers (bfd *a ATTRIBUTE_UNUSED,
1406 struct bfd_link_info *info ATTRIBUTE_UNUSED)
1411 /* Make an empty symbol. This is required only because
1412 bfd_make_section_anyway wants to create a symbol for the section. */
1415 bfd_mach_o_make_empty_symbol (bfd *abfd)
1417 asymbol *new_symbol;
1419 new_symbol = bfd_zalloc (abfd, sizeof (bfd_mach_o_asymbol));
1420 if (new_symbol == NULL)
1422 new_symbol->the_bfd = abfd;
1423 new_symbol->udata.i = 0;
1428 bfd_mach_o_read_header (bfd *abfd, bfd_mach_o_header *header)
1430 unsigned char buf[32];
1432 bfd_vma (*get32) (const void *) = NULL;
1434 /* Just read the magic number. */
1435 if (bfd_seek (abfd, 0, SEEK_SET) != 0
1436 || bfd_bread ((void *) buf, 4, abfd) != 4)
1439 if (bfd_getb32 (buf) == BFD_MACH_O_MH_MAGIC)
1441 header->byteorder = BFD_ENDIAN_BIG;
1442 header->magic = BFD_MACH_O_MH_MAGIC;
1443 header->version = 1;
1446 else if (bfd_getl32 (buf) == BFD_MACH_O_MH_MAGIC)
1448 header->byteorder = BFD_ENDIAN_LITTLE;
1449 header->magic = BFD_MACH_O_MH_MAGIC;
1450 header->version = 1;
1453 else if (bfd_getb32 (buf) == BFD_MACH_O_MH_MAGIC_64)
1455 header->byteorder = BFD_ENDIAN_BIG;
1456 header->magic = BFD_MACH_O_MH_MAGIC_64;
1457 header->version = 2;
1460 else if (bfd_getl32 (buf) == BFD_MACH_O_MH_MAGIC_64)
1462 header->byteorder = BFD_ENDIAN_LITTLE;
1463 header->magic = BFD_MACH_O_MH_MAGIC_64;
1464 header->version = 2;
1469 header->byteorder = BFD_ENDIAN_UNKNOWN;
1473 /* Once the size of the header is known, read the full header. */
1474 size = mach_o_wide_p (header) ?
1475 BFD_MACH_O_HEADER_64_SIZE : BFD_MACH_O_HEADER_SIZE;
1477 if (bfd_seek (abfd, 0, SEEK_SET) != 0
1478 || bfd_bread ((void *) buf, size, abfd) != size)
1481 header->cputype = (*get32) (buf + 4);
1482 header->cpusubtype = (*get32) (buf + 8);
1483 header->filetype = (*get32) (buf + 12);
1484 header->ncmds = (*get32) (buf + 16);
1485 header->sizeofcmds = (*get32) (buf + 20);
1486 header->flags = (*get32) (buf + 24);
1488 if (mach_o_wide_p (header))
1489 header->reserved = (*get32) (buf + 28);
1495 bfd_mach_o_make_bfd_section (bfd *abfd, bfd_mach_o_section *section,
1502 bfd_mach_o_convert_section_name_to_bfd (abfd, section, &sname, &flags);
1506 if (flags == SEC_NO_FLAGS)
1508 /* Try to guess flags. */
1509 if (section->flags & BFD_MACH_O_S_ATTR_DEBUG)
1510 flags = SEC_DEBUGGING;
1514 if ((section->flags & BFD_MACH_O_SECTION_TYPE_MASK)
1515 != BFD_MACH_O_S_ZEROFILL)
1518 if (prot & BFD_MACH_O_PROT_EXECUTE)
1520 if (prot & BFD_MACH_O_PROT_WRITE)
1522 else if (prot & BFD_MACH_O_PROT_READ)
1523 flags |= SEC_READONLY;
1529 if ((flags & SEC_DEBUGGING) == 0)
1533 if (section->offset != 0)
1534 flags |= SEC_HAS_CONTENTS;
1535 if (section->nreloc != 0)
1538 bfdsec = bfd_make_section_anyway_with_flags (abfd, sname, flags);
1542 bfdsec->vma = section->addr;
1543 bfdsec->lma = section->addr;
1544 bfdsec->size = section->size;
1545 bfdsec->filepos = section->offset;
1546 bfdsec->alignment_power = section->align;
1547 bfdsec->segment_mark = 0;
1548 bfdsec->reloc_count = section->nreloc;
1549 bfdsec->rel_filepos = section->reloff;
1555 bfd_mach_o_read_section_32 (bfd *abfd,
1556 bfd_mach_o_section *section,
1557 unsigned int offset,
1560 unsigned char buf[BFD_MACH_O_SECTION_SIZE];
1562 if (bfd_seek (abfd, offset, SEEK_SET) != 0
1563 || (bfd_bread ((void *) buf, BFD_MACH_O_SECTION_SIZE, abfd)
1564 != BFD_MACH_O_SECTION_SIZE))
1567 memcpy (section->sectname, buf, 16);
1568 section->sectname[16] = '\0';
1569 memcpy (section->segname, buf + 16, 16);
1570 section->segname[16] = '\0';
1571 section->addr = bfd_h_get_32 (abfd, buf + 32);
1572 section->size = bfd_h_get_32 (abfd, buf + 36);
1573 section->offset = bfd_h_get_32 (abfd, buf + 40);
1574 section->align = bfd_h_get_32 (abfd, buf + 44);
1575 section->reloff = bfd_h_get_32 (abfd, buf + 48);
1576 section->nreloc = bfd_h_get_32 (abfd, buf + 52);
1577 section->flags = bfd_h_get_32 (abfd, buf + 56);
1578 section->reserved1 = bfd_h_get_32 (abfd, buf + 60);
1579 section->reserved2 = bfd_h_get_32 (abfd, buf + 64);
1580 section->reserved3 = 0;
1581 section->bfdsection = bfd_mach_o_make_bfd_section (abfd, section, prot);
1583 if (section->bfdsection == NULL)
1590 bfd_mach_o_read_section_64 (bfd *abfd,
1591 bfd_mach_o_section *section,
1592 unsigned int offset,
1595 unsigned char buf[BFD_MACH_O_SECTION_64_SIZE];
1597 if (bfd_seek (abfd, offset, SEEK_SET) != 0
1598 || (bfd_bread ((void *) buf, BFD_MACH_O_SECTION_64_SIZE, abfd)
1599 != BFD_MACH_O_SECTION_64_SIZE))
1602 memcpy (section->sectname, buf, 16);
1603 section->sectname[16] = '\0';
1604 memcpy (section->segname, buf + 16, 16);
1605 section->segname[16] = '\0';
1606 section->addr = bfd_h_get_64 (abfd, buf + 32);
1607 section->size = bfd_h_get_64 (abfd, buf + 40);
1608 section->offset = bfd_h_get_32 (abfd, buf + 48);
1609 section->align = bfd_h_get_32 (abfd, buf + 52);
1610 section->reloff = bfd_h_get_32 (abfd, buf + 56);
1611 section->nreloc = bfd_h_get_32 (abfd, buf + 60);
1612 section->flags = bfd_h_get_32 (abfd, buf + 64);
1613 section->reserved1 = bfd_h_get_32 (abfd, buf + 68);
1614 section->reserved2 = bfd_h_get_32 (abfd, buf + 72);
1615 section->reserved3 = bfd_h_get_32 (abfd, buf + 76);
1616 section->bfdsection = bfd_mach_o_make_bfd_section (abfd, section, prot);
1618 if (section->bfdsection == NULL)
1625 bfd_mach_o_read_section (bfd *abfd,
1626 bfd_mach_o_section *section,
1627 unsigned int offset,
1632 return bfd_mach_o_read_section_64 (abfd, section, offset, prot);
1634 return bfd_mach_o_read_section_32 (abfd, section, offset, prot);
1638 bfd_mach_o_read_symtab_symbol (bfd *abfd,
1639 bfd_mach_o_symtab_command *sym,
1640 bfd_mach_o_asymbol *s,
1643 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
1644 unsigned int wide = mach_o_wide_p (&mdata->header);
1645 unsigned int symwidth =
1646 wide ? BFD_MACH_O_NLIST_64_SIZE : BFD_MACH_O_NLIST_SIZE;
1647 unsigned int symoff = sym->symoff + (i * symwidth);
1648 unsigned char buf[16];
1649 unsigned char type = -1;
1650 unsigned char section = -1;
1652 symvalue value = -1;
1653 unsigned long stroff = -1;
1654 unsigned int symtype = -1;
1656 BFD_ASSERT (sym->strtab != NULL);
1658 if (bfd_seek (abfd, symoff, SEEK_SET) != 0
1659 || bfd_bread ((void *) buf, symwidth, abfd) != symwidth)
1661 (*_bfd_error_handler) (_("bfd_mach_o_read_symtab_symbol: unable to read %d bytes at %lu"),
1662 symwidth, (unsigned long) symoff);
1666 stroff = bfd_h_get_32 (abfd, buf);
1667 type = bfd_h_get_8 (abfd, buf + 4);
1668 symtype = type & BFD_MACH_O_N_TYPE;
1669 section = bfd_h_get_8 (abfd, buf + 5);
1670 desc = bfd_h_get_16 (abfd, buf + 6);
1672 value = bfd_h_get_64 (abfd, buf + 8);
1674 value = bfd_h_get_32 (abfd, buf + 8);
1676 if (stroff >= sym->strsize)
1678 (*_bfd_error_handler) (_("bfd_mach_o_read_symtab_symbol: symbol name out of range (%lu >= %lu)"),
1679 (unsigned long) stroff,
1680 (unsigned long) sym->strsize);
1684 s->symbol.the_bfd = abfd;
1685 s->symbol.name = sym->strtab + stroff;
1686 s->symbol.value = value;
1687 s->symbol.flags = 0x0;
1688 s->symbol.udata.i = 0;
1690 s->n_sect = section;
1693 if (type & BFD_MACH_O_N_STAB)
1695 s->symbol.flags |= BSF_DEBUGGING;
1696 s->symbol.section = bfd_und_section_ptr;
1708 if ((section > 0) && (section <= mdata->nsects))
1710 s->symbol.section = mdata->sections[section - 1]->bfdsection;
1712 s->symbol.value - mdata->sections[section - 1]->addr;
1719 if (type & BFD_MACH_O_N_PEXT)
1720 s->symbol.flags |= BSF_GLOBAL;
1722 if (type & BFD_MACH_O_N_EXT)
1723 s->symbol.flags |= BSF_GLOBAL;
1725 if (!(type & (BFD_MACH_O_N_PEXT | BFD_MACH_O_N_EXT)))
1726 s->symbol.flags |= BSF_LOCAL;
1730 case BFD_MACH_O_N_UNDF:
1731 if (type == (BFD_MACH_O_N_UNDF | BFD_MACH_O_N_EXT)
1732 && s->symbol.value != 0)
1734 /* A common symbol. */
1735 s->symbol.section = bfd_com_section_ptr;
1736 s->symbol.flags = BSF_NO_FLAGS;
1740 s->symbol.section = bfd_und_section_ptr;
1741 if (s->n_desc & BFD_MACH_O_N_WEAK_REF)
1742 s->symbol.flags |= BSF_WEAK;
1745 case BFD_MACH_O_N_PBUD:
1746 s->symbol.section = bfd_und_section_ptr;
1748 case BFD_MACH_O_N_ABS:
1749 s->symbol.section = bfd_abs_section_ptr;
1751 case BFD_MACH_O_N_SECT:
1752 if ((section > 0) && (section <= mdata->nsects))
1754 s->symbol.section = mdata->sections[section - 1]->bfdsection;
1756 s->symbol.value - mdata->sections[section - 1]->addr;
1760 /* Mach-O uses 0 to mean "no section"; not an error. */
1763 (*_bfd_error_handler) (_("bfd_mach_o_read_symtab_symbol: "
1764 "symbol \"%s\" specified invalid section %d (max %lu): setting to undefined"),
1765 s->symbol.name, section, mdata->nsects);
1767 s->symbol.section = bfd_und_section_ptr;
1770 case BFD_MACH_O_N_INDR:
1771 (*_bfd_error_handler) (_("bfd_mach_o_read_symtab_symbol: "
1772 "symbol \"%s\" is unsupported 'indirect' reference: setting to undefined"),
1774 s->symbol.section = bfd_und_section_ptr;
1777 (*_bfd_error_handler) (_("bfd_mach_o_read_symtab_symbol: "
1778 "symbol \"%s\" specified invalid type field 0x%x: setting to undefined"),
1779 s->symbol.name, symtype);
1780 s->symbol.section = bfd_und_section_ptr;
1789 bfd_mach_o_read_symtab_strtab (bfd *abfd)
1791 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
1792 bfd_mach_o_symtab_command *sym = mdata->symtab;
1794 /* Fail if there is no symtab. */
1798 /* Success if already loaded. */
1802 if (abfd->flags & BFD_IN_MEMORY)
1804 struct bfd_in_memory *b;
1806 b = (struct bfd_in_memory *) abfd->iostream;
1808 if ((sym->stroff + sym->strsize) > b->size)
1810 bfd_set_error (bfd_error_file_truncated);
1813 sym->strtab = (char *) b->buffer + sym->stroff;
1817 sym->strtab = bfd_alloc (abfd, sym->strsize);
1818 if (sym->strtab == NULL)
1821 if (bfd_seek (abfd, sym->stroff, SEEK_SET) != 0
1822 || bfd_bread ((void *) sym->strtab, sym->strsize, abfd) != sym->strsize)
1824 bfd_set_error (bfd_error_file_truncated);
1833 bfd_mach_o_read_symtab_symbols (bfd *abfd)
1835 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
1836 bfd_mach_o_symtab_command *sym = mdata->symtab;
1840 if (sym == NULL || sym->symbols)
1842 /* Return now if there are no symbols or if already loaded. */
1846 sym->symbols = bfd_alloc (abfd, sym->nsyms * sizeof (bfd_mach_o_asymbol));
1848 if (sym->symbols == NULL)
1850 (*_bfd_error_handler) (_("bfd_mach_o_read_symtab_symbols: unable to allocate memory for symbols"));
1854 ret = bfd_mach_o_read_symtab_strtab (abfd);
1858 for (i = 0; i < sym->nsyms; i++)
1860 ret = bfd_mach_o_read_symtab_symbol (abfd, sym, &sym->symbols[i], i);
1869 bfd_mach_o_read_dysymtab_symbol (bfd *abfd,
1870 bfd_mach_o_dysymtab_command *dysym,
1871 bfd_mach_o_symtab_command *sym,
1872 bfd_mach_o_asymbol *s,
1875 unsigned long isymoff = dysym->indirectsymoff + (i * 4);
1876 unsigned long sym_index;
1877 unsigned char buf[4];
1879 BFD_ASSERT (i < dysym->nindirectsyms);
1881 if (bfd_seek (abfd, isymoff, SEEK_SET) != 0
1882 || bfd_bread ((void *) buf, 4, abfd) != 4)
1884 (*_bfd_error_handler) (_("bfd_mach_o_read_dysymtab_symbol: unable to read %lu bytes at %lu"),
1885 (unsigned long) 4, isymoff);
1888 sym_index = bfd_h_get_32 (abfd, buf);
1890 return bfd_mach_o_read_symtab_symbol (abfd, sym, s, sym_index);
1894 bfd_mach_o_i386_flavour_string (unsigned int flavour)
1896 switch ((int) flavour)
1898 case BFD_MACH_O_x86_THREAD_STATE32: return "x86_THREAD_STATE32";
1899 case BFD_MACH_O_x86_FLOAT_STATE32: return "x86_FLOAT_STATE32";
1900 case BFD_MACH_O_x86_EXCEPTION_STATE32: return "x86_EXCEPTION_STATE32";
1901 case BFD_MACH_O_x86_THREAD_STATE64: return "x86_THREAD_STATE64";
1902 case BFD_MACH_O_x86_FLOAT_STATE64: return "x86_FLOAT_STATE64";
1903 case BFD_MACH_O_x86_EXCEPTION_STATE64: return "x86_EXCEPTION_STATE64";
1904 case BFD_MACH_O_x86_THREAD_STATE: return "x86_THREAD_STATE";
1905 case BFD_MACH_O_x86_FLOAT_STATE: return "x86_FLOAT_STATE";
1906 case BFD_MACH_O_x86_EXCEPTION_STATE: return "x86_EXCEPTION_STATE";
1907 case BFD_MACH_O_x86_DEBUG_STATE32: return "x86_DEBUG_STATE32";
1908 case BFD_MACH_O_x86_DEBUG_STATE64: return "x86_DEBUG_STATE64";
1909 case BFD_MACH_O_x86_DEBUG_STATE: return "x86_DEBUG_STATE";
1910 case BFD_MACH_O_x86_THREAD_STATE_NONE: return "x86_THREAD_STATE_NONE";
1911 default: return "UNKNOWN";
1916 bfd_mach_o_ppc_flavour_string (unsigned int flavour)
1918 switch ((int) flavour)
1920 case BFD_MACH_O_PPC_THREAD_STATE: return "PPC_THREAD_STATE";
1921 case BFD_MACH_O_PPC_FLOAT_STATE: return "PPC_FLOAT_STATE";
1922 case BFD_MACH_O_PPC_EXCEPTION_STATE: return "PPC_EXCEPTION_STATE";
1923 case BFD_MACH_O_PPC_VECTOR_STATE: return "PPC_VECTOR_STATE";
1924 case BFD_MACH_O_PPC_THREAD_STATE64: return "PPC_THREAD_STATE64";
1925 case BFD_MACH_O_PPC_EXCEPTION_STATE64: return "PPC_EXCEPTION_STATE64";
1926 default: return "UNKNOWN";
1931 bfd_mach_o_read_dylinker (bfd *abfd, bfd_mach_o_load_command *command)
1933 bfd_mach_o_dylinker_command *cmd = &command->command.dylinker;
1934 unsigned char buf[4];
1935 unsigned int nameoff;
1937 BFD_ASSERT ((command->type == BFD_MACH_O_LC_ID_DYLINKER)
1938 || (command->type == BFD_MACH_O_LC_LOAD_DYLINKER));
1940 if (bfd_seek (abfd, command->offset + 8, SEEK_SET) != 0
1941 || bfd_bread ((void *) buf, 4, abfd) != 4)
1944 nameoff = bfd_h_get_32 (abfd, buf + 0);
1946 cmd->name_offset = command->offset + nameoff;
1947 cmd->name_len = command->len - nameoff;
1948 cmd->name_str = bfd_alloc (abfd, cmd->name_len);
1949 if (cmd->name_str == NULL)
1951 if (bfd_seek (abfd, cmd->name_offset, SEEK_SET) != 0
1952 || bfd_bread (cmd->name_str, cmd->name_len, abfd) != cmd->name_len)
1958 bfd_mach_o_read_dylib (bfd *abfd, bfd_mach_o_load_command *command)
1960 bfd_mach_o_dylib_command *cmd = &command->command.dylib;
1961 unsigned char buf[16];
1962 unsigned int nameoff;
1964 switch (command->type)
1966 case BFD_MACH_O_LC_LOAD_DYLIB:
1967 case BFD_MACH_O_LC_LOAD_WEAK_DYLIB:
1968 case BFD_MACH_O_LC_ID_DYLIB:
1969 case BFD_MACH_O_LC_REEXPORT_DYLIB:
1976 if (bfd_seek (abfd, command->offset + 8, SEEK_SET) != 0
1977 || bfd_bread ((void *) buf, 16, abfd) != 16)
1980 nameoff = bfd_h_get_32 (abfd, buf + 0);
1981 cmd->timestamp = bfd_h_get_32 (abfd, buf + 4);
1982 cmd->current_version = bfd_h_get_32 (abfd, buf + 8);
1983 cmd->compatibility_version = bfd_h_get_32 (abfd, buf + 12);
1985 cmd->name_offset = command->offset + nameoff;
1986 cmd->name_len = command->len - nameoff;
1987 cmd->name_str = bfd_alloc (abfd, cmd->name_len);
1988 if (cmd->name_str == NULL)
1990 if (bfd_seek (abfd, cmd->name_offset, SEEK_SET) != 0
1991 || bfd_bread (cmd->name_str, cmd->name_len, abfd) != cmd->name_len)
1997 bfd_mach_o_read_prebound_dylib (bfd *abfd ATTRIBUTE_UNUSED,
1998 bfd_mach_o_load_command *command ATTRIBUTE_UNUSED)
2000 /* bfd_mach_o_prebound_dylib_command *cmd = &command->command.prebound_dylib; */
2002 BFD_ASSERT (command->type == BFD_MACH_O_LC_PREBOUND_DYLIB);
2007 bfd_mach_o_read_thread (bfd *abfd, bfd_mach_o_load_command *command)
2009 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
2010 bfd_mach_o_thread_command *cmd = &command->command.thread;
2011 unsigned char buf[8];
2012 unsigned int offset;
2013 unsigned int nflavours;
2016 BFD_ASSERT ((command->type == BFD_MACH_O_LC_THREAD)
2017 || (command->type == BFD_MACH_O_LC_UNIXTHREAD));
2019 /* Count the number of threads. */
2022 while (offset != command->len)
2024 if (offset >= command->len)
2027 if (bfd_seek (abfd, command->offset + offset, SEEK_SET) != 0
2028 || bfd_bread ((void *) buf, 8, abfd) != 8)
2031 offset += 8 + bfd_h_get_32 (abfd, buf + 4) * 4;
2035 /* Allocate threads. */
2036 cmd->flavours = bfd_alloc
2037 (abfd, nflavours * sizeof (bfd_mach_o_thread_flavour));
2038 if (cmd->flavours == NULL)
2040 cmd->nflavours = nflavours;
2044 while (offset != command->len)
2046 if (offset >= command->len)
2049 if (nflavours >= cmd->nflavours)
2052 if (bfd_seek (abfd, command->offset + offset, SEEK_SET) != 0
2053 || bfd_bread ((void *) buf, 8, abfd) != 8)
2056 cmd->flavours[nflavours].flavour = bfd_h_get_32 (abfd, buf);
2057 cmd->flavours[nflavours].offset = command->offset + offset + 8;
2058 cmd->flavours[nflavours].size = bfd_h_get_32 (abfd, buf + 4) * 4;
2059 offset += cmd->flavours[nflavours].size + 8;
2063 for (i = 0; i < nflavours; i++)
2066 unsigned int snamelen;
2068 const char *flavourstr;
2069 const char *prefix = "LC_THREAD";
2072 switch (mdata->header.cputype)
2074 case BFD_MACH_O_CPU_TYPE_POWERPC:
2075 case BFD_MACH_O_CPU_TYPE_POWERPC_64:
2076 flavourstr = bfd_mach_o_ppc_flavour_string (cmd->flavours[i].flavour);
2078 case BFD_MACH_O_CPU_TYPE_I386:
2079 case BFD_MACH_O_CPU_TYPE_X86_64:
2080 flavourstr = bfd_mach_o_i386_flavour_string (cmd->flavours[i].flavour);
2083 flavourstr = "UNKNOWN_ARCHITECTURE";
2087 snamelen = strlen (prefix) + 1 + 20 + 1 + strlen (flavourstr) + 1;
2088 sname = bfd_alloc (abfd, snamelen);
2094 sprintf (sname, "%s.%s.%u", prefix, flavourstr, j);
2095 if (bfd_get_section_by_name (abfd, sname) == NULL)
2100 bfdsec = bfd_make_section_with_flags (abfd, sname, SEC_HAS_CONTENTS);
2104 bfdsec->size = cmd->flavours[i].size;
2105 bfdsec->filepos = cmd->flavours[i].offset;
2106 bfdsec->alignment_power = 0x0;
2108 cmd->section = bfdsec;
2115 bfd_mach_o_read_dysymtab (bfd *abfd, bfd_mach_o_load_command *command)
2117 bfd_mach_o_dysymtab_command *cmd = &command->command.dysymtab;
2118 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
2119 unsigned char buf[72];
2121 BFD_ASSERT (command->type == BFD_MACH_O_LC_DYSYMTAB);
2123 if (bfd_seek (abfd, command->offset + 8, SEEK_SET) != 0
2124 || bfd_bread ((void *) buf, 72, abfd) != 72)
2127 cmd->ilocalsym = bfd_h_get_32 (abfd, buf + 0);
2128 cmd->nlocalsym = bfd_h_get_32 (abfd, buf + 4);
2129 cmd->iextdefsym = bfd_h_get_32 (abfd, buf + 8);
2130 cmd->nextdefsym = bfd_h_get_32 (abfd, buf + 12);
2131 cmd->iundefsym = bfd_h_get_32 (abfd, buf + 16);
2132 cmd->nundefsym = bfd_h_get_32 (abfd, buf + 20);
2133 cmd->tocoff = bfd_h_get_32 (abfd, buf + 24);
2134 cmd->ntoc = bfd_h_get_32 (abfd, buf + 28);
2135 cmd->modtaboff = bfd_h_get_32 (abfd, buf + 32);
2136 cmd->nmodtab = bfd_h_get_32 (abfd, buf + 36);
2137 cmd->extrefsymoff = bfd_h_get_32 (abfd, buf + 40);
2138 cmd->nextrefsyms = bfd_h_get_32 (abfd, buf + 44);
2139 cmd->indirectsymoff = bfd_h_get_32 (abfd, buf + 48);
2140 cmd->nindirectsyms = bfd_h_get_32 (abfd, buf + 52);
2141 cmd->extreloff = bfd_h_get_32 (abfd, buf + 56);
2142 cmd->nextrel = bfd_h_get_32 (abfd, buf + 60);
2143 cmd->locreloff = bfd_h_get_32 (abfd, buf + 64);
2144 cmd->nlocrel = bfd_h_get_32 (abfd, buf + 68);
2146 if (cmd->nmodtab != 0)
2149 int wide = bfd_mach_o_wide_p (abfd);
2150 unsigned int module_len = wide ? 56 : 52;
2153 bfd_alloc (abfd, cmd->nmodtab * sizeof (bfd_mach_o_dylib_module));
2154 if (cmd->dylib_module == NULL)
2157 if (bfd_seek (abfd, cmd->modtaboff, SEEK_SET) != 0)
2160 for (i = 0; i < cmd->nmodtab; i++)
2162 bfd_mach_o_dylib_module *module = &cmd->dylib_module[i];
2165 if (bfd_bread ((void *) buf, module_len, abfd) != module_len)
2168 module->module_name_idx = bfd_h_get_32 (abfd, buf + 0);
2169 module->iextdefsym = bfd_h_get_32 (abfd, buf + 4);
2170 module->nextdefsym = bfd_h_get_32 (abfd, buf + 8);
2171 module->irefsym = bfd_h_get_32 (abfd, buf + 12);
2172 module->nrefsym = bfd_h_get_32 (abfd, buf + 16);
2173 module->ilocalsym = bfd_h_get_32 (abfd, buf + 20);
2174 module->nlocalsym = bfd_h_get_32 (abfd, buf + 24);
2175 module->iextrel = bfd_h_get_32 (abfd, buf + 28);
2176 module->nextrel = bfd_h_get_32 (abfd, buf + 32);
2177 v = bfd_h_get_32 (abfd, buf +36);
2178 module->iinit = v & 0xffff;
2179 module->iterm = (v >> 16) & 0xffff;
2180 v = bfd_h_get_32 (abfd, buf + 40);
2181 module->ninit = v & 0xffff;
2182 module->nterm = (v >> 16) & 0xffff;
2185 module->objc_module_info_size = bfd_h_get_32 (abfd, buf + 44);
2186 module->objc_module_info_addr = bfd_h_get_64 (abfd, buf + 48);
2190 module->objc_module_info_addr = bfd_h_get_32 (abfd, buf + 44);
2191 module->objc_module_info_size = bfd_h_get_32 (abfd, buf + 48);
2200 cmd->dylib_toc = bfd_alloc
2201 (abfd, cmd->ntoc * sizeof (bfd_mach_o_dylib_table_of_content));
2202 if (cmd->dylib_toc == NULL)
2205 if (bfd_seek (abfd, cmd->tocoff, SEEK_SET) != 0)
2208 for (i = 0; i < cmd->ntoc; i++)
2210 bfd_mach_o_dylib_table_of_content *toc = &cmd->dylib_toc[i];
2212 if (bfd_bread ((void *) buf, 8, abfd) != 8)
2215 toc->symbol_index = bfd_h_get_32 (abfd, buf + 0);
2216 toc->module_index = bfd_h_get_32 (abfd, buf + 4);
2220 if (cmd->nindirectsyms != 0)
2224 cmd->indirect_syms = bfd_alloc
2225 (abfd, cmd->nindirectsyms * sizeof (unsigned int));
2226 if (cmd->indirect_syms == NULL)
2229 if (bfd_seek (abfd, cmd->indirectsymoff, SEEK_SET) != 0)
2232 for (i = 0; i < cmd->nindirectsyms; i++)
2234 unsigned int *is = &cmd->indirect_syms[i];
2236 if (bfd_bread ((void *) buf, 4, abfd) != 4)
2239 *is = bfd_h_get_32 (abfd, buf + 0);
2243 if (cmd->nextrefsyms != 0)
2248 cmd->ext_refs = bfd_alloc
2249 (abfd, cmd->nextrefsyms * sizeof (bfd_mach_o_dylib_reference));
2250 if (cmd->ext_refs == NULL)
2253 if (bfd_seek (abfd, cmd->extrefsymoff, SEEK_SET) != 0)
2256 for (i = 0; i < cmd->nextrefsyms; i++)
2258 bfd_mach_o_dylib_reference *ref = &cmd->ext_refs[i];
2260 if (bfd_bread ((void *) buf, 4, abfd) != 4)
2263 /* Fields isym and flags are written as bit-fields, thus we need
2264 a specific processing for endianness. */
2265 v = bfd_h_get_32 (abfd, buf + 0);
2266 if (bfd_big_endian (abfd))
2268 ref->isym = (v >> 8) & 0xffffff;
2269 ref->flags = v & 0xff;
2273 ref->isym = v & 0xffffff;
2274 ref->flags = (v >> 24) & 0xff;
2279 if (mdata->dysymtab)
2281 mdata->dysymtab = cmd;
2287 bfd_mach_o_read_symtab (bfd *abfd, bfd_mach_o_load_command *command)
2289 bfd_mach_o_symtab_command *symtab = &command->command.symtab;
2290 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
2291 unsigned char buf[16];
2293 BFD_ASSERT (command->type == BFD_MACH_O_LC_SYMTAB);
2295 if (bfd_seek (abfd, command->offset + 8, SEEK_SET) != 0
2296 || bfd_bread ((void *) buf, 16, abfd) != 16)
2299 symtab->symoff = bfd_h_get_32 (abfd, buf);
2300 symtab->nsyms = bfd_h_get_32 (abfd, buf + 4);
2301 symtab->stroff = bfd_h_get_32 (abfd, buf + 8);
2302 symtab->strsize = bfd_h_get_32 (abfd, buf + 12);
2303 symtab->symbols = NULL;
2304 symtab->strtab = NULL;
2306 if (symtab->nsyms != 0)
2307 abfd->flags |= HAS_SYMS;
2311 mdata->symtab = symtab;
2316 bfd_mach_o_read_uuid (bfd *abfd, bfd_mach_o_load_command *command)
2318 bfd_mach_o_uuid_command *cmd = &command->command.uuid;
2320 BFD_ASSERT (command->type == BFD_MACH_O_LC_UUID);
2322 if (bfd_seek (abfd, command->offset + 8, SEEK_SET) != 0
2323 || bfd_bread ((void *) cmd->uuid, 16, abfd) != 16)
2330 bfd_mach_o_read_linkedit (bfd *abfd, bfd_mach_o_load_command *command)
2332 bfd_mach_o_linkedit_command *cmd = &command->command.linkedit;
2335 if (bfd_seek (abfd, command->offset + 8, SEEK_SET) != 0
2336 || bfd_bread ((void *) buf, 8, abfd) != 8)
2339 cmd->dataoff = bfd_get_32 (abfd, buf + 0);
2340 cmd->datasize = bfd_get_32 (abfd, buf + 4);
2345 bfd_mach_o_read_str (bfd *abfd, bfd_mach_o_load_command *command)
2347 bfd_mach_o_str_command *cmd = &command->command.str;
2351 if (bfd_seek (abfd, command->offset + 8, SEEK_SET) != 0
2352 || bfd_bread ((void *) buf, 4, abfd) != 4)
2355 off = bfd_get_32 (abfd, buf + 0);
2356 cmd->stroff = command->offset + off;
2357 cmd->str_len = command->len - off;
2358 cmd->str = bfd_alloc (abfd, cmd->str_len);
2359 if (cmd->str == NULL)
2361 if (bfd_seek (abfd, cmd->stroff, SEEK_SET) != 0
2362 || bfd_bread ((void *) cmd->str, cmd->str_len, abfd) != cmd->str_len)
2368 bfd_mach_o_read_dyld_info (bfd *abfd, bfd_mach_o_load_command *command)
2370 bfd_mach_o_dyld_info_command *cmd = &command->command.dyld_info;
2373 if (bfd_seek (abfd, command->offset + 8, SEEK_SET) != 0
2374 || bfd_bread ((void *) buf, sizeof (buf), abfd) != sizeof (buf))
2377 cmd->rebase_off = bfd_get_32 (abfd, buf + 0);
2378 cmd->rebase_size = bfd_get_32 (abfd, buf + 4);
2379 cmd->bind_off = bfd_get_32 (abfd, buf + 8);
2380 cmd->bind_size = bfd_get_32 (abfd, buf + 12);
2381 cmd->weak_bind_off = bfd_get_32 (abfd, buf + 16);
2382 cmd->weak_bind_size = bfd_get_32 (abfd, buf + 20);
2383 cmd->lazy_bind_off = bfd_get_32 (abfd, buf + 24);
2384 cmd->lazy_bind_size = bfd_get_32 (abfd, buf + 28);
2385 cmd->export_off = bfd_get_32 (abfd, buf + 32);
2386 cmd->export_size = bfd_get_32 (abfd, buf + 36);
2391 bfd_mach_o_read_segment (bfd *abfd,
2392 bfd_mach_o_load_command *command,
2395 unsigned char buf[64];
2396 bfd_mach_o_segment_command *seg = &command->command.segment;
2401 BFD_ASSERT (command->type == BFD_MACH_O_LC_SEGMENT_64);
2403 if (bfd_seek (abfd, command->offset + 8, SEEK_SET) != 0
2404 || bfd_bread ((void *) buf, 64, abfd) != 64)
2407 memcpy (seg->segname, buf, 16);
2408 seg->segname[16] = '\0';
2410 seg->vmaddr = bfd_h_get_64 (abfd, buf + 16);
2411 seg->vmsize = bfd_h_get_64 (abfd, buf + 24);
2412 seg->fileoff = bfd_h_get_64 (abfd, buf + 32);
2413 seg->filesize = bfd_h_get_64 (abfd, buf + 40);
2414 seg->maxprot = bfd_h_get_32 (abfd, buf + 48);
2415 seg->initprot = bfd_h_get_32 (abfd, buf + 52);
2416 seg->nsects = bfd_h_get_32 (abfd, buf + 56);
2417 seg->flags = bfd_h_get_32 (abfd, buf + 60);
2421 BFD_ASSERT (command->type == BFD_MACH_O_LC_SEGMENT);
2423 if (bfd_seek (abfd, command->offset + 8, SEEK_SET) != 0
2424 || bfd_bread ((void *) buf, 48, abfd) != 48)
2427 memcpy (seg->segname, buf, 16);
2428 seg->segname[16] = '\0';
2430 seg->vmaddr = bfd_h_get_32 (abfd, buf + 16);
2431 seg->vmsize = bfd_h_get_32 (abfd, buf + 20);
2432 seg->fileoff = bfd_h_get_32 (abfd, buf + 24);
2433 seg->filesize = bfd_h_get_32 (abfd, buf + 28);
2434 seg->maxprot = bfd_h_get_32 (abfd, buf + 32);
2435 seg->initprot = bfd_h_get_32 (abfd, buf + 36);
2436 seg->nsects = bfd_h_get_32 (abfd, buf + 40);
2437 seg->flags = bfd_h_get_32 (abfd, buf + 44);
2440 if (seg->nsects != 0)
2442 seg->sections = bfd_alloc (abfd, seg->nsects
2443 * sizeof (bfd_mach_o_section));
2444 if (seg->sections == NULL)
2447 for (i = 0; i < seg->nsects; i++)
2451 segoff = command->offset + BFD_MACH_O_LC_SEGMENT_64_SIZE
2452 + (i * BFD_MACH_O_SECTION_64_SIZE);
2454 segoff = command->offset + BFD_MACH_O_LC_SEGMENT_SIZE
2455 + (i * BFD_MACH_O_SECTION_SIZE);
2457 if (bfd_mach_o_read_section
2458 (abfd, &seg->sections[i], segoff, seg->initprot, wide) != 0)
2467 bfd_mach_o_read_segment_32 (bfd *abfd, bfd_mach_o_load_command *command)
2469 return bfd_mach_o_read_segment (abfd, command, 0);
2473 bfd_mach_o_read_segment_64 (bfd *abfd, bfd_mach_o_load_command *command)
2475 return bfd_mach_o_read_segment (abfd, command, 1);
2479 bfd_mach_o_read_command (bfd *abfd, bfd_mach_o_load_command *command)
2481 unsigned char buf[8];
2483 /* Read command type and length. */
2484 if (bfd_seek (abfd, command->offset, SEEK_SET) != 0
2485 || bfd_bread ((void *) buf, 8, abfd) != 8)
2488 command->type = bfd_h_get_32 (abfd, buf) & ~BFD_MACH_O_LC_REQ_DYLD;
2489 command->type_required = (bfd_h_get_32 (abfd, buf) & BFD_MACH_O_LC_REQ_DYLD
2491 command->len = bfd_h_get_32 (abfd, buf + 4);
2493 switch (command->type)
2495 case BFD_MACH_O_LC_SEGMENT:
2496 if (bfd_mach_o_read_segment_32 (abfd, command) != 0)
2499 case BFD_MACH_O_LC_SEGMENT_64:
2500 if (bfd_mach_o_read_segment_64 (abfd, command) != 0)
2503 case BFD_MACH_O_LC_SYMTAB:
2504 if (bfd_mach_o_read_symtab (abfd, command) != 0)
2507 case BFD_MACH_O_LC_SYMSEG:
2509 case BFD_MACH_O_LC_THREAD:
2510 case BFD_MACH_O_LC_UNIXTHREAD:
2511 if (bfd_mach_o_read_thread (abfd, command) != 0)
2514 case BFD_MACH_O_LC_LOAD_DYLINKER:
2515 case BFD_MACH_O_LC_ID_DYLINKER:
2516 if (bfd_mach_o_read_dylinker (abfd, command) != 0)
2519 case BFD_MACH_O_LC_LOAD_DYLIB:
2520 case BFD_MACH_O_LC_ID_DYLIB:
2521 case BFD_MACH_O_LC_LOAD_WEAK_DYLIB:
2522 case BFD_MACH_O_LC_REEXPORT_DYLIB:
2523 if (bfd_mach_o_read_dylib (abfd, command) != 0)
2526 case BFD_MACH_O_LC_PREBOUND_DYLIB:
2527 if (bfd_mach_o_read_prebound_dylib (abfd, command) != 0)
2530 case BFD_MACH_O_LC_LOADFVMLIB:
2531 case BFD_MACH_O_LC_IDFVMLIB:
2532 case BFD_MACH_O_LC_IDENT:
2533 case BFD_MACH_O_LC_FVMFILE:
2534 case BFD_MACH_O_LC_PREPAGE:
2535 case BFD_MACH_O_LC_ROUTINES:
2536 case BFD_MACH_O_LC_ROUTINES_64:
2538 case BFD_MACH_O_LC_SUB_FRAMEWORK:
2539 case BFD_MACH_O_LC_SUB_UMBRELLA:
2540 case BFD_MACH_O_LC_SUB_LIBRARY:
2541 case BFD_MACH_O_LC_SUB_CLIENT:
2542 case BFD_MACH_O_LC_RPATH:
2543 if (bfd_mach_o_read_str (abfd, command) != 0)
2546 case BFD_MACH_O_LC_DYSYMTAB:
2547 if (bfd_mach_o_read_dysymtab (abfd, command) != 0)
2550 case BFD_MACH_O_LC_TWOLEVEL_HINTS:
2551 case BFD_MACH_O_LC_PREBIND_CKSUM:
2553 case BFD_MACH_O_LC_UUID:
2554 if (bfd_mach_o_read_uuid (abfd, command) != 0)
2557 case BFD_MACH_O_LC_CODE_SIGNATURE:
2558 case BFD_MACH_O_LC_SEGMENT_SPLIT_INFO:
2559 if (bfd_mach_o_read_linkedit (abfd, command) != 0)
2562 case BFD_MACH_O_LC_DYLD_INFO:
2563 if (bfd_mach_o_read_dyld_info (abfd, command) != 0)
2567 (*_bfd_error_handler) (_("unable to read unknown load command 0x%lx"),
2568 (unsigned long) command->type);
2576 bfd_mach_o_flatten_sections (bfd *abfd)
2578 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
2582 /* Count total number of sections. */
2585 for (i = 0; i < mdata->header.ncmds; i++)
2587 if (mdata->commands[i].type == BFD_MACH_O_LC_SEGMENT
2588 || mdata->commands[i].type == BFD_MACH_O_LC_SEGMENT_64)
2590 bfd_mach_o_segment_command *seg;
2592 seg = &mdata->commands[i].command.segment;
2593 mdata->nsects += seg->nsects;
2597 /* Allocate sections array. */
2598 mdata->sections = bfd_alloc (abfd,
2599 mdata->nsects * sizeof (bfd_mach_o_section *));
2601 /* Fill the array. */
2604 for (i = 0; i < mdata->header.ncmds; i++)
2606 if (mdata->commands[i].type == BFD_MACH_O_LC_SEGMENT
2607 || mdata->commands[i].type == BFD_MACH_O_LC_SEGMENT_64)
2609 bfd_mach_o_segment_command *seg;
2611 seg = &mdata->commands[i].command.segment;
2612 BFD_ASSERT (csect + seg->nsects <= mdata->nsects);
2614 for (j = 0; j < seg->nsects; j++)
2615 mdata->sections[csect++] = &seg->sections[j];
2621 bfd_mach_o_scan_start_address (bfd *abfd)
2623 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
2624 bfd_mach_o_thread_command *cmd = NULL;
2627 for (i = 0; i < mdata->header.ncmds; i++)
2629 if ((mdata->commands[i].type == BFD_MACH_O_LC_THREAD) ||
2630 (mdata->commands[i].type == BFD_MACH_O_LC_UNIXTHREAD))
2633 cmd = &mdata->commands[i].command.thread;
2642 for (i = 0; i < cmd->nflavours; i++)
2644 if ((mdata->header.cputype == BFD_MACH_O_CPU_TYPE_I386)
2645 && (cmd->flavours[i].flavour
2646 == (unsigned long) BFD_MACH_O_x86_THREAD_STATE32))
2648 unsigned char buf[4];
2650 if (bfd_seek (abfd, cmd->flavours[i].offset + 40, 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)
2657 && (cmd->flavours[i].flavour == BFD_MACH_O_PPC_THREAD_STATE))
2659 unsigned char buf[4];
2661 if (bfd_seek (abfd, cmd->flavours[i].offset + 0, SEEK_SET) != 0
2662 || bfd_bread (buf, 4, abfd) != 4)
2665 abfd->start_address = bfd_h_get_32 (abfd, buf);
2667 else if ((mdata->header.cputype == BFD_MACH_O_CPU_TYPE_POWERPC_64)
2668 && (cmd->flavours[i].flavour == BFD_MACH_O_PPC_THREAD_STATE64))
2670 unsigned char buf[8];
2672 if (bfd_seek (abfd, cmd->flavours[i].offset + 0, SEEK_SET) != 0
2673 || bfd_bread (buf, 8, abfd) != 8)
2676 abfd->start_address = bfd_h_get_64 (abfd, buf);
2678 else if ((mdata->header.cputype == BFD_MACH_O_CPU_TYPE_X86_64)
2679 && (cmd->flavours[i].flavour == BFD_MACH_O_x86_THREAD_STATE64))
2681 unsigned char buf[8];
2683 if (bfd_seek (abfd, cmd->flavours[i].offset + (16 * 8), SEEK_SET) != 0
2684 || bfd_bread (buf, 8, abfd) != 8)
2687 abfd->start_address = bfd_h_get_64 (abfd, buf);
2695 bfd_mach_o_set_arch_mach (bfd *abfd,
2696 enum bfd_architecture arch,
2697 unsigned long machine)
2699 bfd_mach_o_backend_data *bed = bfd_mach_o_get_backend_data (abfd);
2701 /* If this isn't the right architecture for this backend, and this
2702 isn't the generic backend, fail. */
2703 if (arch != bed->arch
2704 && arch != bfd_arch_unknown
2705 && bed->arch != bfd_arch_unknown)
2708 return bfd_default_set_arch_mach (abfd, arch, machine);
2712 bfd_mach_o_scan (bfd *abfd,
2713 bfd_mach_o_header *header,
2714 bfd_mach_o_data_struct *mdata)
2717 enum bfd_architecture cputype;
2718 unsigned long cpusubtype;
2719 unsigned int hdrsize;
2721 hdrsize = mach_o_wide_p (header) ?
2722 BFD_MACH_O_HEADER_64_SIZE : BFD_MACH_O_HEADER_SIZE;
2724 mdata->header = *header;
2726 abfd->flags = abfd->flags & BFD_IN_MEMORY;
2727 switch (header->filetype)
2729 case BFD_MACH_O_MH_OBJECT:
2730 abfd->flags |= HAS_RELOC;
2732 case BFD_MACH_O_MH_EXECUTE:
2733 abfd->flags |= EXEC_P;
2735 case BFD_MACH_O_MH_DYLIB:
2736 case BFD_MACH_O_MH_BUNDLE:
2737 abfd->flags |= DYNAMIC;
2741 abfd->tdata.mach_o_data = mdata;
2743 bfd_mach_o_convert_architecture (header->cputype, header->cpusubtype,
2744 &cputype, &cpusubtype);
2745 if (cputype == bfd_arch_unknown)
2747 (*_bfd_error_handler) (_("bfd_mach_o_scan: unknown architecture 0x%lx/0x%lx"),
2748 header->cputype, header->cpusubtype);
2752 bfd_set_arch_mach (abfd, cputype, cpusubtype);
2754 if (header->ncmds != 0)
2756 mdata->commands = bfd_alloc
2757 (abfd, header->ncmds * sizeof (bfd_mach_o_load_command));
2758 if (mdata->commands == NULL)
2761 for (i = 0; i < header->ncmds; i++)
2763 bfd_mach_o_load_command *cur = &mdata->commands[i];
2766 cur->offset = hdrsize;
2769 bfd_mach_o_load_command *prev = &mdata->commands[i - 1];
2770 cur->offset = prev->offset + prev->len;
2773 if (bfd_mach_o_read_command (abfd, cur) < 0)
2778 if (bfd_mach_o_scan_start_address (abfd) < 0)
2781 bfd_mach_o_flatten_sections (abfd);
2786 bfd_mach_o_mkobject_init (bfd *abfd)
2788 bfd_mach_o_data_struct *mdata = NULL;
2790 mdata = bfd_alloc (abfd, sizeof (bfd_mach_o_data_struct));
2793 abfd->tdata.mach_o_data = mdata;
2795 mdata->header.magic = 0;
2796 mdata->header.cputype = 0;
2797 mdata->header.cpusubtype = 0;
2798 mdata->header.filetype = 0;
2799 mdata->header.ncmds = 0;
2800 mdata->header.sizeofcmds = 0;
2801 mdata->header.flags = 0;
2802 mdata->header.byteorder = BFD_ENDIAN_UNKNOWN;
2803 mdata->commands = NULL;
2805 mdata->sections = NULL;
2811 bfd_mach_o_gen_mkobject (bfd *abfd)
2813 bfd_mach_o_data_struct *mdata;
2815 if (!bfd_mach_o_mkobject_init (abfd))
2818 mdata = bfd_mach_o_get_data (abfd);
2819 mdata->header.magic = BFD_MACH_O_MH_MAGIC;
2820 mdata->header.cputype = 0;
2821 mdata->header.cpusubtype = 0;
2822 mdata->header.byteorder = abfd->xvec->byteorder;
2823 mdata->header.version = 1;
2829 bfd_mach_o_header_p (bfd *abfd,
2830 bfd_mach_o_filetype filetype,
2831 bfd_mach_o_cpu_type cputype)
2833 struct bfd_preserve preserve;
2834 bfd_mach_o_header header;
2836 preserve.marker = NULL;
2837 if (!bfd_mach_o_read_header (abfd, &header))
2840 if (! (header.byteorder == BFD_ENDIAN_BIG
2841 || header.byteorder == BFD_ENDIAN_LITTLE))
2843 (*_bfd_error_handler) (_("unknown header byte-order value 0x%lx"),
2844 (unsigned long) header.byteorder);
2848 if (! ((header.byteorder == BFD_ENDIAN_BIG
2849 && abfd->xvec->byteorder == BFD_ENDIAN_BIG
2850 && abfd->xvec->header_byteorder == BFD_ENDIAN_BIG)
2851 || (header.byteorder == BFD_ENDIAN_LITTLE
2852 && abfd->xvec->byteorder == BFD_ENDIAN_LITTLE
2853 && abfd->xvec->header_byteorder == BFD_ENDIAN_LITTLE)))
2856 /* Check cputype and filetype.
2857 In case of wildcard, do not accept magics that are handled by existing
2861 if (header.cputype != cputype)
2866 switch (header.cputype)
2868 case BFD_MACH_O_CPU_TYPE_I386:
2869 /* Handled by mach-o-i386 */
2877 if (header.filetype != filetype)
2882 switch (header.filetype)
2884 case BFD_MACH_O_MH_CORE:
2885 /* Handled by core_p */
2892 preserve.marker = bfd_zalloc (abfd, sizeof (bfd_mach_o_data_struct));
2893 if (preserve.marker == NULL
2894 || !bfd_preserve_save (abfd, &preserve))
2897 if (bfd_mach_o_scan (abfd, &header,
2898 (bfd_mach_o_data_struct *) preserve.marker) != 0)
2901 bfd_preserve_finish (abfd, &preserve);
2905 bfd_set_error (bfd_error_wrong_format);
2908 if (preserve.marker != NULL)
2909 bfd_preserve_restore (abfd, &preserve);
2913 static const bfd_target *
2914 bfd_mach_o_gen_object_p (bfd *abfd)
2916 return bfd_mach_o_header_p (abfd, 0, 0);
2919 static const bfd_target *
2920 bfd_mach_o_gen_core_p (bfd *abfd)
2922 return bfd_mach_o_header_p (abfd, BFD_MACH_O_MH_CORE, 0);
2925 typedef struct mach_o_fat_archentry
2927 unsigned long cputype;
2928 unsigned long cpusubtype;
2929 unsigned long offset;
2931 unsigned long align;
2932 } mach_o_fat_archentry;
2934 typedef struct mach_o_fat_data_struct
2936 unsigned long magic;
2937 unsigned long nfat_arch;
2938 mach_o_fat_archentry *archentries;
2939 } mach_o_fat_data_struct;
2942 bfd_mach_o_archive_p (bfd *abfd)
2944 mach_o_fat_data_struct *adata = NULL;
2945 unsigned char buf[20];
2948 if (bfd_seek (abfd, 0, SEEK_SET) != 0
2949 || bfd_bread ((void *) buf, 8, abfd) != 8)
2952 adata = bfd_alloc (abfd, sizeof (mach_o_fat_data_struct));
2956 adata->magic = bfd_getb32 (buf);
2957 adata->nfat_arch = bfd_getb32 (buf + 4);
2958 if (adata->magic != 0xcafebabe)
2960 /* Avoid matching Java bytecode files, which have the same magic number.
2961 In the Java bytecode file format this field contains the JVM version,
2962 which starts at 43.0. */
2963 if (adata->nfat_arch > 30)
2966 adata->archentries =
2967 bfd_alloc (abfd, adata->nfat_arch * sizeof (mach_o_fat_archentry));
2968 if (adata->archentries == NULL)
2971 for (i = 0; i < adata->nfat_arch; i++)
2973 if (bfd_seek (abfd, 8 + 20 * i, SEEK_SET) != 0
2974 || bfd_bread ((void *) buf, 20, abfd) != 20)
2976 adata->archentries[i].cputype = bfd_getb32 (buf);
2977 adata->archentries[i].cpusubtype = bfd_getb32 (buf + 4);
2978 adata->archentries[i].offset = bfd_getb32 (buf + 8);
2979 adata->archentries[i].size = bfd_getb32 (buf + 12);
2980 adata->archentries[i].align = bfd_getb32 (buf + 16);
2983 abfd->tdata.mach_o_fat_data = adata;
2988 bfd_release (abfd, adata);
2989 bfd_set_error (bfd_error_wrong_format);
2994 bfd_mach_o_openr_next_archived_file (bfd *archive, bfd *prev)
2996 mach_o_fat_data_struct *adata;
2997 mach_o_fat_archentry *entry = NULL;
3000 enum bfd_architecture arch_type;
3001 unsigned long arch_subtype;
3003 adata = (mach_o_fat_data_struct *) archive->tdata.mach_o_fat_data;
3004 BFD_ASSERT (adata != NULL);
3006 /* Find index of previous entry. */
3008 i = 0; /* Start at first one. */
3011 for (i = 0; i < adata->nfat_arch; i++)
3013 if (adata->archentries[i].offset == prev->origin)
3017 if (i == adata->nfat_arch)
3020 bfd_set_error (bfd_error_bad_value);
3023 i++; /* Get next entry. */
3026 if (i >= adata->nfat_arch)
3028 bfd_set_error (bfd_error_no_more_archived_files);
3032 entry = &adata->archentries[i];
3033 nbfd = _bfd_new_bfd_contained_in (archive);
3037 nbfd->origin = entry->offset;
3039 bfd_mach_o_convert_architecture (entry->cputype, entry->cpusubtype,
3040 &arch_type, &arch_subtype);
3041 /* Create the member filename.
3042 Use FILENAME:ARCH_NAME. */
3045 const char *arch_name;
3046 size_t arch_file_len = strlen (bfd_get_filename (archive));
3048 arch_name = bfd_printable_arch_mach (arch_type, arch_subtype);
3049 s = bfd_malloc (arch_file_len + 1 + strlen (arch_name) + 1);
3052 memcpy (s, bfd_get_filename (archive), arch_file_len);
3053 s[arch_file_len] = ':';
3054 strcpy (s + arch_file_len + 1, arch_name);
3057 nbfd->iostream = NULL;
3058 bfd_set_arch_mach (nbfd, arch_type, arch_subtype);
3063 /* If ABFD format is FORMAT and architecture is ARCH, return it.
3064 If ABFD is a fat image containing a member that corresponds to FORMAT
3065 and ARCH, returns it.
3066 In other case, returns NULL.
3067 This function allows transparent uses of fat images. */
3069 bfd_mach_o_fat_extract (bfd *abfd,
3071 const bfd_arch_info_type *arch)
3074 mach_o_fat_data_struct *adata;
3077 if (bfd_check_format (abfd, format))
3079 if (bfd_get_arch_info (abfd) == arch)
3083 if (!bfd_check_format (abfd, bfd_archive)
3084 || abfd->xvec != &mach_o_fat_vec)
3087 /* This is a Mach-O fat image. */
3088 adata = (mach_o_fat_data_struct *) abfd->tdata.mach_o_fat_data;
3089 BFD_ASSERT (adata != NULL);
3091 for (i = 0; i < adata->nfat_arch; i++)
3093 struct mach_o_fat_archentry *e = &adata->archentries[i];
3094 enum bfd_architecture cpu_type;
3095 unsigned long cpu_subtype;
3097 bfd_mach_o_convert_architecture (e->cputype, e->cpusubtype,
3098 &cpu_type, &cpu_subtype);
3099 if (cpu_type != arch->arch || cpu_subtype != arch->mach)
3102 /* The architecture is found. */
3103 res = _bfd_new_bfd_contained_in (abfd);
3107 res->origin = e->offset;
3109 res->filename = strdup (abfd->filename);
3110 res->iostream = NULL;
3112 if (bfd_check_format (res, format))
3114 BFD_ASSERT (bfd_get_arch_info (res) == arch);
3125 bfd_mach_o_lookup_section (bfd *abfd,
3127 bfd_mach_o_load_command **mcommand,
3128 bfd_mach_o_section **msection)
3130 struct mach_o_data_struct *md = bfd_mach_o_get_data (abfd);
3131 unsigned int i, j, num;
3133 bfd_mach_o_load_command *ncmd = NULL;
3134 bfd_mach_o_section *nsect = NULL;
3136 BFD_ASSERT (mcommand != NULL);
3137 BFD_ASSERT (msection != NULL);
3140 for (i = 0; i < md->header.ncmds; i++)
3142 struct bfd_mach_o_load_command *cmd = &md->commands[i];
3143 struct bfd_mach_o_segment_command *seg = NULL;
3145 if (cmd->type != BFD_MACH_O_LC_SEGMENT
3146 || cmd->type != BFD_MACH_O_LC_SEGMENT_64)
3148 seg = &cmd->command.segment;
3150 for (j = 0; j < seg->nsects; j++)
3152 struct bfd_mach_o_section *sect = &seg->sections[j];
3154 if (sect->bfdsection == section)
3172 bfd_mach_o_lookup_command (bfd *abfd,
3173 bfd_mach_o_load_command_type type,
3174 bfd_mach_o_load_command **mcommand)
3176 struct mach_o_data_struct *md = bfd_mach_o_get_data (abfd);
3177 bfd_mach_o_load_command *ncmd = NULL;
3178 unsigned int i, num;
3180 BFD_ASSERT (md != NULL);
3181 BFD_ASSERT (mcommand != NULL);
3184 for (i = 0; i < md->header.ncmds; i++)
3186 struct bfd_mach_o_load_command *cmd = &md->commands[i];
3188 if (cmd->type != type)
3201 bfd_mach_o_stack_addr (enum bfd_mach_o_cpu_type type)
3205 case BFD_MACH_O_CPU_TYPE_MC680x0:
3207 case BFD_MACH_O_CPU_TYPE_MC88000:
3209 case BFD_MACH_O_CPU_TYPE_POWERPC:
3211 case BFD_MACH_O_CPU_TYPE_I386:
3213 case BFD_MACH_O_CPU_TYPE_SPARC:
3215 case BFD_MACH_O_CPU_TYPE_I860:
3217 case BFD_MACH_O_CPU_TYPE_HPPA:
3218 return 0xc0000000 - 0x04000000;
3224 typedef struct bfd_mach_o_xlat_name
3229 bfd_mach_o_xlat_name;
3232 bfd_mach_o_print_flags (const bfd_mach_o_xlat_name *table,
3238 for (; table->name; table++)
3240 if (table->val & val)
3243 fprintf (file, "+");
3244 fprintf (file, "%s", table->name);
3252 fprintf (file, "+");
3253 fprintf (file, "0x%lx", val);
3257 fprintf (file, "-");
3261 bfd_mach_o_get_name (const bfd_mach_o_xlat_name *table, unsigned long val)
3263 for (; table->name; table++)
3264 if (table->val == val)
3269 static bfd_mach_o_xlat_name bfd_mach_o_cpu_name[] =
3271 { "vax", BFD_MACH_O_CPU_TYPE_VAX },
3272 { "mc680x0", BFD_MACH_O_CPU_TYPE_MC680x0 },
3273 { "i386", BFD_MACH_O_CPU_TYPE_I386 },
3274 { "mips", BFD_MACH_O_CPU_TYPE_MIPS },
3275 { "mc98000", BFD_MACH_O_CPU_TYPE_MC98000 },
3276 { "hppa", BFD_MACH_O_CPU_TYPE_HPPA },
3277 { "arm", BFD_MACH_O_CPU_TYPE_ARM },
3278 { "mc88000", BFD_MACH_O_CPU_TYPE_MC88000 },
3279 { "sparc", BFD_MACH_O_CPU_TYPE_SPARC },
3280 { "i860", BFD_MACH_O_CPU_TYPE_I860 },
3281 { "alpha", BFD_MACH_O_CPU_TYPE_ALPHA },
3282 { "powerpc", BFD_MACH_O_CPU_TYPE_POWERPC },
3283 { "powerpc_64", BFD_MACH_O_CPU_TYPE_POWERPC_64 },
3284 { "x86_64", BFD_MACH_O_CPU_TYPE_X86_64 },
3288 static bfd_mach_o_xlat_name bfd_mach_o_filetype_name[] =
3290 { "object", BFD_MACH_O_MH_OBJECT },
3291 { "execute", BFD_MACH_O_MH_EXECUTE },
3292 { "fvmlib", BFD_MACH_O_MH_FVMLIB },
3293 { "core", BFD_MACH_O_MH_CORE },
3294 { "preload", BFD_MACH_O_MH_PRELOAD },
3295 { "dylib", BFD_MACH_O_MH_DYLIB },
3296 { "dylinker", BFD_MACH_O_MH_DYLINKER },
3297 { "bundle", BFD_MACH_O_MH_BUNDLE },
3298 { "dylib_stub", BFD_MACH_O_MH_DYLIB_STUB },
3299 { "dym", BFD_MACH_O_MH_DSYM },
3300 { "kext_bundle", BFD_MACH_O_MH_KEXT_BUNDLE },
3304 static bfd_mach_o_xlat_name bfd_mach_o_header_flags_name[] =
3306 { "noundefs", BFD_MACH_O_MH_NOUNDEFS },
3307 { "incrlink", BFD_MACH_O_MH_INCRLINK },
3308 { "dyldlink", BFD_MACH_O_MH_DYLDLINK },
3309 { "bindatload", BFD_MACH_O_MH_BINDATLOAD },
3310 { "prebound", BFD_MACH_O_MH_PREBOUND },
3311 { "split_segs", BFD_MACH_O_MH_SPLIT_SEGS },
3312 { "lazy_init", BFD_MACH_O_MH_LAZY_INIT },
3313 { "twolevel", BFD_MACH_O_MH_TWOLEVEL },
3314 { "force_flat", BFD_MACH_O_MH_FORCE_FLAT },
3315 { "nomultidefs", BFD_MACH_O_MH_NOMULTIDEFS },
3316 { "nofixprebinding", BFD_MACH_O_MH_NOFIXPREBINDING },
3317 { "prebindable", BFD_MACH_O_MH_PREBINDABLE },
3318 { "allmodsbound", BFD_MACH_O_MH_ALLMODSBOUND },
3319 { "subsections_via_symbols", BFD_MACH_O_MH_SUBSECTIONS_VIA_SYMBOLS },
3320 { "canonical", BFD_MACH_O_MH_CANONICAL },
3321 { "weak_defines", BFD_MACH_O_MH_WEAK_DEFINES },
3322 { "binds_to_weak", BFD_MACH_O_MH_BINDS_TO_WEAK },
3323 { "allow_stack_execution", BFD_MACH_O_MH_ALLOW_STACK_EXECUTION },
3324 { "root_safe", BFD_MACH_O_MH_ROOT_SAFE },
3325 { "setuid_safe", BFD_MACH_O_MH_SETUID_SAFE },
3326 { "no_reexported_dylibs", BFD_MACH_O_MH_NO_REEXPORTED_DYLIBS },
3327 { "pie", BFD_MACH_O_MH_PIE },
3331 static bfd_mach_o_xlat_name bfd_mach_o_section_type_name[] =
3333 { "regular", BFD_MACH_O_S_REGULAR},
3334 { "zerofill", BFD_MACH_O_S_ZEROFILL},
3335 { "cstring_literals", BFD_MACH_O_S_CSTRING_LITERALS},
3336 { "4byte_literals", BFD_MACH_O_S_4BYTE_LITERALS},
3337 { "8byte_literals", BFD_MACH_O_S_8BYTE_LITERALS},
3338 { "literal_pointers", BFD_MACH_O_S_LITERAL_POINTERS},
3339 { "non_lazy_symbol_pointers", BFD_MACH_O_S_NON_LAZY_SYMBOL_POINTERS},
3340 { "lazy_symbol_pointers", BFD_MACH_O_S_LAZY_SYMBOL_POINTERS},
3341 { "symbol_stubs", BFD_MACH_O_S_SYMBOL_STUBS},
3342 { "mod_init_func_pointers", BFD_MACH_O_S_MOD_INIT_FUNC_POINTERS},
3343 { "mod_fini_func_pointers", BFD_MACH_O_S_MOD_FINI_FUNC_POINTERS},
3344 { "coalesced", BFD_MACH_O_S_COALESCED},
3345 { "gb_zerofill", BFD_MACH_O_S_GB_ZEROFILL},
3346 { "interposing", BFD_MACH_O_S_INTERPOSING},
3347 { "16byte_literals", BFD_MACH_O_S_16BYTE_LITERALS},
3348 { "dtrace_dof", BFD_MACH_O_S_DTRACE_DOF},
3349 { "lazy_dylib_symbol_pointers", BFD_MACH_O_S_LAZY_DYLIB_SYMBOL_POINTERS},
3353 static bfd_mach_o_xlat_name bfd_mach_o_section_attribute_name[] =
3355 { "loc_reloc", BFD_MACH_O_S_ATTR_LOC_RELOC },
3356 { "ext_reloc", BFD_MACH_O_S_ATTR_EXT_RELOC },
3357 { "some_instructions", BFD_MACH_O_S_ATTR_SOME_INSTRUCTIONS },
3358 { "debug", BFD_MACH_O_S_ATTR_DEBUG },
3359 { "modifying_code", BFD_MACH_O_S_SELF_MODIFYING_CODE },
3360 { "live_support", BFD_MACH_O_S_ATTR_LIVE_SUPPORT },
3361 { "no_dead_strip", BFD_MACH_O_S_ATTR_NO_DEAD_STRIP },
3362 { "strip_static_syms", BFD_MACH_O_S_ATTR_STRIP_STATIC_SYMS },
3363 { "no_toc", BFD_MACH_O_S_ATTR_NO_TOC },
3364 { "pure_instructions", BFD_MACH_O_S_ATTR_PURE_INSTRUCTIONS },
3368 static bfd_mach_o_xlat_name bfd_mach_o_load_command_name[] =
3370 { "segment", BFD_MACH_O_LC_SEGMENT},
3371 { "symtab", BFD_MACH_O_LC_SYMTAB},
3372 { "symseg", BFD_MACH_O_LC_SYMSEG},
3373 { "thread", BFD_MACH_O_LC_THREAD},
3374 { "unixthread", BFD_MACH_O_LC_UNIXTHREAD},
3375 { "loadfvmlib", BFD_MACH_O_LC_LOADFVMLIB},
3376 { "idfvmlib", BFD_MACH_O_LC_IDFVMLIB},
3377 { "ident", BFD_MACH_O_LC_IDENT},
3378 { "fvmfile", BFD_MACH_O_LC_FVMFILE},
3379 { "prepage", BFD_MACH_O_LC_PREPAGE},
3380 { "dysymtab", BFD_MACH_O_LC_DYSYMTAB},
3381 { "load_dylib", BFD_MACH_O_LC_LOAD_DYLIB},
3382 { "id_dylib", BFD_MACH_O_LC_ID_DYLIB},
3383 { "load_dylinker", BFD_MACH_O_LC_LOAD_DYLINKER},
3384 { "id_dylinker", BFD_MACH_O_LC_ID_DYLINKER},
3385 { "prebound_dylib", BFD_MACH_O_LC_PREBOUND_DYLIB},
3386 { "routines", BFD_MACH_O_LC_ROUTINES},
3387 { "sub_framework", BFD_MACH_O_LC_SUB_FRAMEWORK},
3388 { "sub_umbrella", BFD_MACH_O_LC_SUB_UMBRELLA},
3389 { "sub_client", BFD_MACH_O_LC_SUB_CLIENT},
3390 { "sub_library", BFD_MACH_O_LC_SUB_LIBRARY},
3391 { "twolevel_hints", BFD_MACH_O_LC_TWOLEVEL_HINTS},
3392 { "prebind_cksum", BFD_MACH_O_LC_PREBIND_CKSUM},
3393 { "load_weak_dylib", BFD_MACH_O_LC_LOAD_WEAK_DYLIB},
3394 { "segment_64", BFD_MACH_O_LC_SEGMENT_64},
3395 { "routines_64", BFD_MACH_O_LC_ROUTINES_64},
3396 { "uuid", BFD_MACH_O_LC_UUID},
3397 { "rpath", BFD_MACH_O_LC_RPATH},
3398 { "code_signature", BFD_MACH_O_LC_CODE_SIGNATURE},
3399 { "segment_split_info", BFD_MACH_O_LC_SEGMENT_SPLIT_INFO},
3400 { "reexport_dylib", BFD_MACH_O_LC_REEXPORT_DYLIB},
3401 { "lazy_load_dylib", BFD_MACH_O_LC_LAZY_LOAD_DYLIB},
3402 { "encryption_info", BFD_MACH_O_LC_ENCRYPTION_INFO},
3403 { "dyld_info", BFD_MACH_O_LC_DYLD_INFO},
3408 bfd_mach_o_print_private_header (bfd *abfd, FILE *file)
3410 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
3411 bfd_mach_o_header *h = &mdata->header;
3413 fputs (_("Mach-O header:\n"), file);
3414 fprintf (file, _(" magic : %08lx\n"), h->magic);
3415 fprintf (file, _(" cputype : %08lx (%s)\n"), h->cputype,
3416 bfd_mach_o_get_name (bfd_mach_o_cpu_name, h->cputype));
3417 fprintf (file, _(" cpusubtype: %08lx\n"), h->cpusubtype);
3418 fprintf (file, _(" filetype : %08lx (%s)\n"),
3420 bfd_mach_o_get_name (bfd_mach_o_filetype_name, h->filetype));
3421 fprintf (file, _(" ncmds : %08lx (%lu)\n"), h->ncmds, h->ncmds);
3422 fprintf (file, _(" sizeofcmds: %08lx\n"), h->sizeofcmds);
3423 fprintf (file, _(" flags : %08lx ("), h->flags);
3424 bfd_mach_o_print_flags (bfd_mach_o_header_flags_name, h->flags, file);
3425 fputs (_(")\n"), file);
3426 fprintf (file, _(" reserved : %08x\n"), h->reserved);
3430 bfd_mach_o_print_section_map (bfd *abfd, FILE *file)
3432 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
3434 unsigned int sec_nbr = 0;
3436 fputs (_("Segments and Sections:\n"), file);
3437 fputs (_(" #: Segment name Section name Address\n"), file);
3439 for (i = 0; i < mdata->header.ncmds; i++)
3441 bfd_mach_o_segment_command *seg;
3443 if (mdata->commands[i].type != BFD_MACH_O_LC_SEGMENT
3444 && mdata->commands[i].type != BFD_MACH_O_LC_SEGMENT_64)
3447 seg = &mdata->commands[i].command.segment;
3449 fprintf (file, "[Segment %-16s ", seg->segname);
3450 fprintf_vma (file, seg->vmaddr);
3451 fprintf (file, "-");
3452 fprintf_vma (file, seg->vmaddr + seg->vmsize - 1);
3454 fputc (seg->initprot & BFD_MACH_O_PROT_READ ? 'r' : '-', file);
3455 fputc (seg->initprot & BFD_MACH_O_PROT_WRITE ? 'w' : '-', file);
3456 fputc (seg->initprot & BFD_MACH_O_PROT_EXECUTE ? 'x' : '-', file);
3457 fprintf (file, "]\n");
3458 for (j = 0; j < seg->nsects; j++)
3460 bfd_mach_o_section *sec = &seg->sections[j];
3461 fprintf (file, "%02u: %-16s %-16s ", ++sec_nbr,
3462 sec->segname, sec->sectname);
3463 fprintf_vma (file, sec->addr);
3464 fprintf (file, " ");
3465 fprintf_vma (file, sec->size);
3466 fprintf (file, " %08lx\n", sec->flags);
3472 bfd_mach_o_print_section (bfd *abfd ATTRIBUTE_UNUSED,
3473 bfd_mach_o_section *sec, FILE *file)
3475 fprintf (file, " Section: %-16s %-16s (bfdname: %s)\n",
3476 sec->sectname, sec->segname, sec->bfdsection->name);
3477 fprintf (file, " addr: ");
3478 fprintf_vma (file, sec->addr);
3479 fprintf (file, " size: ");
3480 fprintf_vma (file, sec->size);
3481 fprintf (file, " offset: ");
3482 fprintf_vma (file, sec->offset);
3483 fprintf (file, "\n");
3484 fprintf (file, " align: %ld", sec->align);
3485 fprintf (file, " nreloc: %lu reloff: ", sec->nreloc);
3486 fprintf_vma (file, sec->reloff);
3487 fprintf (file, "\n");
3488 fprintf (file, " flags: %08lx (type: %s", sec->flags,
3489 bfd_mach_o_get_name (bfd_mach_o_section_type_name,
3490 sec->flags & BFD_MACH_O_SECTION_TYPE_MASK));
3491 fprintf (file, " attr: ");
3492 bfd_mach_o_print_flags (bfd_mach_o_section_attribute_name,
3493 sec->flags & BFD_MACH_O_SECTION_ATTRIBUTES_MASK,
3495 fprintf (file, ")\n");
3496 switch (sec->flags & BFD_MACH_O_SECTION_TYPE_MASK)
3498 case BFD_MACH_O_S_NON_LAZY_SYMBOL_POINTERS:
3499 case BFD_MACH_O_S_LAZY_SYMBOL_POINTERS:
3500 case BFD_MACH_O_S_SYMBOL_STUBS:
3501 fprintf (file, " first indirect sym: %lu", sec->reserved1);
3502 fprintf (file, " (%u entries)",
3503 bfd_mach_o_section_get_nbr_indirect (abfd, sec));
3506 fprintf (file, " reserved1: 0x%lx", sec->reserved1);
3509 switch (sec->flags & BFD_MACH_O_SECTION_TYPE_MASK)
3511 case BFD_MACH_O_S_SYMBOL_STUBS:
3512 fprintf (file, " stub size: %lu", sec->reserved2);
3515 fprintf (file, " reserved2: 0x%lx", sec->reserved2);
3518 fprintf (file, " reserved3: 0x%lx\n", sec->reserved3);
3522 bfd_mach_o_print_segment (bfd *abfd ATTRIBUTE_UNUSED,
3523 bfd_mach_o_load_command *cmd, FILE *file)
3525 bfd_mach_o_segment_command *seg = &cmd->command.segment;
3528 fprintf (file, " name: %s\n", *seg->segname ? seg->segname : "*none*");
3529 fprintf (file, " vmaddr: ");
3530 fprintf_vma (file, seg->vmaddr);
3531 fprintf (file, " vmsize: ");
3532 fprintf_vma (file, seg->vmsize);
3533 fprintf (file, "\n");
3534 fprintf (file, " fileoff: ");
3535 fprintf_vma (file, seg->fileoff);
3536 fprintf (file, " filesize: ");
3537 fprintf_vma (file, (bfd_vma)seg->filesize);
3538 fprintf (file, " endoff: ");
3539 fprintf_vma (file, (bfd_vma)(seg->fileoff + seg->filesize));
3540 fprintf (file, "\n");
3541 fprintf (file, " nsects: %lu ", seg->nsects);
3542 fprintf (file, " flags: %lx\n", seg->flags);
3543 for (i = 0; i < seg->nsects; i++)
3544 bfd_mach_o_print_section (abfd, &seg->sections[i], file);
3548 bfd_mach_o_print_dysymtab (bfd *abfd ATTRIBUTE_UNUSED,
3549 bfd_mach_o_load_command *cmd, FILE *file)
3551 bfd_mach_o_dysymtab_command *dysymtab = &cmd->command.dysymtab;
3552 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
3555 fprintf (file, " local symbols: idx: %10lu num: %-8lu",
3556 dysymtab->ilocalsym, dysymtab->nlocalsym);
3557 fprintf (file, " (nxtidx: %lu)\n",
3558 dysymtab->ilocalsym + dysymtab->nlocalsym);
3559 fprintf (file, " external symbols: idx: %10lu num: %-8lu",
3560 dysymtab->iextdefsym, dysymtab->nextdefsym);
3561 fprintf (file, " (nxtidx: %lu)\n",
3562 dysymtab->iextdefsym + dysymtab->nextdefsym);
3563 fprintf (file, " undefined symbols: idx: %10lu num: %-8lu",
3564 dysymtab->iundefsym, dysymtab->nundefsym);
3565 fprintf (file, " (nxtidx: %lu)\n",
3566 dysymtab->iundefsym + dysymtab->nundefsym);
3567 fprintf (file, " table of content: off: 0x%08lx num: %-8lu",
3568 dysymtab->tocoff, dysymtab->ntoc);
3569 fprintf (file, " (endoff: 0x%08lx)\n",
3571 + dysymtab->ntoc * BFD_MACH_O_TABLE_OF_CONTENT_SIZE);
3572 fprintf (file, " module table: off: 0x%08lx num: %-8lu",
3573 dysymtab->modtaboff, dysymtab->nmodtab);
3574 fprintf (file, " (endoff: 0x%08lx)\n",
3575 dysymtab->modtaboff + dysymtab->nmodtab
3576 * (mach_o_wide_p (&mdata->header) ?
3577 BFD_MACH_O_DYLIB_MODULE_64_SIZE : BFD_MACH_O_DYLIB_MODULE_SIZE));
3578 fprintf (file, " external reference table: off: 0x%08lx num: %-8lu",
3579 dysymtab->extrefsymoff, dysymtab->nextrefsyms);
3580 fprintf (file, " (endoff: 0x%08lx)\n",
3581 dysymtab->extrefsymoff
3582 + dysymtab->nextrefsyms * BFD_MACH_O_REFERENCE_SIZE);
3583 fprintf (file, " indirect symbol table: off: 0x%08lx num: %-8lu",
3584 dysymtab->indirectsymoff, dysymtab->nindirectsyms);
3585 fprintf (file, " (endoff: 0x%08lx)\n",
3586 dysymtab->indirectsymoff
3587 + dysymtab->nindirectsyms * BFD_MACH_O_INDIRECT_SYMBOL_SIZE);
3588 fprintf (file, " external relocation table: off: 0x%08lx num: %-8lu",
3589 dysymtab->extreloff, dysymtab->nextrel);
3590 fprintf (file, " (endoff: 0x%08lx)\n",
3591 dysymtab->extreloff + dysymtab->nextrel * BFD_MACH_O_RELENT_SIZE);
3592 fprintf (file, " local relocation table: off: 0x%08lx num: %-8lu",
3593 dysymtab->locreloff, dysymtab->nlocrel);
3594 fprintf (file, " (endoff: 0x%08lx)\n",
3595 dysymtab->locreloff + dysymtab->nlocrel * BFD_MACH_O_RELENT_SIZE);
3597 if (dysymtab->ntoc > 0
3598 || dysymtab->nindirectsyms > 0
3599 || dysymtab->nextrefsyms > 0)
3601 /* Try to read the symbols to display the toc or indirect symbols. */
3602 bfd_mach_o_read_symtab_symbols (abfd);
3604 else if (dysymtab->nmodtab > 0)
3606 /* Try to read the strtab to display modules name. */
3607 bfd_mach_o_read_symtab_strtab (abfd);
3610 for (i = 0; i < dysymtab->nmodtab; i++)
3612 bfd_mach_o_dylib_module *module = &dysymtab->dylib_module[i];
3613 fprintf (file, " module %u:\n", i);
3614 fprintf (file, " name: %lu", module->module_name_idx);
3615 if (mdata->symtab && mdata->symtab->strtab)
3616 fprintf (file, ": %s",
3617 mdata->symtab->strtab + module->module_name_idx);
3618 fprintf (file, "\n");
3619 fprintf (file, " extdefsym: idx: %8lu num: %lu\n",
3620 module->iextdefsym, module->nextdefsym);
3621 fprintf (file, " refsym: idx: %8lu num: %lu\n",
3622 module->irefsym, module->nrefsym);
3623 fprintf (file, " localsym: idx: %8lu num: %lu\n",
3624 module->ilocalsym, module->nlocalsym);
3625 fprintf (file, " extrel: idx: %8lu num: %lu\n",
3626 module->iextrel, module->nextrel);
3627 fprintf (file, " init: idx: %8u num: %u\n",
3628 module->iinit, module->ninit);
3629 fprintf (file, " term: idx: %8u num: %u\n",
3630 module->iterm, module->nterm);
3631 fprintf (file, " objc_module_info: addr: ");
3632 fprintf_vma (file, module->objc_module_info_addr);
3633 fprintf (file, " size: %lu\n", module->objc_module_info_size);
3636 if (dysymtab->ntoc > 0)
3638 bfd_mach_o_symtab_command *symtab = mdata->symtab;
3640 fprintf (file, " table of content: (symbol/module)\n");
3641 for (i = 0; i < dysymtab->ntoc; i++)
3643 bfd_mach_o_dylib_table_of_content *toc = &dysymtab->dylib_toc[i];
3645 fprintf (file, " %4u: ", i);
3646 if (symtab && symtab->symbols && toc->symbol_index < symtab->nsyms)
3648 const char *name = symtab->symbols[toc->symbol_index].symbol.name;
3649 fprintf (file, "%s (%lu)", name ? name : "*invalid*",
3653 fprintf (file, "%lu", toc->symbol_index);
3655 fprintf (file, " / ");
3656 if (symtab && symtab->strtab
3657 && toc->module_index < dysymtab->nmodtab)
3659 bfd_mach_o_dylib_module *mod;
3660 mod = &dysymtab->dylib_module[toc->module_index];
3661 fprintf (file, "%s (%lu)",
3662 symtab->strtab + mod->module_name_idx,
3666 fprintf (file, "%lu", toc->module_index);
3668 fprintf (file, "\n");
3672 if (dysymtab->nindirectsyms != 0)
3674 fprintf (file, " indirect symbols:\n");
3676 for (i = 0; i < mdata->nsects; i++)
3678 bfd_mach_o_section *sec = mdata->sections[i];
3679 unsigned int j, first, last;
3680 bfd_mach_o_symtab_command *symtab = mdata->symtab;
3684 switch (sec->flags & BFD_MACH_O_SECTION_TYPE_MASK)
3686 case BFD_MACH_O_S_NON_LAZY_SYMBOL_POINTERS:
3687 case BFD_MACH_O_S_LAZY_SYMBOL_POINTERS:
3688 case BFD_MACH_O_S_SYMBOL_STUBS:
3689 first = sec->reserved1;
3690 last = first + bfd_mach_o_section_get_nbr_indirect (abfd, sec);
3692 entry_size = bfd_mach_o_section_get_entry_size (abfd, sec);
3693 fprintf (file, " for section %s.%s:\n",
3694 sec->segname, sec->sectname);
3695 for (j = first; j < last; j++)
3697 unsigned int isym = dysymtab->indirect_syms[j];
3699 fprintf (file, " ");
3700 fprintf_vma (file, addr);
3701 fprintf (file, " %5u: 0x%08x", j, isym);
3702 if (isym & BFD_MACH_O_INDIRECT_SYMBOL_LOCAL)
3703 fprintf (file, " LOCAL");
3704 if (isym & BFD_MACH_O_INDIRECT_SYMBOL_ABS)
3705 fprintf (file, " ABSOLUTE");
3706 if (symtab && symtab->symbols
3707 && isym < symtab->nsyms
3708 && symtab->symbols[isym].symbol.name)
3709 fprintf (file, " %s", symtab->symbols[isym].symbol.name);
3710 fprintf (file, "\n");
3719 if (dysymtab->nextrefsyms > 0)
3721 bfd_mach_o_symtab_command *symtab = mdata->symtab;
3723 fprintf (file, " external reference table: (symbol flags)\n");
3724 for (i = 0; i < dysymtab->nextrefsyms; i++)
3726 bfd_mach_o_dylib_reference *ref = &dysymtab->ext_refs[i];
3728 fprintf (file, " %4u: %5lu 0x%02lx", i, ref->isym, ref->flags);
3729 if (symtab && symtab->symbols
3730 && ref->isym < symtab->nsyms
3731 && symtab->symbols[ref->isym].symbol.name)
3732 fprintf (file, " %s", symtab->symbols[ref->isym].symbol.name);
3733 fprintf (file, "\n");
3740 bfd_mach_o_print_dyld_info (bfd *abfd ATTRIBUTE_UNUSED,
3741 bfd_mach_o_load_command *cmd, FILE *file)
3743 bfd_mach_o_dyld_info_command *info = &cmd->command.dyld_info;
3745 fprintf (file, " rebase: off: 0x%08x size: %-8u\n",
3746 info->rebase_off, info->rebase_size);
3747 fprintf (file, " bind: off: 0x%08x size: %-8u\n",
3748 info->bind_off, info->bind_size);
3749 fprintf (file, " weak bind: off: 0x%08x size: %-8u\n",
3750 info->weak_bind_off, info->weak_bind_size);
3751 fprintf (file, " lazy bind: off: 0x%08x size: %-8u\n",
3752 info->lazy_bind_off, info->lazy_bind_size);
3753 fprintf (file, " export: off: 0x%08x size: %-8u\n",
3754 info->export_off, info->export_size);
3758 bfd_mach_o_bfd_print_private_bfd_data (bfd *abfd, void * ptr)
3760 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
3761 FILE *file = (FILE *) ptr;
3764 bfd_mach_o_print_private_header (abfd, file);
3767 for (i = 0; i < mdata->header.ncmds; i++)
3769 bfd_mach_o_load_command *cmd = &mdata->commands[i];
3771 fprintf (file, "Load command %s:",
3772 bfd_mach_o_get_name (bfd_mach_o_load_command_name, cmd->type));
3775 case BFD_MACH_O_LC_SEGMENT:
3776 case BFD_MACH_O_LC_SEGMENT_64:
3777 bfd_mach_o_print_segment (abfd, cmd, file);
3779 case BFD_MACH_O_LC_UUID:
3781 bfd_mach_o_uuid_command *uuid = &cmd->command.uuid;
3784 for (j = 0; j < sizeof (uuid->uuid); j ++)
3785 fprintf (file, " %02x", uuid->uuid[j]);
3789 case BFD_MACH_O_LC_LOAD_DYLIB:
3790 case BFD_MACH_O_LC_LOAD_WEAK_DYLIB:
3791 case BFD_MACH_O_LC_REEXPORT_DYLIB:
3792 case BFD_MACH_O_LC_ID_DYLIB:
3794 bfd_mach_o_dylib_command *dylib = &cmd->command.dylib;
3795 fprintf (file, " %s\n", dylib->name_str);
3796 fprintf (file, " time stamp: 0x%08lx\n",
3798 fprintf (file, " current version: 0x%08lx\n",
3799 dylib->current_version);
3800 fprintf (file, " comptibility version: 0x%08lx\n",
3801 dylib->compatibility_version);
3804 case BFD_MACH_O_LC_LOAD_DYLINKER:
3805 case BFD_MACH_O_LC_ID_DYLINKER:
3806 fprintf (file, " %s\n", cmd->command.dylinker.name_str);
3808 case BFD_MACH_O_LC_SYMTAB:
3810 bfd_mach_o_symtab_command *symtab = &cmd->command.symtab;
3813 " symoff: 0x%08x nsyms: %8u (endoff: 0x%08x)\n",
3814 symtab->symoff, symtab->nsyms,
3815 symtab->symoff + symtab->nsyms
3816 * (mach_o_wide_p (&mdata->header)
3817 ? BFD_MACH_O_NLIST_64_SIZE : BFD_MACH_O_NLIST_SIZE));
3819 " stroff: 0x%08x strsize: %8u (endoff: 0x%08x)\n",
3820 symtab->stroff, symtab->strsize,
3821 symtab->stroff + symtab->strsize);
3824 case BFD_MACH_O_LC_DYSYMTAB:
3825 fprintf (file, "\n");
3826 bfd_mach_o_print_dysymtab (abfd, cmd, file);
3828 case BFD_MACH_O_LC_CODE_SIGNATURE:
3829 case BFD_MACH_O_LC_SEGMENT_SPLIT_INFO:
3831 bfd_mach_o_linkedit_command *linkedit = &cmd->command.linkedit;
3834 " dataoff: 0x%08lx datasize: 0x%08lx (endoff: 0x%08lx)\n",
3835 linkedit->dataoff, linkedit->datasize,
3836 linkedit->dataoff + linkedit->datasize);
3839 case BFD_MACH_O_LC_SUB_FRAMEWORK:
3840 case BFD_MACH_O_LC_SUB_UMBRELLA:
3841 case BFD_MACH_O_LC_SUB_LIBRARY:
3842 case BFD_MACH_O_LC_SUB_CLIENT:
3843 case BFD_MACH_O_LC_RPATH:
3845 bfd_mach_o_str_command *str = &cmd->command.str;
3846 fprintf (file, " %s\n", str->str);
3849 case BFD_MACH_O_LC_THREAD:
3850 case BFD_MACH_O_LC_UNIXTHREAD:
3852 bfd_mach_o_thread_command *thread = &cmd->command.thread;
3854 bfd_mach_o_backend_data *bed = bfd_mach_o_get_backend_data (abfd);
3856 fprintf (file, " nflavours: %lu\n", thread->nflavours);
3857 for (j = 0; j < thread->nflavours; j++)
3859 bfd_mach_o_thread_flavour *flavour = &thread->flavours[j];
3861 fprintf (file, " %2u: flavour: 0x%08lx offset: 0x%08lx"
3863 j, flavour->flavour, flavour->offset,
3865 if (bed->_bfd_mach_o_print_thread)
3867 char *buf = bfd_malloc (flavour->size);
3870 && bfd_seek (abfd, flavour->offset, SEEK_SET) == 0
3871 && (bfd_bread (buf, flavour->size, abfd)
3873 (*bed->_bfd_mach_o_print_thread)(abfd, flavour,
3880 case BFD_MACH_O_LC_DYLD_INFO:
3881 fprintf (file, "\n");
3882 bfd_mach_o_print_dyld_info (abfd, cmd, file);
3885 fprintf (file, "\n");
3891 bfd_mach_o_print_section_map (abfd, file);
3897 bfd_mach_o_core_fetch_environment (bfd *abfd,
3898 unsigned char **rbuf,
3901 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
3902 unsigned long stackaddr = bfd_mach_o_stack_addr (mdata->header.cputype);
3905 for (i = 0; i < mdata->header.ncmds; i++)
3907 bfd_mach_o_load_command *cur = &mdata->commands[i];
3908 bfd_mach_o_segment_command *seg = NULL;
3910 if (cur->type != BFD_MACH_O_LC_SEGMENT)
3913 seg = &cur->command.segment;
3915 if ((seg->vmaddr + seg->vmsize) == stackaddr)
3917 unsigned long start = seg->fileoff;
3918 unsigned long end = seg->fileoff + seg->filesize;
3919 unsigned char *buf = bfd_malloc (1024);
3920 unsigned long size = 1024;
3924 bfd_size_type nread = 0;
3925 unsigned long offset;
3926 int found_nonnull = 0;
3928 if (size > (end - start))
3929 size = (end - start);
3931 buf = bfd_realloc_or_free (buf, size);
3935 if (bfd_seek (abfd, end - size, SEEK_SET) != 0)
3941 nread = bfd_bread (buf, size, abfd);
3949 for (offset = 4; offset <= size; offset += 4)
3953 val = *((unsigned long *) (buf + size - offset));
3954 if (! found_nonnull)
3959 else if (val == 0x0)
3961 unsigned long bottom;
3964 bottom = seg->fileoff + seg->filesize - offset;
3965 top = seg->fileoff + seg->filesize - 4;
3966 *rbuf = bfd_malloc (top - bottom);
3967 *rlen = top - bottom;
3969 memcpy (*rbuf, buf + size - *rlen, *rlen);
3975 if (size == (end - start))
3989 bfd_mach_o_core_file_failing_command (bfd *abfd)
3991 unsigned char *buf = NULL;
3992 unsigned int len = 0;
3995 ret = bfd_mach_o_core_fetch_environment (abfd, &buf, &len);
3999 return (char *) buf;
4003 bfd_mach_o_core_file_failing_signal (bfd *abfd ATTRIBUTE_UNUSED)
4008 #define bfd_mach_o_bfd_reloc_type_lookup _bfd_norelocs_bfd_reloc_type_lookup
4009 #define bfd_mach_o_bfd_reloc_name_lookup _bfd_norelocs_bfd_reloc_name_lookup
4011 #define bfd_mach_o_swap_reloc_in NULL
4012 #define bfd_mach_o_swap_reloc_out NULL
4013 #define bfd_mach_o_print_thread NULL
4015 #define TARGET_NAME mach_o_be_vec
4016 #define TARGET_STRING "mach-o-be"
4017 #define TARGET_ARCHITECTURE bfd_arch_unknown
4018 #define TARGET_BIG_ENDIAN 1
4019 #define TARGET_ARCHIVE 0
4020 #include "mach-o-target.c"
4023 #undef TARGET_STRING
4024 #undef TARGET_ARCHITECTURE
4025 #undef TARGET_BIG_ENDIAN
4026 #undef TARGET_ARCHIVE
4028 #define TARGET_NAME mach_o_le_vec
4029 #define TARGET_STRING "mach-o-le"
4030 #define TARGET_ARCHITECTURE bfd_arch_unknown
4031 #define TARGET_BIG_ENDIAN 0
4032 #define TARGET_ARCHIVE 0
4034 #include "mach-o-target.c"
4037 #undef TARGET_STRING
4038 #undef TARGET_ARCHITECTURE
4039 #undef TARGET_BIG_ENDIAN
4040 #undef TARGET_ARCHIVE
4042 /* Not yet handled: creating an archive. */
4043 #define bfd_mach_o_mkarchive _bfd_noarchive_mkarchive
4046 #define bfd_mach_o_read_ar_hdr _bfd_noarchive_read_ar_hdr
4047 #define bfd_mach_o_write_ar_hdr _bfd_noarchive_write_ar_hdr
4048 #define bfd_mach_o_slurp_armap _bfd_noarchive_slurp_armap
4049 #define bfd_mach_o_slurp_extended_name_table _bfd_noarchive_slurp_extended_name_table
4050 #define bfd_mach_o_construct_extended_name_table _bfd_noarchive_construct_extended_name_table
4051 #define bfd_mach_o_truncate_arname _bfd_noarchive_truncate_arname
4052 #define bfd_mach_o_write_armap _bfd_noarchive_write_armap
4053 #define bfd_mach_o_get_elt_at_index _bfd_noarchive_get_elt_at_index
4054 #define bfd_mach_o_generic_stat_arch_elt _bfd_noarchive_generic_stat_arch_elt
4055 #define bfd_mach_o_update_armap_timestamp _bfd_noarchive_update_armap_timestamp
4057 #define TARGET_NAME mach_o_fat_vec
4058 #define TARGET_STRING "mach-o-fat"
4059 #define TARGET_ARCHITECTURE bfd_arch_unknown
4060 #define TARGET_BIG_ENDIAN 1
4061 #define TARGET_ARCHIVE 1
4063 #include "mach-o-target.c"
4066 #undef TARGET_STRING
4067 #undef TARGET_ARCHITECTURE
4068 #undef TARGET_BIG_ENDIAN
4069 #undef TARGET_ARCHIVE