1 /* Mach-O support for BFD.
2 Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
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 3 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,
20 MA 02110-1301, USA. */
26 #include "libiberty.h"
27 #include "aout/stab_gnu.h"
30 #define bfd_mach_o_object_p bfd_mach_o_gen_object_p
31 #define bfd_mach_o_core_p bfd_mach_o_gen_core_p
32 #define bfd_mach_o_mkobject bfd_mach_o_gen_mkobject
34 #define FILE_ALIGN(off, algn) \
35 (((off) + ((file_ptr) 1 << (algn)) - 1) & ((file_ptr) -1 << (algn)))
37 static int bfd_mach_o_read_symtab_symbols (bfd
*);
40 bfd_mach_o_version (bfd
*abfd
)
42 bfd_mach_o_data_struct
*mdata
= NULL
;
44 BFD_ASSERT (bfd_mach_o_valid (abfd
));
45 mdata
= bfd_mach_o_get_data (abfd
);
47 return mdata
->header
.version
;
51 bfd_mach_o_valid (bfd
*abfd
)
53 if (abfd
== NULL
|| abfd
->xvec
== NULL
)
56 if (abfd
->xvec
->flavour
!= bfd_target_mach_o_flavour
)
59 if (bfd_mach_o_get_data (abfd
) == NULL
)
64 static INLINE bfd_boolean
65 mach_o_wide_p (bfd_mach_o_header
*header
)
67 switch (header
->version
)
79 static INLINE bfd_boolean
80 bfd_mach_o_wide_p (bfd
*abfd
)
82 return mach_o_wide_p (&bfd_mach_o_get_data (abfd
)->header
);
85 /* Tables to translate well known Mach-O segment/section names to bfd
86 names. Use of canonical names (such as .text or .debug_frame) is required
89 struct mach_o_section_name_xlat
92 const char *mach_o_name
;
96 static const struct mach_o_section_name_xlat dwarf_section_names_xlat
[] =
98 { ".debug_frame", "__debug_frame", SEC_DEBUGGING
},
99 { ".debug_info", "__debug_info", SEC_DEBUGGING
},
100 { ".debug_abbrev", "__debug_abbrev", SEC_DEBUGGING
},
101 { ".debug_aranges", "__debug_aranges", SEC_DEBUGGING
},
102 { ".debug_macinfo", "__debug_macinfo", SEC_DEBUGGING
},
103 { ".debug_line", "__debug_line", SEC_DEBUGGING
},
104 { ".debug_loc", "__debug_loc", SEC_DEBUGGING
},
105 { ".debug_pubnames", "__debug_pubnames", SEC_DEBUGGING
},
106 { ".debug_pubtypes", "__debug_pubtypes", SEC_DEBUGGING
},
107 { ".debug_str", "__debug_str", SEC_DEBUGGING
},
108 { ".debug_ranges", "__debug_ranges", SEC_DEBUGGING
},
112 static const struct mach_o_section_name_xlat text_section_names_xlat
[] =
114 { ".text", "__text", SEC_CODE
| SEC_LOAD
},
115 { ".const", "__const", SEC_READONLY
| SEC_DATA
| SEC_LOAD
},
116 { ".cstring", "__cstring", SEC_READONLY
| SEC_DATA
| SEC_LOAD
},
117 { ".eh_frame", "__eh_frame", SEC_READONLY
| SEC_LOAD
},
121 static const struct mach_o_section_name_xlat data_section_names_xlat
[] =
123 { ".data", "__data", SEC_DATA
| SEC_LOAD
},
124 { ".const_data", "__const", SEC_DATA
| SEC_LOAD
},
125 { ".dyld", "__dyld", SEC_DATA
| SEC_LOAD
},
126 { ".lazy_symbol_ptr", "__la_symbol_ptr", SEC_DATA
| SEC_LOAD
},
127 { ".non_lazy_symbol_ptr", "__nl_symbol_ptr", SEC_DATA
| SEC_LOAD
},
128 { ".bss", "__bss", SEC_NO_FLAGS
},
132 struct mach_o_segment_name_xlat
135 const struct mach_o_section_name_xlat
*sections
;
138 static const struct mach_o_segment_name_xlat segsec_names_xlat
[] =
140 { "__DWARF", dwarf_section_names_xlat
},
141 { "__TEXT", text_section_names_xlat
},
142 { "__DATA", data_section_names_xlat
},
147 /* Mach-O to bfd names. */
150 bfd_mach_o_convert_section_name_to_bfd (bfd
*abfd
, bfd_mach_o_section
*section
,
151 char **name
, flagword
*flags
)
153 const struct mach_o_segment_name_xlat
*seg
;
156 const char *pfx
= "";
159 *flags
= SEC_NO_FLAGS
;
161 for (seg
= segsec_names_xlat
; seg
->segname
; seg
++)
163 if (strcmp (seg
->segname
, section
->segname
) == 0)
165 const struct mach_o_section_name_xlat
*sec
;
167 for (sec
= seg
->sections
; sec
->mach_o_name
; sec
++)
169 if (strcmp (sec
->mach_o_name
, section
->sectname
) == 0)
171 len
= strlen (sec
->bfd_name
);
172 res
= bfd_alloc (abfd
, len
+ 1);
176 strcpy (res
, sec
->bfd_name
);
185 len
= strlen (section
->segname
) + 1
186 + strlen (section
->sectname
) + 1;
188 /* Put "LC_SEGMENT." prefix if the segment name is weird (ie doesn't start
189 with an underscore. */
190 if (section
->segname
[0] != '_')
192 static const char seg_pfx
[] = "LC_SEGMENT.";
195 len
+= sizeof (seg_pfx
) - 1;
198 res
= bfd_alloc (abfd
, len
);
201 snprintf (res
, len
, "%s%s.%s", pfx
, section
->segname
, section
->sectname
);
205 /* Convert a bfd section name to a Mach-O segment + section name. */
208 bfd_mach_o_convert_section_name_to_mach_o (bfd
*abfd ATTRIBUTE_UNUSED
,
210 bfd_mach_o_section
*section
)
212 const struct mach_o_segment_name_xlat
*seg
;
213 const char *name
= bfd_get_section_name (abfd
, sect
);
219 /* List of well known names. They all start with a dot. */
221 for (seg
= segsec_names_xlat
; seg
->segname
; seg
++)
223 const struct mach_o_section_name_xlat
*sec
;
225 for (sec
= seg
->sections
; sec
->mach_o_name
; sec
++)
227 if (strcmp (sec
->bfd_name
, name
) == 0)
229 strcpy (section
->segname
, seg
->segname
);
230 strcpy (section
->sectname
, sec
->mach_o_name
);
236 /* Strip LC_SEGMENT. prefix. */
237 if (strncmp (name
, "LC_SEGMENT.", 11) == 0)
241 dot
= strchr (name
, '.');
244 /* Try to split name into segment and section names. */
245 if (dot
&& dot
!= name
)
248 seclen
= len
- (dot
+ 1 - name
);
250 if (seglen
< 16 && seclen
< 16)
252 memcpy (section
->segname
, name
, seglen
);
253 section
->segname
[seglen
] = 0;
254 memcpy (section
->sectname
, dot
+ 1, seclen
);
255 section
->sectname
[seclen
] = 0;
262 memcpy (section
->segname
, name
, len
);
263 section
->segname
[len
] = 0;
264 memcpy (section
->sectname
, name
, len
);
265 section
->sectname
[len
] = 0;
268 /* Return the size of an entry for section SEC.
269 Must be called only for symbol pointer section and symbol stubs
273 bfd_mach_o_section_get_entry_size (bfd
*abfd
, bfd_mach_o_section
*sec
)
275 switch (sec
->flags
& BFD_MACH_O_SECTION_TYPE_MASK
)
277 case BFD_MACH_O_S_NON_LAZY_SYMBOL_POINTERS
:
278 case BFD_MACH_O_S_LAZY_SYMBOL_POINTERS
:
279 return bfd_mach_o_wide_p (abfd
) ? 8 : 4;
280 case BFD_MACH_O_S_SYMBOL_STUBS
:
281 return sec
->reserved2
;
288 /* Return the number of indirect symbols for a section.
289 Must be called only for symbol pointer section and symbol stubs
293 bfd_mach_o_section_get_nbr_indirect (bfd
*abfd
, bfd_mach_o_section
*sec
)
297 elsz
= bfd_mach_o_section_get_entry_size (abfd
, sec
);
301 return sec
->size
/ elsz
;
305 /* Copy any private info we understand from the input symbol
306 to the output symbol. */
309 bfd_mach_o_bfd_copy_private_symbol_data (bfd
*ibfd ATTRIBUTE_UNUSED
,
310 asymbol
*isymbol ATTRIBUTE_UNUSED
,
311 bfd
*obfd ATTRIBUTE_UNUSED
,
312 asymbol
*osymbol ATTRIBUTE_UNUSED
)
317 /* Copy any private info we understand from the input section
318 to the output section. */
321 bfd_mach_o_bfd_copy_private_section_data (bfd
*ibfd ATTRIBUTE_UNUSED
,
322 asection
*isection ATTRIBUTE_UNUSED
,
323 bfd
*obfd ATTRIBUTE_UNUSED
,
324 asection
*osection ATTRIBUTE_UNUSED
)
329 /* Copy any private info we understand from the input bfd
330 to the output bfd. */
333 bfd_mach_o_bfd_copy_private_bfd_data (bfd
*ibfd
, bfd
*obfd
)
335 if (bfd_get_flavour (ibfd
) != bfd_target_mach_o_flavour
336 || bfd_get_flavour (obfd
) != bfd_target_mach_o_flavour
)
339 BFD_ASSERT (bfd_mach_o_valid (ibfd
));
340 BFD_ASSERT (bfd_mach_o_valid (obfd
));
342 /* FIXME: copy commands. */
347 /* Count the total number of symbols. */
350 bfd_mach_o_count_symbols (bfd
*abfd
)
352 bfd_mach_o_data_struct
*mdata
= bfd_mach_o_get_data (abfd
);
354 if (mdata
->symtab
== NULL
)
356 return mdata
->symtab
->nsyms
;
360 bfd_mach_o_get_symtab_upper_bound (bfd
*abfd
)
362 long nsyms
= bfd_mach_o_count_symbols (abfd
);
364 return ((nsyms
+ 1) * sizeof (asymbol
*));
368 bfd_mach_o_canonicalize_symtab (bfd
*abfd
, asymbol
**alocation
)
370 bfd_mach_o_data_struct
*mdata
= bfd_mach_o_get_data (abfd
);
371 long nsyms
= bfd_mach_o_count_symbols (abfd
);
372 bfd_mach_o_symtab_command
*sym
= mdata
->symtab
;
378 if (bfd_mach_o_read_symtab_symbols (abfd
) != 0)
381 "bfd_mach_o_canonicalize_symtab: unable to load symbols\n");
385 BFD_ASSERT (sym
->symbols
!= NULL
);
387 for (j
= 0; j
< sym
->nsyms
; j
++)
388 alocation
[j
] = &sym
->symbols
[j
].symbol
;
396 bfd_mach_o_get_synthetic_symtab (bfd
*abfd
,
397 long symcount ATTRIBUTE_UNUSED
,
398 asymbol
**syms ATTRIBUTE_UNUSED
,
399 long dynsymcount ATTRIBUTE_UNUSED
,
400 asymbol
**dynsyms ATTRIBUTE_UNUSED
,
403 bfd_mach_o_data_struct
*mdata
= bfd_mach_o_get_data (abfd
);
404 bfd_mach_o_dysymtab_command
*dysymtab
= mdata
->dysymtab
;
405 bfd_mach_o_symtab_command
*symtab
= mdata
->symtab
;
407 unsigned long count
, i
, j
, n
;
414 if (dysymtab
== NULL
|| symtab
== NULL
|| symtab
->symbols
== NULL
)
417 if (dysymtab
->nindirectsyms
== 0)
420 count
= dysymtab
->nindirectsyms
;
421 size
= count
* sizeof (asymbol
) + 1;
423 for (j
= 0; j
< count
; j
++)
425 unsigned int isym
= dysymtab
->indirect_syms
[j
];
427 if (isym
< symtab
->nsyms
&& symtab
->symbols
[isym
].symbol
.name
)
428 size
+= strlen (symtab
->symbols
[isym
].symbol
.name
) + sizeof ("$stub");
431 s
= *ret
= (asymbol
*) bfd_malloc (size
);
434 names
= (char *) (s
+ count
);
439 for (i
= 0; i
< mdata
->nsects
; i
++)
441 bfd_mach_o_section
*sec
= mdata
->sections
[i
];
442 unsigned int first
, last
;
446 switch (sec
->flags
& BFD_MACH_O_SECTION_TYPE_MASK
)
448 case BFD_MACH_O_S_NON_LAZY_SYMBOL_POINTERS
:
449 case BFD_MACH_O_S_LAZY_SYMBOL_POINTERS
:
450 case BFD_MACH_O_S_SYMBOL_STUBS
:
451 first
= sec
->reserved1
;
452 last
= first
+ bfd_mach_o_section_get_nbr_indirect (abfd
, sec
);
454 entry_size
= bfd_mach_o_section_get_entry_size (abfd
, sec
);
455 for (j
= first
; j
< last
; j
++)
457 unsigned int isym
= dysymtab
->indirect_syms
[j
];
459 s
->flags
= BSF_GLOBAL
| BSF_SYNTHETIC
;
460 s
->section
= sec
->bfdsection
;
461 s
->value
= addr
- sec
->addr
;
464 if (isym
< symtab
->nsyms
465 && symtab
->symbols
[isym
].symbol
.name
)
467 const char *sym
= symtab
->symbols
[isym
].symbol
.name
;
472 memcpy (names
, sym
, len
);
474 memcpy (names
, "$stub", sizeof ("$stub"));
475 names
+= sizeof ("$stub");
494 bfd_mach_o_get_symbol_info (bfd
*abfd ATTRIBUTE_UNUSED
,
498 bfd_symbol_info (symbol
, ret
);
502 bfd_mach_o_print_symbol (bfd
*abfd
,
505 bfd_print_symbol_type how
)
507 FILE *file
= (FILE *) afile
;
509 bfd_mach_o_asymbol
*asym
= (bfd_mach_o_asymbol
*)symbol
;
513 case bfd_print_symbol_name
:
514 fprintf (file
, "%s", symbol
->name
);
517 bfd_print_symbol_vandf (abfd
, (void *) file
, symbol
);
518 if (asym
->n_type
& BFD_MACH_O_N_STAB
)
519 name
= bfd_get_stab_name (asym
->n_type
);
521 switch (asym
->n_type
& BFD_MACH_O_N_TYPE
)
523 case BFD_MACH_O_N_UNDF
:
526 case BFD_MACH_O_N_ABS
:
529 case BFD_MACH_O_N_INDR
:
532 case BFD_MACH_O_N_PBUD
:
535 case BFD_MACH_O_N_SECT
:
544 fprintf (file
, " %02x %-6s %02x %04x",
545 asym
->n_type
, name
, asym
->n_sect
, asym
->n_desc
);
546 if ((asym
->n_type
& BFD_MACH_O_N_STAB
) == 0
547 && (asym
->n_type
& BFD_MACH_O_N_TYPE
) == BFD_MACH_O_N_SECT
)
548 fprintf (file
, " %-5s", symbol
->section
->name
);
549 fprintf (file
, " %s", symbol
->name
);
554 bfd_mach_o_convert_architecture (bfd_mach_o_cpu_type mtype
,
555 bfd_mach_o_cpu_subtype msubtype ATTRIBUTE_UNUSED
,
556 enum bfd_architecture
*type
,
557 unsigned long *subtype
)
559 *subtype
= bfd_arch_unknown
;
563 case BFD_MACH_O_CPU_TYPE_VAX
: *type
= bfd_arch_vax
; break;
564 case BFD_MACH_O_CPU_TYPE_MC680x0
: *type
= bfd_arch_m68k
; break;
565 case BFD_MACH_O_CPU_TYPE_I386
:
566 *type
= bfd_arch_i386
;
567 *subtype
= bfd_mach_i386_i386
;
569 case BFD_MACH_O_CPU_TYPE_X86_64
:
570 *type
= bfd_arch_i386
;
571 *subtype
= bfd_mach_x86_64
;
573 case BFD_MACH_O_CPU_TYPE_MIPS
: *type
= bfd_arch_mips
; break;
574 case BFD_MACH_O_CPU_TYPE_MC98000
: *type
= bfd_arch_m98k
; break;
575 case BFD_MACH_O_CPU_TYPE_HPPA
: *type
= bfd_arch_hppa
; break;
576 case BFD_MACH_O_CPU_TYPE_ARM
: *type
= bfd_arch_arm
; break;
577 case BFD_MACH_O_CPU_TYPE_MC88000
: *type
= bfd_arch_m88k
; break;
578 case BFD_MACH_O_CPU_TYPE_SPARC
:
579 *type
= bfd_arch_sparc
;
580 *subtype
= bfd_mach_sparc
;
582 case BFD_MACH_O_CPU_TYPE_I860
: *type
= bfd_arch_i860
; break;
583 case BFD_MACH_O_CPU_TYPE_ALPHA
: *type
= bfd_arch_alpha
; break;
584 case BFD_MACH_O_CPU_TYPE_POWERPC
:
585 *type
= bfd_arch_powerpc
;
586 *subtype
= bfd_mach_ppc
;
588 case BFD_MACH_O_CPU_TYPE_POWERPC_64
:
589 *type
= bfd_arch_powerpc
;
590 *subtype
= bfd_mach_ppc64
;
593 *type
= bfd_arch_unknown
;
599 bfd_mach_o_write_header (bfd
*abfd
, bfd_mach_o_header
*header
)
601 unsigned char buf
[32];
604 size
= mach_o_wide_p (header
) ?
605 BFD_MACH_O_HEADER_64_SIZE
: BFD_MACH_O_HEADER_SIZE
;
607 bfd_h_put_32 (abfd
, header
->magic
, buf
+ 0);
608 bfd_h_put_32 (abfd
, header
->cputype
, buf
+ 4);
609 bfd_h_put_32 (abfd
, header
->cpusubtype
, buf
+ 8);
610 bfd_h_put_32 (abfd
, header
->filetype
, buf
+ 12);
611 bfd_h_put_32 (abfd
, header
->ncmds
, buf
+ 16);
612 bfd_h_put_32 (abfd
, header
->sizeofcmds
, buf
+ 20);
613 bfd_h_put_32 (abfd
, header
->flags
, buf
+ 24);
615 if (mach_o_wide_p (header
))
616 bfd_h_put_32 (abfd
, header
->reserved
, buf
+ 28);
618 if (bfd_seek (abfd
, 0, SEEK_SET
) != 0
619 || bfd_bwrite ((void *) buf
, size
, abfd
) != size
)
626 bfd_mach_o_write_thread (bfd
*abfd
, bfd_mach_o_load_command
*command
)
628 bfd_mach_o_thread_command
*cmd
= &command
->command
.thread
;
630 unsigned char buf
[8];
632 unsigned int nflavours
;
634 BFD_ASSERT ((command
->type
== BFD_MACH_O_LC_THREAD
)
635 || (command
->type
== BFD_MACH_O_LC_UNIXTHREAD
));
639 for (i
= 0; i
< cmd
->nflavours
; i
++)
641 BFD_ASSERT ((cmd
->flavours
[i
].size
% 4) == 0);
642 BFD_ASSERT (cmd
->flavours
[i
].offset
== (command
->offset
+ offset
+ 8));
644 bfd_h_put_32 (abfd
, cmd
->flavours
[i
].flavour
, buf
);
645 bfd_h_put_32 (abfd
, (cmd
->flavours
[i
].size
/ 4), buf
+ 4);
647 if (bfd_seek (abfd
, command
->offset
+ offset
, SEEK_SET
) != 0
648 || bfd_bwrite ((void *) buf
, 8, abfd
) != 8)
651 offset
+= cmd
->flavours
[i
].size
+ 8;
658 bfd_mach_o_get_reloc_upper_bound (bfd
*abfd ATTRIBUTE_UNUSED
,
661 return (asect
->reloc_count
+ 1) * sizeof (arelent
*);
665 bfd_mach_o_canonicalize_one_reloc (bfd
*abfd
, char *buf
,
666 arelent
*res
, asymbol
**syms
)
668 bfd_mach_o_data_struct
*mdata
= bfd_mach_o_get_data (abfd
);
669 bfd_mach_o_backend_data
*bed
= bfd_mach_o_get_backend_data (abfd
);
670 bfd_mach_o_reloc_info reloc
;
675 addr
= bfd_get_32 (abfd
, buf
+ 0);
676 symnum
= bfd_get_32 (abfd
, buf
+ 4);
678 if (addr
& BFD_MACH_O_SR_SCATTERED
)
682 /* Scattered relocation.
683 Extract section and offset from r_value. */
684 res
->sym_ptr_ptr
= NULL
;
686 for (j
= 0; j
< mdata
->nsects
; j
++)
688 bfd_mach_o_section
*sect
= mdata
->sections
[j
];
689 if (symnum
>= sect
->addr
&& symnum
< sect
->addr
+ sect
->size
)
691 res
->sym_ptr_ptr
= sect
->bfdsection
->symbol_ptr_ptr
;
692 res
->addend
= symnum
- sect
->addr
;
696 res
->address
= BFD_MACH_O_GET_SR_ADDRESS (addr
);
697 reloc
.r_type
= BFD_MACH_O_GET_SR_TYPE (addr
);
698 reloc
.r_length
= BFD_MACH_O_GET_SR_LENGTH (addr
);
699 reloc
.r_pcrel
= addr
& BFD_MACH_O_SR_PCREL
;
700 reloc
.r_scattered
= 1;
704 unsigned int num
= BFD_MACH_O_GET_R_SYMBOLNUM (symnum
);
707 if (symnum
& BFD_MACH_O_R_EXTERN
)
714 BFD_ASSERT (num
!= 0);
715 BFD_ASSERT (num
<= mdata
->nsects
);
716 sym
= mdata
->sections
[num
- 1]->bfdsection
->symbol_ptr_ptr
;
717 /* For a symbol defined in section S, the addend (stored in the
718 binary) contains the address of the section. To comply with
719 bfd conventio, substract the section address.
720 Use the address from the header, so that the user can modify
721 the vma of the section. */
722 res
->addend
= -mdata
->sections
[num
- 1]->addr
;
725 res
->sym_ptr_ptr
= sym
;
726 reloc
.r_type
= BFD_MACH_O_GET_R_TYPE (symnum
);
727 reloc
.r_length
= BFD_MACH_O_GET_R_LENGTH (symnum
);
728 reloc
.r_pcrel
= (symnum
& BFD_MACH_O_R_PCREL
) ? 1 : 0;
729 reloc
.r_scattered
= 0;
732 if (!(*bed
->_bfd_mach_o_swap_reloc_in
)(res
, &reloc
))
738 bfd_mach_o_canonicalize_relocs (bfd
*abfd
, unsigned long filepos
,
740 arelent
*res
, asymbol
**syms
)
744 bfd_size_type native_size
;
746 /* Allocate and read relocs. */
747 native_size
= count
* BFD_MACH_O_RELENT_SIZE
;
748 native_relocs
= bfd_malloc (native_size
);
749 if (native_relocs
== NULL
)
752 if (bfd_seek (abfd
, filepos
, SEEK_SET
) != 0
753 || bfd_bread (native_relocs
, native_size
, abfd
) != native_size
)
756 for (i
= 0; i
< count
; i
++)
758 char *buf
= native_relocs
+ BFD_MACH_O_RELENT_SIZE
* i
;
760 if (bfd_mach_o_canonicalize_one_reloc (abfd
, buf
, &res
[i
], syms
) < 0)
763 free (native_relocs
);
766 free (native_relocs
);
771 bfd_mach_o_canonicalize_reloc (bfd
*abfd
, asection
*asect
,
772 arelent
**rels
, asymbol
**syms
)
774 bfd_mach_o_backend_data
*bed
= bfd_mach_o_get_backend_data (abfd
);
778 if (asect
->reloc_count
== 0)
781 /* No need to go further if we don't know how to read relocs. */
782 if (bed
->_bfd_mach_o_swap_reloc_in
== NULL
)
785 res
= bfd_malloc (asect
->reloc_count
* sizeof (arelent
));
789 if (bfd_mach_o_canonicalize_relocs (abfd
, asect
->rel_filepos
,
790 asect
->reloc_count
, res
, syms
) < 0)
796 for (i
= 0; i
< asect
->reloc_count
; i
++)
799 asect
->relocation
= res
;
805 bfd_mach_o_get_dynamic_reloc_upper_bound (bfd
*abfd
)
807 bfd_mach_o_data_struct
*mdata
= bfd_mach_o_get_data (abfd
);
809 if (mdata
->dysymtab
== NULL
)
811 return (mdata
->dysymtab
->nextrel
+ mdata
->dysymtab
->nlocrel
)
812 * sizeof (arelent
*);
816 bfd_mach_o_canonicalize_dynamic_reloc (bfd
*abfd
, arelent
**rels
,
817 struct bfd_symbol
**syms
)
819 bfd_mach_o_data_struct
*mdata
= bfd_mach_o_get_data (abfd
);
820 bfd_mach_o_dysymtab_command
*dysymtab
= mdata
->dysymtab
;
821 bfd_mach_o_backend_data
*bed
= bfd_mach_o_get_backend_data (abfd
);
825 if (dysymtab
== NULL
)
827 if (dysymtab
->nextrel
== 0 && dysymtab
->nlocrel
== 0)
830 /* No need to go further if we don't know how to read relocs. */
831 if (bed
->_bfd_mach_o_swap_reloc_in
== NULL
)
834 res
= bfd_malloc ((dysymtab
->nextrel
+ dysymtab
->nlocrel
) * sizeof (arelent
));
838 if (bfd_mach_o_canonicalize_relocs (abfd
, dysymtab
->extreloff
,
839 dysymtab
->nextrel
, res
, syms
) < 0)
845 if (bfd_mach_o_canonicalize_relocs (abfd
, dysymtab
->locreloff
,
847 res
+ dysymtab
->nextrel
, syms
) < 0)
853 for (i
= 0; i
< dysymtab
->nextrel
+ dysymtab
->nlocrel
; i
++)
860 bfd_mach_o_write_relocs (bfd
*abfd
, bfd_mach_o_section
*section
)
862 bfd_mach_o_data_struct
*mdata
= bfd_mach_o_get_data (abfd
);
866 bfd_mach_o_backend_data
*bed
= bfd_mach_o_get_backend_data (abfd
);
868 sec
= section
->bfdsection
;
869 if (sec
->reloc_count
== 0)
872 if (bed
->_bfd_mach_o_swap_reloc_out
== NULL
)
875 /* Allocate relocation room. */
876 mdata
->filelen
= FILE_ALIGN(mdata
->filelen
, 2);
877 section
->nreloc
= sec
->reloc_count
;
878 sec
->rel_filepos
= mdata
->filelen
;
879 section
->reloff
= sec
->rel_filepos
;
880 mdata
->filelen
+= sec
->reloc_count
* BFD_MACH_O_RELENT_SIZE
;
882 if (bfd_seek (abfd
, section
->reloff
, SEEK_SET
) != 0)
885 /* Convert and write. */
886 entries
= section
->bfdsection
->orelocation
;
887 for (i
= 0; i
< section
->nreloc
; i
++)
889 arelent
*rel
= entries
[i
];
891 bfd_mach_o_reloc_info info
, *pinfo
= &info
;
893 /* Convert relocation to an intermediate representation. */
894 if (!(*bed
->_bfd_mach_o_swap_reloc_out
) (rel
, pinfo
))
897 /* Lower the relocation info. */
898 if (pinfo
->r_scattered
)
902 v
= BFD_MACH_O_SR_SCATTERED
903 | (pinfo
->r_pcrel
? BFD_MACH_O_SR_PCREL
: 0)
904 | BFD_MACH_O_SET_SR_LENGTH(pinfo
->r_length
)
905 | BFD_MACH_O_SET_SR_TYPE(pinfo
->r_type
)
906 | BFD_MACH_O_SET_SR_ADDRESS(pinfo
->r_address
);
907 bfd_put_32 (abfd
, v
, buf
);
908 bfd_put_32 (abfd
, pinfo
->r_value
, buf
+ 4);
914 bfd_put_32 (abfd
, pinfo
->r_address
, buf
);
915 v
= BFD_MACH_O_SET_R_SYMBOLNUM (pinfo
->r_value
)
916 | (pinfo
->r_pcrel
? BFD_MACH_O_R_PCREL
: 0)
917 | BFD_MACH_O_SET_R_LENGTH (pinfo
->r_length
)
918 | (pinfo
->r_extern
? BFD_MACH_O_R_EXTERN
: 0)
919 | BFD_MACH_O_SET_R_TYPE (pinfo
->r_type
);
920 bfd_put_32 (abfd
, v
, buf
+ 4);
923 if (bfd_bwrite ((void *) buf
, BFD_MACH_O_RELENT_SIZE
, abfd
)
924 != BFD_MACH_O_RELENT_SIZE
)
931 bfd_mach_o_write_section_32 (bfd
*abfd
, bfd_mach_o_section
*section
)
933 unsigned char buf
[BFD_MACH_O_SECTION_SIZE
];
935 memcpy (buf
, section
->sectname
, 16);
936 memcpy (buf
+ 16, section
->segname
, 16);
937 bfd_h_put_32 (abfd
, section
->addr
, buf
+ 32);
938 bfd_h_put_32 (abfd
, section
->size
, buf
+ 36);
939 bfd_h_put_32 (abfd
, section
->offset
, buf
+ 40);
940 bfd_h_put_32 (abfd
, section
->align
, buf
+ 44);
941 bfd_h_put_32 (abfd
, section
->reloff
, buf
+ 48);
942 bfd_h_put_32 (abfd
, section
->nreloc
, buf
+ 52);
943 bfd_h_put_32 (abfd
, section
->flags
, buf
+ 56);
944 bfd_h_put_32 (abfd
, section
->reserved1
, buf
+ 60);
945 bfd_h_put_32 (abfd
, section
->reserved2
, buf
+ 64);
947 if (bfd_bwrite ((void *) buf
, BFD_MACH_O_SECTION_SIZE
, abfd
)
948 != BFD_MACH_O_SECTION_SIZE
)
955 bfd_mach_o_write_section_64 (bfd
*abfd
, bfd_mach_o_section
*section
)
957 unsigned char buf
[BFD_MACH_O_SECTION_64_SIZE
];
959 memcpy (buf
, section
->sectname
, 16);
960 memcpy (buf
+ 16, section
->segname
, 16);
961 bfd_h_put_64 (abfd
, section
->addr
, buf
+ 32);
962 bfd_h_put_64 (abfd
, section
->size
, buf
+ 40);
963 bfd_h_put_32 (abfd
, section
->offset
, buf
+ 48);
964 bfd_h_put_32 (abfd
, section
->align
, buf
+ 52);
965 bfd_h_put_32 (abfd
, section
->reloff
, buf
+ 56);
966 bfd_h_put_32 (abfd
, section
->nreloc
, buf
+ 60);
967 bfd_h_put_32 (abfd
, section
->flags
, buf
+ 64);
968 bfd_h_put_32 (abfd
, section
->reserved1
, buf
+ 68);
969 bfd_h_put_32 (abfd
, section
->reserved2
, buf
+ 72);
970 bfd_h_put_32 (abfd
, section
->reserved3
, buf
+ 76);
972 if (bfd_bwrite ((void *) buf
, BFD_MACH_O_SECTION_64_SIZE
, abfd
)
973 != BFD_MACH_O_SECTION_64_SIZE
)
980 bfd_mach_o_write_segment_32 (bfd
*abfd
, bfd_mach_o_load_command
*command
)
982 unsigned char buf
[BFD_MACH_O_LC_SEGMENT_SIZE
];
983 bfd_mach_o_segment_command
*seg
= &command
->command
.segment
;
986 BFD_ASSERT (command
->type
== BFD_MACH_O_LC_SEGMENT
);
988 for (i
= 0; i
< seg
->nsects
; i
++)
989 if (!bfd_mach_o_write_relocs (abfd
, &seg
->sections
[i
]))
992 memcpy (buf
, seg
->segname
, 16);
993 bfd_h_put_32 (abfd
, seg
->vmaddr
, buf
+ 16);
994 bfd_h_put_32 (abfd
, seg
->vmsize
, buf
+ 20);
995 bfd_h_put_32 (abfd
, seg
->fileoff
, buf
+ 24);
996 bfd_h_put_32 (abfd
, seg
->filesize
, buf
+ 28);
997 bfd_h_put_32 (abfd
, seg
->maxprot
, buf
+ 32);
998 bfd_h_put_32 (abfd
, seg
->initprot
, buf
+ 36);
999 bfd_h_put_32 (abfd
, seg
->nsects
, buf
+ 40);
1000 bfd_h_put_32 (abfd
, seg
->flags
, buf
+ 44);
1002 if (bfd_seek (abfd
, command
->offset
+ 8, SEEK_SET
) != 0
1003 || (bfd_bwrite ((void *) buf
, BFD_MACH_O_LC_SEGMENT_SIZE
- 8, abfd
)
1004 != BFD_MACH_O_LC_SEGMENT_SIZE
- 8))
1007 for (i
= 0; i
< seg
->nsects
; i
++)
1008 if (bfd_mach_o_write_section_32 (abfd
, &seg
->sections
[i
]))
1015 bfd_mach_o_write_segment_64 (bfd
*abfd
, bfd_mach_o_load_command
*command
)
1017 unsigned char buf
[BFD_MACH_O_LC_SEGMENT_64_SIZE
];
1018 bfd_mach_o_segment_command
*seg
= &command
->command
.segment
;
1021 BFD_ASSERT (command
->type
== BFD_MACH_O_LC_SEGMENT_64
);
1023 for (i
= 0; i
< seg
->nsects
; i
++)
1024 if (!bfd_mach_o_write_relocs (abfd
, &seg
->sections
[i
]))
1027 memcpy (buf
, seg
->segname
, 16);
1028 bfd_h_put_64 (abfd
, seg
->vmaddr
, buf
+ 16);
1029 bfd_h_put_64 (abfd
, seg
->vmsize
, buf
+ 24);
1030 bfd_h_put_64 (abfd
, seg
->fileoff
, buf
+ 32);
1031 bfd_h_put_64 (abfd
, seg
->filesize
, buf
+ 40);
1032 bfd_h_put_32 (abfd
, seg
->maxprot
, buf
+ 48);
1033 bfd_h_put_32 (abfd
, seg
->initprot
, buf
+ 52);
1034 bfd_h_put_32 (abfd
, seg
->nsects
, buf
+ 56);
1035 bfd_h_put_32 (abfd
, seg
->flags
, buf
+ 60);
1037 if (bfd_seek (abfd
, command
->offset
+ 8, SEEK_SET
) != 0
1038 || (bfd_bwrite ((void *) buf
, BFD_MACH_O_LC_SEGMENT_64_SIZE
- 8, abfd
)
1039 != BFD_MACH_O_LC_SEGMENT_64_SIZE
- 8))
1042 for (i
= 0; i
< seg
->nsects
; i
++)
1043 if (bfd_mach_o_write_section_64 (abfd
, &seg
->sections
[i
]))
1050 bfd_mach_o_write_symtab (bfd
*abfd
, bfd_mach_o_load_command
*command
)
1052 bfd_mach_o_data_struct
*mdata
= bfd_mach_o_get_data (abfd
);
1053 bfd_mach_o_symtab_command
*sym
= &command
->command
.symtab
;
1054 unsigned char buf
[16];
1056 unsigned int wide
= bfd_mach_o_wide_p (abfd
);
1057 unsigned int symlen
= wide
? BFD_MACH_O_NLIST_64_SIZE
: BFD_MACH_O_NLIST_SIZE
;
1058 struct bfd_strtab_hash
*strtab
;
1059 asymbol
**symbols
= bfd_get_outsymbols (abfd
);
1061 BFD_ASSERT (command
->type
== BFD_MACH_O_LC_SYMTAB
);
1063 /* Write the symbols first. */
1064 mdata
->filelen
= FILE_ALIGN(mdata
->filelen
, wide
? 3 : 2);
1065 sym
->symoff
= mdata
->filelen
;
1066 if (bfd_seek (abfd
, sym
->symoff
, SEEK_SET
) != 0)
1069 sym
->nsyms
= bfd_get_symcount (abfd
);
1070 mdata
->filelen
+= sym
->nsyms
* symlen
;
1072 strtab
= _bfd_stringtab_init ();
1076 for (i
= 0; i
< sym
->nsyms
; i
++)
1078 bfd_size_type str_index
;
1079 bfd_mach_o_asymbol
*s
= (bfd_mach_o_asymbol
*)symbols
[i
];
1081 /* Compute name index. */
1082 /* An index of 0 always means the empty string. */
1083 if (s
->symbol
.name
== 0 || s
->symbol
.name
[0] == '\0')
1087 str_index
= _bfd_stringtab_add (strtab
, s
->symbol
.name
, TRUE
, FALSE
);
1088 if (str_index
== (bfd_size_type
) -1)
1091 bfd_h_put_32 (abfd
, str_index
, buf
);
1092 bfd_h_put_8 (abfd
, s
->n_type
, buf
+ 4);
1093 bfd_h_put_8 (abfd
, s
->n_sect
, buf
+ 5);
1094 bfd_h_put_16 (abfd
, s
->n_desc
, buf
+ 6);
1096 bfd_h_put_64 (abfd
, s
->symbol
.section
->vma
+ s
->symbol
.value
, buf
+ 8);
1098 bfd_h_put_32 (abfd
, s
->symbol
.section
->vma
+ s
->symbol
.value
, buf
+ 8);
1100 if (bfd_bwrite ((void *) buf
, symlen
, abfd
) != symlen
)
1103 sym
->strsize
= _bfd_stringtab_size (strtab
);
1104 sym
->stroff
= mdata
->filelen
;
1105 mdata
->filelen
+= sym
->strsize
;
1107 if (_bfd_stringtab_emit (abfd
, strtab
) != TRUE
)
1109 _bfd_stringtab_free (strtab
);
1112 bfd_h_put_32 (abfd
, sym
->symoff
, buf
);
1113 bfd_h_put_32 (abfd
, sym
->nsyms
, buf
+ 4);
1114 bfd_h_put_32 (abfd
, sym
->stroff
, buf
+ 8);
1115 bfd_h_put_32 (abfd
, sym
->strsize
, buf
+ 12);
1117 if (bfd_seek (abfd
, command
->offset
+ 8, SEEK_SET
) != 0
1118 || bfd_bwrite ((void *) buf
, 16, abfd
) != 16)
1124 _bfd_stringtab_free (strtab
);
1128 /* Process the symbols and generate Mach-O specific fields.
1132 bfd_mach_o_mangle_symbols (bfd
*abfd
)
1135 asymbol
**symbols
= bfd_get_outsymbols (abfd
);
1137 for (i
= 0; i
< bfd_get_symcount (abfd
); i
++)
1139 bfd_mach_o_asymbol
*s
= (bfd_mach_o_asymbol
*)symbols
[i
];
1141 if (s
->n_type
== BFD_MACH_O_N_UNDF
&& !(s
->symbol
.flags
& BSF_DEBUGGING
))
1143 /* As genuine Mach-O symbols type shouldn't be N_UNDF (undefined
1144 symbols should be N_UNDEF | N_EXT), we suppose the back-end
1145 values haven't been set. */
1146 if (s
->symbol
.section
== bfd_abs_section_ptr
)
1147 s
->n_type
= BFD_MACH_O_N_ABS
;
1148 else if (s
->symbol
.section
== bfd_und_section_ptr
)
1150 s
->n_type
= BFD_MACH_O_N_UNDF
;
1151 if (s
->symbol
.flags
& BSF_WEAK
)
1152 s
->n_desc
|= BFD_MACH_O_N_WEAK_REF
;
1154 else if (s
->symbol
.section
== bfd_com_section_ptr
)
1155 s
->n_type
= BFD_MACH_O_N_UNDF
| BFD_MACH_O_N_EXT
;
1157 s
->n_type
= BFD_MACH_O_N_SECT
;
1159 if (s
->symbol
.flags
& BSF_GLOBAL
)
1160 s
->n_type
|= BFD_MACH_O_N_EXT
;
1163 /* Compute section index. */
1164 if (s
->symbol
.section
!= bfd_abs_section_ptr
1165 && s
->symbol
.section
!= bfd_und_section_ptr
1166 && s
->symbol
.section
!= bfd_com_section_ptr
)
1167 s
->n_sect
= s
->symbol
.section
->target_index
;
1169 /* Number symbols. */
1170 s
->symbol
.udata
.i
= i
;
1176 bfd_mach_o_write_contents (bfd
*abfd
)
1179 bfd_mach_o_data_struct
*mdata
= bfd_mach_o_get_data (abfd
);
1181 if (mdata
->header
.ncmds
== 0)
1182 if (!bfd_mach_o_build_commands (abfd
))
1185 /* Now write header information. */
1186 if (mdata
->header
.filetype
== 0)
1188 if (abfd
->flags
& EXEC_P
)
1189 mdata
->header
.filetype
= BFD_MACH_O_MH_EXECUTE
;
1190 else if (abfd
->flags
& DYNAMIC
)
1191 mdata
->header
.filetype
= BFD_MACH_O_MH_DYLIB
;
1193 mdata
->header
.filetype
= BFD_MACH_O_MH_OBJECT
;
1195 if (!bfd_mach_o_write_header (abfd
, &mdata
->header
))
1198 /* Assign a number to each symbols. */
1199 if (!bfd_mach_o_mangle_symbols (abfd
))
1202 for (i
= 0; i
< mdata
->header
.ncmds
; i
++)
1204 unsigned char buf
[8];
1205 bfd_mach_o_load_command
*cur
= &mdata
->commands
[i
];
1206 unsigned long typeflag
;
1208 typeflag
= cur
->type
| (cur
->type_required
? BFD_MACH_O_LC_REQ_DYLD
: 0);
1210 bfd_h_put_32 (abfd
, typeflag
, buf
);
1211 bfd_h_put_32 (abfd
, cur
->len
, buf
+ 4);
1213 if (bfd_seek (abfd
, cur
->offset
, SEEK_SET
) != 0
1214 || bfd_bwrite ((void *) buf
, 8, abfd
) != 8)
1219 case BFD_MACH_O_LC_SEGMENT
:
1220 if (bfd_mach_o_write_segment_32 (abfd
, cur
) != 0)
1223 case BFD_MACH_O_LC_SEGMENT_64
:
1224 if (bfd_mach_o_write_segment_64 (abfd
, cur
) != 0)
1227 case BFD_MACH_O_LC_SYMTAB
:
1228 if (!bfd_mach_o_write_symtab (abfd
, cur
))
1231 case BFD_MACH_O_LC_SYMSEG
:
1233 case BFD_MACH_O_LC_THREAD
:
1234 case BFD_MACH_O_LC_UNIXTHREAD
:
1235 if (bfd_mach_o_write_thread (abfd
, cur
) != 0)
1238 case BFD_MACH_O_LC_LOADFVMLIB
:
1239 case BFD_MACH_O_LC_IDFVMLIB
:
1240 case BFD_MACH_O_LC_IDENT
:
1241 case BFD_MACH_O_LC_FVMFILE
:
1242 case BFD_MACH_O_LC_PREPAGE
:
1243 case BFD_MACH_O_LC_DYSYMTAB
:
1244 case BFD_MACH_O_LC_LOAD_DYLIB
:
1245 case BFD_MACH_O_LC_LOAD_WEAK_DYLIB
:
1246 case BFD_MACH_O_LC_ID_DYLIB
:
1247 case BFD_MACH_O_LC_REEXPORT_DYLIB
:
1248 case BFD_MACH_O_LC_LOAD_DYLINKER
:
1249 case BFD_MACH_O_LC_ID_DYLINKER
:
1250 case BFD_MACH_O_LC_PREBOUND_DYLIB
:
1251 case BFD_MACH_O_LC_ROUTINES
:
1252 case BFD_MACH_O_LC_SUB_FRAMEWORK
:
1256 "unable to write unknown load command 0x%lx\n",
1257 (unsigned long) cur
->type
);
1265 /* Build Mach-O load commands from the sections. */
1268 bfd_mach_o_build_commands (bfd
*abfd
)
1270 bfd_mach_o_data_struct
*mdata
= bfd_mach_o_get_data (abfd
);
1271 unsigned int wide
= mach_o_wide_p (&mdata
->header
);
1272 bfd_mach_o_segment_command
*seg
;
1273 bfd_mach_o_section
*sections
;
1275 bfd_mach_o_load_command
*cmd
;
1276 bfd_mach_o_load_command
*symtab_cmd
;
1279 /* Return now if commands are already built. */
1280 if (mdata
->header
.ncmds
)
1283 /* Very simple version: 1 command (segment) containing all sections. */
1284 mdata
->header
.ncmds
= 2;
1285 mdata
->commands
= bfd_alloc (abfd
, mdata
->header
.ncmds
1286 * sizeof (bfd_mach_o_load_command
));
1287 if (mdata
->commands
== NULL
)
1289 cmd
= &mdata
->commands
[0];
1290 seg
= &cmd
->command
.segment
;
1292 seg
->nsects
= bfd_count_sections (abfd
);
1293 sections
= bfd_alloc (abfd
, seg
->nsects
* sizeof (bfd_mach_o_section
));
1294 if (sections
== NULL
)
1296 seg
->sections
= sections
;
1298 /* Set segment command. */
1301 cmd
->type
= BFD_MACH_O_LC_SEGMENT_64
;
1302 cmd
->offset
= BFD_MACH_O_HEADER_64_SIZE
;
1303 cmd
->len
= BFD_MACH_O_LC_SEGMENT_64_SIZE
1304 + BFD_MACH_O_SECTION_64_SIZE
* seg
->nsects
;
1308 cmd
->type
= BFD_MACH_O_LC_SEGMENT
;
1309 cmd
->offset
= BFD_MACH_O_HEADER_SIZE
;
1310 cmd
->len
= BFD_MACH_O_LC_SEGMENT_SIZE
1311 + BFD_MACH_O_SECTION_SIZE
* seg
->nsects
;
1313 cmd
->type_required
= FALSE
;
1314 mdata
->header
.sizeofcmds
= cmd
->len
;
1315 mdata
->filelen
= cmd
->offset
+ cmd
->len
;
1317 /* Set symtab command. */
1318 symtab_cmd
= &mdata
->commands
[1];
1320 symtab_cmd
->type
= BFD_MACH_O_LC_SYMTAB
;
1321 symtab_cmd
->offset
= cmd
->offset
+ cmd
->len
;
1322 symtab_cmd
->len
= 6 * 4;
1323 symtab_cmd
->type_required
= FALSE
;
1325 mdata
->header
.sizeofcmds
+= symtab_cmd
->len
;
1326 mdata
->filelen
+= symtab_cmd
->len
;
1328 /* Fill segment command. */
1329 memset (seg
->segname
, 0, sizeof (seg
->segname
));
1331 seg
->fileoff
= mdata
->filelen
;
1333 seg
->maxprot
= BFD_MACH_O_PROT_READ
| BFD_MACH_O_PROT_WRITE
1334 | BFD_MACH_O_PROT_EXECUTE
;
1335 seg
->initprot
= seg
->maxprot
;
1338 /* Create Mach-O sections. */
1340 for (sec
= abfd
->sections
; sec
; sec
= sec
->next
)
1342 sections
->bfdsection
= sec
;
1343 bfd_mach_o_convert_section_name_to_mach_o (abfd
, sec
, sections
);
1344 sections
->addr
= bfd_get_section_vma (abfd
, sec
);
1345 sections
->size
= bfd_get_section_size (sec
);
1346 sections
->align
= bfd_get_section_alignment (abfd
, sec
);
1348 if (sections
->size
!= 0)
1350 mdata
->filelen
= FILE_ALIGN (mdata
->filelen
, sections
->align
);
1351 sections
->offset
= mdata
->filelen
;
1354 sections
->offset
= 0;
1355 sections
->reloff
= 0;
1356 sections
->nreloc
= 0;
1357 sections
->reserved1
= 0;
1358 sections
->reserved2
= 0;
1359 sections
->reserved3
= 0;
1361 sec
->filepos
= sections
->offset
;
1362 sec
->target_index
= ++target_index
;
1364 mdata
->filelen
+= sections
->size
;
1367 seg
->filesize
= mdata
->filelen
- seg
->fileoff
;
1368 seg
->vmsize
= seg
->filesize
;
1373 /* Set the contents of a section. */
1376 bfd_mach_o_set_section_contents (bfd
*abfd
,
1378 const void * location
,
1380 bfd_size_type count
)
1384 /* This must be done first, because bfd_set_section_contents is
1385 going to set output_has_begun to TRUE. */
1386 if (! abfd
->output_has_begun
&& ! bfd_mach_o_build_commands (abfd
))
1392 pos
= section
->filepos
+ offset
;
1393 if (bfd_seek (abfd
, pos
, SEEK_SET
) != 0
1394 || bfd_bwrite (location
, count
, abfd
) != count
)
1401 bfd_mach_o_sizeof_headers (bfd
*a ATTRIBUTE_UNUSED
,
1402 struct bfd_link_info
*info ATTRIBUTE_UNUSED
)
1407 /* Make an empty symbol. This is required only because
1408 bfd_make_section_anyway wants to create a symbol for the section. */
1411 bfd_mach_o_make_empty_symbol (bfd
*abfd
)
1413 asymbol
*new_symbol
;
1415 new_symbol
= bfd_zalloc (abfd
, sizeof (bfd_mach_o_asymbol
));
1416 if (new_symbol
== NULL
)
1418 new_symbol
->the_bfd
= abfd
;
1419 new_symbol
->udata
.i
= 0;
1424 bfd_mach_o_read_header (bfd
*abfd
, bfd_mach_o_header
*header
)
1426 unsigned char buf
[32];
1428 bfd_vma (*get32
) (const void *) = NULL
;
1430 /* Just read the magic number. */
1431 if (bfd_seek (abfd
, 0, SEEK_SET
) != 0
1432 || bfd_bread ((void *) buf
, 4, abfd
) != 4)
1435 if (bfd_getb32 (buf
) == BFD_MACH_O_MH_MAGIC
)
1437 header
->byteorder
= BFD_ENDIAN_BIG
;
1438 header
->magic
= BFD_MACH_O_MH_MAGIC
;
1439 header
->version
= 1;
1442 else if (bfd_getl32 (buf
) == BFD_MACH_O_MH_MAGIC
)
1444 header
->byteorder
= BFD_ENDIAN_LITTLE
;
1445 header
->magic
= BFD_MACH_O_MH_MAGIC
;
1446 header
->version
= 1;
1449 else if (bfd_getb32 (buf
) == BFD_MACH_O_MH_MAGIC_64
)
1451 header
->byteorder
= BFD_ENDIAN_BIG
;
1452 header
->magic
= BFD_MACH_O_MH_MAGIC_64
;
1453 header
->version
= 2;
1456 else if (bfd_getl32 (buf
) == BFD_MACH_O_MH_MAGIC_64
)
1458 header
->byteorder
= BFD_ENDIAN_LITTLE
;
1459 header
->magic
= BFD_MACH_O_MH_MAGIC_64
;
1460 header
->version
= 2;
1465 header
->byteorder
= BFD_ENDIAN_UNKNOWN
;
1469 /* Once the size of the header is known, read the full header. */
1470 size
= mach_o_wide_p (header
) ?
1471 BFD_MACH_O_HEADER_64_SIZE
: BFD_MACH_O_HEADER_SIZE
;
1473 if (bfd_seek (abfd
, 0, SEEK_SET
) != 0
1474 || bfd_bread ((void *) buf
, size
, abfd
) != size
)
1477 header
->cputype
= (*get32
) (buf
+ 4);
1478 header
->cpusubtype
= (*get32
) (buf
+ 8);
1479 header
->filetype
= (*get32
) (buf
+ 12);
1480 header
->ncmds
= (*get32
) (buf
+ 16);
1481 header
->sizeofcmds
= (*get32
) (buf
+ 20);
1482 header
->flags
= (*get32
) (buf
+ 24);
1484 if (mach_o_wide_p (header
))
1485 header
->reserved
= (*get32
) (buf
+ 28);
1491 bfd_mach_o_make_bfd_section (bfd
*abfd
, bfd_mach_o_section
*section
,
1498 bfd_mach_o_convert_section_name_to_bfd (abfd
, section
, &sname
, &flags
);
1502 if (flags
== SEC_NO_FLAGS
)
1504 /* Try to guess flags. */
1505 if (section
->flags
& BFD_MACH_O_S_ATTR_DEBUG
)
1506 flags
= SEC_DEBUGGING
;
1510 if ((section
->flags
& BFD_MACH_O_SECTION_TYPE_MASK
)
1511 != BFD_MACH_O_S_ZEROFILL
)
1514 if (prot
& BFD_MACH_O_PROT_EXECUTE
)
1516 if (prot
& BFD_MACH_O_PROT_WRITE
)
1518 else if (prot
& BFD_MACH_O_PROT_READ
)
1519 flags
|= SEC_READONLY
;
1525 if ((flags
& SEC_DEBUGGING
) == 0)
1529 if (section
->offset
!= 0)
1530 flags
|= SEC_HAS_CONTENTS
;
1531 if (section
->nreloc
!= 0)
1534 bfdsec
= bfd_make_section_anyway_with_flags (abfd
, sname
, flags
);
1538 bfdsec
->vma
= section
->addr
;
1539 bfdsec
->lma
= section
->addr
;
1540 bfdsec
->size
= section
->size
;
1541 bfdsec
->filepos
= section
->offset
;
1542 bfdsec
->alignment_power
= section
->align
;
1543 bfdsec
->segment_mark
= 0;
1544 bfdsec
->reloc_count
= section
->nreloc
;
1545 bfdsec
->rel_filepos
= section
->reloff
;
1551 bfd_mach_o_read_section_32 (bfd
*abfd
,
1552 bfd_mach_o_section
*section
,
1553 unsigned int offset
,
1556 unsigned char buf
[BFD_MACH_O_SECTION_SIZE
];
1558 if (bfd_seek (abfd
, offset
, SEEK_SET
) != 0
1559 || (bfd_bread ((void *) buf
, BFD_MACH_O_SECTION_SIZE
, abfd
)
1560 != BFD_MACH_O_SECTION_SIZE
))
1563 memcpy (section
->sectname
, buf
, 16);
1564 section
->sectname
[16] = '\0';
1565 memcpy (section
->segname
, buf
+ 16, 16);
1566 section
->segname
[16] = '\0';
1567 section
->addr
= bfd_h_get_32 (abfd
, buf
+ 32);
1568 section
->size
= bfd_h_get_32 (abfd
, buf
+ 36);
1569 section
->offset
= bfd_h_get_32 (abfd
, buf
+ 40);
1570 section
->align
= bfd_h_get_32 (abfd
, buf
+ 44);
1571 section
->reloff
= bfd_h_get_32 (abfd
, buf
+ 48);
1572 section
->nreloc
= bfd_h_get_32 (abfd
, buf
+ 52);
1573 section
->flags
= bfd_h_get_32 (abfd
, buf
+ 56);
1574 section
->reserved1
= bfd_h_get_32 (abfd
, buf
+ 60);
1575 section
->reserved2
= bfd_h_get_32 (abfd
, buf
+ 64);
1576 section
->reserved3
= 0;
1577 section
->bfdsection
= bfd_mach_o_make_bfd_section (abfd
, section
, prot
);
1579 if (section
->bfdsection
== NULL
)
1586 bfd_mach_o_read_section_64 (bfd
*abfd
,
1587 bfd_mach_o_section
*section
,
1588 unsigned int offset
,
1591 unsigned char buf
[BFD_MACH_O_SECTION_64_SIZE
];
1593 if (bfd_seek (abfd
, offset
, SEEK_SET
) != 0
1594 || (bfd_bread ((void *) buf
, BFD_MACH_O_SECTION_64_SIZE
, abfd
)
1595 != BFD_MACH_O_SECTION_64_SIZE
))
1598 memcpy (section
->sectname
, buf
, 16);
1599 section
->sectname
[16] = '\0';
1600 memcpy (section
->segname
, buf
+ 16, 16);
1601 section
->segname
[16] = '\0';
1602 section
->addr
= bfd_h_get_64 (abfd
, buf
+ 32);
1603 section
->size
= bfd_h_get_64 (abfd
, buf
+ 40);
1604 section
->offset
= bfd_h_get_32 (abfd
, buf
+ 48);
1605 section
->align
= bfd_h_get_32 (abfd
, buf
+ 52);
1606 section
->reloff
= bfd_h_get_32 (abfd
, buf
+ 56);
1607 section
->nreloc
= bfd_h_get_32 (abfd
, buf
+ 60);
1608 section
->flags
= bfd_h_get_32 (abfd
, buf
+ 64);
1609 section
->reserved1
= bfd_h_get_32 (abfd
, buf
+ 68);
1610 section
->reserved2
= bfd_h_get_32 (abfd
, buf
+ 72);
1611 section
->reserved3
= bfd_h_get_32 (abfd
, buf
+ 76);
1612 section
->bfdsection
= bfd_mach_o_make_bfd_section (abfd
, section
, prot
);
1614 if (section
->bfdsection
== NULL
)
1621 bfd_mach_o_read_section (bfd
*abfd
,
1622 bfd_mach_o_section
*section
,
1623 unsigned int offset
,
1628 return bfd_mach_o_read_section_64 (abfd
, section
, offset
, prot
);
1630 return bfd_mach_o_read_section_32 (abfd
, section
, offset
, prot
);
1634 bfd_mach_o_read_symtab_symbol (bfd
*abfd
,
1635 bfd_mach_o_symtab_command
*sym
,
1636 bfd_mach_o_asymbol
*s
,
1639 bfd_mach_o_data_struct
*mdata
= bfd_mach_o_get_data (abfd
);
1640 unsigned int wide
= mach_o_wide_p (&mdata
->header
);
1641 unsigned int symwidth
=
1642 wide
? BFD_MACH_O_NLIST_64_SIZE
: BFD_MACH_O_NLIST_SIZE
;
1643 unsigned int symoff
= sym
->symoff
+ (i
* symwidth
);
1644 unsigned char buf
[16];
1645 unsigned char type
= -1;
1646 unsigned char section
= -1;
1648 symvalue value
= -1;
1649 unsigned long stroff
= -1;
1650 unsigned int symtype
= -1;
1652 BFD_ASSERT (sym
->strtab
!= NULL
);
1654 if (bfd_seek (abfd
, symoff
, SEEK_SET
) != 0
1655 || bfd_bread ((void *) buf
, symwidth
, abfd
) != symwidth
)
1657 fprintf (stderr
, "bfd_mach_o_read_symtab_symbol: unable to read %d bytes at %lu\n",
1658 symwidth
, (unsigned long) symoff
);
1662 stroff
= bfd_h_get_32 (abfd
, buf
);
1663 type
= bfd_h_get_8 (abfd
, buf
+ 4);
1664 symtype
= type
& BFD_MACH_O_N_TYPE
;
1665 section
= bfd_h_get_8 (abfd
, buf
+ 5);
1666 desc
= bfd_h_get_16 (abfd
, buf
+ 6);
1668 value
= bfd_h_get_64 (abfd
, buf
+ 8);
1670 value
= bfd_h_get_32 (abfd
, buf
+ 8);
1672 if (stroff
>= sym
->strsize
)
1674 fprintf (stderr
, "bfd_mach_o_read_symtab_symbol: symbol name out of range (%lu >= %lu)\n",
1675 (unsigned long) stroff
, (unsigned long) sym
->strsize
);
1679 s
->symbol
.the_bfd
= abfd
;
1680 s
->symbol
.name
= sym
->strtab
+ stroff
;
1681 s
->symbol
.value
= value
;
1682 s
->symbol
.flags
= 0x0;
1683 s
->symbol
.udata
.i
= 0;
1685 s
->n_sect
= section
;
1688 if (type
& BFD_MACH_O_N_STAB
)
1690 s
->symbol
.flags
|= BSF_DEBUGGING
;
1691 s
->symbol
.section
= bfd_und_section_ptr
;
1703 if ((section
> 0) && (section
<= mdata
->nsects
))
1705 s
->symbol
.section
= mdata
->sections
[section
- 1]->bfdsection
;
1707 s
->symbol
.value
- mdata
->sections
[section
- 1]->addr
;
1714 if (type
& BFD_MACH_O_N_PEXT
)
1715 s
->symbol
.flags
|= BSF_GLOBAL
;
1717 if (type
& BFD_MACH_O_N_EXT
)
1718 s
->symbol
.flags
|= BSF_GLOBAL
;
1720 if (!(type
& (BFD_MACH_O_N_PEXT
| BFD_MACH_O_N_EXT
)))
1721 s
->symbol
.flags
|= BSF_LOCAL
;
1725 case BFD_MACH_O_N_UNDF
:
1726 if (type
== (BFD_MACH_O_N_UNDF
| BFD_MACH_O_N_EXT
)
1727 && s
->symbol
.value
!= 0)
1729 /* A common symbol. */
1730 s
->symbol
.section
= bfd_com_section_ptr
;
1731 s
->symbol
.flags
= BSF_NO_FLAGS
;
1735 s
->symbol
.section
= bfd_und_section_ptr
;
1736 if (s
->n_desc
& BFD_MACH_O_N_WEAK_REF
)
1737 s
->symbol
.flags
|= BSF_WEAK
;
1740 case BFD_MACH_O_N_PBUD
:
1741 s
->symbol
.section
= bfd_und_section_ptr
;
1743 case BFD_MACH_O_N_ABS
:
1744 s
->symbol
.section
= bfd_abs_section_ptr
;
1746 case BFD_MACH_O_N_SECT
:
1747 if ((section
> 0) && (section
<= mdata
->nsects
))
1749 s
->symbol
.section
= mdata
->sections
[section
- 1]->bfdsection
;
1751 s
->symbol
.value
- mdata
->sections
[section
- 1]->addr
;
1755 /* Mach-O uses 0 to mean "no section"; not an error. */
1758 fprintf (stderr
, "bfd_mach_o_read_symtab_symbol: "
1759 "symbol \"%s\" specified invalid section %d (max %lu): setting to undefined\n",
1760 s
->symbol
.name
, section
, mdata
->nsects
);
1762 s
->symbol
.section
= bfd_und_section_ptr
;
1765 case BFD_MACH_O_N_INDR
:
1766 fprintf (stderr
, "bfd_mach_o_read_symtab_symbol: "
1767 "symbol \"%s\" is unsupported 'indirect' reference: setting to undefined\n",
1769 s
->symbol
.section
= bfd_und_section_ptr
;
1772 fprintf (stderr
, "bfd_mach_o_read_symtab_symbol: "
1773 "symbol \"%s\" specified invalid type field 0x%x: setting to undefined\n",
1774 s
->symbol
.name
, symtype
);
1775 s
->symbol
.section
= bfd_und_section_ptr
;
1784 bfd_mach_o_read_symtab_strtab (bfd
*abfd
)
1786 bfd_mach_o_data_struct
*mdata
= bfd_mach_o_get_data (abfd
);
1787 bfd_mach_o_symtab_command
*sym
= mdata
->symtab
;
1789 /* Fail if there is no symtab. */
1793 /* Success if already loaded. */
1797 if (abfd
->flags
& BFD_IN_MEMORY
)
1799 struct bfd_in_memory
*b
;
1801 b
= (struct bfd_in_memory
*) abfd
->iostream
;
1803 if ((sym
->stroff
+ sym
->strsize
) > b
->size
)
1805 bfd_set_error (bfd_error_file_truncated
);
1808 sym
->strtab
= (char *) b
->buffer
+ sym
->stroff
;
1812 sym
->strtab
= bfd_alloc (abfd
, sym
->strsize
);
1813 if (sym
->strtab
== NULL
)
1816 if (bfd_seek (abfd
, sym
->stroff
, SEEK_SET
) != 0
1817 || bfd_bread ((void *) sym
->strtab
, sym
->strsize
, abfd
) != sym
->strsize
)
1819 bfd_set_error (bfd_error_file_truncated
);
1828 bfd_mach_o_read_symtab_symbols (bfd
*abfd
)
1830 bfd_mach_o_data_struct
*mdata
= bfd_mach_o_get_data (abfd
);
1831 bfd_mach_o_symtab_command
*sym
= mdata
->symtab
;
1838 sym
->symbols
= bfd_alloc (abfd
, sym
->nsyms
* sizeof (bfd_mach_o_asymbol
));
1840 if (sym
->symbols
== NULL
)
1842 fprintf (stderr
, "bfd_mach_o_read_symtab_symbols: unable to allocate memory for symbols\n");
1846 ret
= bfd_mach_o_read_symtab_strtab (abfd
);
1850 for (i
= 0; i
< sym
->nsyms
; i
++)
1852 ret
= bfd_mach_o_read_symtab_symbol (abfd
, sym
, &sym
->symbols
[i
], i
);
1861 bfd_mach_o_read_dysymtab_symbol (bfd
*abfd
,
1862 bfd_mach_o_dysymtab_command
*dysym
,
1863 bfd_mach_o_symtab_command
*sym
,
1864 bfd_mach_o_asymbol
*s
,
1867 unsigned long isymoff
= dysym
->indirectsymoff
+ (i
* 4);
1868 unsigned long sym_index
;
1869 unsigned char buf
[4];
1871 BFD_ASSERT (i
< dysym
->nindirectsyms
);
1873 if (bfd_seek (abfd
, isymoff
, SEEK_SET
) != 0
1874 || bfd_bread ((void *) buf
, 4, abfd
) != 4)
1876 fprintf (stderr
, "bfd_mach_o_read_dysymtab_symbol: unable to read %lu bytes at %lu\n",
1877 (unsigned long) 4, isymoff
);
1880 sym_index
= bfd_h_get_32 (abfd
, buf
);
1882 return bfd_mach_o_read_symtab_symbol (abfd
, sym
, s
, sym_index
);
1886 bfd_mach_o_i386_flavour_string (unsigned int flavour
)
1888 switch ((int) flavour
)
1890 case BFD_MACH_O_x86_THREAD_STATE32
: return "x86_THREAD_STATE32";
1891 case BFD_MACH_O_x86_FLOAT_STATE32
: return "x86_FLOAT_STATE32";
1892 case BFD_MACH_O_x86_EXCEPTION_STATE32
: return "x86_EXCEPTION_STATE32";
1893 case BFD_MACH_O_x86_THREAD_STATE64
: return "x86_THREAD_STATE64";
1894 case BFD_MACH_O_x86_FLOAT_STATE64
: return "x86_FLOAT_STATE64";
1895 case BFD_MACH_O_x86_EXCEPTION_STATE64
: return "x86_EXCEPTION_STATE64";
1896 case BFD_MACH_O_x86_THREAD_STATE
: return "x86_THREAD_STATE";
1897 case BFD_MACH_O_x86_FLOAT_STATE
: return "x86_FLOAT_STATE";
1898 case BFD_MACH_O_x86_EXCEPTION_STATE
: return "x86_EXCEPTION_STATE";
1899 case BFD_MACH_O_x86_DEBUG_STATE32
: return "x86_DEBUG_STATE32";
1900 case BFD_MACH_O_x86_DEBUG_STATE64
: return "x86_DEBUG_STATE64";
1901 case BFD_MACH_O_x86_DEBUG_STATE
: return "x86_DEBUG_STATE";
1902 case BFD_MACH_O_x86_THREAD_STATE_NONE
: return "x86_THREAD_STATE_NONE";
1903 default: return "UNKNOWN";
1908 bfd_mach_o_ppc_flavour_string (unsigned int flavour
)
1910 switch ((int) flavour
)
1912 case BFD_MACH_O_PPC_THREAD_STATE
: return "PPC_THREAD_STATE";
1913 case BFD_MACH_O_PPC_FLOAT_STATE
: return "PPC_FLOAT_STATE";
1914 case BFD_MACH_O_PPC_EXCEPTION_STATE
: return "PPC_EXCEPTION_STATE";
1915 case BFD_MACH_O_PPC_VECTOR_STATE
: return "PPC_VECTOR_STATE";
1916 case BFD_MACH_O_PPC_THREAD_STATE64
: return "PPC_THREAD_STATE64";
1917 case BFD_MACH_O_PPC_EXCEPTION_STATE64
: return "PPC_EXCEPTION_STATE64";
1918 default: return "UNKNOWN";
1923 bfd_mach_o_read_dylinker (bfd
*abfd
, bfd_mach_o_load_command
*command
)
1925 bfd_mach_o_dylinker_command
*cmd
= &command
->command
.dylinker
;
1926 unsigned char buf
[4];
1927 unsigned int nameoff
;
1929 BFD_ASSERT ((command
->type
== BFD_MACH_O_LC_ID_DYLINKER
)
1930 || (command
->type
== BFD_MACH_O_LC_LOAD_DYLINKER
));
1932 if (bfd_seek (abfd
, command
->offset
+ 8, SEEK_SET
) != 0
1933 || bfd_bread ((void *) buf
, 4, abfd
) != 4)
1936 nameoff
= bfd_h_get_32 (abfd
, buf
+ 0);
1938 cmd
->name_offset
= command
->offset
+ nameoff
;
1939 cmd
->name_len
= command
->len
- nameoff
;
1940 cmd
->name_str
= bfd_alloc (abfd
, cmd
->name_len
);
1941 if (cmd
->name_str
== NULL
)
1943 if (bfd_seek (abfd
, cmd
->name_offset
, SEEK_SET
) != 0
1944 || bfd_bread (cmd
->name_str
, cmd
->name_len
, abfd
) != cmd
->name_len
)
1950 bfd_mach_o_read_dylib (bfd
*abfd
, bfd_mach_o_load_command
*command
)
1952 bfd_mach_o_dylib_command
*cmd
= &command
->command
.dylib
;
1953 unsigned char buf
[16];
1954 unsigned int nameoff
;
1956 switch (command
->type
)
1958 case BFD_MACH_O_LC_LOAD_DYLIB
:
1959 case BFD_MACH_O_LC_LOAD_WEAK_DYLIB
:
1960 case BFD_MACH_O_LC_ID_DYLIB
:
1961 case BFD_MACH_O_LC_REEXPORT_DYLIB
:
1968 if (bfd_seek (abfd
, command
->offset
+ 8, SEEK_SET
) != 0
1969 || bfd_bread ((void *) buf
, 16, abfd
) != 16)
1972 nameoff
= bfd_h_get_32 (abfd
, buf
+ 0);
1973 cmd
->timestamp
= bfd_h_get_32 (abfd
, buf
+ 4);
1974 cmd
->current_version
= bfd_h_get_32 (abfd
, buf
+ 8);
1975 cmd
->compatibility_version
= bfd_h_get_32 (abfd
, buf
+ 12);
1977 cmd
->name_offset
= command
->offset
+ nameoff
;
1978 cmd
->name_len
= command
->len
- nameoff
;
1979 cmd
->name_str
= bfd_alloc (abfd
, cmd
->name_len
);
1980 if (cmd
->name_str
== NULL
)
1982 if (bfd_seek (abfd
, cmd
->name_offset
, SEEK_SET
) != 0
1983 || bfd_bread (cmd
->name_str
, cmd
->name_len
, abfd
) != cmd
->name_len
)
1989 bfd_mach_o_read_prebound_dylib (bfd
*abfd ATTRIBUTE_UNUSED
,
1990 bfd_mach_o_load_command
*command ATTRIBUTE_UNUSED
)
1992 /* bfd_mach_o_prebound_dylib_command *cmd = &command->command.prebound_dylib; */
1994 BFD_ASSERT (command
->type
== BFD_MACH_O_LC_PREBOUND_DYLIB
);
1999 bfd_mach_o_read_thread (bfd
*abfd
, bfd_mach_o_load_command
*command
)
2001 bfd_mach_o_data_struct
*mdata
= bfd_mach_o_get_data (abfd
);
2002 bfd_mach_o_thread_command
*cmd
= &command
->command
.thread
;
2003 unsigned char buf
[8];
2004 unsigned int offset
;
2005 unsigned int nflavours
;
2008 BFD_ASSERT ((command
->type
== BFD_MACH_O_LC_THREAD
)
2009 || (command
->type
== BFD_MACH_O_LC_UNIXTHREAD
));
2011 /* Count the number of threads. */
2014 while (offset
!= command
->len
)
2016 if (offset
>= command
->len
)
2019 if (bfd_seek (abfd
, command
->offset
+ offset
, SEEK_SET
) != 0
2020 || bfd_bread ((void *) buf
, 8, abfd
) != 8)
2023 offset
+= 8 + bfd_h_get_32 (abfd
, buf
+ 4) * 4;
2027 /* Allocate threads. */
2028 cmd
->flavours
= bfd_alloc
2029 (abfd
, nflavours
* sizeof (bfd_mach_o_thread_flavour
));
2030 if (cmd
->flavours
== NULL
)
2032 cmd
->nflavours
= nflavours
;
2036 while (offset
!= command
->len
)
2038 if (offset
>= command
->len
)
2041 if (nflavours
>= cmd
->nflavours
)
2044 if (bfd_seek (abfd
, command
->offset
+ offset
, SEEK_SET
) != 0
2045 || bfd_bread ((void *) buf
, 8, abfd
) != 8)
2048 cmd
->flavours
[nflavours
].flavour
= bfd_h_get_32 (abfd
, buf
);
2049 cmd
->flavours
[nflavours
].offset
= command
->offset
+ offset
+ 8;
2050 cmd
->flavours
[nflavours
].size
= bfd_h_get_32 (abfd
, buf
+ 4) * 4;
2051 offset
+= cmd
->flavours
[nflavours
].size
+ 8;
2055 for (i
= 0; i
< nflavours
; i
++)
2058 unsigned int snamelen
;
2060 const char *flavourstr
;
2061 const char *prefix
= "LC_THREAD";
2064 switch (mdata
->header
.cputype
)
2066 case BFD_MACH_O_CPU_TYPE_POWERPC
:
2067 case BFD_MACH_O_CPU_TYPE_POWERPC_64
:
2068 flavourstr
= bfd_mach_o_ppc_flavour_string (cmd
->flavours
[i
].flavour
);
2070 case BFD_MACH_O_CPU_TYPE_I386
:
2071 case BFD_MACH_O_CPU_TYPE_X86_64
:
2072 flavourstr
= bfd_mach_o_i386_flavour_string (cmd
->flavours
[i
].flavour
);
2075 flavourstr
= "UNKNOWN_ARCHITECTURE";
2079 snamelen
= strlen (prefix
) + 1 + 20 + 1 + strlen (flavourstr
) + 1;
2080 sname
= bfd_alloc (abfd
, snamelen
);
2086 sprintf (sname
, "%s.%s.%u", prefix
, flavourstr
, j
);
2087 if (bfd_get_section_by_name (abfd
, sname
) == NULL
)
2092 bfdsec
= bfd_make_section_with_flags (abfd
, sname
, SEC_HAS_CONTENTS
);
2096 bfdsec
->size
= cmd
->flavours
[i
].size
;
2097 bfdsec
->filepos
= cmd
->flavours
[i
].offset
;
2098 bfdsec
->alignment_power
= 0x0;
2100 cmd
->section
= bfdsec
;
2107 bfd_mach_o_read_dysymtab (bfd
*abfd
, bfd_mach_o_load_command
*command
)
2109 bfd_mach_o_dysymtab_command
*cmd
= &command
->command
.dysymtab
;
2110 bfd_mach_o_data_struct
*mdata
= bfd_mach_o_get_data (abfd
);
2111 unsigned char buf
[72];
2113 BFD_ASSERT (command
->type
== BFD_MACH_O_LC_DYSYMTAB
);
2115 if (bfd_seek (abfd
, command
->offset
+ 8, SEEK_SET
) != 0
2116 || bfd_bread ((void *) buf
, 72, abfd
) != 72)
2119 cmd
->ilocalsym
= bfd_h_get_32 (abfd
, buf
+ 0);
2120 cmd
->nlocalsym
= bfd_h_get_32 (abfd
, buf
+ 4);
2121 cmd
->iextdefsym
= bfd_h_get_32 (abfd
, buf
+ 8);
2122 cmd
->nextdefsym
= bfd_h_get_32 (abfd
, buf
+ 12);
2123 cmd
->iundefsym
= bfd_h_get_32 (abfd
, buf
+ 16);
2124 cmd
->nundefsym
= bfd_h_get_32 (abfd
, buf
+ 20);
2125 cmd
->tocoff
= bfd_h_get_32 (abfd
, buf
+ 24);
2126 cmd
->ntoc
= bfd_h_get_32 (abfd
, buf
+ 28);
2127 cmd
->modtaboff
= bfd_h_get_32 (abfd
, buf
+ 32);
2128 cmd
->nmodtab
= bfd_h_get_32 (abfd
, buf
+ 36);
2129 cmd
->extrefsymoff
= bfd_h_get_32 (abfd
, buf
+ 40);
2130 cmd
->nextrefsyms
= bfd_h_get_32 (abfd
, buf
+ 44);
2131 cmd
->indirectsymoff
= bfd_h_get_32 (abfd
, buf
+ 48);
2132 cmd
->nindirectsyms
= bfd_h_get_32 (abfd
, buf
+ 52);
2133 cmd
->extreloff
= bfd_h_get_32 (abfd
, buf
+ 56);
2134 cmd
->nextrel
= bfd_h_get_32 (abfd
, buf
+ 60);
2135 cmd
->locreloff
= bfd_h_get_32 (abfd
, buf
+ 64);
2136 cmd
->nlocrel
= bfd_h_get_32 (abfd
, buf
+ 68);
2138 if (cmd
->nmodtab
!= 0)
2141 int wide
= bfd_mach_o_wide_p (abfd
);
2142 unsigned int module_len
= wide
? 56 : 52;
2145 bfd_alloc (abfd
, cmd
->nmodtab
* sizeof (bfd_mach_o_dylib_module
));
2146 if (cmd
->dylib_module
== NULL
)
2149 if (bfd_seek (abfd
, cmd
->modtaboff
, SEEK_SET
) != 0)
2152 for (i
= 0; i
< cmd
->nmodtab
; i
++)
2154 bfd_mach_o_dylib_module
*module
= &cmd
->dylib_module
[i
];
2157 if (bfd_bread ((void *) buf
, module_len
, abfd
) != module_len
)
2160 module
->module_name_idx
= bfd_h_get_32 (abfd
, buf
+ 0);
2161 module
->iextdefsym
= bfd_h_get_32 (abfd
, buf
+ 4);
2162 module
->nextdefsym
= bfd_h_get_32 (abfd
, buf
+ 8);
2163 module
->irefsym
= bfd_h_get_32 (abfd
, buf
+ 12);
2164 module
->nrefsym
= bfd_h_get_32 (abfd
, buf
+ 16);
2165 module
->ilocalsym
= bfd_h_get_32 (abfd
, buf
+ 20);
2166 module
->nlocalsym
= bfd_h_get_32 (abfd
, buf
+ 24);
2167 module
->iextrel
= bfd_h_get_32 (abfd
, buf
+ 28);
2168 module
->nextrel
= bfd_h_get_32 (abfd
, buf
+ 32);
2169 v
= bfd_h_get_32 (abfd
, buf
+36);
2170 module
->iinit
= v
& 0xffff;
2171 module
->iterm
= (v
>> 16) & 0xffff;
2172 v
= bfd_h_get_32 (abfd
, buf
+ 40);
2173 module
->ninit
= v
& 0xffff;
2174 module
->nterm
= (v
>> 16) & 0xffff;
2177 module
->objc_module_info_size
= bfd_h_get_32 (abfd
, buf
+ 44);
2178 module
->objc_module_info_addr
= bfd_h_get_64 (abfd
, buf
+ 48);
2182 module
->objc_module_info_addr
= bfd_h_get_32 (abfd
, buf
+ 44);
2183 module
->objc_module_info_size
= bfd_h_get_32 (abfd
, buf
+ 48);
2192 cmd
->dylib_toc
= bfd_alloc
2193 (abfd
, cmd
->ntoc
* sizeof (bfd_mach_o_dylib_table_of_content
));
2194 if (cmd
->dylib_toc
== NULL
)
2197 if (bfd_seek (abfd
, cmd
->tocoff
, SEEK_SET
) != 0)
2200 for (i
= 0; i
< cmd
->ntoc
; i
++)
2202 bfd_mach_o_dylib_table_of_content
*toc
= &cmd
->dylib_toc
[i
];
2204 if (bfd_bread ((void *) buf
, 8, abfd
) != 8)
2207 toc
->symbol_index
= bfd_h_get_32 (abfd
, buf
+ 0);
2208 toc
->module_index
= bfd_h_get_32 (abfd
, buf
+ 4);
2212 if (cmd
->nindirectsyms
!= 0)
2216 cmd
->indirect_syms
= bfd_alloc
2217 (abfd
, cmd
->nindirectsyms
* sizeof (unsigned int));
2218 if (cmd
->indirect_syms
== NULL
)
2221 if (bfd_seek (abfd
, cmd
->indirectsymoff
, SEEK_SET
) != 0)
2224 for (i
= 0; i
< cmd
->nindirectsyms
; i
++)
2226 unsigned int *is
= &cmd
->indirect_syms
[i
];
2228 if (bfd_bread ((void *) buf
, 4, abfd
) != 4)
2231 *is
= bfd_h_get_32 (abfd
, buf
+ 0);
2235 if (cmd
->nextrefsyms
!= 0)
2240 cmd
->ext_refs
= bfd_alloc
2241 (abfd
, cmd
->nextrefsyms
* sizeof (bfd_mach_o_dylib_reference
));
2242 if (cmd
->ext_refs
== NULL
)
2245 if (bfd_seek (abfd
, cmd
->extrefsymoff
, SEEK_SET
) != 0)
2248 for (i
= 0; i
< cmd
->nextrefsyms
; i
++)
2250 bfd_mach_o_dylib_reference
*ref
= &cmd
->ext_refs
[i
];
2252 if (bfd_bread ((void *) buf
, 4, abfd
) != 4)
2255 /* Fields isym and flags are written as bit-fields, thus we need
2256 a specific processing for endianness. */
2257 v
= bfd_h_get_32 (abfd
, buf
+ 0);
2258 if (bfd_big_endian (abfd
))
2260 ref
->isym
= (v
>> 8) & 0xffffff;
2261 ref
->flags
= v
& 0xff;
2265 ref
->isym
= v
& 0xffffff;
2266 ref
->flags
= (v
>> 24) & 0xff;
2271 if (mdata
->dysymtab
)
2273 mdata
->dysymtab
= cmd
;
2279 bfd_mach_o_read_symtab (bfd
*abfd
, bfd_mach_o_load_command
*command
)
2281 bfd_mach_o_symtab_command
*symtab
= &command
->command
.symtab
;
2282 bfd_mach_o_data_struct
*mdata
= bfd_mach_o_get_data (abfd
);
2283 unsigned char buf
[16];
2285 BFD_ASSERT (command
->type
== BFD_MACH_O_LC_SYMTAB
);
2287 if (bfd_seek (abfd
, command
->offset
+ 8, SEEK_SET
) != 0
2288 || bfd_bread ((void *) buf
, 16, abfd
) != 16)
2291 symtab
->symoff
= bfd_h_get_32 (abfd
, buf
);
2292 symtab
->nsyms
= bfd_h_get_32 (abfd
, buf
+ 4);
2293 symtab
->stroff
= bfd_h_get_32 (abfd
, buf
+ 8);
2294 symtab
->strsize
= bfd_h_get_32 (abfd
, buf
+ 12);
2295 symtab
->symbols
= NULL
;
2296 symtab
->strtab
= NULL
;
2298 if (symtab
->nsyms
!= 0)
2299 abfd
->flags
|= HAS_SYMS
;
2303 mdata
->symtab
= symtab
;
2308 bfd_mach_o_read_uuid (bfd
*abfd
, bfd_mach_o_load_command
*command
)
2310 bfd_mach_o_uuid_command
*cmd
= &command
->command
.uuid
;
2312 BFD_ASSERT (command
->type
== BFD_MACH_O_LC_UUID
);
2314 if (bfd_seek (abfd
, command
->offset
+ 8, SEEK_SET
) != 0
2315 || bfd_bread ((void *) cmd
->uuid
, 16, abfd
) != 16)
2322 bfd_mach_o_read_linkedit (bfd
*abfd
, bfd_mach_o_load_command
*command
)
2324 bfd_mach_o_linkedit_command
*cmd
= &command
->command
.linkedit
;
2327 if (bfd_seek (abfd
, command
->offset
+ 8, SEEK_SET
) != 0
2328 || bfd_bread ((void *) buf
, 8, abfd
) != 8)
2331 cmd
->dataoff
= bfd_get_32 (abfd
, buf
+ 0);
2332 cmd
->datasize
= bfd_get_32 (abfd
, buf
+ 4);
2337 bfd_mach_o_read_str (bfd
*abfd
, bfd_mach_o_load_command
*command
)
2339 bfd_mach_o_str_command
*cmd
= &command
->command
.str
;
2343 if (bfd_seek (abfd
, command
->offset
+ 8, SEEK_SET
) != 0
2344 || bfd_bread ((void *) buf
, 4, abfd
) != 4)
2347 off
= bfd_get_32 (abfd
, buf
+ 0);
2348 cmd
->stroff
= command
->offset
+ off
;
2349 cmd
->str_len
= command
->len
- off
;
2350 cmd
->str
= bfd_alloc (abfd
, cmd
->str_len
);
2351 if (cmd
->str
== NULL
)
2353 if (bfd_seek (abfd
, cmd
->stroff
, SEEK_SET
) != 0
2354 || bfd_bread ((void *) cmd
->str
, cmd
->str_len
, abfd
) != cmd
->str_len
)
2360 bfd_mach_o_read_dyld_info (bfd
*abfd
, bfd_mach_o_load_command
*command
)
2362 bfd_mach_o_dyld_info_command
*cmd
= &command
->command
.dyld_info
;
2365 if (bfd_seek (abfd
, command
->offset
+ 8, SEEK_SET
) != 0
2366 || bfd_bread ((void *) buf
, sizeof (buf
), abfd
) != sizeof (buf
))
2369 cmd
->rebase_off
= bfd_get_32 (abfd
, buf
+ 0);
2370 cmd
->rebase_size
= bfd_get_32 (abfd
, buf
+ 4);
2371 cmd
->bind_off
= bfd_get_32 (abfd
, buf
+ 8);
2372 cmd
->bind_size
= bfd_get_32 (abfd
, buf
+ 12);
2373 cmd
->weak_bind_off
= bfd_get_32 (abfd
, buf
+ 16);
2374 cmd
->weak_bind_size
= bfd_get_32 (abfd
, buf
+ 20);
2375 cmd
->lazy_bind_off
= bfd_get_32 (abfd
, buf
+ 24);
2376 cmd
->lazy_bind_size
= bfd_get_32 (abfd
, buf
+ 28);
2377 cmd
->export_off
= bfd_get_32 (abfd
, buf
+ 32);
2378 cmd
->export_size
= bfd_get_32 (abfd
, buf
+ 36);
2383 bfd_mach_o_read_segment (bfd
*abfd
,
2384 bfd_mach_o_load_command
*command
,
2387 unsigned char buf
[64];
2388 bfd_mach_o_segment_command
*seg
= &command
->command
.segment
;
2393 BFD_ASSERT (command
->type
== BFD_MACH_O_LC_SEGMENT_64
);
2395 if (bfd_seek (abfd
, command
->offset
+ 8, SEEK_SET
) != 0
2396 || bfd_bread ((void *) buf
, 64, abfd
) != 64)
2399 memcpy (seg
->segname
, buf
, 16);
2400 seg
->segname
[16] = '\0';
2402 seg
->vmaddr
= bfd_h_get_64 (abfd
, buf
+ 16);
2403 seg
->vmsize
= bfd_h_get_64 (abfd
, buf
+ 24);
2404 seg
->fileoff
= bfd_h_get_64 (abfd
, buf
+ 32);
2405 seg
->filesize
= bfd_h_get_64 (abfd
, buf
+ 40);
2406 seg
->maxprot
= bfd_h_get_32 (abfd
, buf
+ 48);
2407 seg
->initprot
= bfd_h_get_32 (abfd
, buf
+ 52);
2408 seg
->nsects
= bfd_h_get_32 (abfd
, buf
+ 56);
2409 seg
->flags
= bfd_h_get_32 (abfd
, buf
+ 60);
2413 BFD_ASSERT (command
->type
== BFD_MACH_O_LC_SEGMENT
);
2415 if (bfd_seek (abfd
, command
->offset
+ 8, SEEK_SET
) != 0
2416 || bfd_bread ((void *) buf
, 48, abfd
) != 48)
2419 memcpy (seg
->segname
, buf
, 16);
2420 seg
->segname
[16] = '\0';
2422 seg
->vmaddr
= bfd_h_get_32 (abfd
, buf
+ 16);
2423 seg
->vmsize
= bfd_h_get_32 (abfd
, buf
+ 20);
2424 seg
->fileoff
= bfd_h_get_32 (abfd
, buf
+ 24);
2425 seg
->filesize
= bfd_h_get_32 (abfd
, buf
+ 28);
2426 seg
->maxprot
= bfd_h_get_32 (abfd
, buf
+ 32);
2427 seg
->initprot
= bfd_h_get_32 (abfd
, buf
+ 36);
2428 seg
->nsects
= bfd_h_get_32 (abfd
, buf
+ 40);
2429 seg
->flags
= bfd_h_get_32 (abfd
, buf
+ 44);
2432 if (seg
->nsects
!= 0)
2434 seg
->sections
= bfd_alloc (abfd
, seg
->nsects
2435 * sizeof (bfd_mach_o_section
));
2436 if (seg
->sections
== NULL
)
2439 for (i
= 0; i
< seg
->nsects
; i
++)
2443 segoff
= command
->offset
+ BFD_MACH_O_LC_SEGMENT_64_SIZE
2444 + (i
* BFD_MACH_O_SECTION_64_SIZE
);
2446 segoff
= command
->offset
+ BFD_MACH_O_LC_SEGMENT_SIZE
2447 + (i
* BFD_MACH_O_SECTION_SIZE
);
2449 if (bfd_mach_o_read_section
2450 (abfd
, &seg
->sections
[i
], segoff
, seg
->initprot
, wide
) != 0)
2459 bfd_mach_o_read_segment_32 (bfd
*abfd
, bfd_mach_o_load_command
*command
)
2461 return bfd_mach_o_read_segment (abfd
, command
, 0);
2465 bfd_mach_o_read_segment_64 (bfd
*abfd
, bfd_mach_o_load_command
*command
)
2467 return bfd_mach_o_read_segment (abfd
, command
, 1);
2471 bfd_mach_o_read_command (bfd
*abfd
, bfd_mach_o_load_command
*command
)
2473 unsigned char buf
[8];
2475 /* Read command type and length. */
2476 if (bfd_seek (abfd
, command
->offset
, SEEK_SET
) != 0
2477 || bfd_bread ((void *) buf
, 8, abfd
) != 8)
2480 command
->type
= bfd_h_get_32 (abfd
, buf
) & ~BFD_MACH_O_LC_REQ_DYLD
;
2481 command
->type_required
= (bfd_h_get_32 (abfd
, buf
) & BFD_MACH_O_LC_REQ_DYLD
2483 command
->len
= bfd_h_get_32 (abfd
, buf
+ 4);
2485 switch (command
->type
)
2487 case BFD_MACH_O_LC_SEGMENT
:
2488 if (bfd_mach_o_read_segment_32 (abfd
, command
) != 0)
2491 case BFD_MACH_O_LC_SEGMENT_64
:
2492 if (bfd_mach_o_read_segment_64 (abfd
, command
) != 0)
2495 case BFD_MACH_O_LC_SYMTAB
:
2496 if (bfd_mach_o_read_symtab (abfd
, command
) != 0)
2499 case BFD_MACH_O_LC_SYMSEG
:
2501 case BFD_MACH_O_LC_THREAD
:
2502 case BFD_MACH_O_LC_UNIXTHREAD
:
2503 if (bfd_mach_o_read_thread (abfd
, command
) != 0)
2506 case BFD_MACH_O_LC_LOAD_DYLINKER
:
2507 case BFD_MACH_O_LC_ID_DYLINKER
:
2508 if (bfd_mach_o_read_dylinker (abfd
, command
) != 0)
2511 case BFD_MACH_O_LC_LOAD_DYLIB
:
2512 case BFD_MACH_O_LC_ID_DYLIB
:
2513 case BFD_MACH_O_LC_LOAD_WEAK_DYLIB
:
2514 case BFD_MACH_O_LC_REEXPORT_DYLIB
:
2515 if (bfd_mach_o_read_dylib (abfd
, command
) != 0)
2518 case BFD_MACH_O_LC_PREBOUND_DYLIB
:
2519 if (bfd_mach_o_read_prebound_dylib (abfd
, command
) != 0)
2522 case BFD_MACH_O_LC_LOADFVMLIB
:
2523 case BFD_MACH_O_LC_IDFVMLIB
:
2524 case BFD_MACH_O_LC_IDENT
:
2525 case BFD_MACH_O_LC_FVMFILE
:
2526 case BFD_MACH_O_LC_PREPAGE
:
2527 case BFD_MACH_O_LC_ROUTINES
:
2529 case BFD_MACH_O_LC_SUB_FRAMEWORK
:
2530 case BFD_MACH_O_LC_SUB_UMBRELLA
:
2531 case BFD_MACH_O_LC_SUB_LIBRARY
:
2532 case BFD_MACH_O_LC_SUB_CLIENT
:
2533 case BFD_MACH_O_LC_RPATH
:
2534 if (bfd_mach_o_read_str (abfd
, command
) != 0)
2537 case BFD_MACH_O_LC_DYSYMTAB
:
2538 if (bfd_mach_o_read_dysymtab (abfd
, command
) != 0)
2541 case BFD_MACH_O_LC_TWOLEVEL_HINTS
:
2542 case BFD_MACH_O_LC_PREBIND_CKSUM
:
2544 case BFD_MACH_O_LC_UUID
:
2545 if (bfd_mach_o_read_uuid (abfd
, command
) != 0)
2548 case BFD_MACH_O_LC_CODE_SIGNATURE
:
2549 case BFD_MACH_O_LC_SEGMENT_SPLIT_INFO
:
2550 if (bfd_mach_o_read_linkedit (abfd
, command
) != 0)
2553 case BFD_MACH_O_LC_DYLD_INFO
:
2554 if (bfd_mach_o_read_dyld_info (abfd
, command
) != 0)
2558 fprintf (stderr
, "unable to read unknown load command 0x%lx\n",
2559 (unsigned long) command
->type
);
2567 bfd_mach_o_flatten_sections (bfd
*abfd
)
2569 bfd_mach_o_data_struct
*mdata
= bfd_mach_o_get_data (abfd
);
2573 /* Count total number of sections. */
2576 for (i
= 0; i
< mdata
->header
.ncmds
; i
++)
2578 if (mdata
->commands
[i
].type
== BFD_MACH_O_LC_SEGMENT
2579 || mdata
->commands
[i
].type
== BFD_MACH_O_LC_SEGMENT_64
)
2581 bfd_mach_o_segment_command
*seg
;
2583 seg
= &mdata
->commands
[i
].command
.segment
;
2584 mdata
->nsects
+= seg
->nsects
;
2588 /* Allocate sections array. */
2589 mdata
->sections
= bfd_alloc (abfd
,
2590 mdata
->nsects
* sizeof (bfd_mach_o_section
*));
2592 /* Fill the array. */
2595 for (i
= 0; i
< mdata
->header
.ncmds
; i
++)
2597 if (mdata
->commands
[i
].type
== BFD_MACH_O_LC_SEGMENT
2598 || mdata
->commands
[i
].type
== BFD_MACH_O_LC_SEGMENT_64
)
2600 bfd_mach_o_segment_command
*seg
;
2602 seg
= &mdata
->commands
[i
].command
.segment
;
2603 BFD_ASSERT (csect
+ seg
->nsects
<= mdata
->nsects
);
2605 for (j
= 0; j
< seg
->nsects
; j
++)
2606 mdata
->sections
[csect
++] = &seg
->sections
[j
];
2612 bfd_mach_o_scan_start_address (bfd
*abfd
)
2614 bfd_mach_o_data_struct
*mdata
= bfd_mach_o_get_data (abfd
);
2615 bfd_mach_o_thread_command
*cmd
= NULL
;
2618 for (i
= 0; i
< mdata
->header
.ncmds
; i
++)
2620 if ((mdata
->commands
[i
].type
== BFD_MACH_O_LC_THREAD
) ||
2621 (mdata
->commands
[i
].type
== BFD_MACH_O_LC_UNIXTHREAD
))
2624 cmd
= &mdata
->commands
[i
].command
.thread
;
2633 for (i
= 0; i
< cmd
->nflavours
; i
++)
2635 if ((mdata
->header
.cputype
== BFD_MACH_O_CPU_TYPE_I386
)
2636 && (cmd
->flavours
[i
].flavour
2637 == (unsigned long) BFD_MACH_O_x86_THREAD_STATE32
))
2639 unsigned char buf
[4];
2641 if (bfd_seek (abfd
, cmd
->flavours
[i
].offset
+ 40, SEEK_SET
) != 0
2642 || bfd_bread (buf
, 4, abfd
) != 4)
2645 abfd
->start_address
= bfd_h_get_32 (abfd
, buf
);
2647 else if ((mdata
->header
.cputype
== BFD_MACH_O_CPU_TYPE_POWERPC
)
2648 && (cmd
->flavours
[i
].flavour
== BFD_MACH_O_PPC_THREAD_STATE
))
2650 unsigned char buf
[4];
2652 if (bfd_seek (abfd
, cmd
->flavours
[i
].offset
+ 0, SEEK_SET
) != 0
2653 || bfd_bread (buf
, 4, abfd
) != 4)
2656 abfd
->start_address
= bfd_h_get_32 (abfd
, buf
);
2658 else if ((mdata
->header
.cputype
== BFD_MACH_O_CPU_TYPE_POWERPC_64
)
2659 && (cmd
->flavours
[i
].flavour
== BFD_MACH_O_PPC_THREAD_STATE64
))
2661 unsigned char buf
[8];
2663 if (bfd_seek (abfd
, cmd
->flavours
[i
].offset
+ 0, SEEK_SET
) != 0
2664 || bfd_bread (buf
, 8, abfd
) != 8)
2667 abfd
->start_address
= bfd_h_get_64 (abfd
, buf
);
2669 else if ((mdata
->header
.cputype
== BFD_MACH_O_CPU_TYPE_X86_64
)
2670 && (cmd
->flavours
[i
].flavour
== BFD_MACH_O_x86_THREAD_STATE64
))
2672 unsigned char buf
[8];
2674 if (bfd_seek (abfd
, cmd
->flavours
[i
].offset
+ (16 * 8), SEEK_SET
) != 0
2675 || bfd_bread (buf
, 8, abfd
) != 8)
2678 abfd
->start_address
= bfd_h_get_64 (abfd
, buf
);
2686 bfd_mach_o_set_arch_mach (bfd
*abfd
,
2687 enum bfd_architecture arch
,
2688 unsigned long machine
)
2690 bfd_mach_o_backend_data
*bed
= bfd_mach_o_get_backend_data (abfd
);
2692 /* If this isn't the right architecture for this backend, and this
2693 isn't the generic backend, fail. */
2694 if (arch
!= bed
->arch
2695 && arch
!= bfd_arch_unknown
2696 && bed
->arch
!= bfd_arch_unknown
)
2699 return bfd_default_set_arch_mach (abfd
, arch
, machine
);
2703 bfd_mach_o_scan (bfd
*abfd
,
2704 bfd_mach_o_header
*header
,
2705 bfd_mach_o_data_struct
*mdata
)
2708 enum bfd_architecture cputype
;
2709 unsigned long cpusubtype
;
2710 unsigned int hdrsize
;
2712 hdrsize
= mach_o_wide_p (header
) ?
2713 BFD_MACH_O_HEADER_64_SIZE
: BFD_MACH_O_HEADER_SIZE
;
2715 mdata
->header
= *header
;
2717 abfd
->flags
= abfd
->flags
& BFD_IN_MEMORY
;
2718 switch (header
->filetype
)
2720 case BFD_MACH_O_MH_OBJECT
:
2721 abfd
->flags
|= HAS_RELOC
;
2723 case BFD_MACH_O_MH_EXECUTE
:
2724 abfd
->flags
|= EXEC_P
;
2726 case BFD_MACH_O_MH_DYLIB
:
2727 case BFD_MACH_O_MH_BUNDLE
:
2728 abfd
->flags
|= DYNAMIC
;
2732 abfd
->tdata
.mach_o_data
= mdata
;
2734 bfd_mach_o_convert_architecture (header
->cputype
, header
->cpusubtype
,
2735 &cputype
, &cpusubtype
);
2736 if (cputype
== bfd_arch_unknown
)
2738 fprintf (stderr
, "bfd_mach_o_scan: unknown architecture 0x%lx/0x%lx\n",
2739 header
->cputype
, header
->cpusubtype
);
2743 bfd_set_arch_mach (abfd
, cputype
, cpusubtype
);
2745 if (header
->ncmds
!= 0)
2747 mdata
->commands
= bfd_alloc
2748 (abfd
, header
->ncmds
* sizeof (bfd_mach_o_load_command
));
2749 if (mdata
->commands
== NULL
)
2752 for (i
= 0; i
< header
->ncmds
; i
++)
2754 bfd_mach_o_load_command
*cur
= &mdata
->commands
[i
];
2757 cur
->offset
= hdrsize
;
2760 bfd_mach_o_load_command
*prev
= &mdata
->commands
[i
- 1];
2761 cur
->offset
= prev
->offset
+ prev
->len
;
2764 if (bfd_mach_o_read_command (abfd
, cur
) < 0)
2769 if (bfd_mach_o_scan_start_address (abfd
) < 0)
2772 bfd_mach_o_flatten_sections (abfd
);
2777 bfd_mach_o_mkobject_init (bfd
*abfd
)
2779 bfd_mach_o_data_struct
*mdata
= NULL
;
2781 mdata
= bfd_alloc (abfd
, sizeof (bfd_mach_o_data_struct
));
2784 abfd
->tdata
.mach_o_data
= mdata
;
2786 mdata
->header
.magic
= 0;
2787 mdata
->header
.cputype
= 0;
2788 mdata
->header
.cpusubtype
= 0;
2789 mdata
->header
.filetype
= 0;
2790 mdata
->header
.ncmds
= 0;
2791 mdata
->header
.sizeofcmds
= 0;
2792 mdata
->header
.flags
= 0;
2793 mdata
->header
.byteorder
= BFD_ENDIAN_UNKNOWN
;
2794 mdata
->commands
= NULL
;
2796 mdata
->sections
= NULL
;
2802 bfd_mach_o_gen_mkobject (bfd
*abfd
)
2804 bfd_mach_o_data_struct
*mdata
;
2806 if (!bfd_mach_o_mkobject_init (abfd
))
2809 mdata
= bfd_mach_o_get_data (abfd
);
2810 mdata
->header
.magic
= BFD_MACH_O_MH_MAGIC
;
2811 mdata
->header
.cputype
= 0;
2812 mdata
->header
.cpusubtype
= 0;
2813 mdata
->header
.byteorder
= abfd
->xvec
->byteorder
;
2814 mdata
->header
.version
= 1;
2820 bfd_mach_o_header_p (bfd
*abfd
,
2821 bfd_mach_o_filetype filetype
,
2822 bfd_mach_o_cpu_type cputype
)
2824 struct bfd_preserve preserve
;
2825 bfd_mach_o_header header
;
2827 preserve
.marker
= NULL
;
2828 if (!bfd_mach_o_read_header (abfd
, &header
))
2831 if (! (header
.byteorder
== BFD_ENDIAN_BIG
2832 || header
.byteorder
== BFD_ENDIAN_LITTLE
))
2834 fprintf (stderr
, "unknown header byte-order value 0x%lx\n",
2835 (unsigned long) header
.byteorder
);
2839 if (! ((header
.byteorder
== BFD_ENDIAN_BIG
2840 && abfd
->xvec
->byteorder
== BFD_ENDIAN_BIG
2841 && abfd
->xvec
->header_byteorder
== BFD_ENDIAN_BIG
)
2842 || (header
.byteorder
== BFD_ENDIAN_LITTLE
2843 && abfd
->xvec
->byteorder
== BFD_ENDIAN_LITTLE
2844 && abfd
->xvec
->header_byteorder
== BFD_ENDIAN_LITTLE
)))
2847 /* Check cputype and filetype.
2848 In case of wildcard, do not accept magics that are handled by existing
2852 if (header
.cputype
!= cputype
)
2857 switch (header
.cputype
)
2859 case BFD_MACH_O_CPU_TYPE_I386
:
2860 /* Handled by mach-o-i386 */
2868 if (header
.filetype
!= filetype
)
2873 switch (header
.filetype
)
2875 case BFD_MACH_O_MH_CORE
:
2876 /* Handled by core_p */
2883 preserve
.marker
= bfd_zalloc (abfd
, sizeof (bfd_mach_o_data_struct
));
2884 if (preserve
.marker
== NULL
2885 || !bfd_preserve_save (abfd
, &preserve
))
2888 if (bfd_mach_o_scan (abfd
, &header
,
2889 (bfd_mach_o_data_struct
*) preserve
.marker
) != 0)
2892 bfd_preserve_finish (abfd
, &preserve
);
2896 bfd_set_error (bfd_error_wrong_format
);
2899 if (preserve
.marker
!= NULL
)
2900 bfd_preserve_restore (abfd
, &preserve
);
2904 static const bfd_target
*
2905 bfd_mach_o_gen_object_p (bfd
*abfd
)
2907 return bfd_mach_o_header_p (abfd
, 0, 0);
2910 static const bfd_target
*
2911 bfd_mach_o_gen_core_p (bfd
*abfd
)
2913 return bfd_mach_o_header_p (abfd
, BFD_MACH_O_MH_CORE
, 0);
2916 typedef struct mach_o_fat_archentry
2918 unsigned long cputype
;
2919 unsigned long cpusubtype
;
2920 unsigned long offset
;
2922 unsigned long align
;
2923 } mach_o_fat_archentry
;
2925 typedef struct mach_o_fat_data_struct
2927 unsigned long magic
;
2928 unsigned long nfat_arch
;
2929 mach_o_fat_archentry
*archentries
;
2930 } mach_o_fat_data_struct
;
2933 bfd_mach_o_archive_p (bfd
*abfd
)
2935 mach_o_fat_data_struct
*adata
= NULL
;
2936 unsigned char buf
[20];
2939 if (bfd_seek (abfd
, 0, SEEK_SET
) != 0
2940 || bfd_bread ((void *) buf
, 8, abfd
) != 8)
2943 adata
= bfd_alloc (abfd
, sizeof (mach_o_fat_data_struct
));
2947 adata
->magic
= bfd_getb32 (buf
);
2948 adata
->nfat_arch
= bfd_getb32 (buf
+ 4);
2949 if (adata
->magic
!= 0xcafebabe)
2951 /* Avoid matching Java bytecode files, which have the same magic number.
2952 In the Java bytecode file format this field contains the JVM version,
2953 which starts at 43.0. */
2954 if (adata
->nfat_arch
> 30)
2957 adata
->archentries
=
2958 bfd_alloc (abfd
, adata
->nfat_arch
* sizeof (mach_o_fat_archentry
));
2959 if (adata
->archentries
== NULL
)
2962 for (i
= 0; i
< adata
->nfat_arch
; i
++)
2964 if (bfd_seek (abfd
, 8 + 20 * i
, SEEK_SET
) != 0
2965 || bfd_bread ((void *) buf
, 20, abfd
) != 20)
2967 adata
->archentries
[i
].cputype
= bfd_getb32 (buf
);
2968 adata
->archentries
[i
].cpusubtype
= bfd_getb32 (buf
+ 4);
2969 adata
->archentries
[i
].offset
= bfd_getb32 (buf
+ 8);
2970 adata
->archentries
[i
].size
= bfd_getb32 (buf
+ 12);
2971 adata
->archentries
[i
].align
= bfd_getb32 (buf
+ 16);
2974 abfd
->tdata
.mach_o_fat_data
= adata
;
2979 bfd_release (abfd
, adata
);
2980 bfd_set_error (bfd_error_wrong_format
);
2985 bfd_mach_o_openr_next_archived_file (bfd
*archive
, bfd
*prev
)
2987 mach_o_fat_data_struct
*adata
;
2988 mach_o_fat_archentry
*entry
= NULL
;
2991 enum bfd_architecture arch_type
;
2992 unsigned long arch_subtype
;
2994 adata
= (mach_o_fat_data_struct
*) archive
->tdata
.mach_o_fat_data
;
2995 BFD_ASSERT (adata
!= NULL
);
2997 /* Find index of previous entry. */
2999 i
= 0; /* Start at first one. */
3002 for (i
= 0; i
< adata
->nfat_arch
; i
++)
3004 if (adata
->archentries
[i
].offset
== prev
->origin
)
3008 if (i
== adata
->nfat_arch
)
3011 bfd_set_error (bfd_error_bad_value
);
3014 i
++; /* Get next entry. */
3017 if (i
>= adata
->nfat_arch
)
3019 bfd_set_error (bfd_error_no_more_archived_files
);
3023 entry
= &adata
->archentries
[i
];
3024 nbfd
= _bfd_new_bfd_contained_in (archive
);
3028 nbfd
->origin
= entry
->offset
;
3030 bfd_mach_o_convert_architecture (entry
->cputype
, entry
->cpusubtype
,
3031 &arch_type
, &arch_subtype
);
3032 /* Create the member filename.
3033 Use FILENAME:ARCH_NAME. */
3036 const char *arch_name
;
3037 size_t arch_file_len
= strlen (bfd_get_filename (archive
));
3039 arch_name
= bfd_printable_arch_mach (arch_type
, arch_subtype
);
3040 s
= bfd_malloc (arch_file_len
+ 1 + strlen (arch_name
) + 1);
3043 memcpy (s
, bfd_get_filename (archive
), arch_file_len
);
3044 s
[arch_file_len
] = ':';
3045 strcpy (s
+ arch_file_len
+ 1, arch_name
);
3048 nbfd
->iostream
= NULL
;
3049 bfd_set_arch_mach (nbfd
, arch_type
, arch_subtype
);
3054 /* If ABFD format is FORMAT and architecture is ARCH, return it.
3055 If ABFD is a fat image containing a member that corresponds to FORMAT
3056 and ARCH, returns it.
3057 In other case, returns NULL.
3058 This function allows transparent uses of fat images. */
3060 bfd_mach_o_fat_extract (bfd
*abfd
,
3062 const bfd_arch_info_type
*arch
)
3065 mach_o_fat_data_struct
*adata
;
3068 if (bfd_check_format (abfd
, format
))
3070 if (bfd_get_arch_info (abfd
) == arch
)
3074 if (!bfd_check_format (abfd
, bfd_archive
)
3075 || abfd
->xvec
!= &mach_o_fat_vec
)
3078 /* This is a Mach-O fat image. */
3079 adata
= (mach_o_fat_data_struct
*) abfd
->tdata
.mach_o_fat_data
;
3080 BFD_ASSERT (adata
!= NULL
);
3082 for (i
= 0; i
< adata
->nfat_arch
; i
++)
3084 struct mach_o_fat_archentry
*e
= &adata
->archentries
[i
];
3085 enum bfd_architecture cpu_type
;
3086 unsigned long cpu_subtype
;
3088 bfd_mach_o_convert_architecture (e
->cputype
, e
->cpusubtype
,
3089 &cpu_type
, &cpu_subtype
);
3090 if (cpu_type
!= arch
->arch
|| cpu_subtype
!= arch
->mach
)
3093 /* The architecture is found. */
3094 res
= _bfd_new_bfd_contained_in (abfd
);
3098 res
->origin
= e
->offset
;
3100 res
->filename
= strdup (abfd
->filename
);
3101 res
->iostream
= NULL
;
3103 if (bfd_check_format (res
, format
))
3105 BFD_ASSERT (bfd_get_arch_info (res
) == arch
);
3116 bfd_mach_o_lookup_section (bfd
*abfd
,
3118 bfd_mach_o_load_command
**mcommand
,
3119 bfd_mach_o_section
**msection
)
3121 struct mach_o_data_struct
*md
= bfd_mach_o_get_data (abfd
);
3122 unsigned int i
, j
, num
;
3124 bfd_mach_o_load_command
*ncmd
= NULL
;
3125 bfd_mach_o_section
*nsect
= NULL
;
3127 BFD_ASSERT (mcommand
!= NULL
);
3128 BFD_ASSERT (msection
!= NULL
);
3131 for (i
= 0; i
< md
->header
.ncmds
; i
++)
3133 struct bfd_mach_o_load_command
*cmd
= &md
->commands
[i
];
3134 struct bfd_mach_o_segment_command
*seg
= NULL
;
3136 if (cmd
->type
!= BFD_MACH_O_LC_SEGMENT
3137 || cmd
->type
!= BFD_MACH_O_LC_SEGMENT_64
)
3139 seg
= &cmd
->command
.segment
;
3141 for (j
= 0; j
< seg
->nsects
; j
++)
3143 struct bfd_mach_o_section
*sect
= &seg
->sections
[j
];
3145 if (sect
->bfdsection
== section
)
3163 bfd_mach_o_lookup_command (bfd
*abfd
,
3164 bfd_mach_o_load_command_type type
,
3165 bfd_mach_o_load_command
**mcommand
)
3167 struct mach_o_data_struct
*md
= bfd_mach_o_get_data (abfd
);
3168 bfd_mach_o_load_command
*ncmd
= NULL
;
3169 unsigned int i
, num
;
3171 BFD_ASSERT (md
!= NULL
);
3172 BFD_ASSERT (mcommand
!= NULL
);
3175 for (i
= 0; i
< md
->header
.ncmds
; i
++)
3177 struct bfd_mach_o_load_command
*cmd
= &md
->commands
[i
];
3179 if (cmd
->type
!= type
)
3192 bfd_mach_o_stack_addr (enum bfd_mach_o_cpu_type type
)
3196 case BFD_MACH_O_CPU_TYPE_MC680x0
:
3198 case BFD_MACH_O_CPU_TYPE_MC88000
:
3200 case BFD_MACH_O_CPU_TYPE_POWERPC
:
3202 case BFD_MACH_O_CPU_TYPE_I386
:
3204 case BFD_MACH_O_CPU_TYPE_SPARC
:
3206 case BFD_MACH_O_CPU_TYPE_I860
:
3208 case BFD_MACH_O_CPU_TYPE_HPPA
:
3209 return 0xc0000000 - 0x04000000;
3215 typedef struct bfd_mach_o_xlat_name
3220 bfd_mach_o_xlat_name
;
3223 bfd_mach_o_print_flags (const bfd_mach_o_xlat_name
*table
,
3229 for (; table
->name
; table
++)
3231 if (table
->val
& val
)
3234 fprintf (file
, "+");
3235 fprintf (file
, "%s", table
->name
);
3243 fprintf (file
, "+");
3244 fprintf (file
, "0x%lx", val
);
3248 fprintf (file
, "-");
3252 bfd_mach_o_get_name (const bfd_mach_o_xlat_name
*table
, unsigned long val
)
3254 for (; table
->name
; table
++)
3255 if (table
->val
== val
)
3260 static bfd_mach_o_xlat_name bfd_mach_o_cpu_name
[] =
3262 { "vax", BFD_MACH_O_CPU_TYPE_VAX
},
3263 { "mc680x0", BFD_MACH_O_CPU_TYPE_MC680x0
},
3264 { "i386", BFD_MACH_O_CPU_TYPE_I386
},
3265 { "mips", BFD_MACH_O_CPU_TYPE_MIPS
},
3266 { "mc98000", BFD_MACH_O_CPU_TYPE_MC98000
},
3267 { "hppa", BFD_MACH_O_CPU_TYPE_HPPA
},
3268 { "arm", BFD_MACH_O_CPU_TYPE_ARM
},
3269 { "mc88000", BFD_MACH_O_CPU_TYPE_MC88000
},
3270 { "sparc", BFD_MACH_O_CPU_TYPE_SPARC
},
3271 { "i860", BFD_MACH_O_CPU_TYPE_I860
},
3272 { "alpha", BFD_MACH_O_CPU_TYPE_ALPHA
},
3273 { "powerpc", BFD_MACH_O_CPU_TYPE_POWERPC
},
3274 { "powerpc_64", BFD_MACH_O_CPU_TYPE_POWERPC_64
},
3275 { "x86_64", BFD_MACH_O_CPU_TYPE_X86_64
},
3279 static bfd_mach_o_xlat_name bfd_mach_o_filetype_name
[] =
3281 { "object", BFD_MACH_O_MH_OBJECT
},
3282 { "execute", BFD_MACH_O_MH_EXECUTE
},
3283 { "fvmlib", BFD_MACH_O_MH_FVMLIB
},
3284 { "core", BFD_MACH_O_MH_CORE
},
3285 { "preload", BFD_MACH_O_MH_PRELOAD
},
3286 { "dylib", BFD_MACH_O_MH_DYLIB
},
3287 { "dylinker", BFD_MACH_O_MH_DYLINKER
},
3288 { "bundle", BFD_MACH_O_MH_BUNDLE
},
3289 { "dylib_stub", BFD_MACH_O_MH_DYLIB_STUB
},
3290 { "dym", BFD_MACH_O_MH_DSYM
},
3291 { "kext_bundle", BFD_MACH_O_MH_KEXT_BUNDLE
},
3295 static bfd_mach_o_xlat_name bfd_mach_o_header_flags_name
[] =
3297 { "noundefs", BFD_MACH_O_MH_NOUNDEFS
},
3298 { "incrlink", BFD_MACH_O_MH_INCRLINK
},
3299 { "dyldlink", BFD_MACH_O_MH_DYLDLINK
},
3300 { "bindatload", BFD_MACH_O_MH_BINDATLOAD
},
3301 { "prebound", BFD_MACH_O_MH_PREBOUND
},
3302 { "split_segs", BFD_MACH_O_MH_SPLIT_SEGS
},
3303 { "lazy_init", BFD_MACH_O_MH_LAZY_INIT
},
3304 { "twolevel", BFD_MACH_O_MH_TWOLEVEL
},
3305 { "force_flat", BFD_MACH_O_MH_FORCE_FLAT
},
3306 { "nomultidefs", BFD_MACH_O_MH_NOMULTIDEFS
},
3307 { "nofixprebinding", BFD_MACH_O_MH_NOFIXPREBINDING
},
3308 { "prebindable", BFD_MACH_O_MH_PREBINDABLE
},
3309 { "allmodsbound", BFD_MACH_O_MH_ALLMODSBOUND
},
3310 { "subsections_via_symbols", BFD_MACH_O_MH_SUBSECTIONS_VIA_SYMBOLS
},
3311 { "canonical", BFD_MACH_O_MH_CANONICAL
},
3312 { "weak_defines", BFD_MACH_O_MH_WEAK_DEFINES
},
3313 { "binds_to_weak", BFD_MACH_O_MH_BINDS_TO_WEAK
},
3314 { "allow_stack_execution", BFD_MACH_O_MH_ALLOW_STACK_EXECUTION
},
3315 { "root_safe", BFD_MACH_O_MH_ROOT_SAFE
},
3316 { "setuid_safe", BFD_MACH_O_MH_SETUID_SAFE
},
3317 { "no_reexported_dylibs", BFD_MACH_O_MH_NO_REEXPORTED_DYLIBS
},
3318 { "pie", BFD_MACH_O_MH_PIE
},
3322 static bfd_mach_o_xlat_name bfd_mach_o_section_type_name
[] =
3324 { "regular", BFD_MACH_O_S_REGULAR
},
3325 { "zerofill", BFD_MACH_O_S_ZEROFILL
},
3326 { "cstring_literals", BFD_MACH_O_S_CSTRING_LITERALS
},
3327 { "4byte_literals", BFD_MACH_O_S_4BYTE_LITERALS
},
3328 { "8byte_literals", BFD_MACH_O_S_8BYTE_LITERALS
},
3329 { "literal_pointers", BFD_MACH_O_S_LITERAL_POINTERS
},
3330 { "non_lazy_symbol_pointers", BFD_MACH_O_S_NON_LAZY_SYMBOL_POINTERS
},
3331 { "lazy_symbol_pointers", BFD_MACH_O_S_LAZY_SYMBOL_POINTERS
},
3332 { "symbol_stubs", BFD_MACH_O_S_SYMBOL_STUBS
},
3333 { "mod_init_func_pointers", BFD_MACH_O_S_MOD_INIT_FUNC_POINTERS
},
3334 { "mod_fini_func_pointers", BFD_MACH_O_S_MOD_FINI_FUNC_POINTERS
},
3335 { "coalesced", BFD_MACH_O_S_COALESCED
},
3336 { "gb_zerofill", BFD_MACH_O_S_GB_ZEROFILL
},
3337 { "interposing", BFD_MACH_O_S_INTERPOSING
},
3338 { "16byte_literals", BFD_MACH_O_S_16BYTE_LITERALS
},
3339 { "dtrace_dof", BFD_MACH_O_S_DTRACE_DOF
},
3340 { "lazy_dylib_symbol_pointers", BFD_MACH_O_S_LAZY_DYLIB_SYMBOL_POINTERS
},
3344 static bfd_mach_o_xlat_name bfd_mach_o_section_attribute_name
[] =
3346 { "loc_reloc", BFD_MACH_O_S_ATTR_LOC_RELOC
},
3347 { "ext_reloc", BFD_MACH_O_S_ATTR_EXT_RELOC
},
3348 { "some_instructions", BFD_MACH_O_S_ATTR_SOME_INSTRUCTIONS
},
3349 { "debug", BFD_MACH_O_S_ATTR_DEBUG
},
3350 { "modifying_code", BFD_MACH_O_S_SELF_MODIFYING_CODE
},
3351 { "live_support", BFD_MACH_O_S_ATTR_LIVE_SUPPORT
},
3352 { "no_dead_strip", BFD_MACH_O_S_ATTR_NO_DEAD_STRIP
},
3353 { "strip_static_syms", BFD_MACH_O_S_ATTR_STRIP_STATIC_SYMS
},
3354 { "no_toc", BFD_MACH_O_S_ATTR_NO_TOC
},
3355 { "pure_instructions", BFD_MACH_O_S_ATTR_PURE_INSTRUCTIONS
},
3359 static bfd_mach_o_xlat_name bfd_mach_o_load_command_name
[] =
3361 { "segment", BFD_MACH_O_LC_SEGMENT
},
3362 { "symtab", BFD_MACH_O_LC_SYMTAB
},
3363 { "symseg", BFD_MACH_O_LC_SYMSEG
},
3364 { "thread", BFD_MACH_O_LC_THREAD
},
3365 { "unixthread", BFD_MACH_O_LC_UNIXTHREAD
},
3366 { "loadfvmlib", BFD_MACH_O_LC_LOADFVMLIB
},
3367 { "idfvmlib", BFD_MACH_O_LC_IDFVMLIB
},
3368 { "ident", BFD_MACH_O_LC_IDENT
},
3369 { "fvmfile", BFD_MACH_O_LC_FVMFILE
},
3370 { "prepage", BFD_MACH_O_LC_PREPAGE
},
3371 { "dysymtab", BFD_MACH_O_LC_DYSYMTAB
},
3372 { "load_dylib", BFD_MACH_O_LC_LOAD_DYLIB
},
3373 { "id_dylib", BFD_MACH_O_LC_ID_DYLIB
},
3374 { "load_dylinker", BFD_MACH_O_LC_LOAD_DYLINKER
},
3375 { "id_dylinker", BFD_MACH_O_LC_ID_DYLINKER
},
3376 { "prebound_dylib", BFD_MACH_O_LC_PREBOUND_DYLIB
},
3377 { "routines", BFD_MACH_O_LC_ROUTINES
},
3378 { "sub_framework", BFD_MACH_O_LC_SUB_FRAMEWORK
},
3379 { "sub_umbrella", BFD_MACH_O_LC_SUB_UMBRELLA
},
3380 { "sub_client", BFD_MACH_O_LC_SUB_CLIENT
},
3381 { "sub_library", BFD_MACH_O_LC_SUB_LIBRARY
},
3382 { "twolevel_hints", BFD_MACH_O_LC_TWOLEVEL_HINTS
},
3383 { "prebind_cksum", BFD_MACH_O_LC_PREBIND_CKSUM
},
3384 { "load_weak_dylib", BFD_MACH_O_LC_LOAD_WEAK_DYLIB
},
3385 { "segment_64", BFD_MACH_O_LC_SEGMENT_64
},
3386 { "routines_64", BFD_MACH_O_LC_ROUTINES_64
},
3387 { "uuid", BFD_MACH_O_LC_UUID
},
3388 { "rpath", BFD_MACH_O_LC_RPATH
},
3389 { "code_signature", BFD_MACH_O_LC_CODE_SIGNATURE
},
3390 { "segment_split_info", BFD_MACH_O_LC_SEGMENT_SPLIT_INFO
},
3391 { "reexport_dylib", BFD_MACH_O_LC_REEXPORT_DYLIB
},
3392 { "lazy_load_dylib", BFD_MACH_O_LC_LAZY_LOAD_DYLIB
},
3393 { "encryption_info", BFD_MACH_O_LC_ENCRYPTION_INFO
},
3394 { "dyld_info", BFD_MACH_O_LC_DYLD_INFO
},
3399 bfd_mach_o_print_private_header (bfd
*abfd
, FILE *file
)
3401 bfd_mach_o_data_struct
*mdata
= bfd_mach_o_get_data (abfd
);
3402 bfd_mach_o_header
*h
= &mdata
->header
;
3404 fputs (_("Mach-O header:\n"), file
);
3405 fprintf (file
, _(" magic : %08lx\n"), h
->magic
);
3406 fprintf (file
, _(" cputype : %08lx (%s)\n"), h
->cputype
,
3407 bfd_mach_o_get_name (bfd_mach_o_cpu_name
, h
->cputype
));
3408 fprintf (file
, _(" cpusubtype: %08lx\n"), h
->cpusubtype
);
3409 fprintf (file
, _(" filetype : %08lx (%s)\n"),
3411 bfd_mach_o_get_name (bfd_mach_o_filetype_name
, h
->filetype
));
3412 fprintf (file
, _(" ncmds : %08lx (%lu)\n"), h
->ncmds
, h
->ncmds
);
3413 fprintf (file
, _(" sizeofcmds: %08lx\n"), h
->sizeofcmds
);
3414 fprintf (file
, _(" flags : %08lx ("), h
->flags
);
3415 bfd_mach_o_print_flags (bfd_mach_o_header_flags_name
, h
->flags
, file
);
3416 fputs (_(")\n"), file
);
3417 fprintf (file
, _(" reserved : %08x\n"), h
->reserved
);
3421 bfd_mach_o_print_section_map (bfd
*abfd
, FILE *file
)
3423 bfd_mach_o_data_struct
*mdata
= bfd_mach_o_get_data (abfd
);
3425 unsigned int sec_nbr
= 0;
3427 fputs (_("Segments and Sections:\n"), file
);
3428 fputs (_(" #: Segment name Section name Address\n"), file
);
3430 for (i
= 0; i
< mdata
->header
.ncmds
; i
++)
3432 bfd_mach_o_segment_command
*seg
;
3434 if (mdata
->commands
[i
].type
!= BFD_MACH_O_LC_SEGMENT
3435 && mdata
->commands
[i
].type
!= BFD_MACH_O_LC_SEGMENT_64
)
3438 seg
= &mdata
->commands
[i
].command
.segment
;
3440 fprintf (file
, "[Segment %-16s ", seg
->segname
);
3441 fprintf_vma (file
, seg
->vmaddr
);
3442 fprintf (file
, "-");
3443 fprintf_vma (file
, seg
->vmaddr
+ seg
->vmsize
- 1);
3445 fputc (seg
->initprot
& BFD_MACH_O_PROT_READ
? 'r' : '-', file
);
3446 fputc (seg
->initprot
& BFD_MACH_O_PROT_WRITE
? 'w' : '-', file
);
3447 fputc (seg
->initprot
& BFD_MACH_O_PROT_EXECUTE
? 'x' : '-', file
);
3448 fprintf (file
, "]\n");
3449 for (j
= 0; j
< seg
->nsects
; j
++)
3451 bfd_mach_o_section
*sec
= &seg
->sections
[j
];
3452 fprintf (file
, "%02u: %-16s %-16s ", ++sec_nbr
,
3453 sec
->segname
, sec
->sectname
);
3454 fprintf_vma (file
, sec
->addr
);
3455 fprintf (file
, " ");
3456 fprintf_vma (file
, sec
->size
);
3457 fprintf (file
, " %08lx\n", sec
->flags
);
3463 bfd_mach_o_print_section (bfd
*abfd ATTRIBUTE_UNUSED
,
3464 bfd_mach_o_section
*sec
, FILE *file
)
3466 fprintf (file
, " Section: %-16s %-16s (bfdname: %s)\n",
3467 sec
->sectname
, sec
->segname
, sec
->bfdsection
->name
);
3468 fprintf (file
, " addr: ");
3469 fprintf_vma (file
, sec
->addr
);
3470 fprintf (file
, " size: ");
3471 fprintf_vma (file
, sec
->size
);
3472 fprintf (file
, " offset: ");
3473 fprintf_vma (file
, sec
->offset
);
3474 fprintf (file
, "\n");
3475 fprintf (file
, " align: %ld", sec
->align
);
3476 fprintf (file
, " nreloc: %lu reloff: ", sec
->nreloc
);
3477 fprintf_vma (file
, sec
->reloff
);
3478 fprintf (file
, "\n");
3479 fprintf (file
, " flags: %08lx (type: %s", sec
->flags
,
3480 bfd_mach_o_get_name (bfd_mach_o_section_type_name
,
3481 sec
->flags
& BFD_MACH_O_SECTION_TYPE_MASK
));
3482 fprintf (file
, " attr: ");
3483 bfd_mach_o_print_flags (bfd_mach_o_section_attribute_name
,
3484 sec
->flags
& BFD_MACH_O_SECTION_ATTRIBUTES_MASK
,
3486 fprintf (file
, ")\n");
3487 switch (sec
->flags
& BFD_MACH_O_SECTION_TYPE_MASK
)
3489 case BFD_MACH_O_S_NON_LAZY_SYMBOL_POINTERS
:
3490 case BFD_MACH_O_S_LAZY_SYMBOL_POINTERS
:
3491 case BFD_MACH_O_S_SYMBOL_STUBS
:
3492 fprintf (file
, " first indirect sym: %lu", sec
->reserved1
);
3493 fprintf (file
, " (%u entries)",
3494 bfd_mach_o_section_get_nbr_indirect (abfd
, sec
));
3497 fprintf (file
, " reserved1: 0x%lx", sec
->reserved1
);
3500 switch (sec
->flags
& BFD_MACH_O_SECTION_TYPE_MASK
)
3502 case BFD_MACH_O_S_SYMBOL_STUBS
:
3503 fprintf (file
, " stub size: %lu", sec
->reserved2
);
3506 fprintf (file
, " reserved2: 0x%lx", sec
->reserved2
);
3509 fprintf (file
, " reserved3: 0x%lx\n", sec
->reserved3
);
3513 bfd_mach_o_print_segment (bfd
*abfd ATTRIBUTE_UNUSED
,
3514 bfd_mach_o_load_command
*cmd
, FILE *file
)
3516 bfd_mach_o_segment_command
*seg
= &cmd
->command
.segment
;
3519 fprintf (file
, " name: %s\n", *seg
->segname
? seg
->segname
: "*none*");
3520 fprintf (file
, " vmaddr: ");
3521 fprintf_vma (file
, seg
->vmaddr
);
3522 fprintf (file
, " vmsize: ");
3523 fprintf_vma (file
, seg
->vmsize
);
3524 fprintf (file
, "\n");
3525 fprintf (file
, " fileoff: ");
3526 fprintf_vma (file
, seg
->fileoff
);
3527 fprintf (file
, " filesize: ");
3528 fprintf_vma (file
, (bfd_vma
)seg
->filesize
);
3529 fprintf (file
, " endoff: ");
3530 fprintf_vma (file
, (bfd_vma
)(seg
->fileoff
+ seg
->filesize
));
3531 fprintf (file
, "\n");
3532 fprintf (file
, " nsects: %lu ", seg
->nsects
);
3533 fprintf (file
, " flags: %lx\n", seg
->flags
);
3534 for (i
= 0; i
< seg
->nsects
; i
++)
3535 bfd_mach_o_print_section (abfd
, &seg
->sections
[i
], file
);
3539 bfd_mach_o_print_dysymtab (bfd
*abfd ATTRIBUTE_UNUSED
,
3540 bfd_mach_o_load_command
*cmd
, FILE *file
)
3542 bfd_mach_o_dysymtab_command
*dysymtab
= &cmd
->command
.dysymtab
;
3543 bfd_mach_o_data_struct
*mdata
= bfd_mach_o_get_data (abfd
);
3546 fprintf (file
, " local symbols: idx: %10lu num: %-8lu",
3547 dysymtab
->ilocalsym
, dysymtab
->nlocalsym
);
3548 fprintf (file
, " (nxtidx: %lu)\n",
3549 dysymtab
->ilocalsym
+ dysymtab
->nlocalsym
);
3550 fprintf (file
, " external symbols: idx: %10lu num: %-8lu",
3551 dysymtab
->iextdefsym
, dysymtab
->nextdefsym
);
3552 fprintf (file
, " (nxtidx: %lu)\n",
3553 dysymtab
->iextdefsym
+ dysymtab
->nextdefsym
);
3554 fprintf (file
, " undefined symbols: idx: %10lu num: %-8lu",
3555 dysymtab
->iundefsym
, dysymtab
->nundefsym
);
3556 fprintf (file
, " (nxtidx: %lu)\n",
3557 dysymtab
->iundefsym
+ dysymtab
->nundefsym
);
3558 fprintf (file
, " table of content: off: 0x%08lx num: %-8lu",
3559 dysymtab
->tocoff
, dysymtab
->ntoc
);
3560 fprintf (file
, " (endoff: 0x%08lx)\n",
3562 + dysymtab
->ntoc
* BFD_MACH_O_TABLE_OF_CONTENT_SIZE
);
3563 fprintf (file
, " module table: off: 0x%08lx num: %-8lu",
3564 dysymtab
->modtaboff
, dysymtab
->nmodtab
);
3565 fprintf (file
, " (endoff: 0x%08lx)\n",
3566 dysymtab
->modtaboff
+ dysymtab
->nmodtab
3567 * (mach_o_wide_p (&mdata
->header
) ?
3568 BFD_MACH_O_DYLIB_MODULE_64_SIZE
: BFD_MACH_O_DYLIB_MODULE_SIZE
));
3569 fprintf (file
, " external reference table: off: 0x%08lx num: %-8lu",
3570 dysymtab
->extrefsymoff
, dysymtab
->nextrefsyms
);
3571 fprintf (file
, " (endoff: 0x%08lx)\n",
3572 dysymtab
->extrefsymoff
3573 + dysymtab
->nextrefsyms
* BFD_MACH_O_REFERENCE_SIZE
);
3574 fprintf (file
, " indirect symbol table: off: 0x%08lx num: %-8lu",
3575 dysymtab
->indirectsymoff
, dysymtab
->nindirectsyms
);
3576 fprintf (file
, " (endoff: 0x%08lx)\n",
3577 dysymtab
->indirectsymoff
3578 + dysymtab
->nindirectsyms
* BFD_MACH_O_INDIRECT_SYMBOL_SIZE
);
3579 fprintf (file
, " external relocation table: off: 0x%08lx num: %-8lu",
3580 dysymtab
->extreloff
, dysymtab
->nextrel
);
3581 fprintf (file
, " (endoff: 0x%08lx)\n",
3582 dysymtab
->extreloff
+ dysymtab
->nextrel
* BFD_MACH_O_RELENT_SIZE
);
3583 fprintf (file
, " local relocation table: off: 0x%08lx num: %-8lu",
3584 dysymtab
->locreloff
, dysymtab
->nlocrel
);
3585 fprintf (file
, " (endoff: 0x%08lx)\n",
3586 dysymtab
->locreloff
+ dysymtab
->nlocrel
* BFD_MACH_O_RELENT_SIZE
);
3588 if (dysymtab
->ntoc
> 0
3589 || dysymtab
->nindirectsyms
> 0
3590 || dysymtab
->nextrefsyms
> 0)
3592 /* Try to read the symbols to display the toc or indirect symbols. */
3593 bfd_mach_o_read_symtab_symbols (abfd
);
3595 else if (dysymtab
->nmodtab
> 0)
3597 /* Try to read the strtab to display modules name. */
3598 bfd_mach_o_read_symtab_strtab (abfd
);
3601 for (i
= 0; i
< dysymtab
->nmodtab
; i
++)
3603 bfd_mach_o_dylib_module
*module
= &dysymtab
->dylib_module
[i
];
3604 fprintf (file
, " module %u:\n", i
);
3605 fprintf (file
, " name: %lu", module
->module_name_idx
);
3606 if (mdata
->symtab
&& mdata
->symtab
->strtab
)
3607 fprintf (file
, ": %s",
3608 mdata
->symtab
->strtab
+ module
->module_name_idx
);
3609 fprintf (file
, "\n");
3610 fprintf (file
, " extdefsym: idx: %8lu num: %lu\n",
3611 module
->iextdefsym
, module
->nextdefsym
);
3612 fprintf (file
, " refsym: idx: %8lu num: %lu\n",
3613 module
->irefsym
, module
->nrefsym
);
3614 fprintf (file
, " localsym: idx: %8lu num: %lu\n",
3615 module
->ilocalsym
, module
->nlocalsym
);
3616 fprintf (file
, " extrel: idx: %8lu num: %lu\n",
3617 module
->iextrel
, module
->nextrel
);
3618 fprintf (file
, " init: idx: %8u num: %u\n",
3619 module
->iinit
, module
->ninit
);
3620 fprintf (file
, " term: idx: %8u num: %u\n",
3621 module
->iterm
, module
->nterm
);
3622 fprintf (file
, " objc_module_info: addr: ");
3623 fprintf_vma (file
, module
->objc_module_info_addr
);
3624 fprintf (file
, " size: %lu\n", module
->objc_module_info_size
);
3627 if (dysymtab
->ntoc
> 0)
3629 bfd_mach_o_symtab_command
*symtab
= mdata
->symtab
;
3631 fprintf (file
, " table of content: (symbol/module)\n");
3632 for (i
= 0; i
< dysymtab
->ntoc
; i
++)
3634 bfd_mach_o_dylib_table_of_content
*toc
= &dysymtab
->dylib_toc
[i
];
3636 fprintf (file
, " %4u: ", i
);
3637 if (symtab
&& symtab
->symbols
&& toc
->symbol_index
< symtab
->nsyms
)
3639 const char *name
= symtab
->symbols
[toc
->symbol_index
].symbol
.name
;
3640 fprintf (file
, "%s (%lu)", name
? name
: "*invalid*",
3644 fprintf (file
, "%lu", toc
->symbol_index
);
3646 fprintf (file
, " / ");
3647 if (symtab
&& symtab
->strtab
3648 && toc
->module_index
< dysymtab
->nmodtab
)
3650 bfd_mach_o_dylib_module
*mod
;
3651 mod
= &dysymtab
->dylib_module
[toc
->module_index
];
3652 fprintf (file
, "%s (%lu)",
3653 symtab
->strtab
+ mod
->module_name_idx
,
3657 fprintf (file
, "%lu", toc
->module_index
);
3659 fprintf (file
, "\n");
3663 if (dysymtab
->nindirectsyms
!= 0)
3665 fprintf (file
, " indirect symbols:\n");
3667 for (i
= 0; i
< mdata
->nsects
; i
++)
3669 bfd_mach_o_section
*sec
= mdata
->sections
[i
];
3670 unsigned int j
, first
, last
;
3671 bfd_mach_o_symtab_command
*symtab
= mdata
->symtab
;
3675 switch (sec
->flags
& BFD_MACH_O_SECTION_TYPE_MASK
)
3677 case BFD_MACH_O_S_NON_LAZY_SYMBOL_POINTERS
:
3678 case BFD_MACH_O_S_LAZY_SYMBOL_POINTERS
:
3679 case BFD_MACH_O_S_SYMBOL_STUBS
:
3680 first
= sec
->reserved1
;
3681 last
= first
+ bfd_mach_o_section_get_nbr_indirect (abfd
, sec
);
3683 entry_size
= bfd_mach_o_section_get_entry_size (abfd
, sec
);
3684 fprintf (file
, " for section %s.%s:\n",
3685 sec
->segname
, sec
->sectname
);
3686 for (j
= first
; j
< last
; j
++)
3688 unsigned int isym
= dysymtab
->indirect_syms
[j
];
3690 fprintf (file
, " ");
3691 fprintf_vma (file
, addr
);
3692 fprintf (file
, " %5u: 0x%08x", j
, isym
);
3693 if (isym
& BFD_MACH_O_INDIRECT_SYMBOL_LOCAL
)
3694 fprintf (file
, " LOCAL");
3695 if (isym
& BFD_MACH_O_INDIRECT_SYMBOL_ABS
)
3696 fprintf (file
, " ABSOLUTE");
3697 if (symtab
&& symtab
->symbols
3698 && isym
< symtab
->nsyms
3699 && symtab
->symbols
[isym
].symbol
.name
)
3700 fprintf (file
, " %s", symtab
->symbols
[isym
].symbol
.name
);
3701 fprintf (file
, "\n");
3710 if (dysymtab
->nextrefsyms
> 0)
3712 bfd_mach_o_symtab_command
*symtab
= mdata
->symtab
;
3714 fprintf (file
, " external reference table: (symbol flags)\n");
3715 for (i
= 0; i
< dysymtab
->nextrefsyms
; i
++)
3717 bfd_mach_o_dylib_reference
*ref
= &dysymtab
->ext_refs
[i
];
3719 fprintf (file
, " %4u: %5lu 0x%02lx", i
, ref
->isym
, ref
->flags
);
3720 if (symtab
&& symtab
->symbols
3721 && ref
->isym
< symtab
->nsyms
3722 && symtab
->symbols
[ref
->isym
].symbol
.name
)
3723 fprintf (file
, " %s", symtab
->symbols
[ref
->isym
].symbol
.name
);
3724 fprintf (file
, "\n");
3731 bfd_mach_o_print_dyld_info (bfd
*abfd ATTRIBUTE_UNUSED
,
3732 bfd_mach_o_load_command
*cmd
, FILE *file
)
3734 bfd_mach_o_dyld_info_command
*info
= &cmd
->command
.dyld_info
;
3736 fprintf (file
, " rebase: off: 0x%08x size: %-8u\n",
3737 info
->rebase_off
, info
->rebase_size
);
3738 fprintf (file
, " bind: off: 0x%08x size: %-8u\n",
3739 info
->bind_off
, info
->bind_size
);
3740 fprintf (file
, " weak bind: off: 0x%08x size: %-8u\n",
3741 info
->weak_bind_off
, info
->weak_bind_size
);
3742 fprintf (file
, " lazy bind: off: 0x%08x size: %-8u\n",
3743 info
->lazy_bind_off
, info
->lazy_bind_size
);
3744 fprintf (file
, " export: off: 0x%08x size: %-8u\n",
3745 info
->export_off
, info
->export_size
);
3749 bfd_mach_o_bfd_print_private_bfd_data (bfd
*abfd
, void * ptr
)
3751 bfd_mach_o_data_struct
*mdata
= bfd_mach_o_get_data (abfd
);
3752 FILE *file
= (FILE *) ptr
;
3755 bfd_mach_o_print_private_header (abfd
, file
);
3758 for (i
= 0; i
< mdata
->header
.ncmds
; i
++)
3760 bfd_mach_o_load_command
*cmd
= &mdata
->commands
[i
];
3762 fprintf (file
, "Load command %s:",
3763 bfd_mach_o_get_name (bfd_mach_o_load_command_name
, cmd
->type
));
3766 case BFD_MACH_O_LC_SEGMENT
:
3767 case BFD_MACH_O_LC_SEGMENT_64
:
3768 bfd_mach_o_print_segment (abfd
, cmd
, file
);
3770 case BFD_MACH_O_LC_UUID
:
3772 bfd_mach_o_uuid_command
*uuid
= &cmd
->command
.uuid
;
3775 for (j
= 0; j
< sizeof (uuid
->uuid
); j
++)
3776 fprintf (file
, " %02x", uuid
->uuid
[j
]);
3780 case BFD_MACH_O_LC_LOAD_DYLIB
:
3781 case BFD_MACH_O_LC_LOAD_WEAK_DYLIB
:
3782 case BFD_MACH_O_LC_REEXPORT_DYLIB
:
3783 case BFD_MACH_O_LC_ID_DYLIB
:
3785 bfd_mach_o_dylib_command
*dylib
= &cmd
->command
.dylib
;
3786 fprintf (file
, " %s\n", dylib
->name_str
);
3787 fprintf (file
, " time stamp: 0x%08lx\n",
3789 fprintf (file
, " current version: 0x%08lx\n",
3790 dylib
->current_version
);
3791 fprintf (file
, " comptibility version: 0x%08lx\n",
3792 dylib
->compatibility_version
);
3795 case BFD_MACH_O_LC_LOAD_DYLINKER
:
3796 case BFD_MACH_O_LC_ID_DYLINKER
:
3797 fprintf (file
, " %s\n", cmd
->command
.dylinker
.name_str
);
3799 case BFD_MACH_O_LC_SYMTAB
:
3801 bfd_mach_o_symtab_command
*symtab
= &cmd
->command
.symtab
;
3804 " symoff: 0x%08x nsyms: %8u (endoff: 0x%08x)\n",
3805 symtab
->symoff
, symtab
->nsyms
,
3806 symtab
->symoff
+ symtab
->nsyms
3807 * (mach_o_wide_p (&mdata
->header
)
3808 ? BFD_MACH_O_NLIST_64_SIZE
: BFD_MACH_O_NLIST_SIZE
));
3810 " stroff: 0x%08x strsize: %8u (endoff: 0x%08x)\n",
3811 symtab
->stroff
, symtab
->strsize
,
3812 symtab
->stroff
+ symtab
->strsize
);
3815 case BFD_MACH_O_LC_DYSYMTAB
:
3816 fprintf (file
, "\n");
3817 bfd_mach_o_print_dysymtab (abfd
, cmd
, file
);
3819 case BFD_MACH_O_LC_CODE_SIGNATURE
:
3820 case BFD_MACH_O_LC_SEGMENT_SPLIT_INFO
:
3822 bfd_mach_o_linkedit_command
*linkedit
= &cmd
->command
.linkedit
;
3825 " dataoff: 0x%08lx datasize: 0x%08lx (endoff: 0x%08lx)\n",
3826 linkedit
->dataoff
, linkedit
->datasize
,
3827 linkedit
->dataoff
+ linkedit
->datasize
);
3830 case BFD_MACH_O_LC_SUB_FRAMEWORK
:
3831 case BFD_MACH_O_LC_SUB_UMBRELLA
:
3832 case BFD_MACH_O_LC_SUB_LIBRARY
:
3833 case BFD_MACH_O_LC_SUB_CLIENT
:
3834 case BFD_MACH_O_LC_RPATH
:
3836 bfd_mach_o_str_command
*str
= &cmd
->command
.str
;
3837 fprintf (file
, " %s\n", str
->str
);
3840 case BFD_MACH_O_LC_THREAD
:
3841 case BFD_MACH_O_LC_UNIXTHREAD
:
3843 bfd_mach_o_thread_command
*thread
= &cmd
->command
.thread
;
3845 bfd_mach_o_backend_data
*bed
= bfd_mach_o_get_backend_data (abfd
);
3847 fprintf (file
, " nflavours: %lu\n", thread
->nflavours
);
3848 for (j
= 0; j
< thread
->nflavours
; j
++)
3850 bfd_mach_o_thread_flavour
*flavour
= &thread
->flavours
[j
];
3852 fprintf (file
, " %2u: flavour: 0x%08lx offset: 0x%08lx"
3854 j
, flavour
->flavour
, flavour
->offset
,
3856 if (bed
->_bfd_mach_o_print_thread
)
3858 char *buf
= bfd_malloc (flavour
->size
);
3861 && bfd_seek (abfd
, flavour
->offset
, SEEK_SET
) == 0
3862 && (bfd_bread (buf
, flavour
->size
, abfd
)
3864 (*bed
->_bfd_mach_o_print_thread
)(abfd
, flavour
,
3871 case BFD_MACH_O_LC_DYLD_INFO
:
3872 fprintf (file
, "\n");
3873 bfd_mach_o_print_dyld_info (abfd
, cmd
, file
);
3876 fprintf (file
, "\n");
3882 bfd_mach_o_print_section_map (abfd
, file
);
3888 bfd_mach_o_core_fetch_environment (bfd
*abfd
,
3889 unsigned char **rbuf
,
3892 bfd_mach_o_data_struct
*mdata
= bfd_mach_o_get_data (abfd
);
3893 unsigned long stackaddr
= bfd_mach_o_stack_addr (mdata
->header
.cputype
);
3896 for (i
= 0; i
< mdata
->header
.ncmds
; i
++)
3898 bfd_mach_o_load_command
*cur
= &mdata
->commands
[i
];
3899 bfd_mach_o_segment_command
*seg
= NULL
;
3901 if (cur
->type
!= BFD_MACH_O_LC_SEGMENT
)
3904 seg
= &cur
->command
.segment
;
3906 if ((seg
->vmaddr
+ seg
->vmsize
) == stackaddr
)
3908 unsigned long start
= seg
->fileoff
;
3909 unsigned long end
= seg
->fileoff
+ seg
->filesize
;
3910 unsigned char *buf
= bfd_malloc (1024);
3911 unsigned long size
= 1024;
3915 bfd_size_type nread
= 0;
3916 unsigned long offset
;
3917 int found_nonnull
= 0;
3919 if (size
> (end
- start
))
3920 size
= (end
- start
);
3922 buf
= bfd_realloc_or_free (buf
, size
);
3926 if (bfd_seek (abfd
, end
- size
, SEEK_SET
) != 0)
3932 nread
= bfd_bread (buf
, size
, abfd
);
3940 for (offset
= 4; offset
<= size
; offset
+= 4)
3944 val
= *((unsigned long *) (buf
+ size
- offset
));
3945 if (! found_nonnull
)
3950 else if (val
== 0x0)
3952 unsigned long bottom
;
3955 bottom
= seg
->fileoff
+ seg
->filesize
- offset
;
3956 top
= seg
->fileoff
+ seg
->filesize
- 4;
3957 *rbuf
= bfd_malloc (top
- bottom
);
3958 *rlen
= top
- bottom
;
3960 memcpy (*rbuf
, buf
+ size
- *rlen
, *rlen
);
3966 if (size
== (end
- start
))
3980 bfd_mach_o_core_file_failing_command (bfd
*abfd
)
3982 unsigned char *buf
= NULL
;
3983 unsigned int len
= 0;
3986 ret
= bfd_mach_o_core_fetch_environment (abfd
, &buf
, &len
);
3990 return (char *) buf
;
3994 bfd_mach_o_core_file_failing_signal (bfd
*abfd ATTRIBUTE_UNUSED
)
3999 #define bfd_mach_o_bfd_reloc_type_lookup _bfd_norelocs_bfd_reloc_type_lookup
4000 #define bfd_mach_o_bfd_reloc_name_lookup _bfd_norelocs_bfd_reloc_name_lookup
4002 #define bfd_mach_o_swap_reloc_in NULL
4003 #define bfd_mach_o_swap_reloc_out NULL
4004 #define bfd_mach_o_print_thread NULL
4006 #define TARGET_NAME mach_o_be_vec
4007 #define TARGET_STRING "mach-o-be"
4008 #define TARGET_ARCHITECTURE bfd_arch_unknown
4009 #define TARGET_BIG_ENDIAN 1
4010 #define TARGET_ARCHIVE 0
4011 #include "mach-o-target.c"
4014 #undef TARGET_STRING
4015 #undef TARGET_ARCHITECTURE
4016 #undef TARGET_BIG_ENDIAN
4017 #undef TARGET_ARCHIVE
4019 #define TARGET_NAME mach_o_le_vec
4020 #define TARGET_STRING "mach-o-le"
4021 #define TARGET_ARCHITECTURE bfd_arch_unknown
4022 #define TARGET_BIG_ENDIAN 0
4023 #define TARGET_ARCHIVE 0
4025 #include "mach-o-target.c"
4028 #undef TARGET_STRING
4029 #undef TARGET_ARCHITECTURE
4030 #undef TARGET_BIG_ENDIAN
4031 #undef TARGET_ARCHIVE
4033 /* Not yet handled: creating an archive. */
4034 #define bfd_mach_o_mkarchive _bfd_noarchive_mkarchive
4037 #define bfd_mach_o_read_ar_hdr _bfd_noarchive_read_ar_hdr
4038 #define bfd_mach_o_write_ar_hdr _bfd_noarchive_write_ar_hdr
4039 #define bfd_mach_o_slurp_armap _bfd_noarchive_slurp_armap
4040 #define bfd_mach_o_slurp_extended_name_table _bfd_noarchive_slurp_extended_name_table
4041 #define bfd_mach_o_construct_extended_name_table _bfd_noarchive_construct_extended_name_table
4042 #define bfd_mach_o_truncate_arname _bfd_noarchive_truncate_arname
4043 #define bfd_mach_o_write_armap _bfd_noarchive_write_armap
4044 #define bfd_mach_o_get_elt_at_index _bfd_noarchive_get_elt_at_index
4045 #define bfd_mach_o_generic_stat_arch_elt _bfd_noarchive_generic_stat_arch_elt
4046 #define bfd_mach_o_update_armap_timestamp _bfd_noarchive_update_armap_timestamp
4048 #define TARGET_NAME mach_o_fat_vec
4049 #define TARGET_STRING "mach-o-fat"
4050 #define TARGET_ARCHITECTURE bfd_arch_unknown
4051 #define TARGET_BIG_ENDIAN 1
4052 #define TARGET_ARCHIVE 1
4054 #include "mach-o-target.c"
4057 #undef TARGET_STRING
4058 #undef TARGET_ARCHITECTURE
4059 #undef TARGET_BIG_ENDIAN
4060 #undef TARGET_ARCHIVE