1 /* Mach-O support for BFD.
2 Copyright 1999, 2000, 2001, 2002
3 Free Software Foundation, Inc.
5 This file is part of BFD, the Binary File Descriptor library.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
25 #include "libiberty.h"
29 #define BFD_IO_FUNCS 0
32 #define bfd_mach_o_mkarchive _bfd_noarchive_mkarchive
33 #define bfd_mach_o_read_ar_hdr _bfd_noarchive_read_ar_hdr
34 #define bfd_mach_o_slurp_armap _bfd_noarchive_slurp_armap
35 #define bfd_mach_o_slurp_extended_name_table _bfd_noarchive_slurp_extended_name_table
36 #define bfd_mach_o_construct_extended_name_table _bfd_noarchive_construct_extended_name_table
37 #define bfd_mach_o_truncate_arname _bfd_noarchive_truncate_arname
38 #define bfd_mach_o_write_armap _bfd_noarchive_write_armap
39 #define bfd_mach_o_get_elt_at_index _bfd_noarchive_get_elt_at_index
40 #define bfd_mach_o_generic_stat_arch_elt _bfd_noarchive_generic_stat_arch_elt
41 #define bfd_mach_o_update_armap_timestamp _bfd_noarchive_update_armap_timestamp
42 #define bfd_mach_o_close_and_cleanup _bfd_generic_close_and_cleanup
43 #define bfd_mach_o_bfd_free_cached_info _bfd_generic_bfd_free_cached_info
44 #define bfd_mach_o_new_section_hook _bfd_generic_new_section_hook
45 #define bfd_mach_o_get_section_contents_in_window _bfd_generic_get_section_contents_in_window
46 #define bfd_mach_o_bfd_is_local_label_name _bfd_nosymbols_bfd_is_local_label_name
47 #define bfd_mach_o_get_lineno _bfd_nosymbols_get_lineno
48 #define bfd_mach_o_find_nearest_line _bfd_nosymbols_find_nearest_line
49 #define bfd_mach_o_bfd_make_debug_symbol _bfd_nosymbols_bfd_make_debug_symbol
50 #define bfd_mach_o_read_minisymbols _bfd_generic_read_minisymbols
51 #define bfd_mach_o_minisymbol_to_symbol _bfd_generic_minisymbol_to_symbol
52 #define bfd_mach_o_get_reloc_upper_bound _bfd_norelocs_get_reloc_upper_bound
53 #define bfd_mach_o_canonicalize_reloc _bfd_norelocs_canonicalize_reloc
54 #define bfd_mach_o_bfd_reloc_type_lookup _bfd_norelocs_bfd_reloc_type_lookup
55 #define bfd_mach_o_bfd_get_relocated_section_contents bfd_generic_get_relocated_section_contents
56 #define bfd_mach_o_bfd_relax_section bfd_generic_relax_section
57 #define bfd_mach_o_bfd_link_hash_table_create _bfd_generic_link_hash_table_create
58 #define bfd_mach_o_bfd_link_hash_table_free _bfd_generic_link_hash_table_free
59 #define bfd_mach_o_bfd_link_add_symbols _bfd_generic_link_add_symbols
60 #define bfd_mach_o_bfd_link_just_syms _bfd_generic_link_just_syms
61 #define bfd_mach_o_bfd_final_link _bfd_generic_final_link
62 #define bfd_mach_o_bfd_link_split_section _bfd_generic_link_split_section
63 #define bfd_mach_o_set_arch_mach bfd_default_set_arch_mach
64 #define bfd_mach_o_bfd_merge_private_bfd_data _bfd_generic_bfd_merge_private_bfd_data
65 #define bfd_mach_o_bfd_set_private_flags _bfd_generic_bfd_set_private_flags
66 #define bfd_mach_o_bfd_print_private_bfd_data _bfd_generic_bfd_print_private_bfd_data
67 #define bfd_mach_o_get_section_contents _bfd_generic_get_section_contents
68 #define bfd_mach_o_set_section_contents _bfd_generic_set_section_contents
69 #define bfd_mach_o_bfd_gc_sections bfd_generic_gc_sections
70 #define bfd_mach_o_bfd_merge_sections bfd_generic_merge_sections
71 #define bfd_mach_o_bfd_discard_group bfd_generic_discard_group
73 static boolean bfd_mach_o_bfd_copy_private_symbol_data
PARAMS ((bfd
*, asymbol
*, bfd
*, asymbol
*));
74 static boolean bfd_mach_o_bfd_copy_private_section_data
PARAMS ((bfd
*, asection
*, bfd
*, asection
*));
75 static boolean bfd_mach_o_bfd_copy_private_bfd_data
PARAMS ((bfd
*, bfd
*));
76 static long bfd_mach_o_count_symbols
PARAMS ((bfd
*));
77 static long bfd_mach_o_get_symtab_upper_bound
PARAMS ((bfd
*));
78 static long bfd_mach_o_get_symtab
PARAMS ((bfd
*, asymbol
**));
79 static void bfd_mach_o_get_symbol_info
PARAMS ((bfd
*, asymbol
*, symbol_info
*));
80 static void bfd_mach_o_print_symbol
PARAMS ((bfd
*, PTR
, asymbol
*, bfd_print_symbol_type
));
81 static void bfd_mach_o_convert_architecture
PARAMS ((bfd_mach_o_cpu_type
, bfd_mach_o_cpu_subtype
, enum bfd_architecture
*, unsigned long *));
82 static boolean bfd_mach_o_write_contents
PARAMS ((bfd
*));
83 static int bfd_mach_o_sizeof_headers
PARAMS ((bfd
*, boolean
));
84 static asymbol
* bfd_mach_o_make_empty_symbol
PARAMS ((bfd
*));
85 static int bfd_mach_o_write_header
PARAMS ((bfd
*, bfd_mach_o_header
*));
86 static int bfd_mach_o_read_header
PARAMS ((bfd
*, bfd_mach_o_header
*));
87 static asection
* bfd_mach_o_make_bfd_section
PARAMS ((bfd
*, bfd_mach_o_section
*));
88 static int bfd_mach_o_scan_read_section
PARAMS ((bfd
*, bfd_mach_o_section
*, bfd_vma
));
89 static int bfd_mach_o_scan_write_section
PARAMS ((bfd
*, bfd_mach_o_section
*, bfd_vma
));
90 static int bfd_mach_o_scan_write_symtab_symbols
PARAMS ((bfd
*, bfd_mach_o_load_command
*));
91 static int bfd_mach_o_scan_write_thread
PARAMS ((bfd
*, bfd_mach_o_load_command
*));
92 static int bfd_mach_o_scan_read_dylinker
PARAMS ((bfd
*, bfd_mach_o_load_command
*));
93 static int bfd_mach_o_scan_read_dylib
PARAMS ((bfd
*, bfd_mach_o_load_command
*));
94 static int bfd_mach_o_scan_read_prebound_dylib
PARAMS ((bfd
*, bfd_mach_o_load_command
*));
95 static int bfd_mach_o_scan_read_thread
PARAMS ((bfd
*, bfd_mach_o_load_command
*));
96 static int bfd_mach_o_scan_write_symtab
PARAMS ((bfd
*, bfd_mach_o_load_command
*));
97 static int bfd_mach_o_scan_read_dysymtab
PARAMS ((bfd
*, bfd_mach_o_load_command
*));
98 static int bfd_mach_o_scan_read_symtab
PARAMS ((bfd
*, bfd_mach_o_load_command
*));
99 static int bfd_mach_o_scan_read_segment
PARAMS ((bfd
*, bfd_mach_o_load_command
*));
100 static int bfd_mach_o_scan_write_segment
PARAMS ((bfd
*, bfd_mach_o_load_command
*));
101 static int bfd_mach_o_scan_read_command
PARAMS ((bfd
*, bfd_mach_o_load_command
*));
102 static void bfd_mach_o_flatten_sections
PARAMS ((bfd
*));
103 static const char * bfd_mach_o_i386_flavour_string
PARAMS ((unsigned int));
104 static const char * bfd_mach_o_ppc_flavour_string
PARAMS ((unsigned int));
106 /* The flags field of a section structure is separated into two parts a section
107 type and section attributes. The section types are mutually exclusive (it
108 can only have one type) but the section attributes are not (it may have more
109 than one attribute). */
111 #define SECTION_TYPE 0x000000ff /* 256 section types. */
112 #define SECTION_ATTRIBUTES 0xffffff00 /* 24 section attributes. */
114 /* Constants for the section attributes part of the flags field of a section
117 #define SECTION_ATTRIBUTES_USR 0xff000000 /* User-settable attributes. */
118 #define S_ATTR_PURE_INSTRUCTIONS 0x80000000 /* Section contains only true machine instructions. */
119 #define SECTION_ATTRIBUTES_SYS 0x00ffff00 /* System setable attributes. */
120 #define S_ATTR_SOME_INSTRUCTIONS 0x00000400 /* Section contains some machine instructions. */
121 #define S_ATTR_EXT_RELOC 0x00000200 /* Section has external relocation entries. */
122 #define S_ATTR_LOC_RELOC 0x00000100 /* Section has local relocation entries. */
133 bfd_mach_o_valid (abfd
)
136 if (abfd
== NULL
|| abfd
->xvec
== NULL
)
139 if (! ((abfd
->xvec
== &mach_o_be_vec
)
140 || (abfd
->xvec
== &mach_o_le_vec
)
141 || (abfd
->xvec
== &mach_o_fat_vec
)))
144 if (abfd
->tdata
.mach_o_data
== NULL
)
149 /* Copy any private info we understand from the input symbol
150 to the output symbol. */
153 bfd_mach_o_bfd_copy_private_symbol_data (ibfd
, isymbol
, obfd
, osymbol
)
154 bfd
*ibfd ATTRIBUTE_UNUSED
;
155 asymbol
*isymbol ATTRIBUTE_UNUSED
;
156 bfd
*obfd ATTRIBUTE_UNUSED
;
157 asymbol
*osymbol ATTRIBUTE_UNUSED
;
162 /* Copy any private info we understand from the input section
163 to the output section. */
166 bfd_mach_o_bfd_copy_private_section_data (ibfd
, isection
, obfd
, osection
)
167 bfd
*ibfd ATTRIBUTE_UNUSED
;
168 asection
*isection ATTRIBUTE_UNUSED
;
169 bfd
*obfd ATTRIBUTE_UNUSED
;
170 asection
*osection ATTRIBUTE_UNUSED
;
175 /* Copy any private info we understand from the input bfd
176 to the output bfd. */
179 bfd_mach_o_bfd_copy_private_bfd_data (ibfd
, obfd
)
183 BFD_ASSERT (bfd_mach_o_valid (ibfd
));
184 BFD_ASSERT (bfd_mach_o_valid (obfd
));
186 obfd
->tdata
.mach_o_data
= ibfd
->tdata
.mach_o_data
;
187 obfd
->tdata
.mach_o_data
->ibfd
= ibfd
;
192 bfd_mach_o_count_symbols (abfd
)
195 bfd_mach_o_data_struct
*mdata
= NULL
;
199 BFD_ASSERT (bfd_mach_o_valid (abfd
));
200 mdata
= abfd
->tdata
.mach_o_data
;
202 for (i
= 0; i
< mdata
->header
.ncmds
; i
++)
203 if (mdata
->commands
[i
].type
== BFD_MACH_O_LC_SYMTAB
)
205 bfd_mach_o_symtab_command
*sym
= &mdata
->commands
[i
].command
.symtab
;
213 bfd_mach_o_get_symtab_upper_bound (abfd
)
216 long nsyms
= bfd_mach_o_count_symbols (abfd
);
221 return ((nsyms
+ 1) * sizeof (asymbol
*));
225 bfd_mach_o_get_symtab (abfd
, alocation
)
229 bfd_mach_o_data_struct
*mdata
= abfd
->tdata
.mach_o_data
;
230 long nsyms
= bfd_mach_o_count_symbols (abfd
);
231 asymbol
**csym
= alocation
;
237 for (i
= 0; i
< mdata
->header
.ncmds
; i
++)
239 if (mdata
->commands
[i
].type
== BFD_MACH_O_LC_SYMTAB
)
241 bfd_mach_o_symtab_command
*sym
= &mdata
->commands
[i
].command
.symtab
;
243 if (bfd_mach_o_scan_read_symtab_symbols (abfd
, &mdata
->commands
[i
].command
.symtab
) != 0)
245 fprintf (stderr
, "bfd_mach_o_get_symtab: unable to load symbols for section %lu\n", i
);
249 BFD_ASSERT (sym
->symbols
!= NULL
);
251 for (j
= 0; j
< sym
->nsyms
; j
++)
253 BFD_ASSERT (csym
< (alocation
+ nsyms
));
254 *csym
++ = &sym
->symbols
[j
];
265 bfd_mach_o_get_symbol_info (abfd
, symbol
, ret
)
266 bfd
*abfd ATTRIBUTE_UNUSED
;
270 bfd_symbol_info (symbol
, ret
);
274 bfd_mach_o_print_symbol (abfd
, afile
, symbol
, how
)
278 bfd_print_symbol_type how
;
280 FILE *file
= (FILE *) afile
;
284 case bfd_print_symbol_name
:
285 fprintf (file
, "%s", symbol
->name
);
288 bfd_print_symbol_vandf (abfd
, (PTR
) file
, symbol
);
289 fprintf (file
, " %-5s %s", symbol
->section
->name
, symbol
->name
);
294 bfd_mach_o_convert_architecture (mtype
, msubtype
, type
, subtype
)
295 bfd_mach_o_cpu_type mtype
;
296 bfd_mach_o_cpu_subtype msubtype ATTRIBUTE_UNUSED
;
297 enum bfd_architecture
*type
;
298 unsigned long *subtype
;
300 *subtype
= bfd_arch_unknown
;
304 case BFD_MACH_O_CPU_TYPE_VAX
: *type
= bfd_arch_vax
; break;
305 case BFD_MACH_O_CPU_TYPE_MC680x0
: *type
= bfd_arch_m68k
; break;
306 case BFD_MACH_O_CPU_TYPE_I386
: *type
= bfd_arch_i386
; break;
307 case BFD_MACH_O_CPU_TYPE_MIPS
: *type
= bfd_arch_mips
; break;
308 case BFD_MACH_O_CPU_TYPE_MC98000
: *type
= bfd_arch_m98k
; break;
309 case BFD_MACH_O_CPU_TYPE_HPPA
: *type
= bfd_arch_hppa
; break;
310 case BFD_MACH_O_CPU_TYPE_ARM
: *type
= bfd_arch_arm
; break;
311 case BFD_MACH_O_CPU_TYPE_MC88000
: *type
= bfd_arch_m88k
; break;
312 case BFD_MACH_O_CPU_TYPE_SPARC
: *type
= bfd_arch_sparc
; break;
313 case BFD_MACH_O_CPU_TYPE_I860
: *type
= bfd_arch_i860
; break;
314 case BFD_MACH_O_CPU_TYPE_ALPHA
: *type
= bfd_arch_alpha
; break;
315 case BFD_MACH_O_CPU_TYPE_POWERPC
: *type
= bfd_arch_powerpc
; break;
316 default: *type
= bfd_arch_unknown
; break;
321 case bfd_arch_i386
: *subtype
= bfd_mach_i386_i386
; break;
322 case bfd_arch_sparc
: *subtype
= bfd_mach_sparc
; break;
324 *subtype
= bfd_arch_unknown
;
329 bfd_mach_o_write_contents (abfd
)
335 bfd_mach_o_data_struct
*mdata
= abfd
->tdata
.mach_o_data
;
337 /* Write data sections first in case they overlap header data to be
340 for (s
= abfd
->sections
; s
!= (asection
*) NULL
; s
= s
->next
)
344 for (i
= 0; i
< mdata
->header
.ncmds
; i
++)
346 bfd_mach_o_load_command
*cur
= &mdata
->commands
[i
];
347 if (cur
->type
!= BFD_MACH_O_LC_SEGMENT
)
351 bfd_mach_o_segment_command
*seg
= &cur
->command
.segment
;
353 bfd_vma nbytes
= seg
->filesize
;
354 bfd_vma curoff
= seg
->fileoff
;
358 bfd_vma thisread
= nbytes
;
363 bfd_seek (abfd
, curoff
, SEEK_SET
);
364 if (bfd_bread ((PTR
) buf
, thisread
, abfd
) != thisread
)
367 bfd_seek (abfd
, curoff
, SEEK_SET
);
368 if (bfd_bwrite ((PTR
) buf
, thisread
, abfd
) != thisread
)
378 /* Now write header information. */
379 if (bfd_mach_o_write_header (abfd
, &mdata
->header
) != 0)
382 for (i
= 0; i
< mdata
->header
.ncmds
; i
++)
384 unsigned char buf
[8];
385 bfd_mach_o_load_command
*cur
= &mdata
->commands
[i
];
386 unsigned long typeflag
;
388 typeflag
= cur
->type_required
? cur
->type
& BFD_MACH_O_LC_REQ_DYLD
: cur
->type
;
390 bfd_h_put_32 (abfd
, typeflag
, buf
);
391 bfd_h_put_32 (abfd
, cur
->len
, buf
+ 4);
393 bfd_seek (abfd
, cur
->offset
, SEEK_SET
);
394 if (bfd_bwrite ((PTR
) buf
, 8, abfd
) != 8)
399 case BFD_MACH_O_LC_SEGMENT
:
400 if (bfd_mach_o_scan_write_segment (abfd
, cur
) != 0)
403 case BFD_MACH_O_LC_SYMTAB
:
404 if (bfd_mach_o_scan_write_symtab (abfd
, cur
) != 0)
407 case BFD_MACH_O_LC_SYMSEG
:
409 case BFD_MACH_O_LC_THREAD
:
410 case BFD_MACH_O_LC_UNIXTHREAD
:
411 if (bfd_mach_o_scan_write_thread (abfd
, cur
) != 0)
414 case BFD_MACH_O_LC_LOADFVMLIB
:
415 case BFD_MACH_O_LC_IDFVMLIB
:
416 case BFD_MACH_O_LC_IDENT
:
417 case BFD_MACH_O_LC_FVMFILE
:
418 case BFD_MACH_O_LC_PREPAGE
:
419 case BFD_MACH_O_LC_DYSYMTAB
:
420 case BFD_MACH_O_LC_LOAD_DYLIB
:
421 case BFD_MACH_O_LC_LOAD_WEAK_DYLIB
:
422 case BFD_MACH_O_LC_ID_DYLIB
:
423 case BFD_MACH_O_LC_LOAD_DYLINKER
:
424 case BFD_MACH_O_LC_ID_DYLINKER
:
425 case BFD_MACH_O_LC_PREBOUND_DYLIB
:
426 case BFD_MACH_O_LC_ROUTINES
:
427 case BFD_MACH_O_LC_SUB_FRAMEWORK
:
431 "unable to write unknown load command 0x%lx\n",
441 bfd_mach_o_sizeof_headers (a
, b
)
442 bfd
*a ATTRIBUTE_UNUSED
;
443 boolean b ATTRIBUTE_UNUSED
;
448 /* Make an empty symbol. This is required only because
449 bfd_make_section_anyway wants to create a symbol for the section. */
452 bfd_mach_o_make_empty_symbol (abfd
)
457 new = (asymbol
*) bfd_zalloc (abfd
, sizeof (asymbol
));
465 bfd_mach_o_write_header (abfd
, header
)
467 bfd_mach_o_header
*header
;
469 unsigned char buf
[28];
471 bfd_h_put_32 (abfd
, header
->magic
, buf
+ 0);
472 bfd_h_put_32 (abfd
, header
->cputype
, buf
+ 4);
473 bfd_h_put_32 (abfd
, header
->cpusubtype
, buf
+ 8);
474 bfd_h_put_32 (abfd
, header
->filetype
, buf
+ 12);
475 bfd_h_put_32 (abfd
, header
->ncmds
, buf
+ 16);
476 bfd_h_put_32 (abfd
, header
->sizeofcmds
, buf
+ 20);
477 bfd_h_put_32 (abfd
, header
->flags
, buf
+ 24);
479 bfd_seek (abfd
, 0, SEEK_SET
);
480 if (bfd_bwrite ((PTR
) buf
, 28, abfd
) != 28)
487 bfd_mach_o_read_header (abfd
, header
)
489 bfd_mach_o_header
*header
;
491 unsigned char buf
[28];
492 bfd_vma (*get32
) PARAMS ((const bfd_byte
*)) = NULL
;
494 bfd_seek (abfd
, 0, SEEK_SET
);
496 if (bfd_bread ((PTR
) buf
, 28, abfd
) != 28)
499 if (bfd_getb32 (buf
) == 0xfeedface)
501 header
->byteorder
= BFD_ENDIAN_BIG
;
502 header
->magic
= 0xfeedface;
505 else if (bfd_getl32 (buf
) == 0xfeedface)
507 header
->byteorder
= BFD_ENDIAN_LITTLE
;
508 header
->magic
= 0xfeedface;
513 header
->byteorder
= BFD_ENDIAN_UNKNOWN
;
517 header
->cputype
= (*get32
) (buf
+ 4);
518 header
->cpusubtype
= (*get32
) (buf
+ 8);
519 header
->filetype
= (*get32
) (buf
+ 12);
520 header
->ncmds
= (*get32
) (buf
+ 16);
521 header
->sizeofcmds
= (*get32
) (buf
+ 20);
522 header
->flags
= (*get32
) (buf
+ 24);
528 bfd_mach_o_make_bfd_section (abfd
, section
)
530 bfd_mach_o_section
*section
;
534 const char *prefix
= "LC_SEGMENT";
535 unsigned int snamelen
;
537 snamelen
= strlen (prefix
) + 1
538 + strlen (section
->segname
) + 1
539 + strlen (section
->sectname
) + 1;
541 sname
= (char *) bfd_alloc (abfd
, snamelen
);
544 sprintf (sname
, "%s.%s.%s", prefix
, section
->segname
, section
->sectname
);
546 bfdsec
= bfd_make_section_anyway (abfd
, sname
);
550 bfdsec
->vma
= section
->addr
;
551 bfdsec
->lma
= section
->addr
;
552 bfdsec
->_raw_size
= section
->size
;
553 bfdsec
->filepos
= section
->offset
;
554 bfdsec
->alignment_power
= section
->align
;
556 if (section
->flags
& BFD_MACH_O_S_ZEROFILL
)
557 bfdsec
->flags
= SEC_ALLOC
;
559 bfdsec
->flags
= SEC_HAS_CONTENTS
| SEC_LOAD
| SEC_ALLOC
| SEC_CODE
;
565 bfd_mach_o_scan_read_section (abfd
, section
, offset
)
567 bfd_mach_o_section
*section
;
570 unsigned char buf
[68];
572 bfd_seek (abfd
, offset
, SEEK_SET
);
573 if (bfd_bread ((PTR
) buf
, 68, abfd
) != 68)
576 memcpy (section
->sectname
, buf
, 16);
577 section
->sectname
[16] = '\0';
578 memcpy (section
->segname
, buf
+ 16, 16);
579 section
->segname
[16] = '\0';
580 section
->addr
= bfd_h_get_32 (abfd
, buf
+ 32);
581 section
->size
= bfd_h_get_32 (abfd
, buf
+ 36);
582 section
->offset
= bfd_h_get_32 (abfd
, buf
+ 40);
583 section
->align
= bfd_h_get_32 (abfd
, buf
+ 44);
584 section
->reloff
= bfd_h_get_32 (abfd
, buf
+ 48);
585 section
->nreloc
= bfd_h_get_32 (abfd
, buf
+ 52);
586 section
->flags
= bfd_h_get_32 (abfd
, buf
+ 56);
587 section
->reserved1
= bfd_h_get_32 (abfd
, buf
+ 60);
588 section
->reserved2
= bfd_h_get_32 (abfd
, buf
+ 64);
589 section
->bfdsection
= bfd_mach_o_make_bfd_section (abfd
, section
);
591 if (section
->bfdsection
== NULL
)
598 bfd_mach_o_scan_write_section (abfd
, section
, offset
)
600 bfd_mach_o_section
*section
;
603 unsigned char buf
[68];
605 memcpy (buf
, section
->sectname
, 16);
606 memcpy (buf
+ 16, section
->segname
, 16);
607 bfd_h_put_32 (abfd
, section
->addr
, buf
+ 32);
608 bfd_h_put_32 (abfd
, section
->size
, buf
+ 36);
609 bfd_h_put_32 (abfd
, section
->offset
, buf
+ 40);
610 bfd_h_put_32 (abfd
, section
->align
, buf
+ 44);
611 bfd_h_put_32 (abfd
, section
->reloff
, buf
+ 48);
612 bfd_h_put_32 (abfd
, section
->nreloc
, buf
+ 52);
613 bfd_h_put_32 (abfd
, section
->flags
, buf
+ 56);
614 /* bfd_h_put_32 (abfd, section->reserved1, buf + 60); */
615 /* bfd_h_put_32 (abfd, section->reserved2, buf + 64); */
617 bfd_seek (abfd
, offset
, SEEK_SET
);
618 if (bfd_bwrite ((PTR
) buf
, 68, abfd
) != 68)
625 bfd_mach_o_scan_write_symtab_symbols (abfd
, command
)
627 bfd_mach_o_load_command
*command
;
629 bfd_mach_o_symtab_command
*sym
= &command
->command
.symtab
;
633 for (i
= 0; i
< sym
->nsyms
; i
++)
635 unsigned char buf
[12];
636 bfd_vma symoff
= sym
->symoff
+ (i
* 12);
637 unsigned char ntype
= 0;
638 unsigned char nsect
= 0;
641 s
= &sym
->symbols
[i
];
643 /* Don't set this from the symbol information; use stored values. */
645 if (s
->flags
& BSF_GLOBAL
)
647 if (s
->flags
& BSF_DEBUGGING
)
650 if (s
->section
== bfd_und_section_ptr
)
652 else if (s
->section
== bfd_abs_section_ptr
)
658 /* Instead just set from the stored values. */
659 ntype
= (s
->udata
.i
>> 24) & 0xff;
660 nsect
= (s
->udata
.i
>> 16) & 0xff;
661 ndesc
= s
->udata
.i
& 0xffff;
663 bfd_h_put_32 (abfd
, s
->name
- sym
->strtab
, buf
);
664 bfd_h_put_8 (abfd
, ntype
, buf
+ 4);
665 bfd_h_put_8 (abfd
, nsect
, buf
+ 5);
666 bfd_h_put_16 (abfd
, ndesc
, buf
+ 6);
667 bfd_h_put_32 (abfd
, s
->section
->vma
+ s
->value
, buf
+ 8);
669 bfd_seek (abfd
, symoff
, SEEK_SET
);
670 if (bfd_bwrite ((PTR
) buf
, 12, abfd
) != 12)
672 fprintf (stderr
, "bfd_mach_o_scan_write_symtab_symbols: unable to write %d bytes at %lu\n",
673 12, (unsigned long) symoff
);
682 bfd_mach_o_scan_read_symtab_symbol (abfd
, sym
, s
, i
)
684 bfd_mach_o_symtab_command
*sym
;
688 bfd_mach_o_data_struct
*mdata
= abfd
->tdata
.mach_o_data
;
689 bfd_vma symoff
= sym
->symoff
+ (i
* 12);
690 unsigned char buf
[12];
691 unsigned char type
= -1;
692 unsigned char section
= -1;
695 unsigned long stroff
= -1;
696 unsigned int symtype
= -1;
698 BFD_ASSERT (sym
->strtab
!= NULL
);
700 bfd_seek (abfd
, symoff
, SEEK_SET
);
701 if (bfd_bread ((PTR
) buf
, 12, abfd
) != 12)
703 fprintf (stderr
, "bfd_mach_o_scan_read_symtab_symbol: unable to read %d bytes at %lu\n",
704 12, (unsigned long) symoff
);
708 stroff
= bfd_h_get_32 (abfd
, buf
);
709 type
= bfd_h_get_8 (abfd
, buf
+ 4);
710 symtype
= (type
& 0x0e);
711 section
= bfd_h_get_8 (abfd
, buf
+ 5) - 1;
712 desc
= bfd_h_get_16 (abfd
, buf
+ 6);
713 value
= bfd_h_get_32 (abfd
, buf
+ 8);
715 if (stroff
>= sym
->strsize
)
717 fprintf (stderr
, "bfd_mach_o_scan_read_symtab_symbol: symbol name out of range (%lu >= %lu)\n",
718 (unsigned long) stroff
, (unsigned long) sym
->strsize
);
723 s
->name
= sym
->strtab
+ stroff
;
725 s
->udata
.i
= (type
<< 24) | (section
<< 16) | desc
;
728 if (type
& BFD_MACH_O_N_STAB
)
730 s
->flags
|= BSF_DEBUGGING
;
731 s
->section
= bfd_und_section_ptr
;
735 if (type
& BFD_MACH_O_N_PEXT
)
737 type
&= ~BFD_MACH_O_N_PEXT
;
738 s
->flags
|= BSF_GLOBAL
;
741 if (type
& BFD_MACH_O_N_EXT
)
743 type
&= ~BFD_MACH_O_N_EXT
;
744 s
->flags
|= BSF_GLOBAL
;
749 case BFD_MACH_O_N_UNDF
:
750 s
->section
= bfd_und_section_ptr
;
752 case BFD_MACH_O_N_PBUD
:
753 s
->section
= bfd_und_section_ptr
;
755 case BFD_MACH_O_N_ABS
:
756 s
->section
= bfd_abs_section_ptr
;
758 case BFD_MACH_O_N_SECT
:
759 if ((section
> 0) && (section
<= mdata
->nsects
))
761 s
->section
= mdata
->sections
[section
- 1]->bfdsection
;
762 s
->value
= s
->value
- mdata
->sections
[section
- 1]->addr
;
766 /* Mach-O uses 0 to mean "no section"; not an error. */
769 fprintf (stderr
, "bfd_mach_o_scan_read_symtab_symbol: "
770 "symbol \"%s\" specified invalid section %d (max %lu): setting to undefined\n",
771 s
->name
, section
, mdata
->nsects
);
773 s
->section
= bfd_und_section_ptr
;
776 case BFD_MACH_O_N_INDR
:
777 fprintf (stderr
, "bfd_mach_o_scan_read_symtab_symbol: "
778 "symbol \"%s\" is unsupported 'indirect' reference: setting to undefined\n",
780 s
->section
= bfd_und_section_ptr
;
783 fprintf (stderr
, "bfd_mach_o_scan_read_symtab_symbol: "
784 "symbol \"%s\" specified invalid type field 0x%x: setting to undefined\n",
786 s
->section
= bfd_und_section_ptr
;
795 bfd_mach_o_scan_read_symtab_strtab (abfd
, sym
)
797 bfd_mach_o_symtab_command
*sym
;
799 BFD_ASSERT (sym
->strtab
== NULL
);
801 if (abfd
->flags
& BFD_IN_MEMORY
)
803 struct bfd_in_memory
*b
;
805 b
= (struct bfd_in_memory
*) abfd
->iostream
;
807 if ((sym
->stroff
+ sym
->strsize
) > b
->size
)
809 bfd_set_error (bfd_error_file_truncated
);
812 sym
->strtab
= b
->buffer
+ sym
->stroff
;
816 sym
->strtab
= bfd_alloc (abfd
, sym
->strsize
);
817 if (sym
->strtab
== NULL
)
820 bfd_seek (abfd
, sym
->stroff
, SEEK_SET
);
821 if (bfd_bread ((PTR
) sym
->strtab
, sym
->strsize
, abfd
) != sym
->strsize
)
823 fprintf (stderr
, "bfd_mach_o_scan_read_symtab_strtab: unable to read %lu bytes at %lu\n",
824 sym
->strsize
, sym
->stroff
);
832 bfd_mach_o_scan_read_symtab_symbols (abfd
, sym
)
834 bfd_mach_o_symtab_command
*sym
;
839 BFD_ASSERT (sym
->symbols
== NULL
);
840 sym
->symbols
= bfd_alloc (abfd
, sym
->nsyms
* sizeof (asymbol
));
842 if (sym
->symbols
== NULL
)
844 fprintf (stderr
, "bfd_mach_o_scan_read_symtab_symbols: unable to allocate memory for symbols\n");
848 ret
= bfd_mach_o_scan_read_symtab_strtab (abfd
, sym
);
852 for (i
= 0; i
< sym
->nsyms
; i
++)
854 ret
= bfd_mach_o_scan_read_symtab_symbol (abfd
, sym
, &sym
->symbols
[i
], i
);
863 bfd_mach_o_scan_read_dysymtab_symbol (abfd
, dysym
, sym
, s
, i
)
865 bfd_mach_o_dysymtab_command
*dysym
;
866 bfd_mach_o_symtab_command
*sym
;
870 unsigned long isymoff
= dysym
->indirectsymoff
+ (i
* 4);
871 unsigned long symindex
;
872 unsigned char buf
[4];
874 BFD_ASSERT (i
< dysym
->nindirectsyms
);
876 bfd_seek (abfd
, isymoff
, SEEK_SET
);
877 if (bfd_bread ((PTR
) buf
, 4, abfd
) != 4)
879 fprintf (stderr
, "bfd_mach_o_scan_read_dysymtab_symbol: unable to read %lu bytes at %lu\n",
880 (unsigned long) 4, isymoff
);
883 symindex
= bfd_h_get_32 (abfd
, buf
);
885 return bfd_mach_o_scan_read_symtab_symbol (abfd
, sym
, s
, symindex
);
889 bfd_mach_o_i386_flavour_string (flavour
)
890 unsigned int flavour
;
892 switch ((int) flavour
)
894 case BFD_MACH_O_i386_NEW_THREAD_STATE
: return "i386_NEW_THREAD_STATE";
895 case BFD_MACH_O_i386_FLOAT_STATE
: return "i386_FLOAT_STATE";
896 case BFD_MACH_O_i386_ISA_PORT_MAP_STATE
: return "i386_ISA_PORT_MAP_STATE";
897 case BFD_MACH_O_i386_V86_ASSIST_STATE
: return "i386_V86_ASSIST_STATE";
898 case BFD_MACH_O_i386_REGS_SEGS_STATE
: return "i386_REGS_SEGS_STATE";
899 case BFD_MACH_O_i386_THREAD_SYSCALL_STATE
: return "i386_THREAD_SYSCALL_STATE";
900 case BFD_MACH_O_i386_THREAD_STATE_NONE
: return "i386_THREAD_STATE_NONE";
901 case BFD_MACH_O_i386_SAVED_STATE
: return "i386_SAVED_STATE";
902 case BFD_MACH_O_i386_THREAD_STATE
: return "i386_THREAD_STATE";
903 case BFD_MACH_O_i386_THREAD_FPSTATE
: return "i386_THREAD_FPSTATE";
904 case BFD_MACH_O_i386_THREAD_EXCEPTSTATE
: return "i386_THREAD_EXCEPTSTATE";
905 case BFD_MACH_O_i386_THREAD_CTHREADSTATE
: return "i386_THREAD_CTHREADSTATE";
906 default: return "UNKNOWN";
911 bfd_mach_o_ppc_flavour_string (flavour
)
912 unsigned int flavour
;
914 switch ((int) flavour
)
916 case BFD_MACH_O_PPC_THREAD_STATE
: return "PPC_THREAD_STATE";
917 case BFD_MACH_O_PPC_FLOAT_STATE
: return "PPC_FLOAT_STATE";
918 case BFD_MACH_O_PPC_EXCEPTION_STATE
: return "PPC_EXCEPTION_STATE";
919 case BFD_MACH_O_PPC_VECTOR_STATE
: return "PPC_VECTOR_STATE";
920 default: return "UNKNOWN";
925 bfd_mach_o_scan_write_thread (abfd
, command
)
927 bfd_mach_o_load_command
*command
;
929 bfd_mach_o_thread_command
*cmd
= &command
->command
.thread
;
931 unsigned char buf
[8];
933 unsigned int nflavours
;
935 BFD_ASSERT ((command
->type
== BFD_MACH_O_LC_THREAD
)
936 || (command
->type
== BFD_MACH_O_LC_UNIXTHREAD
));
940 for (i
= 0; i
< cmd
->nflavours
; i
++)
942 BFD_ASSERT ((cmd
->flavours
[i
].size
% 4) == 0);
943 BFD_ASSERT (cmd
->flavours
[i
].offset
== (command
->offset
+ offset
+ 8));
945 bfd_h_put_32 (abfd
, cmd
->flavours
[i
].flavour
, buf
);
946 bfd_h_put_32 (abfd
, (cmd
->flavours
[i
].size
/ 4), buf
+ 4);
948 bfd_seek (abfd
, command
->offset
+ offset
, SEEK_SET
);
949 if (bfd_bwrite ((PTR
) buf
, 8, abfd
) != 8)
952 offset
+= cmd
->flavours
[i
].size
+ 8;
959 bfd_mach_o_scan_read_dylinker (abfd
, command
)
961 bfd_mach_o_load_command
*command
;
963 bfd_mach_o_dylinker_command
*cmd
= &command
->command
.dylinker
;
964 unsigned char buf
[4];
965 unsigned int nameoff
;
970 BFD_ASSERT ((command
->type
== BFD_MACH_O_LC_ID_DYLINKER
)
971 || (command
->type
== BFD_MACH_O_LC_LOAD_DYLINKER
));
973 bfd_seek (abfd
, command
->offset
+ 8, SEEK_SET
);
974 if (bfd_bread ((PTR
) buf
, 4, abfd
) != 4)
977 nameoff
= bfd_h_get_32 (abfd
, buf
+ 0);
979 cmd
->name_offset
= command
->offset
+ nameoff
;
980 cmd
->name_len
= command
->len
- nameoff
;
982 if (command
->type
== BFD_MACH_O_LC_LOAD_DYLINKER
)
983 prefix
= "LC_LOAD_DYLINKER";
984 else if (command
->type
== BFD_MACH_O_LC_ID_DYLINKER
)
985 prefix
= "LC_ID_DYLINKER";
989 sname
= (char *) bfd_alloc (abfd
, strlen (prefix
) + 1);
992 strcpy (sname
, prefix
);
994 bfdsec
= bfd_make_section_anyway (abfd
, sname
);
1000 bfdsec
->_raw_size
= command
->len
- 8;
1001 bfdsec
->filepos
= command
->offset
+ 8;
1002 bfdsec
->alignment_power
= 0;
1003 bfdsec
->flags
= SEC_HAS_CONTENTS
;
1005 cmd
->section
= bfdsec
;
1011 bfd_mach_o_scan_read_dylib (abfd
, command
)
1013 bfd_mach_o_load_command
*command
;
1015 bfd_mach_o_dylib_command
*cmd
= &command
->command
.dylib
;
1016 unsigned char buf
[16];
1017 unsigned int nameoff
;
1022 BFD_ASSERT ((command
->type
== BFD_MACH_O_LC_ID_DYLIB
)
1023 || (command
->type
== BFD_MACH_O_LC_LOAD_DYLIB
)
1024 || (command
->type
== BFD_MACH_O_LC_LOAD_WEAK_DYLIB
));
1026 bfd_seek (abfd
, command
->offset
+ 8, SEEK_SET
);
1027 if (bfd_bread ((PTR
) buf
, 16, abfd
) != 16)
1030 nameoff
= bfd_h_get_32 (abfd
, buf
+ 0);
1031 cmd
->timestamp
= bfd_h_get_32 (abfd
, buf
+ 4);
1032 cmd
->current_version
= bfd_h_get_32 (abfd
, buf
+ 8);
1033 cmd
->compatibility_version
= bfd_h_get_32 (abfd
, buf
+ 12);
1035 cmd
->name_offset
= command
->offset
+ nameoff
;
1036 cmd
->name_len
= command
->len
- nameoff
;
1038 if (command
->type
== BFD_MACH_O_LC_LOAD_DYLIB
)
1039 prefix
= "LC_LOAD_DYLIB";
1040 else if (command
->type
== BFD_MACH_O_LC_LOAD_WEAK_DYLIB
)
1041 prefix
= "LC_LOAD_WEAK_DYLIB";
1042 else if (command
->type
== BFD_MACH_O_LC_ID_DYLIB
)
1043 prefix
= "LC_ID_DYLIB";
1047 sname
= (char *) bfd_alloc (abfd
, strlen (prefix
) + 1);
1050 strcpy (sname
, prefix
);
1052 bfdsec
= bfd_make_section_anyway (abfd
, sname
);
1058 bfdsec
->_raw_size
= command
->len
- 8;
1059 bfdsec
->filepos
= command
->offset
+ 8;
1060 bfdsec
->alignment_power
= 0;
1061 bfdsec
->flags
= SEC_HAS_CONTENTS
;
1063 cmd
->section
= bfdsec
;
1069 bfd_mach_o_scan_read_prebound_dylib (abfd
, command
)
1070 bfd
*abfd ATTRIBUTE_UNUSED
;
1071 bfd_mach_o_load_command
*command ATTRIBUTE_UNUSED
;
1073 /* bfd_mach_o_prebound_dylib_command *cmd = &command->command.prebound_dylib; */
1075 BFD_ASSERT (command
->type
== BFD_MACH_O_LC_PREBOUND_DYLIB
);
1080 bfd_mach_o_scan_read_thread (abfd
, command
)
1082 bfd_mach_o_load_command
*command
;
1084 bfd_mach_o_data_struct
*mdata
= NULL
;
1085 bfd_mach_o_thread_command
*cmd
= &command
->command
.thread
;
1086 unsigned char buf
[8];
1088 unsigned int nflavours
;
1091 BFD_ASSERT ((command
->type
== BFD_MACH_O_LC_THREAD
)
1092 || (command
->type
== BFD_MACH_O_LC_UNIXTHREAD
));
1094 BFD_ASSERT (bfd_mach_o_valid (abfd
));
1095 mdata
= abfd
->tdata
.mach_o_data
;
1099 while (offset
!= command
->len
)
1101 if (offset
>= command
->len
)
1104 bfd_seek (abfd
, command
->offset
+ offset
, SEEK_SET
);
1106 if (bfd_bread ((PTR
) buf
, 8, abfd
) != 8)
1109 offset
+= 8 + bfd_h_get_32 (abfd
, buf
+ 4) * 4;
1114 ((bfd_mach_o_thread_flavour
*)
1115 bfd_alloc (abfd
, nflavours
* sizeof (bfd_mach_o_thread_flavour
)));
1116 if (cmd
->flavours
== NULL
)
1118 cmd
->nflavours
= nflavours
;
1122 while (offset
!= command
->len
)
1124 if (offset
>= command
->len
)
1127 if (nflavours
>= cmd
->nflavours
)
1130 bfd_seek (abfd
, command
->offset
+ offset
, SEEK_SET
);
1132 if (bfd_bread ((PTR
) buf
, 8, abfd
) != 8)
1135 cmd
->flavours
[nflavours
].flavour
= bfd_h_get_32 (abfd
, buf
);
1136 cmd
->flavours
[nflavours
].offset
= command
->offset
+ offset
+ 8;
1137 cmd
->flavours
[nflavours
].size
= bfd_h_get_32 (abfd
, buf
+ 4) * 4;
1138 offset
+= cmd
->flavours
[nflavours
].size
+ 8;
1142 for (i
= 0; i
< nflavours
; i
++)
1145 unsigned int snamelen
;
1147 const char *flavourstr
;
1148 const char *prefix
= "LC_THREAD";
1151 switch (mdata
->header
.cputype
)
1153 case BFD_MACH_O_CPU_TYPE_POWERPC
:
1154 flavourstr
= bfd_mach_o_ppc_flavour_string (cmd
->flavours
[i
].flavour
);
1156 case BFD_MACH_O_CPU_TYPE_I386
:
1157 flavourstr
= bfd_mach_o_i386_flavour_string (cmd
->flavours
[i
].flavour
);
1160 flavourstr
= "UNKNOWN_ARCHITECTURE";
1164 snamelen
= strlen (prefix
) + 1 + 20 + 1 + strlen (flavourstr
) + 1;
1165 sname
= (char *) bfd_alloc (abfd
, snamelen
);
1171 sprintf (sname
, "%s.%s.%u", prefix
, flavourstr
, i
);
1172 if (bfd_get_section_by_name (abfd
, sname
) == NULL
) {
1178 bfdsec
= bfd_make_section (abfd
, sname
);
1182 bfdsec
->_raw_size
= cmd
->flavours
[i
].size
;
1183 bfdsec
->filepos
= cmd
->flavours
[i
].offset
;
1184 bfdsec
->alignment_power
= 0x0;
1185 bfdsec
->flags
= SEC_HAS_CONTENTS
;
1187 cmd
->section
= bfdsec
;
1194 bfd_mach_o_scan_write_symtab (abfd
, command
)
1196 bfd_mach_o_load_command
*command
;
1198 bfd_mach_o_symtab_command
*seg
= &command
->command
.symtab
;
1199 unsigned char buf
[16];
1201 BFD_ASSERT (command
->type
== BFD_MACH_O_LC_SYMTAB
);
1203 bfd_h_put_32 (abfd
, seg
->symoff
, buf
);
1204 bfd_h_put_32 (abfd
, seg
->nsyms
, buf
+ 4);
1205 bfd_h_put_32 (abfd
, seg
->stroff
, buf
+ 8);
1206 bfd_h_put_32 (abfd
, seg
->strsize
, buf
+ 12);
1208 bfd_seek (abfd
, command
->offset
+ 8, SEEK_SET
);
1209 if (bfd_bwrite ((PTR
) buf
, 16, abfd
) != 16)
1212 if (bfd_mach_o_scan_write_symtab_symbols (abfd
, command
) != 0)
1219 bfd_mach_o_scan_read_dysymtab (abfd
, command
)
1221 bfd_mach_o_load_command
*command
;
1223 bfd_mach_o_dysymtab_command
*seg
= &command
->command
.dysymtab
;
1224 unsigned char buf
[72];
1226 BFD_ASSERT (command
->type
== BFD_MACH_O_LC_DYSYMTAB
);
1228 bfd_seek (abfd
, command
->offset
+ 8, SEEK_SET
);
1229 if (bfd_bread ((PTR
) buf
, 72, abfd
) != 72)
1232 seg
->ilocalsym
= bfd_h_get_32 (abfd
, buf
+ 0);
1233 seg
->nlocalsym
= bfd_h_get_32 (abfd
, buf
+ 4);
1234 seg
->iextdefsym
= bfd_h_get_32 (abfd
, buf
+ 8);
1235 seg
->nextdefsym
= bfd_h_get_32 (abfd
, buf
+ 12);
1236 seg
->iundefsym
= bfd_h_get_32 (abfd
, buf
+ 16);
1237 seg
->nundefsym
= bfd_h_get_32 (abfd
, buf
+ 20);
1238 seg
->tocoff
= bfd_h_get_32 (abfd
, buf
+ 24);
1239 seg
->ntoc
= bfd_h_get_32 (abfd
, buf
+ 28);
1240 seg
->modtaboff
= bfd_h_get_32 (abfd
, buf
+ 32);
1241 seg
->nmodtab
= bfd_h_get_32 (abfd
, buf
+ 36);
1242 seg
->extrefsymoff
= bfd_h_get_32 (abfd
, buf
+ 40);
1243 seg
->nextrefsyms
= bfd_h_get_32 (abfd
, buf
+ 44);
1244 seg
->indirectsymoff
= bfd_h_get_32 (abfd
, buf
+ 48);
1245 seg
->nindirectsyms
= bfd_h_get_32 (abfd
, buf
+ 52);
1246 seg
->extreloff
= bfd_h_get_32 (abfd
, buf
+ 56);
1247 seg
->nextrel
= bfd_h_get_32 (abfd
, buf
+ 60);
1248 seg
->locreloff
= bfd_h_get_32 (abfd
, buf
+ 64);
1249 seg
->nlocrel
= bfd_h_get_32 (abfd
, buf
+ 68);
1255 bfd_mach_o_scan_read_symtab (abfd
, command
)
1257 bfd_mach_o_load_command
*command
;
1259 bfd_mach_o_symtab_command
*seg
= &command
->command
.symtab
;
1260 unsigned char buf
[16];
1263 const char *prefix
= "LC_SYMTAB.stabs";
1265 BFD_ASSERT (command
->type
== BFD_MACH_O_LC_SYMTAB
);
1267 bfd_seek (abfd
, command
->offset
+ 8, SEEK_SET
);
1268 if (bfd_bread ((PTR
) buf
, 16, abfd
) != 16)
1271 seg
->symoff
= bfd_h_get_32 (abfd
, buf
);
1272 seg
->nsyms
= bfd_h_get_32 (abfd
, buf
+ 4);
1273 seg
->stroff
= bfd_h_get_32 (abfd
, buf
+ 8);
1274 seg
->strsize
= bfd_h_get_32 (abfd
, buf
+ 12);
1275 seg
->symbols
= NULL
;
1278 sname
= (char *) bfd_alloc (abfd
, strlen (prefix
) + 1);
1281 strcpy (sname
, prefix
);
1283 bfdsec
= bfd_make_section_anyway (abfd
, sname
);
1289 bfdsec
->_raw_size
= seg
->nsyms
* 12;
1290 bfdsec
->filepos
= seg
->symoff
;
1291 bfdsec
->alignment_power
= 0;
1292 bfdsec
->flags
= SEC_HAS_CONTENTS
;
1294 seg
->stabs_segment
= bfdsec
;
1296 prefix
= "LC_SYMTAB.stabstr";
1297 sname
= (char *) bfd_alloc (abfd
, strlen (prefix
) + 1);
1300 strcpy (sname
, prefix
);
1302 bfdsec
= bfd_make_section_anyway (abfd
, sname
);
1308 bfdsec
->_raw_size
= seg
->strsize
;
1309 bfdsec
->filepos
= seg
->stroff
;
1310 bfdsec
->alignment_power
= 0;
1311 bfdsec
->flags
= SEC_HAS_CONTENTS
;
1313 seg
->stabstr_segment
= bfdsec
;
1319 bfd_mach_o_scan_read_segment (abfd
, command
)
1321 bfd_mach_o_load_command
*command
;
1323 unsigned char buf
[48];
1324 bfd_mach_o_segment_command
*seg
= &command
->command
.segment
;
1328 const char *prefix
= "LC_SEGMENT";
1329 unsigned int snamelen
;
1331 BFD_ASSERT (command
->type
== BFD_MACH_O_LC_SEGMENT
);
1333 bfd_seek (abfd
, command
->offset
+ 8, SEEK_SET
);
1334 if (bfd_bread ((PTR
) buf
, 48, abfd
) != 48)
1337 memcpy (seg
->segname
, buf
, 16);
1338 seg
->vmaddr
= bfd_h_get_32 (abfd
, buf
+ 16);
1339 seg
->vmsize
= bfd_h_get_32 (abfd
, buf
+ 20);
1340 seg
->fileoff
= bfd_h_get_32 (abfd
, buf
+ 24);
1341 seg
->filesize
= bfd_h_get_32 (abfd
, buf
+ 28);
1342 /* seg->maxprot = bfd_h_get_32 (abfd, buf + 32); */
1343 /* seg->initprot = bfd_h_get_32 (abfd, buf + 36); */
1344 seg
->nsects
= bfd_h_get_32 (abfd
, buf
+ 40);
1345 seg
->flags
= bfd_h_get_32 (abfd
, buf
+ 44);
1347 snamelen
= strlen (prefix
) + 1 + strlen (seg
->segname
) + 1;
1348 sname
= (char *) bfd_alloc (abfd
, snamelen
);
1351 sprintf (sname
, "%s.%s", prefix
, seg
->segname
);
1353 bfdsec
= bfd_make_section_anyway (abfd
, sname
);
1357 bfdsec
->vma
= seg
->vmaddr
;
1358 bfdsec
->lma
= seg
->vmaddr
;
1359 bfdsec
->_raw_size
= seg
->filesize
;
1360 bfdsec
->filepos
= seg
->fileoff
;
1361 bfdsec
->alignment_power
= 0x0;
1362 bfdsec
->flags
= SEC_HAS_CONTENTS
| SEC_LOAD
| SEC_ALLOC
| SEC_CODE
;
1364 seg
->segment
= bfdsec
;
1366 if (seg
->nsects
!= 0)
1369 ((bfd_mach_o_section
*)
1370 bfd_alloc (abfd
, seg
->nsects
* sizeof (bfd_mach_o_section
)));
1371 if (seg
->sections
== NULL
)
1374 for (i
= 0; i
< seg
->nsects
; i
++)
1376 bfd_vma segoff
= command
->offset
+ 48 + 8 + (i
* 68);
1378 if (bfd_mach_o_scan_read_section (abfd
, &seg
->sections
[i
], segoff
) != 0)
1387 bfd_mach_o_scan_write_segment (abfd
, command
)
1389 bfd_mach_o_load_command
*command
;
1391 unsigned char buf
[48];
1392 bfd_mach_o_segment_command
*seg
= &command
->command
.segment
;
1395 BFD_ASSERT (command
->type
== BFD_MACH_O_LC_SEGMENT
);
1397 memcpy (buf
, seg
->segname
, 16);
1398 bfd_h_put_32 (abfd
, seg
->vmaddr
, buf
+ 16);
1399 bfd_h_put_32 (abfd
, seg
->vmsize
, buf
+ 20);
1400 bfd_h_put_32 (abfd
, seg
->fileoff
, buf
+ 24);
1401 bfd_h_put_32 (abfd
, seg
->filesize
, buf
+ 28);
1402 bfd_h_put_32 (abfd
, 0 /* seg->maxprot */, buf
+ 32);
1403 bfd_h_put_32 (abfd
, 0 /* seg->initprot */, buf
+ 36);
1404 bfd_h_put_32 (abfd
, seg
->nsects
, buf
+ 40);
1405 bfd_h_put_32 (abfd
, seg
->flags
, buf
+ 44);
1407 bfd_seek (abfd
, command
->offset
+ 8, SEEK_SET
);
1408 if (bfd_bwrite ((PTR
) buf
, 48, abfd
) != 48)
1413 bfd_vma nbytes
= seg
->filesize
;
1414 bfd_vma curoff
= seg
->fileoff
;
1418 bfd_vma thisread
= nbytes
;
1420 if (thisread
> 1024)
1423 bfd_seek (abfd
, curoff
, SEEK_SET
);
1424 if (bfd_bread ((PTR
) buf
, thisread
, abfd
) != thisread
)
1427 bfd_seek (abfd
, curoff
, SEEK_SET
);
1428 if (bfd_bwrite ((PTR
) buf
, thisread
, abfd
) != thisread
)
1436 for (i
= 0; i
< seg
->nsects
; i
++)
1438 bfd_vma segoff
= command
->offset
+ 48 + 8 + (i
* 68);
1440 if (bfd_mach_o_scan_write_section (abfd
, &seg
->sections
[i
], segoff
) != 0)
1448 bfd_mach_o_scan_read_command (abfd
, command
)
1450 bfd_mach_o_load_command
*command
;
1452 unsigned char buf
[8];
1454 bfd_seek (abfd
, command
->offset
, SEEK_SET
);
1455 if (bfd_bread ((PTR
) buf
, 8, abfd
) != 8)
1458 command
->type
= (bfd_h_get_32 (abfd
, buf
) & ~BFD_MACH_O_LC_REQ_DYLD
);
1459 command
->type_required
= (bfd_h_get_32 (abfd
, buf
) & BFD_MACH_O_LC_REQ_DYLD
) ? 1 : 0;
1460 command
->len
= bfd_h_get_32 (abfd
, buf
+ 4);
1462 switch (command
->type
)
1464 case BFD_MACH_O_LC_SEGMENT
:
1465 if (bfd_mach_o_scan_read_segment (abfd
, command
) != 0)
1468 case BFD_MACH_O_LC_SYMTAB
:
1469 if (bfd_mach_o_scan_read_symtab (abfd
, command
) != 0)
1472 case BFD_MACH_O_LC_SYMSEG
:
1474 case BFD_MACH_O_LC_THREAD
:
1475 case BFD_MACH_O_LC_UNIXTHREAD
:
1476 if (bfd_mach_o_scan_read_thread (abfd
, command
) != 0)
1479 case BFD_MACH_O_LC_LOAD_DYLINKER
:
1480 case BFD_MACH_O_LC_ID_DYLINKER
:
1481 if (bfd_mach_o_scan_read_dylinker (abfd
, command
) != 0)
1484 case BFD_MACH_O_LC_LOAD_DYLIB
:
1485 case BFD_MACH_O_LC_ID_DYLIB
:
1486 case BFD_MACH_O_LC_LOAD_WEAK_DYLIB
:
1487 if (bfd_mach_o_scan_read_dylib (abfd
, command
) != 0)
1490 case BFD_MACH_O_LC_PREBOUND_DYLIB
:
1491 if (bfd_mach_o_scan_read_prebound_dylib (abfd
, command
) != 0)
1494 case BFD_MACH_O_LC_LOADFVMLIB
:
1495 case BFD_MACH_O_LC_IDFVMLIB
:
1496 case BFD_MACH_O_LC_IDENT
:
1497 case BFD_MACH_O_LC_FVMFILE
:
1498 case BFD_MACH_O_LC_PREPAGE
:
1499 case BFD_MACH_O_LC_ROUTINES
:
1500 case BFD_MACH_O_LC_SUB_FRAMEWORK
:
1502 case BFD_MACH_O_LC_DYSYMTAB
:
1503 if (bfd_mach_o_scan_read_dysymtab (abfd
, command
) != 0)
1506 case BFD_MACH_O_LC_SUB_UMBRELLA
:
1507 case BFD_MACH_O_LC_SUB_CLIENT
:
1508 case BFD_MACH_O_LC_SUB_LIBRARY
:
1509 case BFD_MACH_O_LC_TWOLEVEL_HINTS
:
1510 case BFD_MACH_O_LC_PREBIND_CKSUM
:
1513 fprintf (stderr
, "unable to read unknown load command 0x%lx\n",
1514 (unsigned long) command
->type
);
1522 bfd_mach_o_flatten_sections (abfd
)
1525 bfd_mach_o_data_struct
*mdata
= abfd
->tdata
.mach_o_data
;
1531 for (i
= 0; i
< mdata
->header
.ncmds
; i
++)
1533 if (mdata
->commands
[i
].type
== BFD_MACH_O_LC_SEGMENT
)
1535 bfd_mach_o_segment_command
*seg
= &mdata
->commands
[i
].command
.segment
;
1536 mdata
->nsects
+= seg
->nsects
;
1540 mdata
->sections
= bfd_alloc (abfd
, mdata
->nsects
* sizeof (bfd_mach_o_section
*));
1543 for (i
= 0; i
< mdata
->header
.ncmds
; i
++)
1545 if (mdata
->commands
[i
].type
== BFD_MACH_O_LC_SEGMENT
)
1547 bfd_mach_o_segment_command
*seg
= &mdata
->commands
[i
].command
.segment
;
1549 BFD_ASSERT (csect
+ seg
->nsects
<= mdata
->nsects
);
1551 for (j
= 0; j
< seg
->nsects
; j
++)
1552 mdata
->sections
[csect
++] = &seg
->sections
[j
];
1558 bfd_mach_o_scan_start_address (abfd
)
1561 bfd_mach_o_data_struct
*mdata
= abfd
->tdata
.mach_o_data
;
1562 bfd_mach_o_thread_command
*cmd
= NULL
;
1565 for (i
= 0; i
< mdata
->header
.ncmds
; i
++)
1567 if ((mdata
->commands
[i
].type
== BFD_MACH_O_LC_THREAD
) ||
1568 (mdata
->commands
[i
].type
== BFD_MACH_O_LC_UNIXTHREAD
))
1571 cmd
= &mdata
->commands
[i
].command
.thread
;
1580 for (i
= 0; i
< cmd
->nflavours
; i
++)
1582 if ((mdata
->header
.cputype
== BFD_MACH_O_CPU_TYPE_I386
)
1583 && (cmd
->flavours
[i
].flavour
== (unsigned long) BFD_MACH_O_i386_THREAD_STATE
))
1585 unsigned char buf
[4];
1587 bfd_seek (abfd
, cmd
->flavours
[i
].offset
+ 40, SEEK_SET
);
1589 if (bfd_bread (buf
, 4, abfd
) != 4)
1592 abfd
->start_address
= bfd_h_get_32 (abfd
, buf
);
1594 else if ((mdata
->header
.cputype
== BFD_MACH_O_CPU_TYPE_POWERPC
)
1595 && (cmd
->flavours
[i
].flavour
== BFD_MACH_O_PPC_THREAD_STATE
))
1597 unsigned char buf
[4];
1599 bfd_seek (abfd
, cmd
->flavours
[i
].offset
+ 0, SEEK_SET
);
1601 if (bfd_bread (buf
, 4, abfd
) != 4)
1604 abfd
->start_address
= bfd_h_get_32 (abfd
, buf
);
1612 bfd_mach_o_scan (abfd
, header
)
1614 bfd_mach_o_header
*header
;
1617 bfd_mach_o_data_struct
*mdata
= NULL
;
1618 enum bfd_architecture cputype
;
1619 unsigned long cpusubtype
;
1621 mdata
= ((bfd_mach_o_data_struct
*)
1622 bfd_alloc (abfd
, sizeof (bfd_mach_o_data_struct
)));
1626 mdata
->header
= *header
;
1627 mdata
->symbols
= NULL
;
1629 abfd
->flags
= abfd
->xvec
->object_flags
| (abfd
->flags
& (BFD_IN_MEMORY
| BFD_IO_FUNCS
));
1630 abfd
->tdata
.mach_o_data
= mdata
;
1632 bfd_mach_o_convert_architecture (header
->cputype
, header
->cpusubtype
, &cputype
, &cpusubtype
);
1633 if (cputype
== bfd_arch_unknown
)
1635 fprintf (stderr
, "bfd_mach_o_scan: unknown architecture 0x%lx/0x%lx\n",
1636 header
->cputype
, header
->cpusubtype
);
1640 bfd_set_arch_mach (abfd
, cputype
, cpusubtype
);
1642 if (header
->ncmds
!= 0)
1645 ((bfd_mach_o_load_command
*)
1646 bfd_alloc (abfd
, header
->ncmds
* sizeof (bfd_mach_o_load_command
)));
1647 if (mdata
->commands
== NULL
)
1650 for (i
= 0; i
< header
->ncmds
; i
++)
1652 bfd_mach_o_load_command
*cur
= &mdata
->commands
[i
];
1658 bfd_mach_o_load_command
*prev
= &mdata
->commands
[i
- 1];
1659 cur
->offset
= prev
->offset
+ prev
->len
;
1662 if (bfd_mach_o_scan_read_command (abfd
, cur
) < 0)
1667 if (bfd_mach_o_scan_start_address (abfd
) < 0)
1670 fprintf (stderr
, "bfd_mach_o_scan: unable to scan start address: %s\n",
1671 bfd_errmsg (bfd_get_error ()));
1672 abfd
->tdata
.mach_o_data
= NULL
;
1677 bfd_mach_o_flatten_sections (abfd
);
1683 bfd_mach_o_mkobject (abfd
)
1686 bfd_mach_o_data_struct
*mdata
= NULL
;
1688 mdata
= ((bfd_mach_o_data_struct
*)
1689 bfd_alloc (abfd
, sizeof (bfd_mach_o_data_struct
)));
1692 abfd
->tdata
.mach_o_data
= mdata
;
1694 mdata
->header
.magic
= 0;
1695 mdata
->header
.cputype
= 0;
1696 mdata
->header
.cpusubtype
= 0;
1697 mdata
->header
.filetype
= 0;
1698 mdata
->header
.ncmds
= 0;
1699 mdata
->header
.sizeofcmds
= 0;
1700 mdata
->header
.flags
= 0;
1701 mdata
->header
.byteorder
= BFD_ENDIAN_UNKNOWN
;
1702 mdata
->commands
= NULL
;
1703 mdata
->nsymbols
= 0;
1704 mdata
->symbols
= NULL
;
1706 mdata
->sections
= NULL
;
1713 bfd_mach_o_object_p (abfd
)
1716 bfd_mach_o_header header
;
1718 if (bfd_mach_o_read_header (abfd
, &header
) != 0)
1720 bfd_set_error (bfd_error_wrong_format
);
1724 if (! ((header
.byteorder
== BFD_ENDIAN_BIG
)
1725 || (header
.byteorder
== BFD_ENDIAN_LITTLE
)))
1727 fprintf (stderr
, "unknown header byte-order value 0x%lx\n", (long) header
.byteorder
);
1728 bfd_set_error (bfd_error_wrong_format
);
1732 if (! (((header
.byteorder
== BFD_ENDIAN_BIG
)
1733 && (abfd
->xvec
->byteorder
== BFD_ENDIAN_BIG
)
1734 && (abfd
->xvec
->header_byteorder
== BFD_ENDIAN_BIG
))
1736 ((header
.byteorder
== BFD_ENDIAN_LITTLE
)
1737 && (abfd
->xvec
->byteorder
== BFD_ENDIAN_LITTLE
)
1738 && (abfd
->xvec
->header_byteorder
== BFD_ENDIAN_LITTLE
))))
1740 bfd_set_error (bfd_error_wrong_format
);
1744 abfd
->tdata
.mach_o_data
= NULL
;
1746 if (bfd_mach_o_scan (abfd
, &header
) != 0)
1748 abfd
->tdata
.mach_o_data
= NULL
;
1749 bfd_set_error (bfd_error_wrong_format
);
1757 bfd_mach_o_core_p (abfd
)
1760 bfd_mach_o_header header
;
1762 bfd_set_error (bfd_error_wrong_format
);
1764 if (bfd_mach_o_read_header (abfd
, &header
) != 0)
1767 if (! ((header
.byteorder
== BFD_ENDIAN_BIG
)
1768 || (header
.byteorder
== BFD_ENDIAN_LITTLE
)))
1770 fprintf (stderr
, "unknown header byte-order value 0x%lx\n", (long) header
.byteorder
);
1774 if (! (((header
.byteorder
== BFD_ENDIAN_BIG
)
1775 && (abfd
->xvec
->byteorder
== BFD_ENDIAN_BIG
)
1776 && (abfd
->xvec
->header_byteorder
== BFD_ENDIAN_BIG
))
1778 ((header
.byteorder
== BFD_ENDIAN_LITTLE
)
1779 && (abfd
->xvec
->byteorder
== BFD_ENDIAN_LITTLE
)
1780 && (abfd
->xvec
->header_byteorder
== BFD_ENDIAN_LITTLE
))))
1783 if (header
.filetype
!= BFD_MACH_O_MH_CORE
)
1786 abfd
->tdata
.mach_o_data
= NULL
;
1787 if (bfd_mach_o_scan (abfd
, &header
) != 0)
1789 abfd
->tdata
.mach_o_data
= NULL
;
1796 typedef struct mach_o_fat_archentry
1798 unsigned long cputype
;
1799 unsigned long cpusubtype
;
1800 unsigned long offset
;
1802 unsigned long align
;
1804 } mach_o_fat_archentry
;
1806 typedef struct mach_o_fat_data_struct
1808 unsigned long magic
;
1809 unsigned long nfat_arch
;
1810 mach_o_fat_archentry
*archentries
;
1811 } mach_o_fat_data_struct
;
1814 bfd_mach_o_archive_p (abfd
)
1817 mach_o_fat_data_struct
*adata
;
1818 unsigned char buf
[20];
1821 bfd_seek (abfd
, 0, SEEK_SET
);
1822 if (bfd_bread ((PTR
) buf
, 8, abfd
) != 8)
1825 adata
= (mach_o_fat_data_struct
*)
1826 bfd_alloc (abfd
, sizeof (mach_o_fat_data_struct
));
1830 adata
->magic
= bfd_getb32 (buf
);
1831 adata
->nfat_arch
= bfd_getb32 (buf
+ 4);
1832 if (adata
->magic
!= 0xcafebabe)
1835 adata
->archentries
= (mach_o_fat_archentry
*)
1836 bfd_alloc (abfd
, adata
->nfat_arch
* sizeof (mach_o_fat_archentry
));
1837 if (adata
->archentries
== NULL
)
1840 for (i
= 0; i
< adata
->nfat_arch
; i
++)
1842 bfd_seek (abfd
, 8 + 20 * i
, SEEK_SET
);
1844 if (bfd_bread ((PTR
) buf
, 20, abfd
) != 20)
1846 adata
->archentries
[i
].cputype
= bfd_getb32 (buf
);
1847 adata
->archentries
[i
].cpusubtype
= bfd_getb32 (buf
+ 4);
1848 adata
->archentries
[i
].offset
= bfd_getb32 (buf
+ 8);
1849 adata
->archentries
[i
].size
= bfd_getb32 (buf
+ 12);
1850 adata
->archentries
[i
].align
= bfd_getb32 (buf
+ 16);
1851 adata
->archentries
[i
].abfd
= NULL
;
1854 abfd
->tdata
.mach_o_fat_data
= adata
;
1859 bfd_mach_o_openr_next_archived_file (archive
, prev
)
1863 mach_o_fat_data_struct
*adata
= (mach_o_fat_data_struct
*) archive
->tdata
.mach_o_fat_data
;
1864 mach_o_fat_archentry
*entry
= NULL
;
1867 BFD_ASSERT (adata
!= NULL
);
1869 /* Find index of previous entry. */
1871 i
= 0; /* Start at first one. */
1874 for (i
= 0; i
< adata
->nfat_arch
; i
++)
1876 if (adata
->archentries
[i
].abfd
== prev
)
1880 if (i
== adata
->nfat_arch
)
1883 bfd_set_error (bfd_error_bad_value
);
1886 i
++; /* Get next entry. */
1889 if (i
>= adata
->nfat_arch
)
1891 bfd_set_error (bfd_error_no_more_archived_files
);
1895 entry
= &adata
->archentries
[i
];
1896 if (entry
->abfd
== NULL
)
1898 bfd
*nbfd
= _bfd_new_bfd_contained_in (archive
);
1904 nbfd
->origin
= entry
->offset
;
1905 s
= bfd_malloc (strlen (archive
->filename
) + 1);
1908 strcpy (s
, archive
->filename
);
1910 nbfd
->iostream
= NULL
;
1917 int bfd_mach_o_lookup_section
1918 (bfd
*abfd
, asection
*section
,
1919 bfd_mach_o_load_command
**mcommand
, bfd_mach_o_section
**msection
)
1921 struct mach_o_data_struct
*md
= abfd
->tdata
.mach_o_data
;
1922 unsigned int i
, j
, num
;
1924 bfd_mach_o_load_command
*ncmd
= NULL
;
1925 bfd_mach_o_section
*nsect
= NULL
;
1927 BFD_ASSERT (mcommand
!= NULL
);
1928 BFD_ASSERT (msection
!= NULL
);
1931 for (i
= 0; i
< md
->header
.ncmds
; i
++)
1933 struct bfd_mach_o_load_command
*cmd
= &md
->commands
[i
];
1934 struct bfd_mach_o_segment_command
*seg
= NULL
;
1936 if (cmd
->type
!= BFD_MACH_O_LC_SEGMENT
)
1938 seg
= &cmd
->command
.segment
;
1940 if (seg
->segment
== section
)
1947 for (j
= 0; j
< seg
->nsects
; j
++)
1949 struct bfd_mach_o_section
*sect
= &seg
->sections
[j
];
1951 if (sect
->bfdsection
== section
)
1966 bfd_mach_o_lookup_command
1967 (bfd
*abfd
, bfd_mach_o_load_command_type type
,
1968 bfd_mach_o_load_command
**mcommand
)
1970 struct mach_o_data_struct
*md
= NULL
;
1971 bfd_mach_o_load_command
*ncmd
= NULL
;
1972 unsigned int i
, num
;
1974 md
= abfd
->tdata
.mach_o_data
;
1976 BFD_ASSERT (md
!= NULL
);
1977 BFD_ASSERT (mcommand
!= NULL
);
1980 for (i
= 0; i
< md
->header
.ncmds
; i
++)
1982 struct bfd_mach_o_load_command
*cmd
= &md
->commands
[i
];
1984 if (cmd
->type
!= type
)
1997 bfd_mach_o_stack_addr (type
)
1998 enum bfd_mach_o_cpu_type type
;
2002 case BFD_MACH_O_CPU_TYPE_MC680x0
:
2004 case BFD_MACH_O_CPU_TYPE_MC88000
:
2006 case BFD_MACH_O_CPU_TYPE_POWERPC
:
2008 case BFD_MACH_O_CPU_TYPE_I386
:
2010 case BFD_MACH_O_CPU_TYPE_SPARC
:
2012 case BFD_MACH_O_CPU_TYPE_I860
:
2014 case BFD_MACH_O_CPU_TYPE_HPPA
:
2015 return (0xc0000000-0x04000000);
2022 bfd_mach_o_core_fetch_environment (abfd
, rbuf
, rlen
)
2024 unsigned char **rbuf
;
2027 bfd_mach_o_data_struct
*mdata
= abfd
->tdata
.mach_o_data
;
2028 unsigned long stackaddr
= bfd_mach_o_stack_addr (mdata
->header
.cputype
);
2031 for (i
= 0; i
< mdata
->header
.ncmds
; i
++)
2033 bfd_mach_o_load_command
*cur
= &mdata
->commands
[i
];
2034 bfd_mach_o_segment_command
*seg
= NULL
;
2036 if (cur
->type
!= BFD_MACH_O_LC_SEGMENT
)
2039 seg
= &cur
->command
.segment
;
2041 if ((seg
->vmaddr
+ seg
->vmsize
) == stackaddr
)
2043 unsigned long start
= seg
->fileoff
;
2044 unsigned long end
= seg
->fileoff
+ seg
->filesize
;
2045 unsigned char *buf
= bfd_malloc (1024);
2046 unsigned long size
= 1024;
2050 bfd_size_type nread
= 0;
2051 unsigned long offset
;
2052 int found_nonnull
= 0;
2054 if (size
> (end
- start
))
2055 size
= (end
- start
);
2057 buf
= bfd_realloc (buf
, size
);
2059 bfd_seek (abfd
, end
- size
, SEEK_SET
);
2060 nread
= bfd_bread (buf
, size
, abfd
);
2065 for (offset
= 4; offset
<= size
; offset
+= 4)
2067 unsigned long val
= *((unsigned long *) (buf
+ size
- offset
));
2069 if (! found_nonnull
)
2074 else if (val
== 0x0)
2076 unsigned long bottom
= seg
->fileoff
+ seg
->filesize
- offset
;
2077 unsigned long top
= seg
->fileoff
+ seg
->filesize
- 4;
2079 *rbuf
= bfd_malloc (top
- bottom
);
2080 *rlen
= top
- bottom
;
2082 memcpy (*rbuf
, buf
+ size
- *rlen
, *rlen
);
2087 if (size
== (end
- start
))
2099 bfd_mach_o_core_file_failing_command (abfd
)
2102 unsigned char *buf
= NULL
;
2103 unsigned int len
= 0;
2106 ret
= bfd_mach_o_core_fetch_environment (abfd
, &buf
, &len
);
2114 bfd_mach_o_core_file_failing_signal (abfd
)
2115 bfd
*abfd ATTRIBUTE_UNUSED
;
2121 bfd_mach_o_core_file_matches_executable_p (core_bfd
, exec_bfd
)
2122 bfd
*core_bfd ATTRIBUTE_UNUSED
;
2123 bfd
*exec_bfd ATTRIBUTE_UNUSED
;
2128 #define TARGET_NAME mach_o_be_vec
2129 #define TARGET_STRING "mach-o-be"
2130 #define TARGET_BIG_ENDIAN 1
2131 #define TARGET_ARCHIVE 0
2133 #include "mach-o-target.c"
2136 #undef TARGET_STRING
2137 #undef TARGET_BIG_ENDIAN
2138 #undef TARGET_ARCHIVE
2140 #define TARGET_NAME mach_o_le_vec
2141 #define TARGET_STRING "mach-o-le"
2142 #define TARGET_BIG_ENDIAN 0
2143 #define TARGET_ARCHIVE 0
2145 #include "mach-o-target.c"
2148 #undef TARGET_STRING
2149 #undef TARGET_BIG_ENDIAN
2150 #undef TARGET_ARCHIVE
2152 #define TARGET_NAME mach_o_fat_vec
2153 #define TARGET_STRING "mach-o-fat"
2154 #define TARGET_BIG_ENDIAN 1
2155 #define TARGET_ARCHIVE 1
2157 #include "mach-o-target.c"
2160 #undef TARGET_STRING
2161 #undef TARGET_BIG_ENDIAN
2162 #undef TARGET_ARCHIVE