1 /* Mach-O support for BFD.
2 Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005
3 Free Software Foundation, Inc.
5 This file is part of BFD, the Binary File Descriptor library.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */
25 #include "libiberty.h"
29 #define BFD_IO_FUNCS 0
32 #define bfd_mach_o_mkarchive _bfd_noarchive_mkarchive
33 #define bfd_mach_o_read_ar_hdr _bfd_noarchive_read_ar_hdr
34 #define bfd_mach_o_slurp_armap _bfd_noarchive_slurp_armap
35 #define bfd_mach_o_slurp_extended_name_table _bfd_noarchive_slurp_extended_name_table
36 #define bfd_mach_o_construct_extended_name_table _bfd_noarchive_construct_extended_name_table
37 #define bfd_mach_o_truncate_arname _bfd_noarchive_truncate_arname
38 #define bfd_mach_o_write_armap _bfd_noarchive_write_armap
39 #define bfd_mach_o_get_elt_at_index _bfd_noarchive_get_elt_at_index
40 #define bfd_mach_o_generic_stat_arch_elt _bfd_noarchive_generic_stat_arch_elt
41 #define bfd_mach_o_update_armap_timestamp _bfd_noarchive_update_armap_timestamp
42 #define bfd_mach_o_close_and_cleanup _bfd_generic_close_and_cleanup
43 #define bfd_mach_o_bfd_free_cached_info _bfd_generic_bfd_free_cached_info
44 #define bfd_mach_o_new_section_hook _bfd_generic_new_section_hook
45 #define bfd_mach_o_get_section_contents_in_window _bfd_generic_get_section_contents_in_window
46 #define bfd_mach_o_bfd_is_local_label_name _bfd_nosymbols_bfd_is_local_label_name
47 #define bfd_mach_o_bfd_is_target_special_symbol ((bfd_boolean (*) (bfd *, asymbol *)) bfd_false)
48 #define bfd_mach_o_bfd_is_local_label_name _bfd_nosymbols_bfd_is_local_label_name
49 #define bfd_mach_o_get_lineno _bfd_nosymbols_get_lineno
50 #define bfd_mach_o_find_nearest_line _bfd_nosymbols_find_nearest_line
51 #define bfd_mach_o_find_inliner_info _bfd_nosymbols_find_inliner_info
52 #define bfd_mach_o_bfd_make_debug_symbol _bfd_nosymbols_bfd_make_debug_symbol
53 #define bfd_mach_o_read_minisymbols _bfd_generic_read_minisymbols
54 #define bfd_mach_o_minisymbol_to_symbol _bfd_generic_minisymbol_to_symbol
55 #define bfd_mach_o_get_reloc_upper_bound _bfd_norelocs_get_reloc_upper_bound
56 #define bfd_mach_o_canonicalize_reloc _bfd_norelocs_canonicalize_reloc
57 #define bfd_mach_o_bfd_reloc_type_lookup _bfd_norelocs_bfd_reloc_type_lookup
58 #define bfd_mach_o_bfd_get_relocated_section_contents bfd_generic_get_relocated_section_contents
59 #define bfd_mach_o_bfd_relax_section bfd_generic_relax_section
60 #define bfd_mach_o_bfd_link_hash_table_create _bfd_generic_link_hash_table_create
61 #define bfd_mach_o_bfd_link_hash_table_free _bfd_generic_link_hash_table_free
62 #define bfd_mach_o_bfd_link_add_symbols _bfd_generic_link_add_symbols
63 #define bfd_mach_o_bfd_link_just_syms _bfd_generic_link_just_syms
64 #define bfd_mach_o_bfd_final_link _bfd_generic_final_link
65 #define bfd_mach_o_bfd_link_split_section _bfd_generic_link_split_section
66 #define bfd_mach_o_set_arch_mach bfd_default_set_arch_mach
67 #define bfd_mach_o_bfd_merge_private_bfd_data _bfd_generic_bfd_merge_private_bfd_data
68 #define bfd_mach_o_bfd_set_private_flags _bfd_generic_bfd_set_private_flags
69 #define bfd_mach_o_bfd_print_private_bfd_data _bfd_generic_bfd_print_private_bfd_data
70 #define bfd_mach_o_get_section_contents _bfd_generic_get_section_contents
71 #define bfd_mach_o_set_section_contents _bfd_generic_set_section_contents
72 #define bfd_mach_o_bfd_gc_sections bfd_generic_gc_sections
73 #define bfd_mach_o_bfd_merge_sections bfd_generic_merge_sections
74 #define bfd_mach_o_bfd_is_group_section bfd_generic_is_group_section
75 #define bfd_mach_o_bfd_discard_group bfd_generic_discard_group
76 #define bfd_mach_o_section_already_linked _bfd_generic_section_already_linked
77 #define bfd_mach_o_bfd_copy_private_header_data _bfd_generic_bfd_copy_private_header_data
80 /* The flags field of a section structure is separated into two parts a section
81 type and section attributes. The section types are mutually exclusive (it
82 can only have one type) but the section attributes are not (it may have more
83 than one attribute). */
85 #define SECTION_TYPE 0x000000ff /* 256 section types. */
86 #define SECTION_ATTRIBUTES 0xffffff00 /* 24 section attributes. */
88 /* Constants for the section attributes part of the flags field of a section
91 #define SECTION_ATTRIBUTES_USR 0xff000000 /* User-settable attributes. */
92 #define S_ATTR_PURE_INSTRUCTIONS 0x80000000 /* Section contains only true machine instructions. */
93 #define SECTION_ATTRIBUTES_SYS 0x00ffff00 /* System setable attributes. */
94 #define S_ATTR_SOME_INSTRUCTIONS 0x00000400 /* Section contains some machine instructions. */
95 #define S_ATTR_EXT_RELOC 0x00000200 /* Section has external relocation entries. */
96 #define S_ATTR_LOC_RELOC 0x00000100 /* Section has local relocation entries. */
107 bfd_mach_o_valid (bfd *abfd)
109 if (abfd == NULL || abfd->xvec == NULL)
112 if (! ((abfd->xvec == &mach_o_be_vec)
113 || (abfd->xvec == &mach_o_le_vec)
114 || (abfd->xvec == &mach_o_fat_vec)))
117 if (abfd->tdata.mach_o_data == NULL)
122 /* Copy any private info we understand from the input symbol
123 to the output symbol. */
126 bfd_mach_o_bfd_copy_private_symbol_data (bfd *ibfd ATTRIBUTE_UNUSED,
127 asymbol *isymbol ATTRIBUTE_UNUSED,
128 bfd *obfd ATTRIBUTE_UNUSED,
129 asymbol *osymbol ATTRIBUTE_UNUSED)
134 /* Copy any private info we understand from the input section
135 to the output section. */
138 bfd_mach_o_bfd_copy_private_section_data (bfd *ibfd ATTRIBUTE_UNUSED,
139 asection *isection ATTRIBUTE_UNUSED,
140 bfd *obfd ATTRIBUTE_UNUSED,
141 asection *osection ATTRIBUTE_UNUSED)
146 /* Copy any private info we understand from the input bfd
147 to the output bfd. */
150 bfd_mach_o_bfd_copy_private_bfd_data (bfd *ibfd, bfd *obfd)
152 BFD_ASSERT (bfd_mach_o_valid (ibfd));
153 BFD_ASSERT (bfd_mach_o_valid (obfd));
155 obfd->tdata.mach_o_data = ibfd->tdata.mach_o_data;
156 obfd->tdata.mach_o_data->ibfd = ibfd;
161 bfd_mach_o_count_symbols (bfd *abfd)
163 bfd_mach_o_data_struct *mdata = NULL;
167 BFD_ASSERT (bfd_mach_o_valid (abfd));
168 mdata = abfd->tdata.mach_o_data;
170 for (i = 0; i < mdata->header.ncmds; i++)
171 if (mdata->commands[i].type == BFD_MACH_O_LC_SYMTAB)
173 bfd_mach_o_symtab_command *sym = &mdata->commands[i].command.symtab;
181 bfd_mach_o_get_symtab_upper_bound (bfd *abfd)
183 long nsyms = bfd_mach_o_count_symbols (abfd);
188 return ((nsyms + 1) * sizeof (asymbol *));
192 bfd_mach_o_canonicalize_symtab (bfd *abfd, asymbol **alocation)
194 bfd_mach_o_data_struct *mdata = abfd->tdata.mach_o_data;
195 long nsyms = bfd_mach_o_count_symbols (abfd);
196 asymbol **csym = alocation;
202 for (i = 0; i < mdata->header.ncmds; i++)
204 if (mdata->commands[i].type == BFD_MACH_O_LC_SYMTAB)
206 bfd_mach_o_symtab_command *sym = &mdata->commands[i].command.symtab;
208 if (bfd_mach_o_scan_read_symtab_symbols (abfd, &mdata->commands[i].command.symtab) != 0)
210 fprintf (stderr, "bfd_mach_o_canonicalize_symtab: unable to load symbols for section %lu\n", i);
214 BFD_ASSERT (sym->symbols != NULL);
216 for (j = 0; j < sym->nsyms; j++)
218 BFD_ASSERT (csym < (alocation + nsyms));
219 *csym++ = &sym->symbols[j];
230 bfd_mach_o_get_symbol_info (bfd *abfd ATTRIBUTE_UNUSED,
234 bfd_symbol_info (symbol, ret);
238 bfd_mach_o_print_symbol (bfd *abfd,
241 bfd_print_symbol_type how)
243 FILE *file = (FILE *) afile;
247 case bfd_print_symbol_name:
248 fprintf (file, "%s", symbol->name);
251 bfd_print_symbol_vandf (abfd, (PTR) file, symbol);
252 fprintf (file, " %-5s %s", symbol->section->name, symbol->name);
257 bfd_mach_o_convert_architecture (bfd_mach_o_cpu_type mtype,
258 bfd_mach_o_cpu_subtype msubtype ATTRIBUTE_UNUSED,
259 enum bfd_architecture *type,
260 unsigned long *subtype)
262 *subtype = bfd_arch_unknown;
266 case BFD_MACH_O_CPU_TYPE_VAX: *type = bfd_arch_vax; break;
267 case BFD_MACH_O_CPU_TYPE_MC680x0: *type = bfd_arch_m68k; break;
268 case BFD_MACH_O_CPU_TYPE_I386: *type = bfd_arch_i386; break;
269 case BFD_MACH_O_CPU_TYPE_MIPS: *type = bfd_arch_mips; break;
270 case BFD_MACH_O_CPU_TYPE_MC98000: *type = bfd_arch_m98k; break;
271 case BFD_MACH_O_CPU_TYPE_HPPA: *type = bfd_arch_hppa; break;
272 case BFD_MACH_O_CPU_TYPE_ARM: *type = bfd_arch_arm; break;
273 case BFD_MACH_O_CPU_TYPE_MC88000: *type = bfd_arch_m88k; break;
274 case BFD_MACH_O_CPU_TYPE_SPARC: *type = bfd_arch_sparc; break;
275 case BFD_MACH_O_CPU_TYPE_I860: *type = bfd_arch_i860; break;
276 case BFD_MACH_O_CPU_TYPE_ALPHA: *type = bfd_arch_alpha; break;
277 case BFD_MACH_O_CPU_TYPE_POWERPC: *type = bfd_arch_powerpc; break;
278 default: *type = bfd_arch_unknown; break;
283 case bfd_arch_i386: *subtype = bfd_mach_i386_i386; break;
284 case bfd_arch_sparc: *subtype = bfd_mach_sparc; break;
286 *subtype = bfd_arch_unknown;
291 bfd_mach_o_write_header (bfd *abfd, bfd_mach_o_header *header)
293 unsigned char buf[28];
295 bfd_h_put_32 (abfd, header->magic, buf + 0);
296 bfd_h_put_32 (abfd, header->cputype, buf + 4);
297 bfd_h_put_32 (abfd, header->cpusubtype, buf + 8);
298 bfd_h_put_32 (abfd, header->filetype, buf + 12);
299 bfd_h_put_32 (abfd, header->ncmds, buf + 16);
300 bfd_h_put_32 (abfd, header->sizeofcmds, buf + 20);
301 bfd_h_put_32 (abfd, header->flags, buf + 24);
303 bfd_seek (abfd, 0, SEEK_SET);
304 if (bfd_bwrite ((PTR) buf, 28, abfd) != 28)
311 bfd_mach_o_scan_write_thread (bfd *abfd,
312 bfd_mach_o_load_command *command)
314 bfd_mach_o_thread_command *cmd = &command->command.thread;
316 unsigned char buf[8];
318 unsigned int nflavours;
320 BFD_ASSERT ((command->type == BFD_MACH_O_LC_THREAD)
321 || (command->type == BFD_MACH_O_LC_UNIXTHREAD));
325 for (i = 0; i < cmd->nflavours; i++)
327 BFD_ASSERT ((cmd->flavours[i].size % 4) == 0);
328 BFD_ASSERT (cmd->flavours[i].offset == (command->offset + offset + 8));
330 bfd_h_put_32 (abfd, cmd->flavours[i].flavour, buf);
331 bfd_h_put_32 (abfd, (cmd->flavours[i].size / 4), buf + 4);
333 bfd_seek (abfd, command->offset + offset, SEEK_SET);
334 if (bfd_bwrite ((PTR) buf, 8, abfd) != 8)
337 offset += cmd->flavours[i].size + 8;
344 bfd_mach_o_scan_write_section (bfd *abfd,
345 bfd_mach_o_section *section,
348 unsigned char buf[68];
350 memcpy (buf, section->sectname, 16);
351 memcpy (buf + 16, section->segname, 16);
352 bfd_h_put_32 (abfd, section->addr, buf + 32);
353 bfd_h_put_32 (abfd, section->size, buf + 36);
354 bfd_h_put_32 (abfd, section->offset, buf + 40);
355 bfd_h_put_32 (abfd, section->align, buf + 44);
356 bfd_h_put_32 (abfd, section->reloff, buf + 48);
357 bfd_h_put_32 (abfd, section->nreloc, buf + 52);
358 bfd_h_put_32 (abfd, section->flags, buf + 56);
359 /* bfd_h_put_32 (abfd, section->reserved1, buf + 60); */
360 /* bfd_h_put_32 (abfd, section->reserved2, buf + 64); */
362 bfd_seek (abfd, offset, SEEK_SET);
363 if (bfd_bwrite ((PTR) buf, 68, abfd) != 68)
370 bfd_mach_o_scan_write_segment (bfd *abfd, bfd_mach_o_load_command *command)
372 unsigned char buf[48];
373 bfd_mach_o_segment_command *seg = &command->command.segment;
376 BFD_ASSERT (command->type == BFD_MACH_O_LC_SEGMENT);
378 memcpy (buf, seg->segname, 16);
379 bfd_h_put_32 (abfd, seg->vmaddr, buf + 16);
380 bfd_h_put_32 (abfd, seg->vmsize, buf + 20);
381 bfd_h_put_32 (abfd, seg->fileoff, buf + 24);
382 bfd_h_put_32 (abfd, seg->filesize, buf + 28);
383 bfd_h_put_32 (abfd, 0 /* seg->maxprot */, buf + 32);
384 bfd_h_put_32 (abfd, 0 /* seg->initprot */, buf + 36);
385 bfd_h_put_32 (abfd, seg->nsects, buf + 40);
386 bfd_h_put_32 (abfd, seg->flags, buf + 44);
388 bfd_seek (abfd, command->offset + 8, SEEK_SET);
389 if (bfd_bwrite ((PTR) buf, 48, abfd) != 48)
394 bfd_vma nbytes = seg->filesize;
395 bfd_vma curoff = seg->fileoff;
399 bfd_vma thisread = nbytes;
404 bfd_seek (abfd, curoff, SEEK_SET);
405 if (bfd_bread ((PTR) buf, thisread, abfd) != thisread)
408 bfd_seek (abfd, curoff, SEEK_SET);
409 if (bfd_bwrite ((PTR) buf, thisread, abfd) != thisread)
417 for (i = 0; i < seg->nsects; i++)
419 bfd_vma segoff = command->offset + 48 + 8 + (i * 68);
421 if (bfd_mach_o_scan_write_section (abfd, &seg->sections[i], segoff) != 0)
429 bfd_mach_o_scan_write_symtab_symbols (bfd *abfd,
430 bfd_mach_o_load_command *command)
432 bfd_mach_o_symtab_command *sym = &command->command.symtab;
436 for (i = 0; i < sym->nsyms; i++)
438 unsigned char buf[12];
439 bfd_vma symoff = sym->symoff + (i * 12);
440 unsigned char ntype = 0;
441 unsigned char nsect = 0;
444 s = &sym->symbols[i];
446 /* Instead just set from the stored values. */
447 ntype = (s->udata.i >> 24) & 0xff;
448 nsect = (s->udata.i >> 16) & 0xff;
449 ndesc = s->udata.i & 0xffff;
451 bfd_h_put_32 (abfd, s->name - sym->strtab, buf);
452 bfd_h_put_8 (abfd, ntype, buf + 4);
453 bfd_h_put_8 (abfd, nsect, buf + 5);
454 bfd_h_put_16 (abfd, ndesc, buf + 6);
455 bfd_h_put_32 (abfd, s->section->vma + s->value, buf + 8);
457 bfd_seek (abfd, symoff, SEEK_SET);
458 if (bfd_bwrite ((PTR) buf, 12, abfd) != 12)
460 fprintf (stderr, "bfd_mach_o_scan_write_symtab_symbols: unable to write %d bytes at %lu\n",
461 12, (unsigned long) symoff);
470 bfd_mach_o_scan_write_symtab (bfd *abfd, bfd_mach_o_load_command *command)
472 bfd_mach_o_symtab_command *seg = &command->command.symtab;
473 unsigned char buf[16];
475 BFD_ASSERT (command->type == BFD_MACH_O_LC_SYMTAB);
477 bfd_h_put_32 (abfd, seg->symoff, buf);
478 bfd_h_put_32 (abfd, seg->nsyms, buf + 4);
479 bfd_h_put_32 (abfd, seg->stroff, buf + 8);
480 bfd_h_put_32 (abfd, seg->strsize, buf + 12);
482 bfd_seek (abfd, command->offset + 8, SEEK_SET);
483 if (bfd_bwrite ((PTR) buf, 16, abfd) != 16)
486 if (bfd_mach_o_scan_write_symtab_symbols (abfd, command) != 0)
493 bfd_mach_o_write_contents (bfd *abfd)
498 bfd_mach_o_data_struct *mdata = abfd->tdata.mach_o_data;
500 /* Write data sections first in case they overlap header data to be
503 for (s = abfd->sections; s != (asection *) NULL; s = s->next)
506 /* Now write header information. */
507 if (bfd_mach_o_write_header (abfd, &mdata->header) != 0)
510 for (i = 0; i < mdata->header.ncmds; i++)
512 unsigned char buf[8];
513 bfd_mach_o_load_command *cur = &mdata->commands[i];
514 unsigned long typeflag;
516 typeflag = cur->type_required ? cur->type & BFD_MACH_O_LC_REQ_DYLD : cur->type;
518 bfd_h_put_32 (abfd, typeflag, buf);
519 bfd_h_put_32 (abfd, cur->len, buf + 4);
521 bfd_seek (abfd, cur->offset, SEEK_SET);
522 if (bfd_bwrite ((PTR) buf, 8, abfd) != 8)
527 case BFD_MACH_O_LC_SEGMENT:
528 if (bfd_mach_o_scan_write_segment (abfd, cur) != 0)
531 case BFD_MACH_O_LC_SYMTAB:
532 if (bfd_mach_o_scan_write_symtab (abfd, cur) != 0)
535 case BFD_MACH_O_LC_SYMSEG:
537 case BFD_MACH_O_LC_THREAD:
538 case BFD_MACH_O_LC_UNIXTHREAD:
539 if (bfd_mach_o_scan_write_thread (abfd, cur) != 0)
542 case BFD_MACH_O_LC_LOADFVMLIB:
543 case BFD_MACH_O_LC_IDFVMLIB:
544 case BFD_MACH_O_LC_IDENT:
545 case BFD_MACH_O_LC_FVMFILE:
546 case BFD_MACH_O_LC_PREPAGE:
547 case BFD_MACH_O_LC_DYSYMTAB:
548 case BFD_MACH_O_LC_LOAD_DYLIB:
549 case BFD_MACH_O_LC_LOAD_WEAK_DYLIB:
550 case BFD_MACH_O_LC_ID_DYLIB:
551 case BFD_MACH_O_LC_LOAD_DYLINKER:
552 case BFD_MACH_O_LC_ID_DYLINKER:
553 case BFD_MACH_O_LC_PREBOUND_DYLIB:
554 case BFD_MACH_O_LC_ROUTINES:
555 case BFD_MACH_O_LC_SUB_FRAMEWORK:
559 "unable to write unknown load command 0x%lx\n",
569 bfd_mach_o_sizeof_headers (bfd *a ATTRIBUTE_UNUSED,
570 bfd_boolean b ATTRIBUTE_UNUSED)
575 /* Make an empty symbol. This is required only because
576 bfd_make_section_anyway wants to create a symbol for the section. */
579 bfd_mach_o_make_empty_symbol (bfd *abfd)
583 new = bfd_zalloc (abfd, sizeof (* new));
591 bfd_mach_o_read_header (bfd *abfd, bfd_mach_o_header *header)
593 unsigned char buf[28];
594 bfd_vma (*get32) (const void *) = NULL;
596 bfd_seek (abfd, 0, SEEK_SET);
598 if (bfd_bread ((PTR) buf, 28, abfd) != 28)
601 if (bfd_getb32 (buf) == 0xfeedface)
603 header->byteorder = BFD_ENDIAN_BIG;
604 header->magic = 0xfeedface;
607 else if (bfd_getl32 (buf) == 0xfeedface)
609 header->byteorder = BFD_ENDIAN_LITTLE;
610 header->magic = 0xfeedface;
615 header->byteorder = BFD_ENDIAN_UNKNOWN;
619 header->cputype = (*get32) (buf + 4);
620 header->cpusubtype = (*get32) (buf + 8);
621 header->filetype = (*get32) (buf + 12);
622 header->ncmds = (*get32) (buf + 16);
623 header->sizeofcmds = (*get32) (buf + 20);
624 header->flags = (*get32) (buf + 24);
630 bfd_mach_o_make_bfd_section (bfd *abfd, bfd_mach_o_section *section)
634 const char *prefix = "LC_SEGMENT";
635 unsigned int snamelen;
637 snamelen = strlen (prefix) + 1
638 + strlen (section->segname) + 1
639 + strlen (section->sectname) + 1;
641 sname = bfd_alloc (abfd, snamelen);
644 sprintf (sname, "%s.%s.%s", prefix, section->segname, section->sectname);
646 bfdsec = bfd_make_section_anyway (abfd, sname);
650 bfdsec->vma = section->addr;
651 bfdsec->lma = section->addr;
652 bfdsec->size = section->size;
653 bfdsec->filepos = section->offset;
654 bfdsec->alignment_power = section->align;
656 if (section->flags & BFD_MACH_O_S_ZEROFILL)
657 bfdsec->flags = SEC_ALLOC;
659 bfdsec->flags = SEC_HAS_CONTENTS | SEC_LOAD | SEC_ALLOC | SEC_CODE;
665 bfd_mach_o_scan_read_section (bfd *abfd,
666 bfd_mach_o_section *section,
669 unsigned char buf[68];
671 bfd_seek (abfd, offset, SEEK_SET);
672 if (bfd_bread ((PTR) buf, 68, abfd) != 68)
675 memcpy (section->sectname, buf, 16);
676 section->sectname[16] = '\0';
677 memcpy (section->segname, buf + 16, 16);
678 section->segname[16] = '\0';
679 section->addr = bfd_h_get_32 (abfd, buf + 32);
680 section->size = bfd_h_get_32 (abfd, buf + 36);
681 section->offset = bfd_h_get_32 (abfd, buf + 40);
682 section->align = bfd_h_get_32 (abfd, buf + 44);
683 section->reloff = bfd_h_get_32 (abfd, buf + 48);
684 section->nreloc = bfd_h_get_32 (abfd, buf + 52);
685 section->flags = bfd_h_get_32 (abfd, buf + 56);
686 section->reserved1 = bfd_h_get_32 (abfd, buf + 60);
687 section->reserved2 = bfd_h_get_32 (abfd, buf + 64);
688 section->bfdsection = bfd_mach_o_make_bfd_section (abfd, section);
690 if (section->bfdsection == NULL)
697 bfd_mach_o_scan_read_symtab_symbol (bfd *abfd,
698 bfd_mach_o_symtab_command *sym,
702 bfd_mach_o_data_struct *mdata = abfd->tdata.mach_o_data;
703 bfd_vma symoff = sym->symoff + (i * 12);
704 unsigned char buf[12];
705 unsigned char type = -1;
706 unsigned char section = -1;
708 unsigned long value = -1;
709 unsigned long stroff = -1;
710 unsigned int symtype = -1;
712 BFD_ASSERT (sym->strtab != NULL);
714 bfd_seek (abfd, symoff, SEEK_SET);
715 if (bfd_bread ((PTR) buf, 12, abfd) != 12)
717 fprintf (stderr, "bfd_mach_o_scan_read_symtab_symbol: unable to read %d bytes at %lu\n",
718 12, (unsigned long) symoff);
722 stroff = bfd_h_get_32 (abfd, buf);
723 type = bfd_h_get_8 (abfd, buf + 4);
724 symtype = (type & 0x0e);
725 section = bfd_h_get_8 (abfd, buf + 5) - 1;
726 desc = bfd_h_get_16 (abfd, buf + 6);
727 value = bfd_h_get_32 (abfd, buf + 8);
729 if (stroff >= sym->strsize)
731 fprintf (stderr, "bfd_mach_o_scan_read_symtab_symbol: symbol name out of range (%lu >= %lu)\n",
732 (unsigned long) stroff, (unsigned long) sym->strsize);
737 s->name = sym->strtab + stroff;
739 s->udata.i = (type << 24) | (section << 16) | desc;
742 if (type & BFD_MACH_O_N_STAB)
744 s->flags |= BSF_DEBUGGING;
745 s->section = bfd_und_section_ptr;
749 if (type & BFD_MACH_O_N_PEXT)
751 type &= ~BFD_MACH_O_N_PEXT;
752 s->flags |= BSF_GLOBAL;
755 if (type & BFD_MACH_O_N_EXT)
757 type &= ~BFD_MACH_O_N_EXT;
758 s->flags |= BSF_GLOBAL;
763 case BFD_MACH_O_N_UNDF:
764 s->section = bfd_und_section_ptr;
766 case BFD_MACH_O_N_PBUD:
767 s->section = bfd_und_section_ptr;
769 case BFD_MACH_O_N_ABS:
770 s->section = bfd_abs_section_ptr;
772 case BFD_MACH_O_N_SECT:
773 if ((section > 0) && (section <= mdata->nsects))
775 s->section = mdata->sections[section - 1]->bfdsection;
776 s->value = s->value - mdata->sections[section - 1]->addr;
780 /* Mach-O uses 0 to mean "no section"; not an error. */
783 fprintf (stderr, "bfd_mach_o_scan_read_symtab_symbol: "
784 "symbol \"%s\" specified invalid section %d (max %lu): setting to undefined\n",
785 s->name, section, mdata->nsects);
787 s->section = bfd_und_section_ptr;
790 case BFD_MACH_O_N_INDR:
791 fprintf (stderr, "bfd_mach_o_scan_read_symtab_symbol: "
792 "symbol \"%s\" is unsupported 'indirect' reference: setting to undefined\n",
794 s->section = bfd_und_section_ptr;
797 fprintf (stderr, "bfd_mach_o_scan_read_symtab_symbol: "
798 "symbol \"%s\" specified invalid type field 0x%x: setting to undefined\n",
800 s->section = bfd_und_section_ptr;
809 bfd_mach_o_scan_read_symtab_strtab (bfd *abfd,
810 bfd_mach_o_symtab_command *sym)
812 BFD_ASSERT (sym->strtab == NULL);
814 if (abfd->flags & BFD_IN_MEMORY)
816 struct bfd_in_memory *b;
818 b = (struct bfd_in_memory *) abfd->iostream;
820 if ((sym->stroff + sym->strsize) > b->size)
822 bfd_set_error (bfd_error_file_truncated);
825 sym->strtab = (char *) b->buffer + sym->stroff;
829 sym->strtab = bfd_alloc (abfd, sym->strsize);
830 if (sym->strtab == NULL)
833 bfd_seek (abfd, sym->stroff, SEEK_SET);
834 if (bfd_bread ((PTR) sym->strtab, sym->strsize, abfd) != sym->strsize)
836 fprintf (stderr, "bfd_mach_o_scan_read_symtab_strtab: unable to read %lu bytes at %lu\n",
837 sym->strsize, sym->stroff);
845 bfd_mach_o_scan_read_symtab_symbols (bfd *abfd,
846 bfd_mach_o_symtab_command *sym)
851 BFD_ASSERT (sym->symbols == NULL);
852 sym->symbols = bfd_alloc (abfd, sym->nsyms * sizeof (asymbol));
854 if (sym->symbols == NULL)
856 fprintf (stderr, "bfd_mach_o_scan_read_symtab_symbols: unable to allocate memory for symbols\n");
860 ret = bfd_mach_o_scan_read_symtab_strtab (abfd, sym);
864 for (i = 0; i < sym->nsyms; i++)
866 ret = bfd_mach_o_scan_read_symtab_symbol (abfd, sym, &sym->symbols[i], i);
875 bfd_mach_o_scan_read_dysymtab_symbol (bfd *abfd,
876 bfd_mach_o_dysymtab_command *dysym,
877 bfd_mach_o_symtab_command *sym,
881 unsigned long isymoff = dysym->indirectsymoff + (i * 4);
882 unsigned long symindex;
883 unsigned char buf[4];
885 BFD_ASSERT (i < dysym->nindirectsyms);
887 bfd_seek (abfd, isymoff, SEEK_SET);
888 if (bfd_bread ((PTR) buf, 4, abfd) != 4)
890 fprintf (stderr, "bfd_mach_o_scan_read_dysymtab_symbol: unable to read %lu bytes at %lu\n",
891 (unsigned long) 4, isymoff);
894 symindex = bfd_h_get_32 (abfd, buf);
896 return bfd_mach_o_scan_read_symtab_symbol (abfd, sym, s, symindex);
900 bfd_mach_o_i386_flavour_string (unsigned int flavour)
902 switch ((int) flavour)
904 case BFD_MACH_O_i386_NEW_THREAD_STATE: return "i386_NEW_THREAD_STATE";
905 case BFD_MACH_O_i386_FLOAT_STATE: return "i386_FLOAT_STATE";
906 case BFD_MACH_O_i386_ISA_PORT_MAP_STATE: return "i386_ISA_PORT_MAP_STATE";
907 case BFD_MACH_O_i386_V86_ASSIST_STATE: return "i386_V86_ASSIST_STATE";
908 case BFD_MACH_O_i386_REGS_SEGS_STATE: return "i386_REGS_SEGS_STATE";
909 case BFD_MACH_O_i386_THREAD_SYSCALL_STATE: return "i386_THREAD_SYSCALL_STATE";
910 case BFD_MACH_O_i386_THREAD_STATE_NONE: return "i386_THREAD_STATE_NONE";
911 case BFD_MACH_O_i386_SAVED_STATE: return "i386_SAVED_STATE";
912 case BFD_MACH_O_i386_THREAD_STATE: return "i386_THREAD_STATE";
913 case BFD_MACH_O_i386_THREAD_FPSTATE: return "i386_THREAD_FPSTATE";
914 case BFD_MACH_O_i386_THREAD_EXCEPTSTATE: return "i386_THREAD_EXCEPTSTATE";
915 case BFD_MACH_O_i386_THREAD_CTHREADSTATE: return "i386_THREAD_CTHREADSTATE";
916 default: return "UNKNOWN";
921 bfd_mach_o_ppc_flavour_string (unsigned int flavour)
923 switch ((int) flavour)
925 case BFD_MACH_O_PPC_THREAD_STATE: return "PPC_THREAD_STATE";
926 case BFD_MACH_O_PPC_FLOAT_STATE: return "PPC_FLOAT_STATE";
927 case BFD_MACH_O_PPC_EXCEPTION_STATE: return "PPC_EXCEPTION_STATE";
928 case BFD_MACH_O_PPC_VECTOR_STATE: return "PPC_VECTOR_STATE";
929 default: return "UNKNOWN";
934 bfd_mach_o_scan_read_dylinker (bfd *abfd,
935 bfd_mach_o_load_command *command)
937 bfd_mach_o_dylinker_command *cmd = &command->command.dylinker;
938 unsigned char buf[4];
939 unsigned int nameoff;
944 BFD_ASSERT ((command->type == BFD_MACH_O_LC_ID_DYLINKER)
945 || (command->type == BFD_MACH_O_LC_LOAD_DYLINKER));
947 bfd_seek (abfd, command->offset + 8, SEEK_SET);
948 if (bfd_bread ((PTR) buf, 4, abfd) != 4)
951 nameoff = bfd_h_get_32 (abfd, buf + 0);
953 cmd->name_offset = command->offset + nameoff;
954 cmd->name_len = command->len - nameoff;
956 if (command->type == BFD_MACH_O_LC_LOAD_DYLINKER)
957 prefix = "LC_LOAD_DYLINKER";
958 else if (command->type == BFD_MACH_O_LC_ID_DYLINKER)
959 prefix = "LC_ID_DYLINKER";
963 sname = bfd_alloc (abfd, strlen (prefix) + 1);
966 strcpy (sname, prefix);
968 bfdsec = bfd_make_section_anyway (abfd, sname);
974 bfdsec->size = command->len - 8;
975 bfdsec->filepos = command->offset + 8;
976 bfdsec->alignment_power = 0;
977 bfdsec->flags = SEC_HAS_CONTENTS;
979 cmd->section = bfdsec;
985 bfd_mach_o_scan_read_dylib (bfd *abfd, bfd_mach_o_load_command *command)
987 bfd_mach_o_dylib_command *cmd = &command->command.dylib;
988 unsigned char buf[16];
989 unsigned int nameoff;
994 BFD_ASSERT ((command->type == BFD_MACH_O_LC_ID_DYLIB)
995 || (command->type == BFD_MACH_O_LC_LOAD_DYLIB)
996 || (command->type == BFD_MACH_O_LC_LOAD_WEAK_DYLIB));
998 bfd_seek (abfd, command->offset + 8, SEEK_SET);
999 if (bfd_bread ((PTR) buf, 16, abfd) != 16)
1002 nameoff = bfd_h_get_32 (abfd, buf + 0);
1003 cmd->timestamp = bfd_h_get_32 (abfd, buf + 4);
1004 cmd->current_version = bfd_h_get_32 (abfd, buf + 8);
1005 cmd->compatibility_version = bfd_h_get_32 (abfd, buf + 12);
1007 cmd->name_offset = command->offset + nameoff;
1008 cmd->name_len = command->len - nameoff;
1010 if (command->type == BFD_MACH_O_LC_LOAD_DYLIB)
1011 prefix = "LC_LOAD_DYLIB";
1012 else if (command->type == BFD_MACH_O_LC_LOAD_WEAK_DYLIB)
1013 prefix = "LC_LOAD_WEAK_DYLIB";
1014 else if (command->type == BFD_MACH_O_LC_ID_DYLIB)
1015 prefix = "LC_ID_DYLIB";
1019 sname = bfd_alloc (abfd, strlen (prefix) + 1);
1022 strcpy (sname, prefix);
1024 bfdsec = bfd_make_section_anyway (abfd, sname);
1030 bfdsec->size = command->len - 8;
1031 bfdsec->filepos = command->offset + 8;
1032 bfdsec->alignment_power = 0;
1033 bfdsec->flags = SEC_HAS_CONTENTS;
1035 cmd->section = bfdsec;
1041 bfd_mach_o_scan_read_prebound_dylib (bfd *abfd ATTRIBUTE_UNUSED,
1042 bfd_mach_o_load_command *command ATTRIBUTE_UNUSED)
1044 /* bfd_mach_o_prebound_dylib_command *cmd = &command->command.prebound_dylib; */
1046 BFD_ASSERT (command->type == BFD_MACH_O_LC_PREBOUND_DYLIB);
1051 bfd_mach_o_scan_read_thread (bfd *abfd, bfd_mach_o_load_command *command)
1053 bfd_mach_o_data_struct *mdata = NULL;
1054 bfd_mach_o_thread_command *cmd = &command->command.thread;
1055 unsigned char buf[8];
1057 unsigned int nflavours;
1060 BFD_ASSERT ((command->type == BFD_MACH_O_LC_THREAD)
1061 || (command->type == BFD_MACH_O_LC_UNIXTHREAD));
1063 BFD_ASSERT (bfd_mach_o_valid (abfd));
1064 mdata = abfd->tdata.mach_o_data;
1068 while (offset != command->len)
1070 if (offset >= command->len)
1073 bfd_seek (abfd, command->offset + offset, SEEK_SET);
1075 if (bfd_bread ((PTR) buf, 8, abfd) != 8)
1078 offset += 8 + bfd_h_get_32 (abfd, buf + 4) * 4;
1082 cmd->flavours = bfd_alloc (abfd, nflavours * sizeof (bfd_mach_o_thread_flavour));
1083 if (cmd->flavours == NULL)
1085 cmd->nflavours = nflavours;
1089 while (offset != command->len)
1091 if (offset >= command->len)
1094 if (nflavours >= cmd->nflavours)
1097 bfd_seek (abfd, command->offset + offset, SEEK_SET);
1099 if (bfd_bread ((PTR) buf, 8, abfd) != 8)
1102 cmd->flavours[nflavours].flavour = bfd_h_get_32 (abfd, buf);
1103 cmd->flavours[nflavours].offset = command->offset + offset + 8;
1104 cmd->flavours[nflavours].size = bfd_h_get_32 (abfd, buf + 4) * 4;
1105 offset += cmd->flavours[nflavours].size + 8;
1109 for (i = 0; i < nflavours; i++)
1112 unsigned int snamelen;
1114 const char *flavourstr;
1115 const char *prefix = "LC_THREAD";
1118 switch (mdata->header.cputype)
1120 case BFD_MACH_O_CPU_TYPE_POWERPC:
1121 flavourstr = bfd_mach_o_ppc_flavour_string (cmd->flavours[i].flavour);
1123 case BFD_MACH_O_CPU_TYPE_I386:
1124 flavourstr = bfd_mach_o_i386_flavour_string (cmd->flavours[i].flavour);
1127 flavourstr = "UNKNOWN_ARCHITECTURE";
1131 snamelen = strlen (prefix) + 1 + 20 + 1 + strlen (flavourstr) + 1;
1132 sname = bfd_alloc (abfd, snamelen);
1138 sprintf (sname, "%s.%s.%u", prefix, flavourstr, j);
1139 if (bfd_get_section_by_name (abfd, sname) == NULL)
1144 bfdsec = bfd_make_section (abfd, sname);
1148 bfdsec->size = cmd->flavours[i].size;
1149 bfdsec->filepos = cmd->flavours[i].offset;
1150 bfdsec->alignment_power = 0x0;
1151 bfdsec->flags = SEC_HAS_CONTENTS;
1153 cmd->section = bfdsec;
1160 bfd_mach_o_scan_read_dysymtab (bfd *abfd, bfd_mach_o_load_command *command)
1162 bfd_mach_o_dysymtab_command *seg = &command->command.dysymtab;
1163 unsigned char buf[72];
1165 BFD_ASSERT (command->type == BFD_MACH_O_LC_DYSYMTAB);
1167 bfd_seek (abfd, command->offset + 8, SEEK_SET);
1168 if (bfd_bread ((PTR) buf, 72, abfd) != 72)
1171 seg->ilocalsym = bfd_h_get_32 (abfd, buf + 0);
1172 seg->nlocalsym = bfd_h_get_32 (abfd, buf + 4);
1173 seg->iextdefsym = bfd_h_get_32 (abfd, buf + 8);
1174 seg->nextdefsym = bfd_h_get_32 (abfd, buf + 12);
1175 seg->iundefsym = bfd_h_get_32 (abfd, buf + 16);
1176 seg->nundefsym = bfd_h_get_32 (abfd, buf + 20);
1177 seg->tocoff = bfd_h_get_32 (abfd, buf + 24);
1178 seg->ntoc = bfd_h_get_32 (abfd, buf + 28);
1179 seg->modtaboff = bfd_h_get_32 (abfd, buf + 32);
1180 seg->nmodtab = bfd_h_get_32 (abfd, buf + 36);
1181 seg->extrefsymoff = bfd_h_get_32 (abfd, buf + 40);
1182 seg->nextrefsyms = bfd_h_get_32 (abfd, buf + 44);
1183 seg->indirectsymoff = bfd_h_get_32 (abfd, buf + 48);
1184 seg->nindirectsyms = bfd_h_get_32 (abfd, buf + 52);
1185 seg->extreloff = bfd_h_get_32 (abfd, buf + 56);
1186 seg->nextrel = bfd_h_get_32 (abfd, buf + 60);
1187 seg->locreloff = bfd_h_get_32 (abfd, buf + 64);
1188 seg->nlocrel = bfd_h_get_32 (abfd, buf + 68);
1194 bfd_mach_o_scan_read_symtab (bfd *abfd, bfd_mach_o_load_command *command)
1196 bfd_mach_o_symtab_command *seg = &command->command.symtab;
1197 unsigned char buf[16];
1200 const char *prefix = "LC_SYMTAB.stabs";
1202 BFD_ASSERT (command->type == BFD_MACH_O_LC_SYMTAB);
1204 bfd_seek (abfd, command->offset + 8, SEEK_SET);
1205 if (bfd_bread ((PTR) buf, 16, abfd) != 16)
1208 seg->symoff = bfd_h_get_32 (abfd, buf);
1209 seg->nsyms = bfd_h_get_32 (abfd, buf + 4);
1210 seg->stroff = bfd_h_get_32 (abfd, buf + 8);
1211 seg->strsize = bfd_h_get_32 (abfd, buf + 12);
1212 seg->symbols = NULL;
1215 sname = bfd_alloc (abfd, strlen (prefix) + 1);
1218 strcpy (sname, prefix);
1220 bfdsec = bfd_make_section_anyway (abfd, sname);
1226 bfdsec->size = seg->nsyms * 12;
1227 bfdsec->filepos = seg->symoff;
1228 bfdsec->alignment_power = 0;
1229 bfdsec->flags = SEC_HAS_CONTENTS;
1231 seg->stabs_segment = bfdsec;
1233 prefix = "LC_SYMTAB.stabstr";
1234 sname = bfd_alloc (abfd, strlen (prefix) + 1);
1237 strcpy (sname, prefix);
1239 bfdsec = bfd_make_section_anyway (abfd, sname);
1245 bfdsec->size = seg->strsize;
1246 bfdsec->filepos = seg->stroff;
1247 bfdsec->alignment_power = 0;
1248 bfdsec->flags = SEC_HAS_CONTENTS;
1250 seg->stabstr_segment = bfdsec;
1256 bfd_mach_o_scan_read_segment (bfd *abfd, bfd_mach_o_load_command *command)
1258 unsigned char buf[48];
1259 bfd_mach_o_segment_command *seg = &command->command.segment;
1263 const char *prefix = "LC_SEGMENT";
1264 unsigned int snamelen;
1266 BFD_ASSERT (command->type == BFD_MACH_O_LC_SEGMENT);
1268 bfd_seek (abfd, command->offset + 8, SEEK_SET);
1269 if (bfd_bread ((PTR) buf, 48, abfd) != 48)
1272 memcpy (seg->segname, buf, 16);
1273 seg->vmaddr = bfd_h_get_32 (abfd, buf + 16);
1274 seg->vmsize = bfd_h_get_32 (abfd, buf + 20);
1275 seg->fileoff = bfd_h_get_32 (abfd, buf + 24);
1276 seg->filesize = bfd_h_get_32 (abfd, buf + 28);
1277 /* seg->maxprot = bfd_h_get_32 (abfd, buf + 32); */
1278 /* seg->initprot = bfd_h_get_32 (abfd, buf + 36); */
1279 seg->nsects = bfd_h_get_32 (abfd, buf + 40);
1280 seg->flags = bfd_h_get_32 (abfd, buf + 44);
1282 snamelen = strlen (prefix) + 1 + strlen (seg->segname) + 1;
1283 sname = bfd_alloc (abfd, snamelen);
1286 sprintf (sname, "%s.%s", prefix, seg->segname);
1288 bfdsec = bfd_make_section_anyway (abfd, sname);
1292 bfdsec->vma = seg->vmaddr;
1293 bfdsec->lma = seg->vmaddr;
1294 bfdsec->size = seg->filesize;
1295 bfdsec->filepos = seg->fileoff;
1296 bfdsec->alignment_power = 0x0;
1297 bfdsec->flags = SEC_HAS_CONTENTS | SEC_LOAD | SEC_ALLOC | SEC_CODE;
1299 seg->segment = bfdsec;
1301 if (seg->nsects != 0)
1303 seg->sections = bfd_alloc (abfd, seg->nsects * sizeof (bfd_mach_o_section));
1304 if (seg->sections == NULL)
1307 for (i = 0; i < seg->nsects; i++)
1309 bfd_vma segoff = command->offset + 48 + 8 + (i * 68);
1311 if (bfd_mach_o_scan_read_section (abfd, &seg->sections[i],
1321 bfd_mach_o_scan_read_command (bfd *abfd, bfd_mach_o_load_command *command)
1323 unsigned char buf[8];
1325 bfd_seek (abfd, command->offset, SEEK_SET);
1326 if (bfd_bread ((PTR) buf, 8, abfd) != 8)
1329 command->type = (bfd_h_get_32 (abfd, buf) & ~BFD_MACH_O_LC_REQ_DYLD);
1330 command->type_required = (bfd_h_get_32 (abfd, buf) & BFD_MACH_O_LC_REQ_DYLD
1332 command->len = bfd_h_get_32 (abfd, buf + 4);
1334 switch (command->type)
1336 case BFD_MACH_O_LC_SEGMENT:
1337 if (bfd_mach_o_scan_read_segment (abfd, command) != 0)
1340 case BFD_MACH_O_LC_SYMTAB:
1341 if (bfd_mach_o_scan_read_symtab (abfd, command) != 0)
1344 case BFD_MACH_O_LC_SYMSEG:
1346 case BFD_MACH_O_LC_THREAD:
1347 case BFD_MACH_O_LC_UNIXTHREAD:
1348 if (bfd_mach_o_scan_read_thread (abfd, command) != 0)
1351 case BFD_MACH_O_LC_LOAD_DYLINKER:
1352 case BFD_MACH_O_LC_ID_DYLINKER:
1353 if (bfd_mach_o_scan_read_dylinker (abfd, command) != 0)
1356 case BFD_MACH_O_LC_LOAD_DYLIB:
1357 case BFD_MACH_O_LC_ID_DYLIB:
1358 case BFD_MACH_O_LC_LOAD_WEAK_DYLIB:
1359 if (bfd_mach_o_scan_read_dylib (abfd, command) != 0)
1362 case BFD_MACH_O_LC_PREBOUND_DYLIB:
1363 if (bfd_mach_o_scan_read_prebound_dylib (abfd, command) != 0)
1366 case BFD_MACH_O_LC_LOADFVMLIB:
1367 case BFD_MACH_O_LC_IDFVMLIB:
1368 case BFD_MACH_O_LC_IDENT:
1369 case BFD_MACH_O_LC_FVMFILE:
1370 case BFD_MACH_O_LC_PREPAGE:
1371 case BFD_MACH_O_LC_ROUTINES:
1372 case BFD_MACH_O_LC_SUB_FRAMEWORK:
1374 case BFD_MACH_O_LC_DYSYMTAB:
1375 if (bfd_mach_o_scan_read_dysymtab (abfd, command) != 0)
1378 case BFD_MACH_O_LC_SUB_UMBRELLA:
1379 case BFD_MACH_O_LC_SUB_CLIENT:
1380 case BFD_MACH_O_LC_SUB_LIBRARY:
1381 case BFD_MACH_O_LC_TWOLEVEL_HINTS:
1382 case BFD_MACH_O_LC_PREBIND_CKSUM:
1385 fprintf (stderr, "unable to read unknown load command 0x%lx\n",
1386 (unsigned long) command->type);
1394 bfd_mach_o_flatten_sections (bfd *abfd)
1396 bfd_mach_o_data_struct *mdata = abfd->tdata.mach_o_data;
1402 for (i = 0; i < mdata->header.ncmds; i++)
1404 if (mdata->commands[i].type == BFD_MACH_O_LC_SEGMENT)
1406 bfd_mach_o_segment_command *seg;
1408 seg = &mdata->commands[i].command.segment;
1409 mdata->nsects += seg->nsects;
1413 mdata->sections = bfd_alloc (abfd,
1414 mdata->nsects * sizeof (bfd_mach_o_section *));
1417 for (i = 0; i < mdata->header.ncmds; i++)
1419 if (mdata->commands[i].type == BFD_MACH_O_LC_SEGMENT)
1421 bfd_mach_o_segment_command *seg;
1423 seg = &mdata->commands[i].command.segment;
1424 BFD_ASSERT (csect + seg->nsects <= mdata->nsects);
1426 for (j = 0; j < seg->nsects; j++)
1427 mdata->sections[csect++] = &seg->sections[j];
1433 bfd_mach_o_scan_start_address (bfd *abfd)
1435 bfd_mach_o_data_struct *mdata = abfd->tdata.mach_o_data;
1436 bfd_mach_o_thread_command *cmd = NULL;
1439 for (i = 0; i < mdata->header.ncmds; i++)
1441 if ((mdata->commands[i].type == BFD_MACH_O_LC_THREAD) ||
1442 (mdata->commands[i].type == BFD_MACH_O_LC_UNIXTHREAD))
1445 cmd = &mdata->commands[i].command.thread;
1454 for (i = 0; i < cmd->nflavours; i++)
1456 if ((mdata->header.cputype == BFD_MACH_O_CPU_TYPE_I386)
1457 && (cmd->flavours[i].flavour
1458 == (unsigned long) BFD_MACH_O_i386_THREAD_STATE))
1460 unsigned char buf[4];
1462 bfd_seek (abfd, cmd->flavours[i].offset + 40, SEEK_SET);
1464 if (bfd_bread (buf, 4, abfd) != 4)
1467 abfd->start_address = bfd_h_get_32 (abfd, buf);
1469 else if ((mdata->header.cputype == BFD_MACH_O_CPU_TYPE_POWERPC)
1470 && (cmd->flavours[i].flavour == BFD_MACH_O_PPC_THREAD_STATE))
1472 unsigned char buf[4];
1474 bfd_seek (abfd, cmd->flavours[i].offset + 0, SEEK_SET);
1476 if (bfd_bread (buf, 4, abfd) != 4)
1479 abfd->start_address = bfd_h_get_32 (abfd, buf);
1487 bfd_mach_o_scan (bfd *abfd,
1488 bfd_mach_o_header *header,
1489 bfd_mach_o_data_struct *mdata)
1492 enum bfd_architecture cputype;
1493 unsigned long cpusubtype;
1495 mdata->header = *header;
1496 mdata->symbols = NULL;
1498 abfd->flags = (abfd->xvec->object_flags
1499 | (abfd->flags & (BFD_IN_MEMORY | BFD_IO_FUNCS)));
1500 abfd->tdata.mach_o_data = mdata;
1502 bfd_mach_o_convert_architecture (header->cputype, header->cpusubtype,
1503 &cputype, &cpusubtype);
1504 if (cputype == bfd_arch_unknown)
1506 fprintf (stderr, "bfd_mach_o_scan: unknown architecture 0x%lx/0x%lx\n",
1507 header->cputype, header->cpusubtype);
1511 bfd_set_arch_mach (abfd, cputype, cpusubtype);
1513 if (header->ncmds != 0)
1515 mdata->commands = bfd_alloc (abfd, header->ncmds * sizeof (bfd_mach_o_load_command));
1516 if (mdata->commands == NULL)
1519 for (i = 0; i < header->ncmds; i++)
1521 bfd_mach_o_load_command *cur = &mdata->commands[i];
1527 bfd_mach_o_load_command *prev = &mdata->commands[i - 1];
1528 cur->offset = prev->offset + prev->len;
1531 if (bfd_mach_o_scan_read_command (abfd, cur) < 0)
1536 if (bfd_mach_o_scan_start_address (abfd) < 0)
1539 bfd_mach_o_flatten_sections (abfd);
1544 bfd_mach_o_mkobject (bfd *abfd)
1546 bfd_mach_o_data_struct *mdata = NULL;
1548 mdata = bfd_alloc (abfd, sizeof (bfd_mach_o_data_struct));
1551 abfd->tdata.mach_o_data = mdata;
1553 mdata->header.magic = 0;
1554 mdata->header.cputype = 0;
1555 mdata->header.cpusubtype = 0;
1556 mdata->header.filetype = 0;
1557 mdata->header.ncmds = 0;
1558 mdata->header.sizeofcmds = 0;
1559 mdata->header.flags = 0;
1560 mdata->header.byteorder = BFD_ENDIAN_UNKNOWN;
1561 mdata->commands = NULL;
1562 mdata->nsymbols = 0;
1563 mdata->symbols = NULL;
1565 mdata->sections = NULL;
1572 bfd_mach_o_object_p (bfd *abfd)
1574 struct bfd_preserve preserve;
1575 bfd_mach_o_header header;
1577 preserve.marker = NULL;
1578 if (bfd_mach_o_read_header (abfd, &header) != 0)
1581 if (! (header.byteorder == BFD_ENDIAN_BIG
1582 || header.byteorder == BFD_ENDIAN_LITTLE))
1584 fprintf (stderr, "unknown header byte-order value 0x%lx\n",
1585 (long) header.byteorder);
1589 if (! ((header.byteorder == BFD_ENDIAN_BIG
1590 && abfd->xvec->byteorder == BFD_ENDIAN_BIG
1591 && abfd->xvec->header_byteorder == BFD_ENDIAN_BIG)
1592 || (header.byteorder == BFD_ENDIAN_LITTLE
1593 && abfd->xvec->byteorder == BFD_ENDIAN_LITTLE
1594 && abfd->xvec->header_byteorder == BFD_ENDIAN_LITTLE)))
1597 preserve.marker = bfd_zalloc (abfd, sizeof (bfd_mach_o_data_struct));
1598 if (preserve.marker == NULL
1599 || !bfd_preserve_save (abfd, &preserve))
1602 if (bfd_mach_o_scan (abfd, &header,
1603 (bfd_mach_o_data_struct *) preserve.marker) != 0)
1606 bfd_preserve_finish (abfd, &preserve);
1610 bfd_set_error (bfd_error_wrong_format);
1613 if (preserve.marker != NULL)
1614 bfd_preserve_restore (abfd, &preserve);
1619 bfd_mach_o_core_p (bfd *abfd)
1621 struct bfd_preserve preserve;
1622 bfd_mach_o_header header;
1624 preserve.marker = NULL;
1625 if (bfd_mach_o_read_header (abfd, &header) != 0)
1628 if (! (header.byteorder == BFD_ENDIAN_BIG
1629 || header.byteorder == BFD_ENDIAN_LITTLE))
1631 fprintf (stderr, "unknown header byte-order value 0x%lx\n",
1632 (long) header.byteorder);
1636 if (! ((header.byteorder == BFD_ENDIAN_BIG
1637 && abfd->xvec->byteorder == BFD_ENDIAN_BIG
1638 && abfd->xvec->header_byteorder == BFD_ENDIAN_BIG)
1639 || (header.byteorder == BFD_ENDIAN_LITTLE
1640 && abfd->xvec->byteorder == BFD_ENDIAN_LITTLE
1641 && abfd->xvec->header_byteorder == BFD_ENDIAN_LITTLE)))
1644 if (header.filetype != BFD_MACH_O_MH_CORE)
1647 preserve.marker = bfd_zalloc (abfd, sizeof (bfd_mach_o_data_struct));
1648 if (preserve.marker == NULL
1649 || !bfd_preserve_save (abfd, &preserve))
1652 if (bfd_mach_o_scan (abfd, &header,
1653 (bfd_mach_o_data_struct *) preserve.marker) != 0)
1656 bfd_preserve_finish (abfd, &preserve);
1660 bfd_set_error (bfd_error_wrong_format);
1663 if (preserve.marker != NULL)
1664 bfd_preserve_restore (abfd, &preserve);
1668 typedef struct mach_o_fat_archentry
1670 unsigned long cputype;
1671 unsigned long cpusubtype;
1672 unsigned long offset;
1674 unsigned long align;
1676 } mach_o_fat_archentry;
1678 typedef struct mach_o_fat_data_struct
1680 unsigned long magic;
1681 unsigned long nfat_arch;
1682 mach_o_fat_archentry *archentries;
1683 } mach_o_fat_data_struct;
1686 bfd_mach_o_archive_p (bfd *abfd)
1688 mach_o_fat_data_struct *adata = NULL;
1689 unsigned char buf[20];
1692 bfd_seek (abfd, 0, SEEK_SET);
1693 if (bfd_bread ((PTR) buf, 8, abfd) != 8)
1696 adata = bfd_alloc (abfd, sizeof (mach_o_fat_data_struct));
1700 adata->magic = bfd_getb32 (buf);
1701 adata->nfat_arch = bfd_getb32 (buf + 4);
1702 if (adata->magic != 0xcafebabe)
1705 adata->archentries =
1706 bfd_alloc (abfd, adata->nfat_arch * sizeof (mach_o_fat_archentry));
1707 if (adata->archentries == NULL)
1710 for (i = 0; i < adata->nfat_arch; i++)
1712 bfd_seek (abfd, 8 + 20 * i, SEEK_SET);
1714 if (bfd_bread ((PTR) buf, 20, abfd) != 20)
1716 adata->archentries[i].cputype = bfd_getb32 (buf);
1717 adata->archentries[i].cpusubtype = bfd_getb32 (buf + 4);
1718 adata->archentries[i].offset = bfd_getb32 (buf + 8);
1719 adata->archentries[i].size = bfd_getb32 (buf + 12);
1720 adata->archentries[i].align = bfd_getb32 (buf + 16);
1721 adata->archentries[i].abfd = NULL;
1724 abfd->tdata.mach_o_fat_data = adata;
1729 bfd_release (abfd, adata);
1730 bfd_set_error (bfd_error_wrong_format);
1735 bfd_mach_o_openr_next_archived_file (bfd *archive, bfd *prev)
1737 mach_o_fat_data_struct *adata;
1738 mach_o_fat_archentry *entry = NULL;
1741 adata = (mach_o_fat_data_struct *) archive->tdata.mach_o_fat_data;
1742 BFD_ASSERT (adata != NULL);
1744 /* Find index of previous entry. */
1746 i = 0; /* Start at first one. */
1749 for (i = 0; i < adata->nfat_arch; i++)
1751 if (adata->archentries[i].abfd == prev)
1755 if (i == adata->nfat_arch)
1758 bfd_set_error (bfd_error_bad_value);
1761 i++; /* Get next entry. */
1764 if (i >= adata->nfat_arch)
1766 bfd_set_error (bfd_error_no_more_archived_files);
1770 entry = &adata->archentries[i];
1771 if (entry->abfd == NULL)
1773 bfd *nbfd = _bfd_new_bfd_contained_in (archive);
1779 nbfd->origin = entry->offset;
1780 s = bfd_malloc (strlen (archive->filename) + 1);
1783 strcpy (s, archive->filename);
1785 nbfd->iostream = NULL;
1793 bfd_mach_o_lookup_section (bfd *abfd,
1795 bfd_mach_o_load_command **mcommand,
1796 bfd_mach_o_section **msection)
1798 struct mach_o_data_struct *md = abfd->tdata.mach_o_data;
1799 unsigned int i, j, num;
1801 bfd_mach_o_load_command *ncmd = NULL;
1802 bfd_mach_o_section *nsect = NULL;
1804 BFD_ASSERT (mcommand != NULL);
1805 BFD_ASSERT (msection != NULL);
1808 for (i = 0; i < md->header.ncmds; i++)
1810 struct bfd_mach_o_load_command *cmd = &md->commands[i];
1811 struct bfd_mach_o_segment_command *seg = NULL;
1813 if (cmd->type != BFD_MACH_O_LC_SEGMENT)
1815 seg = &cmd->command.segment;
1817 if (seg->segment == section)
1824 for (j = 0; j < seg->nsects; j++)
1826 struct bfd_mach_o_section *sect = &seg->sections[j];
1828 if (sect->bfdsection == section)
1843 bfd_mach_o_lookup_command (bfd *abfd,
1844 bfd_mach_o_load_command_type type,
1845 bfd_mach_o_load_command **mcommand)
1847 struct mach_o_data_struct *md = NULL;
1848 bfd_mach_o_load_command *ncmd = NULL;
1849 unsigned int i, num;
1851 md = abfd->tdata.mach_o_data;
1853 BFD_ASSERT (md != NULL);
1854 BFD_ASSERT (mcommand != NULL);
1857 for (i = 0; i < md->header.ncmds; i++)
1859 struct bfd_mach_o_load_command *cmd = &md->commands[i];
1861 if (cmd->type != type)
1874 bfd_mach_o_stack_addr (enum bfd_mach_o_cpu_type type)
1878 case BFD_MACH_O_CPU_TYPE_MC680x0:
1880 case BFD_MACH_O_CPU_TYPE_MC88000:
1882 case BFD_MACH_O_CPU_TYPE_POWERPC:
1884 case BFD_MACH_O_CPU_TYPE_I386:
1886 case BFD_MACH_O_CPU_TYPE_SPARC:
1888 case BFD_MACH_O_CPU_TYPE_I860:
1890 case BFD_MACH_O_CPU_TYPE_HPPA:
1891 return 0xc0000000 - 0x04000000;
1898 bfd_mach_o_core_fetch_environment (bfd *abfd,
1899 unsigned char **rbuf,
1902 bfd_mach_o_data_struct *mdata = abfd->tdata.mach_o_data;
1903 unsigned long stackaddr = bfd_mach_o_stack_addr (mdata->header.cputype);
1906 for (i = 0; i < mdata->header.ncmds; i++)
1908 bfd_mach_o_load_command *cur = &mdata->commands[i];
1909 bfd_mach_o_segment_command *seg = NULL;
1911 if (cur->type != BFD_MACH_O_LC_SEGMENT)
1914 seg = &cur->command.segment;
1916 if ((seg->vmaddr + seg->vmsize) == stackaddr)
1918 unsigned long start = seg->fileoff;
1919 unsigned long end = seg->fileoff + seg->filesize;
1920 unsigned char *buf = bfd_malloc (1024);
1921 unsigned long size = 1024;
1925 bfd_size_type nread = 0;
1926 unsigned long offset;
1927 int found_nonnull = 0;
1929 if (size > (end - start))
1930 size = (end - start);
1932 buf = bfd_realloc (buf, size);
1934 bfd_seek (abfd, end - size, SEEK_SET);
1935 nread = bfd_bread (buf, size, abfd);
1940 for (offset = 4; offset <= size; offset += 4)
1944 val = *((unsigned long *) (buf + size - offset));
1945 if (! found_nonnull)
1950 else if (val == 0x0)
1952 unsigned long bottom;
1955 bottom = seg->fileoff + seg->filesize - offset;
1956 top = seg->fileoff + seg->filesize - 4;
1957 *rbuf = bfd_malloc (top - bottom);
1958 *rlen = top - bottom;
1960 memcpy (*rbuf, buf + size - *rlen, *rlen);
1965 if (size == (end - start))
1977 bfd_mach_o_core_file_failing_command (bfd *abfd)
1979 unsigned char *buf = NULL;
1980 unsigned int len = 0;
1983 ret = bfd_mach_o_core_fetch_environment (abfd, &buf, &len);
1987 return (char *) buf;
1991 bfd_mach_o_core_file_failing_signal (bfd *abfd ATTRIBUTE_UNUSED)
1997 bfd_mach_o_core_file_matches_executable_p (bfd *core_bfd ATTRIBUTE_UNUSED,
1998 bfd *exec_bfd ATTRIBUTE_UNUSED)
2003 #define TARGET_NAME mach_o_be_vec
2004 #define TARGET_STRING "mach-o-be"
2005 #define TARGET_BIG_ENDIAN 1
2006 #define TARGET_ARCHIVE 0
2008 #include "mach-o-target.c"
2011 #undef TARGET_STRING
2012 #undef TARGET_BIG_ENDIAN
2013 #undef TARGET_ARCHIVE
2015 #define TARGET_NAME mach_o_le_vec
2016 #define TARGET_STRING "mach-o-le"
2017 #define TARGET_BIG_ENDIAN 0
2018 #define TARGET_ARCHIVE 0
2020 #include "mach-o-target.c"
2023 #undef TARGET_STRING
2024 #undef TARGET_BIG_ENDIAN
2025 #undef TARGET_ARCHIVE
2027 #define TARGET_NAME mach_o_fat_vec
2028 #define TARGET_STRING "mach-o-fat"
2029 #define TARGET_BIG_ENDIAN 1
2030 #define TARGET_ARCHIVE 1
2032 #include "mach-o-target.c"
2035 #undef TARGET_STRING
2036 #undef TARGET_BIG_ENDIAN
2037 #undef TARGET_ARCHIVE