/* Mach-O support for BFD.
- Copyright 1999, 2000, 2001, 2002
+ Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005
Free Software Foundation, Inc.
This file is part of BFD, the Binary File Descriptor library.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+ Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */
#include "mach-o.h"
#include "bfd.h"
#define BFD_IO_FUNCS 0
#endif
-#define bfd_mach_o_mkarchive _bfd_noarchive_mkarchive
-#define bfd_mach_o_read_ar_hdr _bfd_noarchive_read_ar_hdr
-#define bfd_mach_o_slurp_armap _bfd_noarchive_slurp_armap
-#define bfd_mach_o_slurp_extended_name_table _bfd_noarchive_slurp_extended_name_table
-#define bfd_mach_o_construct_extended_name_table _bfd_noarchive_construct_extended_name_table
-#define bfd_mach_o_truncate_arname _bfd_noarchive_truncate_arname
-#define bfd_mach_o_write_armap _bfd_noarchive_write_armap
-#define bfd_mach_o_get_elt_at_index _bfd_noarchive_get_elt_at_index
-#define bfd_mach_o_generic_stat_arch_elt _bfd_noarchive_generic_stat_arch_elt
-#define bfd_mach_o_update_armap_timestamp _bfd_noarchive_update_armap_timestamp
-#define bfd_mach_o_close_and_cleanup _bfd_generic_close_and_cleanup
-#define bfd_mach_o_bfd_free_cached_info _bfd_generic_bfd_free_cached_info
-#define bfd_mach_o_new_section_hook _bfd_generic_new_section_hook
-#define bfd_mach_o_get_section_contents_in_window _bfd_generic_get_section_contents_in_window
-#define bfd_mach_o_bfd_is_local_label_name _bfd_nosymbols_bfd_is_local_label_name
-#define bfd_mach_o_get_lineno _bfd_nosymbols_get_lineno
-#define bfd_mach_o_find_nearest_line _bfd_nosymbols_find_nearest_line
-#define bfd_mach_o_bfd_make_debug_symbol _bfd_nosymbols_bfd_make_debug_symbol
-#define bfd_mach_o_read_minisymbols _bfd_generic_read_minisymbols
-#define bfd_mach_o_minisymbol_to_symbol _bfd_generic_minisymbol_to_symbol
-#define bfd_mach_o_get_reloc_upper_bound _bfd_norelocs_get_reloc_upper_bound
-#define bfd_mach_o_canonicalize_reloc _bfd_norelocs_canonicalize_reloc
-#define bfd_mach_o_bfd_reloc_type_lookup _bfd_norelocs_bfd_reloc_type_lookup
+#define bfd_mach_o_mkarchive _bfd_noarchive_mkarchive
+#define bfd_mach_o_read_ar_hdr _bfd_noarchive_read_ar_hdr
+#define bfd_mach_o_slurp_armap _bfd_noarchive_slurp_armap
+#define bfd_mach_o_slurp_extended_name_table _bfd_noarchive_slurp_extended_name_table
+#define bfd_mach_o_construct_extended_name_table _bfd_noarchive_construct_extended_name_table
+#define bfd_mach_o_truncate_arname _bfd_noarchive_truncate_arname
+#define bfd_mach_o_write_armap _bfd_noarchive_write_armap
+#define bfd_mach_o_get_elt_at_index _bfd_noarchive_get_elt_at_index
+#define bfd_mach_o_generic_stat_arch_elt _bfd_noarchive_generic_stat_arch_elt
+#define bfd_mach_o_update_armap_timestamp _bfd_noarchive_update_armap_timestamp
+#define bfd_mach_o_close_and_cleanup _bfd_generic_close_and_cleanup
+#define bfd_mach_o_bfd_free_cached_info _bfd_generic_bfd_free_cached_info
+#define bfd_mach_o_new_section_hook _bfd_generic_new_section_hook
+#define bfd_mach_o_get_section_contents_in_window _bfd_generic_get_section_contents_in_window
+#define bfd_mach_o_bfd_is_local_label_name _bfd_nosymbols_bfd_is_local_label_name
+#define bfd_mach_o_bfd_is_target_special_symbol ((bfd_boolean (*) (bfd *, asymbol *)) bfd_false)
+#define bfd_mach_o_bfd_is_local_label_name _bfd_nosymbols_bfd_is_local_label_name
+#define bfd_mach_o_get_lineno _bfd_nosymbols_get_lineno
+#define bfd_mach_o_find_nearest_line _bfd_nosymbols_find_nearest_line
+#define bfd_mach_o_find_inliner_info _bfd_nosymbols_find_inliner_info
+#define bfd_mach_o_bfd_make_debug_symbol _bfd_nosymbols_bfd_make_debug_symbol
+#define bfd_mach_o_read_minisymbols _bfd_generic_read_minisymbols
+#define bfd_mach_o_minisymbol_to_symbol _bfd_generic_minisymbol_to_symbol
+#define bfd_mach_o_get_reloc_upper_bound _bfd_norelocs_get_reloc_upper_bound
+#define bfd_mach_o_canonicalize_reloc _bfd_norelocs_canonicalize_reloc
+#define bfd_mach_o_bfd_reloc_type_lookup _bfd_norelocs_bfd_reloc_type_lookup
#define bfd_mach_o_bfd_get_relocated_section_contents bfd_generic_get_relocated_section_contents
-#define bfd_mach_o_bfd_relax_section bfd_generic_relax_section
-#define bfd_mach_o_bfd_link_hash_table_create _bfd_generic_link_hash_table_create
-#define bfd_mach_o_bfd_link_hash_table_free _bfd_generic_link_hash_table_free
-#define bfd_mach_o_bfd_link_add_symbols _bfd_generic_link_add_symbols
-#define bfd_mach_o_bfd_link_just_syms _bfd_generic_link_just_syms
-#define bfd_mach_o_bfd_final_link _bfd_generic_final_link
-#define bfd_mach_o_bfd_link_split_section _bfd_generic_link_split_section
-#define bfd_mach_o_set_arch_mach bfd_default_set_arch_mach
-#define bfd_mach_o_bfd_merge_private_bfd_data _bfd_generic_bfd_merge_private_bfd_data
-#define bfd_mach_o_bfd_set_private_flags _bfd_generic_bfd_set_private_flags
-#define bfd_mach_o_bfd_print_private_bfd_data _bfd_generic_bfd_print_private_bfd_data
-#define bfd_mach_o_get_section_contents _bfd_generic_get_section_contents
-#define bfd_mach_o_set_section_contents _bfd_generic_set_section_contents
-#define bfd_mach_o_bfd_gc_sections bfd_generic_gc_sections
-#define bfd_mach_o_bfd_merge_sections bfd_generic_merge_sections
-#define bfd_mach_o_bfd_discard_group bfd_generic_discard_group
-
-static boolean bfd_mach_o_bfd_copy_private_symbol_data PARAMS ((bfd *, asymbol *, bfd *, asymbol *));
-static boolean bfd_mach_o_bfd_copy_private_section_data PARAMS ((bfd *, asection *, bfd *, asection *));
-static boolean bfd_mach_o_bfd_copy_private_bfd_data PARAMS ((bfd *, bfd *));
-static long bfd_mach_o_count_symbols PARAMS ((bfd *));
-static long bfd_mach_o_get_symtab_upper_bound PARAMS ((bfd *));
-static long bfd_mach_o_get_symtab PARAMS ((bfd *, asymbol **));
-static void bfd_mach_o_get_symbol_info PARAMS ((bfd *, asymbol *, symbol_info *));
-static void bfd_mach_o_print_symbol PARAMS ((bfd *, PTR, asymbol *, bfd_print_symbol_type));
-static void bfd_mach_o_convert_architecture PARAMS ((bfd_mach_o_cpu_type, bfd_mach_o_cpu_subtype, enum bfd_architecture *, unsigned long *));
-static boolean bfd_mach_o_write_contents PARAMS ((bfd *));
-static int bfd_mach_o_sizeof_headers PARAMS ((bfd *, boolean));
-static asymbol * bfd_mach_o_make_empty_symbol PARAMS ((bfd *));
-static int bfd_mach_o_write_header PARAMS ((bfd *, bfd_mach_o_header *));
-static int bfd_mach_o_read_header PARAMS ((bfd *, bfd_mach_o_header *));
-static asection * bfd_mach_o_make_bfd_section PARAMS ((bfd *, bfd_mach_o_section *));
-static int bfd_mach_o_scan_read_section PARAMS ((bfd *, bfd_mach_o_section *, bfd_vma));
-static int bfd_mach_o_scan_write_section PARAMS ((bfd *, bfd_mach_o_section *, bfd_vma));
-static int bfd_mach_o_scan_write_symtab_symbols PARAMS ((bfd *, bfd_mach_o_load_command *));
-static int bfd_mach_o_scan_write_thread PARAMS ((bfd *, bfd_mach_o_load_command *));
-static int bfd_mach_o_scan_read_dylinker PARAMS ((bfd *, bfd_mach_o_load_command *));
-static int bfd_mach_o_scan_read_dylib PARAMS ((bfd *, bfd_mach_o_load_command *));
-static int bfd_mach_o_scan_read_prebound_dylib PARAMS ((bfd *, bfd_mach_o_load_command *));
-static int bfd_mach_o_scan_read_thread PARAMS ((bfd *, bfd_mach_o_load_command *));
-static int bfd_mach_o_scan_write_symtab PARAMS ((bfd *, bfd_mach_o_load_command *));
-static int bfd_mach_o_scan_read_dysymtab PARAMS ((bfd *, bfd_mach_o_load_command *));
-static int bfd_mach_o_scan_read_symtab PARAMS ((bfd *, bfd_mach_o_load_command *));
-static int bfd_mach_o_scan_read_segment PARAMS ((bfd *, bfd_mach_o_load_command *));
-static int bfd_mach_o_scan_write_segment PARAMS ((bfd *, bfd_mach_o_load_command *));
-static int bfd_mach_o_scan_read_command PARAMS ((bfd *, bfd_mach_o_load_command *));
-static void bfd_mach_o_flatten_sections PARAMS ((bfd *));
-static const char * bfd_mach_o_i386_flavour_string PARAMS ((unsigned int));
-static const char * bfd_mach_o_ppc_flavour_string PARAMS ((unsigned int));
+#define bfd_mach_o_bfd_relax_section bfd_generic_relax_section
+#define bfd_mach_o_bfd_link_hash_table_create _bfd_generic_link_hash_table_create
+#define bfd_mach_o_bfd_link_hash_table_free _bfd_generic_link_hash_table_free
+#define bfd_mach_o_bfd_link_add_symbols _bfd_generic_link_add_symbols
+#define bfd_mach_o_bfd_link_just_syms _bfd_generic_link_just_syms
+#define bfd_mach_o_bfd_final_link _bfd_generic_final_link
+#define bfd_mach_o_bfd_link_split_section _bfd_generic_link_split_section
+#define bfd_mach_o_set_arch_mach bfd_default_set_arch_mach
+#define bfd_mach_o_bfd_merge_private_bfd_data _bfd_generic_bfd_merge_private_bfd_data
+#define bfd_mach_o_bfd_set_private_flags _bfd_generic_bfd_set_private_flags
+#define bfd_mach_o_bfd_print_private_bfd_data _bfd_generic_bfd_print_private_bfd_data
+#define bfd_mach_o_get_section_contents _bfd_generic_get_section_contents
+#define bfd_mach_o_set_section_contents _bfd_generic_set_section_contents
+#define bfd_mach_o_bfd_gc_sections bfd_generic_gc_sections
+#define bfd_mach_o_bfd_merge_sections bfd_generic_merge_sections
+#define bfd_mach_o_bfd_is_group_section bfd_generic_is_group_section
+#define bfd_mach_o_bfd_discard_group bfd_generic_discard_group
+#define bfd_mach_o_section_already_linked _bfd_generic_section_already_linked
+#define bfd_mach_o_bfd_copy_private_header_data _bfd_generic_bfd_copy_private_header_data
+#define bfd_mach_o_core_file_matches_executable_p generic_core_file_matches_executable_p
+
/* The flags field of a section structure is separated into two parts a section
type and section attributes. The section types are mutually exclusive (it
#define N_SECT 0xe
#define N_INDR 0xa
-boolean
-bfd_mach_o_valid (abfd)
- bfd *abfd;
+bfd_boolean
+bfd_mach_o_valid (bfd *abfd)
{
if (abfd == NULL || abfd->xvec == NULL)
return 0;
/* Copy any private info we understand from the input symbol
to the output symbol. */
-static boolean
-bfd_mach_o_bfd_copy_private_symbol_data (ibfd, isymbol, obfd, osymbol)
- bfd *ibfd ATTRIBUTE_UNUSED;
- asymbol *isymbol ATTRIBUTE_UNUSED;
- bfd *obfd ATTRIBUTE_UNUSED;
- asymbol *osymbol ATTRIBUTE_UNUSED;
+static bfd_boolean
+bfd_mach_o_bfd_copy_private_symbol_data (bfd *ibfd ATTRIBUTE_UNUSED,
+ asymbol *isymbol ATTRIBUTE_UNUSED,
+ bfd *obfd ATTRIBUTE_UNUSED,
+ asymbol *osymbol ATTRIBUTE_UNUSED)
{
- return true;
+ return TRUE;
}
/* Copy any private info we understand from the input section
to the output section. */
-static boolean
-bfd_mach_o_bfd_copy_private_section_data (ibfd, isection, obfd, osection)
- bfd *ibfd ATTRIBUTE_UNUSED;
- asection *isection ATTRIBUTE_UNUSED;
- bfd *obfd ATTRIBUTE_UNUSED;
- asection *osection ATTRIBUTE_UNUSED;
+static bfd_boolean
+bfd_mach_o_bfd_copy_private_section_data (bfd *ibfd ATTRIBUTE_UNUSED,
+ asection *isection ATTRIBUTE_UNUSED,
+ bfd *obfd ATTRIBUTE_UNUSED,
+ asection *osection ATTRIBUTE_UNUSED)
{
- return true;
+ return TRUE;
}
/* Copy any private info we understand from the input bfd
to the output bfd. */
-static boolean
-bfd_mach_o_bfd_copy_private_bfd_data (ibfd, obfd)
- bfd *ibfd;
- bfd *obfd;
+static bfd_boolean
+bfd_mach_o_bfd_copy_private_bfd_data (bfd *ibfd, bfd *obfd)
{
BFD_ASSERT (bfd_mach_o_valid (ibfd));
BFD_ASSERT (bfd_mach_o_valid (obfd));
obfd->tdata.mach_o_data = ibfd->tdata.mach_o_data;
obfd->tdata.mach_o_data->ibfd = ibfd;
- return true;
+ return TRUE;
}
static long
-bfd_mach_o_count_symbols (abfd)
- bfd *abfd;
+bfd_mach_o_count_symbols (bfd *abfd)
{
bfd_mach_o_data_struct *mdata = NULL;
long nsyms = 0;
}
static long
-bfd_mach_o_get_symtab_upper_bound (abfd)
- bfd *abfd;
+bfd_mach_o_get_symtab_upper_bound (bfd *abfd)
{
long nsyms = bfd_mach_o_count_symbols (abfd);
}
static long
-bfd_mach_o_get_symtab (abfd, alocation)
- bfd *abfd;
- asymbol **alocation;
+bfd_mach_o_canonicalize_symtab (bfd *abfd, asymbol **alocation)
{
bfd_mach_o_data_struct *mdata = abfd->tdata.mach_o_data;
long nsyms = bfd_mach_o_count_symbols (abfd);
if (bfd_mach_o_scan_read_symtab_symbols (abfd, &mdata->commands[i].command.symtab) != 0)
{
- fprintf (stderr, "bfd_mach_o_get_symtab: unable to load symbols for section %lu\n", i);
+ fprintf (stderr, "bfd_mach_o_canonicalize_symtab: unable to load symbols for section %lu\n", i);
return 0;
}
}
static void
-bfd_mach_o_get_symbol_info (abfd, symbol, ret)
- bfd *abfd ATTRIBUTE_UNUSED;
- asymbol *symbol;
- symbol_info *ret;
+bfd_mach_o_get_symbol_info (bfd *abfd ATTRIBUTE_UNUSED,
+ asymbol *symbol,
+ symbol_info *ret)
{
bfd_symbol_info (symbol, ret);
}
static void
-bfd_mach_o_print_symbol (abfd, afile, symbol, how)
- bfd *abfd;
- PTR afile;
- asymbol *symbol;
- bfd_print_symbol_type how;
+bfd_mach_o_print_symbol (bfd *abfd,
+ PTR afile,
+ asymbol *symbol,
+ bfd_print_symbol_type how)
{
FILE *file = (FILE *) afile;
}
static void
-bfd_mach_o_convert_architecture (mtype, msubtype, type, subtype)
- bfd_mach_o_cpu_type mtype;
- bfd_mach_o_cpu_subtype msubtype ATTRIBUTE_UNUSED;
- enum bfd_architecture *type;
- unsigned long *subtype;
+bfd_mach_o_convert_architecture (bfd_mach_o_cpu_type mtype,
+ bfd_mach_o_cpu_subtype msubtype ATTRIBUTE_UNUSED,
+ enum bfd_architecture *type,
+ unsigned long *subtype)
{
*subtype = bfd_arch_unknown;
}
}
-static boolean
-bfd_mach_o_write_contents (abfd)
- bfd *abfd;
+static int
+bfd_mach_o_write_header (bfd *abfd, bfd_mach_o_header *header)
{
- unsigned int i;
- asection *s;
+ unsigned char buf[28];
- bfd_mach_o_data_struct *mdata = abfd->tdata.mach_o_data;
+ bfd_h_put_32 (abfd, header->magic, buf + 0);
+ bfd_h_put_32 (abfd, header->cputype, buf + 4);
+ bfd_h_put_32 (abfd, header->cpusubtype, buf + 8);
+ bfd_h_put_32 (abfd, header->filetype, buf + 12);
+ bfd_h_put_32 (abfd, header->ncmds, buf + 16);
+ bfd_h_put_32 (abfd, header->sizeofcmds, buf + 20);
+ bfd_h_put_32 (abfd, header->flags, buf + 24);
- /* Write data sections first in case they overlap header data to be
- written later. */
+ bfd_seek (abfd, 0, SEEK_SET);
+ if (bfd_bwrite ((PTR) buf, 28, abfd) != 28)
+ return -1;
- for (s = abfd->sections; s != (asection *) NULL; s = s->next)
- ;
+ return 0;
+}
-#if 0
- for (i = 0; i < mdata->header.ncmds; i++)
+static int
+bfd_mach_o_scan_write_thread (bfd *abfd,
+ bfd_mach_o_load_command *command)
+{
+ bfd_mach_o_thread_command *cmd = &command->command.thread;
+ unsigned int i;
+ unsigned char buf[8];
+ bfd_vma offset;
+ unsigned int nflavours;
+
+ BFD_ASSERT ((command->type == BFD_MACH_O_LC_THREAD)
+ || (command->type == BFD_MACH_O_LC_UNIXTHREAD));
+
+ offset = 8;
+ nflavours = 0;
+ for (i = 0; i < cmd->nflavours; i++)
{
- bfd_mach_o_load_command *cur = &mdata->commands[i];
- if (cur->type != BFD_MACH_O_LC_SEGMENT)
- break;
+ BFD_ASSERT ((cmd->flavours[i].size % 4) == 0);
+ BFD_ASSERT (cmd->flavours[i].offset == (command->offset + offset + 8));
- {
- bfd_mach_o_segment_command *seg = &cur->command.segment;
- char buf[1024];
- bfd_vma nbytes = seg->filesize;
- bfd_vma curoff = seg->fileoff;
+ bfd_h_put_32 (abfd, cmd->flavours[i].flavour, buf);
+ bfd_h_put_32 (abfd, (cmd->flavours[i].size / 4), buf + 4);
+
+ bfd_seek (abfd, command->offset + offset, SEEK_SET);
+ if (bfd_bwrite ((PTR) buf, 8, abfd) != 8)
+ return -1;
+
+ offset += cmd->flavours[i].size + 8;
+ }
+
+ return 0;
+}
+
+static int
+bfd_mach_o_scan_write_section (bfd *abfd,
+ bfd_mach_o_section *section,
+ bfd_vma offset)
+{
+ unsigned char buf[68];
+
+ memcpy (buf, section->sectname, 16);
+ memcpy (buf + 16, section->segname, 16);
+ bfd_h_put_32 (abfd, section->addr, buf + 32);
+ bfd_h_put_32 (abfd, section->size, buf + 36);
+ bfd_h_put_32 (abfd, section->offset, buf + 40);
+ bfd_h_put_32 (abfd, section->align, buf + 44);
+ bfd_h_put_32 (abfd, section->reloff, buf + 48);
+ bfd_h_put_32 (abfd, section->nreloc, buf + 52);
+ bfd_h_put_32 (abfd, section->flags, buf + 56);
+ /* bfd_h_put_32 (abfd, section->reserved1, buf + 60); */
+ /* bfd_h_put_32 (abfd, section->reserved2, buf + 64); */
+
+ bfd_seek (abfd, offset, SEEK_SET);
+ if (bfd_bwrite ((PTR) buf, 68, abfd) != 68)
+ return -1;
+
+ return 0;
+}
+
+static int
+bfd_mach_o_scan_write_segment (bfd *abfd, bfd_mach_o_load_command *command)
+{
+ unsigned char buf[48];
+ bfd_mach_o_segment_command *seg = &command->command.segment;
+ unsigned long i;
+
+ BFD_ASSERT (command->type == BFD_MACH_O_LC_SEGMENT);
+
+ memcpy (buf, seg->segname, 16);
+ bfd_h_put_32 (abfd, seg->vmaddr, buf + 16);
+ bfd_h_put_32 (abfd, seg->vmsize, buf + 20);
+ bfd_h_put_32 (abfd, seg->fileoff, buf + 24);
+ bfd_h_put_32 (abfd, seg->filesize, buf + 28);
+ bfd_h_put_32 (abfd, 0 /* seg->maxprot */, buf + 32);
+ bfd_h_put_32 (abfd, 0 /* seg->initprot */, buf + 36);
+ bfd_h_put_32 (abfd, seg->nsects, buf + 40);
+ bfd_h_put_32 (abfd, seg->flags, buf + 44);
+
+ bfd_seek (abfd, command->offset + 8, SEEK_SET);
+ if (bfd_bwrite ((PTR) buf, 48, abfd) != 48)
+ return -1;
- while (nbytes > 0)
- {
- bfd_vma thisread = nbytes;
+ {
+ char buf[1024];
+ bfd_vma nbytes = seg->filesize;
+ bfd_vma curoff = seg->fileoff;
- if (thisread > 1024)
- thisread = 1024;
+ while (nbytes > 0)
+ {
+ bfd_vma thisread = nbytes;
- bfd_seek (abfd, curoff, SEEK_SET);
- if (bfd_bread ((PTR) buf, thisread, abfd) != thisread)
- return false;
+ if (thisread > 1024)
+ thisread = 1024;
- bfd_seek (abfd, curoff, SEEK_SET);
- if (bfd_bwrite ((PTR) buf, thisread, abfd) != thisread)
- return false;
+ bfd_seek (abfd, curoff, SEEK_SET);
+ if (bfd_bread ((PTR) buf, thisread, abfd) != thisread)
+ return -1;
- nbytes -= thisread;
- curoff += thisread;
- }
+ bfd_seek (abfd, curoff, SEEK_SET);
+ if (bfd_bwrite ((PTR) buf, thisread, abfd) != thisread)
+ return -1;
+
+ nbytes -= thisread;
+ curoff += thisread;
}
}
-#endif
+
+ for (i = 0; i < seg->nsects; i++)
+ {
+ bfd_vma segoff = command->offset + 48 + 8 + (i * 68);
+
+ if (bfd_mach_o_scan_write_section (abfd, &seg->sections[i], segoff) != 0)
+ return -1;
+ }
+
+ return 0;
+}
+
+static int
+bfd_mach_o_scan_write_symtab_symbols (bfd *abfd,
+ bfd_mach_o_load_command *command)
+{
+ bfd_mach_o_symtab_command *sym = &command->command.symtab;
+ asymbol *s = NULL;
+ unsigned long i;
+
+ for (i = 0; i < sym->nsyms; i++)
+ {
+ unsigned char buf[12];
+ bfd_vma symoff = sym->symoff + (i * 12);
+ unsigned char ntype = 0;
+ unsigned char nsect = 0;
+ short ndesc = 0;
+
+ s = &sym->symbols[i];
+
+ /* Instead just set from the stored values. */
+ ntype = (s->udata.i >> 24) & 0xff;
+ nsect = (s->udata.i >> 16) & 0xff;
+ ndesc = s->udata.i & 0xffff;
+
+ bfd_h_put_32 (abfd, s->name - sym->strtab, buf);
+ bfd_h_put_8 (abfd, ntype, buf + 4);
+ bfd_h_put_8 (abfd, nsect, buf + 5);
+ bfd_h_put_16 (abfd, ndesc, buf + 6);
+ bfd_h_put_32 (abfd, s->section->vma + s->value, buf + 8);
+
+ bfd_seek (abfd, symoff, SEEK_SET);
+ if (bfd_bwrite ((PTR) buf, 12, abfd) != 12)
+ {
+ fprintf (stderr, "bfd_mach_o_scan_write_symtab_symbols: unable to write %d bytes at %lu\n",
+ 12, (unsigned long) symoff);
+ return -1;
+ }
+ }
+
+ return 0;
+}
+
+static int
+bfd_mach_o_scan_write_symtab (bfd *abfd, bfd_mach_o_load_command *command)
+{
+ bfd_mach_o_symtab_command *seg = &command->command.symtab;
+ unsigned char buf[16];
+
+ BFD_ASSERT (command->type == BFD_MACH_O_LC_SYMTAB);
+
+ bfd_h_put_32 (abfd, seg->symoff, buf);
+ bfd_h_put_32 (abfd, seg->nsyms, buf + 4);
+ bfd_h_put_32 (abfd, seg->stroff, buf + 8);
+ bfd_h_put_32 (abfd, seg->strsize, buf + 12);
+
+ bfd_seek (abfd, command->offset + 8, SEEK_SET);
+ if (bfd_bwrite ((PTR) buf, 16, abfd) != 16)
+ return -1;
+
+ if (bfd_mach_o_scan_write_symtab_symbols (abfd, command) != 0)
+ return -1;
+
+ return 0;
+}
+
+static bfd_boolean
+bfd_mach_o_write_contents (bfd *abfd)
+{
+ unsigned int i;
+ asection *s;
+
+ bfd_mach_o_data_struct *mdata = abfd->tdata.mach_o_data;
+
+ /* Write data sections first in case they overlap header data to be
+ written later. */
+
+ for (s = abfd->sections; s != (asection *) NULL; s = s->next)
+ ;
/* Now write header information. */
if (bfd_mach_o_write_header (abfd, &mdata->header) != 0)
- return false;
+ return FALSE;
for (i = 0; i < mdata->header.ncmds; i++)
{
bfd_seek (abfd, cur->offset, SEEK_SET);
if (bfd_bwrite ((PTR) buf, 8, abfd) != 8)
- return false;
+ return FALSE;
switch (cur->type)
{
case BFD_MACH_O_LC_SEGMENT:
if (bfd_mach_o_scan_write_segment (abfd, cur) != 0)
- return false;
+ return FALSE;
break;
case BFD_MACH_O_LC_SYMTAB:
if (bfd_mach_o_scan_write_symtab (abfd, cur) != 0)
- return false;
+ return FALSE;
break;
case BFD_MACH_O_LC_SYMSEG:
break;
case BFD_MACH_O_LC_THREAD:
case BFD_MACH_O_LC_UNIXTHREAD:
if (bfd_mach_o_scan_write_thread (abfd, cur) != 0)
- return false;
+ return FALSE;
break;
case BFD_MACH_O_LC_LOADFVMLIB:
case BFD_MACH_O_LC_IDFVMLIB:
fprintf (stderr,
"unable to write unknown load command 0x%lx\n",
(long) cur->type);
- return false;
+ return FALSE;
}
}
- return true;
+ return TRUE;
}
static int
-bfd_mach_o_sizeof_headers (a, b)
- bfd *a ATTRIBUTE_UNUSED;
- boolean b ATTRIBUTE_UNUSED;
+bfd_mach_o_sizeof_headers (bfd *a ATTRIBUTE_UNUSED,
+ bfd_boolean b ATTRIBUTE_UNUSED)
{
return 0;
}
bfd_make_section_anyway wants to create a symbol for the section. */
static asymbol *
-bfd_mach_o_make_empty_symbol (abfd)
- bfd *abfd;
+bfd_mach_o_make_empty_symbol (bfd *abfd)
{
asymbol *new;
- new = (asymbol *) bfd_zalloc (abfd, sizeof (asymbol));
+ new = bfd_zalloc (abfd, sizeof (* new));
if (new == NULL)
return new;
new->the_bfd = abfd;
}
static int
-bfd_mach_o_write_header (abfd, header)
- bfd *abfd;
- bfd_mach_o_header *header;
+bfd_mach_o_read_header (bfd *abfd, bfd_mach_o_header *header)
{
unsigned char buf[28];
-
- bfd_h_put_32 (abfd, header->magic, buf + 0);
- bfd_h_put_32 (abfd, header->cputype, buf + 4);
- bfd_h_put_32 (abfd, header->cpusubtype, buf + 8);
- bfd_h_put_32 (abfd, header->filetype, buf + 12);
- bfd_h_put_32 (abfd, header->ncmds, buf + 16);
- bfd_h_put_32 (abfd, header->sizeofcmds, buf + 20);
- bfd_h_put_32 (abfd, header->flags, buf + 24);
-
- bfd_seek (abfd, 0, SEEK_SET);
- if (bfd_bwrite ((PTR) buf, 28, abfd) != 28)
- return -1;
-
- return 0;
-}
-
-static int
-bfd_mach_o_read_header (abfd, header)
- bfd *abfd;
- bfd_mach_o_header *header;
-{
- unsigned char buf[28];
- bfd_vma (*get32) PARAMS ((const bfd_byte *)) = NULL;
+ bfd_vma (*get32) (const void *) = NULL;
bfd_seek (abfd, 0, SEEK_SET);
}
static asection *
-bfd_mach_o_make_bfd_section (abfd, section)
- bfd *abfd;
- bfd_mach_o_section *section;
+bfd_mach_o_make_bfd_section (bfd *abfd, bfd_mach_o_section *section)
{
asection *bfdsec;
char *sname;
+ strlen (section->segname) + 1
+ strlen (section->sectname) + 1;
- sname = (char *) bfd_alloc (abfd, snamelen);
+ sname = bfd_alloc (abfd, snamelen);
if (sname == NULL)
return NULL;
sprintf (sname, "%s.%s.%s", prefix, section->segname, section->sectname);
bfdsec->vma = section->addr;
bfdsec->lma = section->addr;
- bfdsec->_raw_size = section->size;
+ bfdsec->size = section->size;
bfdsec->filepos = section->offset;
bfdsec->alignment_power = section->align;
}
static int
-bfd_mach_o_scan_read_section (abfd, section, offset)
- bfd *abfd;
- bfd_mach_o_section *section;
- bfd_vma offset;
+bfd_mach_o_scan_read_section (bfd *abfd,
+ bfd_mach_o_section *section,
+ bfd_vma offset)
{
unsigned char buf[68];
return 0;
}
-static int
-bfd_mach_o_scan_write_section (abfd, section, offset)
- bfd *abfd;
- bfd_mach_o_section *section;
- bfd_vma offset;
-{
- unsigned char buf[68];
-
- memcpy (buf, section->sectname, 16);
- memcpy (buf + 16, section->segname, 16);
- bfd_h_put_32 (abfd, section->addr, buf + 32);
- bfd_h_put_32 (abfd, section->size, buf + 36);
- bfd_h_put_32 (abfd, section->offset, buf + 40);
- bfd_h_put_32 (abfd, section->align, buf + 44);
- bfd_h_put_32 (abfd, section->reloff, buf + 48);
- bfd_h_put_32 (abfd, section->nreloc, buf + 52);
- bfd_h_put_32 (abfd, section->flags, buf + 56);
- /* bfd_h_put_32 (abfd, section->reserved1, buf + 60); */
- /* bfd_h_put_32 (abfd, section->reserved2, buf + 64); */
-
- bfd_seek (abfd, offset, SEEK_SET);
- if (bfd_bwrite ((PTR) buf, 68, abfd) != 68)
- return -1;
-
- return 0;
-}
-
-static int
-bfd_mach_o_scan_write_symtab_symbols (abfd, command)
- bfd *abfd;
- bfd_mach_o_load_command *command;
-{
- bfd_mach_o_symtab_command *sym = &command->command.symtab;
- asymbol *s = NULL;
- unsigned long i;
-
- for (i = 0; i < sym->nsyms; i++)
- {
- unsigned char buf[12];
- bfd_vma symoff = sym->symoff + (i * 12);
- unsigned char ntype = 0;
- unsigned char nsect = 0;
- short ndesc = 0;
-
- s = &sym->symbols[i];
-
- /* Don't set this from the symbol information; use stored values. */
-#if 0
- if (s->flags & BSF_GLOBAL)
- ntype |= N_EXT;
- if (s->flags & BSF_DEBUGGING)
- ntype |= N_STAB;
-
- if (s->section == bfd_und_section_ptr)
- ntype |= N_UNDF;
- else if (s->section == bfd_abs_section_ptr)
- ntype |= N_ABS;
- else
- ntype |= N_SECT;
-#endif
-
- /* Instead just set from the stored values. */
- ntype = (s->udata.i >> 24) & 0xff;
- nsect = (s->udata.i >> 16) & 0xff;
- ndesc = s->udata.i & 0xffff;
-
- bfd_h_put_32 (abfd, s->name - sym->strtab, buf);
- bfd_h_put_8 (abfd, ntype, buf + 4);
- bfd_h_put_8 (abfd, nsect, buf + 5);
- bfd_h_put_16 (abfd, ndesc, buf + 6);
- bfd_h_put_32 (abfd, s->section->vma + s->value, buf + 8);
-
- bfd_seek (abfd, symoff, SEEK_SET);
- if (bfd_bwrite ((PTR) buf, 12, abfd) != 12)
- {
- fprintf (stderr, "bfd_mach_o_scan_write_symtab_symbols: unable to write %d bytes at %lu\n",
- 12, (unsigned long) symoff);
- return -1;
- }
- }
-
- return 0;
-}
-
int
-bfd_mach_o_scan_read_symtab_symbol (abfd, sym, s, i)
- bfd *abfd;
- bfd_mach_o_symtab_command *sym;
- asymbol *s;
- unsigned long i;
+bfd_mach_o_scan_read_symtab_symbol (bfd *abfd,
+ bfd_mach_o_symtab_command *sym,
+ asymbol *s,
+ unsigned long i)
{
bfd_mach_o_data_struct *mdata = abfd->tdata.mach_o_data;
bfd_vma symoff = sym->symoff + (i * 12);
unsigned char type = -1;
unsigned char section = -1;
short desc = -1;
- long value = -1;
+ unsigned long value = -1;
unsigned long stroff = -1;
unsigned int symtype = -1;
}
int
-bfd_mach_o_scan_read_symtab_strtab (abfd, sym)
- bfd *abfd;
- bfd_mach_o_symtab_command *sym;
+bfd_mach_o_scan_read_symtab_strtab (bfd *abfd,
+ bfd_mach_o_symtab_command *sym)
{
BFD_ASSERT (sym->strtab == NULL);
bfd_set_error (bfd_error_file_truncated);
return -1;
}
- sym->strtab = b->buffer + sym->stroff;
+ sym->strtab = (char *) b->buffer + sym->stroff;
return 0;
}
}
int
-bfd_mach_o_scan_read_symtab_symbols (abfd, sym)
- bfd *abfd;
- bfd_mach_o_symtab_command *sym;
+bfd_mach_o_scan_read_symtab_symbols (bfd *abfd,
+ bfd_mach_o_symtab_command *sym)
{
unsigned long i;
int ret;
}
int
-bfd_mach_o_scan_read_dysymtab_symbol (abfd, dysym, sym, s, i)
- bfd *abfd;
- bfd_mach_o_dysymtab_command *dysym;
- bfd_mach_o_symtab_command *sym;
- asymbol *s;
- unsigned long i;
+bfd_mach_o_scan_read_dysymtab_symbol (bfd *abfd,
+ bfd_mach_o_dysymtab_command *dysym,
+ bfd_mach_o_symtab_command *sym,
+ asymbol *s,
+ unsigned long i)
{
unsigned long isymoff = dysym->indirectsymoff + (i * 4);
unsigned long symindex;
}
static const char *
-bfd_mach_o_i386_flavour_string (flavour)
- unsigned int flavour;
+bfd_mach_o_i386_flavour_string (unsigned int flavour)
{
switch ((int) flavour)
{
}
static const char *
-bfd_mach_o_ppc_flavour_string (flavour)
- unsigned int flavour;
+bfd_mach_o_ppc_flavour_string (unsigned int flavour)
{
switch ((int) flavour)
{
}
static int
-bfd_mach_o_scan_write_thread (abfd, command)
- bfd *abfd;
- bfd_mach_o_load_command *command;
-{
- bfd_mach_o_thread_command *cmd = &command->command.thread;
- unsigned int i;
- unsigned char buf[8];
- bfd_vma offset;
- unsigned int nflavours;
-
- BFD_ASSERT ((command->type == BFD_MACH_O_LC_THREAD)
- || (command->type == BFD_MACH_O_LC_UNIXTHREAD));
-
- offset = 8;
- nflavours = 0;
- for (i = 0; i < cmd->nflavours; i++)
- {
- BFD_ASSERT ((cmd->flavours[i].size % 4) == 0);
- BFD_ASSERT (cmd->flavours[i].offset == (command->offset + offset + 8));
-
- bfd_h_put_32 (abfd, cmd->flavours[i].flavour, buf);
- bfd_h_put_32 (abfd, (cmd->flavours[i].size / 4), buf + 4);
-
- bfd_seek (abfd, command->offset + offset, SEEK_SET);
- if (bfd_bwrite ((PTR) buf, 8, abfd) != 8)
- return -1;
-
- offset += cmd->flavours[i].size + 8;
- }
-
- return 0;
-}
-
-static int
-bfd_mach_o_scan_read_dylinker (abfd, command)
- bfd *abfd;
- bfd_mach_o_load_command *command;
+bfd_mach_o_scan_read_dylinker (bfd *abfd,
+ bfd_mach_o_load_command *command)
{
bfd_mach_o_dylinker_command *cmd = &command->command.dylinker;
unsigned char buf[4];
else
abort ();
- sname = (char *) bfd_alloc (abfd, strlen (prefix) + 1);
+ sname = bfd_alloc (abfd, strlen (prefix) + 1);
if (sname == NULL)
return -1;
strcpy (sname, prefix);
bfdsec->vma = 0;
bfdsec->lma = 0;
- bfdsec->_raw_size = command->len - 8;
+ bfdsec->size = command->len - 8;
bfdsec->filepos = command->offset + 8;
bfdsec->alignment_power = 0;
bfdsec->flags = SEC_HAS_CONTENTS;
}
static int
-bfd_mach_o_scan_read_dylib (abfd, command)
- bfd *abfd;
- bfd_mach_o_load_command *command;
+bfd_mach_o_scan_read_dylib (bfd *abfd, bfd_mach_o_load_command *command)
{
bfd_mach_o_dylib_command *cmd = &command->command.dylib;
unsigned char buf[16];
else
abort ();
- sname = (char *) bfd_alloc (abfd, strlen (prefix) + 1);
+ sname = bfd_alloc (abfd, strlen (prefix) + 1);
if (sname == NULL)
return -1;
strcpy (sname, prefix);
bfdsec->vma = 0;
bfdsec->lma = 0;
- bfdsec->_raw_size = command->len - 8;
+ bfdsec->size = command->len - 8;
bfdsec->filepos = command->offset + 8;
bfdsec->alignment_power = 0;
bfdsec->flags = SEC_HAS_CONTENTS;
}
static int
-bfd_mach_o_scan_read_prebound_dylib (abfd, command)
- bfd *abfd ATTRIBUTE_UNUSED;
- bfd_mach_o_load_command *command ATTRIBUTE_UNUSED;
+bfd_mach_o_scan_read_prebound_dylib (bfd *abfd ATTRIBUTE_UNUSED,
+ bfd_mach_o_load_command *command ATTRIBUTE_UNUSED)
{
/* bfd_mach_o_prebound_dylib_command *cmd = &command->command.prebound_dylib; */
}
static int
-bfd_mach_o_scan_read_thread (abfd, command)
- bfd *abfd;
- bfd_mach_o_load_command *command;
+bfd_mach_o_scan_read_thread (bfd *abfd, bfd_mach_o_load_command *command)
{
bfd_mach_o_data_struct *mdata = NULL;
bfd_mach_o_thread_command *cmd = &command->command.thread;
nflavours++;
}
- cmd->flavours =
- ((bfd_mach_o_thread_flavour *)
- bfd_alloc (abfd, nflavours * sizeof (bfd_mach_o_thread_flavour)));
+ cmd->flavours = bfd_alloc (abfd, nflavours * sizeof (bfd_mach_o_thread_flavour));
if (cmd->flavours == NULL)
return -1;
cmd->nflavours = nflavours;
}
snamelen = strlen (prefix) + 1 + 20 + 1 + strlen (flavourstr) + 1;
- sname = (char *) bfd_alloc (abfd, snamelen);
+ sname = bfd_alloc (abfd, snamelen);
if (sname == NULL)
return -1;
bfdsec->vma = 0;
bfdsec->lma = 0;
- bfdsec->_raw_size = cmd->flavours[i].size;
+ bfdsec->size = cmd->flavours[i].size;
bfdsec->filepos = cmd->flavours[i].offset;
bfdsec->alignment_power = 0x0;
bfdsec->flags = SEC_HAS_CONTENTS;
}
static int
-bfd_mach_o_scan_write_symtab (abfd, command)
- bfd *abfd;
- bfd_mach_o_load_command *command;
-{
- bfd_mach_o_symtab_command *seg = &command->command.symtab;
- unsigned char buf[16];
-
- BFD_ASSERT (command->type == BFD_MACH_O_LC_SYMTAB);
-
- bfd_h_put_32 (abfd, seg->symoff, buf);
- bfd_h_put_32 (abfd, seg->nsyms, buf + 4);
- bfd_h_put_32 (abfd, seg->stroff, buf + 8);
- bfd_h_put_32 (abfd, seg->strsize, buf + 12);
-
- bfd_seek (abfd, command->offset + 8, SEEK_SET);
- if (bfd_bwrite ((PTR) buf, 16, abfd) != 16)
- return -1;
-
- if (bfd_mach_o_scan_write_symtab_symbols (abfd, command) != 0)
- return -1;
-
- return 0;
-}
-
-static int
-bfd_mach_o_scan_read_dysymtab (abfd, command)
- bfd *abfd;
- bfd_mach_o_load_command *command;
+bfd_mach_o_scan_read_dysymtab (bfd *abfd, bfd_mach_o_load_command *command)
{
bfd_mach_o_dysymtab_command *seg = &command->command.dysymtab;
unsigned char buf[72];
}
static int
-bfd_mach_o_scan_read_symtab (abfd, command)
- bfd *abfd;
- bfd_mach_o_load_command *command;
+bfd_mach_o_scan_read_symtab (bfd *abfd, bfd_mach_o_load_command *command)
{
bfd_mach_o_symtab_command *seg = &command->command.symtab;
unsigned char buf[16];
seg->symbols = NULL;
seg->strtab = NULL;
- sname = (char *) bfd_alloc (abfd, strlen (prefix) + 1);
+ sname = bfd_alloc (abfd, strlen (prefix) + 1);
if (sname == NULL)
return -1;
strcpy (sname, prefix);
bfdsec->vma = 0;
bfdsec->lma = 0;
- bfdsec->_raw_size = seg->nsyms * 12;
+ bfdsec->size = seg->nsyms * 12;
bfdsec->filepos = seg->symoff;
bfdsec->alignment_power = 0;
bfdsec->flags = SEC_HAS_CONTENTS;
seg->stabs_segment = bfdsec;
prefix = "LC_SYMTAB.stabstr";
- sname = (char *) bfd_alloc (abfd, strlen (prefix) + 1);
+ sname = bfd_alloc (abfd, strlen (prefix) + 1);
if (sname == NULL)
return -1;
strcpy (sname, prefix);
bfdsec->vma = 0;
bfdsec->lma = 0;
- bfdsec->_raw_size = seg->strsize;
+ bfdsec->size = seg->strsize;
bfdsec->filepos = seg->stroff;
bfdsec->alignment_power = 0;
bfdsec->flags = SEC_HAS_CONTENTS;
}
static int
-bfd_mach_o_scan_read_segment (abfd, command)
- bfd *abfd;
- bfd_mach_o_load_command *command;
+bfd_mach_o_scan_read_segment (bfd *abfd, bfd_mach_o_load_command *command)
{
unsigned char buf[48];
bfd_mach_o_segment_command *seg = &command->command.segment;
seg->flags = bfd_h_get_32 (abfd, buf + 44);
snamelen = strlen (prefix) + 1 + strlen (seg->segname) + 1;
- sname = (char *) bfd_alloc (abfd, snamelen);
+ sname = bfd_alloc (abfd, snamelen);
if (sname == NULL)
return -1;
sprintf (sname, "%s.%s", prefix, seg->segname);
bfdsec->vma = seg->vmaddr;
bfdsec->lma = seg->vmaddr;
- bfdsec->_raw_size = seg->filesize;
+ bfdsec->size = seg->filesize;
bfdsec->filepos = seg->fileoff;
bfdsec->alignment_power = 0x0;
bfdsec->flags = SEC_HAS_CONTENTS | SEC_LOAD | SEC_ALLOC | SEC_CODE;
if (seg->nsects != 0)
{
- seg->sections =
- ((bfd_mach_o_section *)
- bfd_alloc (abfd, seg->nsects * sizeof (bfd_mach_o_section)));
+ seg->sections = bfd_alloc (abfd, seg->nsects * sizeof (bfd_mach_o_section));
if (seg->sections == NULL)
return -1;
{
bfd_vma segoff = command->offset + 48 + 8 + (i * 68);
- if (bfd_mach_o_scan_read_section (abfd, &seg->sections[i], segoff) != 0)
+ if (bfd_mach_o_scan_read_section (abfd, &seg->sections[i],
+ segoff) != 0)
return -1;
}
}
}
static int
-bfd_mach_o_scan_write_segment (abfd, command)
- bfd *abfd;
- bfd_mach_o_load_command *command;
-{
- unsigned char buf[48];
- bfd_mach_o_segment_command *seg = &command->command.segment;
- unsigned long i;
-
- BFD_ASSERT (command->type == BFD_MACH_O_LC_SEGMENT);
-
- memcpy (buf, seg->segname, 16);
- bfd_h_put_32 (abfd, seg->vmaddr, buf + 16);
- bfd_h_put_32 (abfd, seg->vmsize, buf + 20);
- bfd_h_put_32 (abfd, seg->fileoff, buf + 24);
- bfd_h_put_32 (abfd, seg->filesize, buf + 28);
- bfd_h_put_32 (abfd, 0 /* seg->maxprot */, buf + 32);
- bfd_h_put_32 (abfd, 0 /* seg->initprot */, buf + 36);
- bfd_h_put_32 (abfd, seg->nsects, buf + 40);
- bfd_h_put_32 (abfd, seg->flags, buf + 44);
-
- bfd_seek (abfd, command->offset + 8, SEEK_SET);
- if (bfd_bwrite ((PTR) buf, 48, abfd) != 48)
- return -1;
-
- {
- char buf[1024];
- bfd_vma nbytes = seg->filesize;
- bfd_vma curoff = seg->fileoff;
-
- while (nbytes > 0)
- {
- bfd_vma thisread = nbytes;
-
- if (thisread > 1024)
- thisread = 1024;
-
- bfd_seek (abfd, curoff, SEEK_SET);
- if (bfd_bread ((PTR) buf, thisread, abfd) != thisread)
- return -1;
-
- bfd_seek (abfd, curoff, SEEK_SET);
- if (bfd_bwrite ((PTR) buf, thisread, abfd) != thisread)
- return -1;
-
- nbytes -= thisread;
- curoff += thisread;
- }
- }
-
- for (i = 0; i < seg->nsects; i++)
- {
- bfd_vma segoff = command->offset + 48 + 8 + (i * 68);
-
- if (bfd_mach_o_scan_write_section (abfd, &seg->sections[i], segoff) != 0)
- return -1;
- }
-
- return 0;
-}
-
-static int
-bfd_mach_o_scan_read_command (abfd, command)
- bfd *abfd;
- bfd_mach_o_load_command *command;
+bfd_mach_o_scan_read_command (bfd *abfd, bfd_mach_o_load_command *command)
{
unsigned char buf[8];
return -1;
command->type = (bfd_h_get_32 (abfd, buf) & ~BFD_MACH_O_LC_REQ_DYLD);
- command->type_required = (bfd_h_get_32 (abfd, buf) & BFD_MACH_O_LC_REQ_DYLD) ? 1 : 0;
+ command->type_required = (bfd_h_get_32 (abfd, buf) & BFD_MACH_O_LC_REQ_DYLD
+ ? 1 : 0);
command->len = bfd_h_get_32 (abfd, buf + 4);
switch (command->type)
}
static void
-bfd_mach_o_flatten_sections (abfd)
- bfd *abfd;
+bfd_mach_o_flatten_sections (bfd *abfd)
{
bfd_mach_o_data_struct *mdata = abfd->tdata.mach_o_data;
long csect = 0;
{
if (mdata->commands[i].type == BFD_MACH_O_LC_SEGMENT)
{
- bfd_mach_o_segment_command *seg = &mdata->commands[i].command.segment;
+ bfd_mach_o_segment_command *seg;
+
+ seg = &mdata->commands[i].command.segment;
mdata->nsects += seg->nsects;
}
}
- mdata->sections = bfd_alloc (abfd, mdata->nsects * sizeof (bfd_mach_o_section *));
+ mdata->sections = bfd_alloc (abfd,
+ mdata->nsects * sizeof (bfd_mach_o_section *));
csect = 0;
for (i = 0; i < mdata->header.ncmds; i++)
{
if (mdata->commands[i].type == BFD_MACH_O_LC_SEGMENT)
{
- bfd_mach_o_segment_command *seg = &mdata->commands[i].command.segment;
+ bfd_mach_o_segment_command *seg;
+ seg = &mdata->commands[i].command.segment;
BFD_ASSERT (csect + seg->nsects <= mdata->nsects);
for (j = 0; j < seg->nsects; j++)
}
int
-bfd_mach_o_scan_start_address (abfd)
- bfd *abfd;
+bfd_mach_o_scan_start_address (bfd *abfd)
{
bfd_mach_o_data_struct *mdata = abfd->tdata.mach_o_data;
bfd_mach_o_thread_command *cmd = NULL;
for (i = 0; i < cmd->nflavours; i++)
{
if ((mdata->header.cputype == BFD_MACH_O_CPU_TYPE_I386)
- && (cmd->flavours[i].flavour == (unsigned long) BFD_MACH_O_i386_THREAD_STATE))
+ && (cmd->flavours[i].flavour
+ == (unsigned long) BFD_MACH_O_i386_THREAD_STATE))
{
unsigned char buf[4];
}
int
-bfd_mach_o_scan (abfd, header)
- bfd *abfd;
- bfd_mach_o_header *header;
+bfd_mach_o_scan (bfd *abfd,
+ bfd_mach_o_header *header,
+ bfd_mach_o_data_struct *mdata)
{
unsigned int i;
- bfd_mach_o_data_struct *mdata = NULL;
enum bfd_architecture cputype;
unsigned long cpusubtype;
- mdata = ((bfd_mach_o_data_struct *)
- bfd_alloc (abfd, sizeof (bfd_mach_o_data_struct)));
- if (mdata == NULL)
- return -1;
-
mdata->header = *header;
mdata->symbols = NULL;
- abfd->flags = abfd->xvec->object_flags | (abfd->flags & (BFD_IN_MEMORY | BFD_IO_FUNCS));
+ abfd->flags = (abfd->xvec->object_flags
+ | (abfd->flags & (BFD_IN_MEMORY | BFD_IO_FUNCS)));
abfd->tdata.mach_o_data = mdata;
- bfd_mach_o_convert_architecture (header->cputype, header->cpusubtype, &cputype, &cpusubtype);
+ bfd_mach_o_convert_architecture (header->cputype, header->cpusubtype,
+ &cputype, &cpusubtype);
if (cputype == bfd_arch_unknown)
{
fprintf (stderr, "bfd_mach_o_scan: unknown architecture 0x%lx/0x%lx\n",
if (header->ncmds != 0)
{
- mdata->commands =
- ((bfd_mach_o_load_command *)
- bfd_alloc (abfd, header->ncmds * sizeof (bfd_mach_o_load_command)));
+ mdata->commands = bfd_alloc (abfd, header->ncmds * sizeof (bfd_mach_o_load_command));
if (mdata->commands == NULL)
return -1;
}
if (bfd_mach_o_scan_start_address (abfd) < 0)
- {
-#if 0
- fprintf (stderr, "bfd_mach_o_scan: unable to scan start address: %s\n",
- bfd_errmsg (bfd_get_error ()));
- abfd->tdata.mach_o_data = NULL;
- return -1;
-#endif
- }
+ return -1;
bfd_mach_o_flatten_sections (abfd);
-
return 0;
}
-boolean
-bfd_mach_o_mkobject (abfd)
- bfd *abfd;
+bfd_boolean
+bfd_mach_o_mkobject (bfd *abfd)
{
bfd_mach_o_data_struct *mdata = NULL;
- mdata = ((bfd_mach_o_data_struct *)
- bfd_alloc (abfd, sizeof (bfd_mach_o_data_struct)));
+ mdata = bfd_alloc (abfd, sizeof (bfd_mach_o_data_struct));
if (mdata == NULL)
- return false;
+ return FALSE;
abfd->tdata.mach_o_data = mdata;
mdata->header.magic = 0;
mdata->sections = NULL;
mdata->ibfd = NULL;
- return true;
+ return TRUE;
}
const bfd_target *
-bfd_mach_o_object_p (abfd)
- bfd *abfd;
+bfd_mach_o_object_p (bfd *abfd)
{
+ struct bfd_preserve preserve;
bfd_mach_o_header header;
+ preserve.marker = NULL;
if (bfd_mach_o_read_header (abfd, &header) != 0)
- {
- bfd_set_error (bfd_error_wrong_format);
- return NULL;
- }
+ goto wrong;
- if (! ((header.byteorder == BFD_ENDIAN_BIG)
- || (header.byteorder == BFD_ENDIAN_LITTLE)))
+ if (! (header.byteorder == BFD_ENDIAN_BIG
+ || header.byteorder == BFD_ENDIAN_LITTLE))
{
- fprintf (stderr, "unknown header byte-order value 0x%lx\n", (long) header.byteorder);
- bfd_set_error (bfd_error_wrong_format);
- return NULL;
+ fprintf (stderr, "unknown header byte-order value 0x%lx\n",
+ (long) header.byteorder);
+ goto wrong;
}
- if (! (((header.byteorder == BFD_ENDIAN_BIG)
- && (abfd->xvec->byteorder == BFD_ENDIAN_BIG)
- && (abfd->xvec->header_byteorder == BFD_ENDIAN_BIG))
- ||
- ((header.byteorder == BFD_ENDIAN_LITTLE)
- && (abfd->xvec->byteorder == BFD_ENDIAN_LITTLE)
- && (abfd->xvec->header_byteorder == BFD_ENDIAN_LITTLE))))
- {
- bfd_set_error (bfd_error_wrong_format);
- return NULL;
- }
+ if (! ((header.byteorder == BFD_ENDIAN_BIG
+ && abfd->xvec->byteorder == BFD_ENDIAN_BIG
+ && abfd->xvec->header_byteorder == BFD_ENDIAN_BIG)
+ || (header.byteorder == BFD_ENDIAN_LITTLE
+ && abfd->xvec->byteorder == BFD_ENDIAN_LITTLE
+ && abfd->xvec->header_byteorder == BFD_ENDIAN_LITTLE)))
+ goto wrong;
- abfd->tdata.mach_o_data = NULL;
+ preserve.marker = bfd_zalloc (abfd, sizeof (bfd_mach_o_data_struct));
+ if (preserve.marker == NULL
+ || !bfd_preserve_save (abfd, &preserve))
+ goto fail;
- if (bfd_mach_o_scan (abfd, &header) != 0)
- {
- abfd->tdata.mach_o_data = NULL;
- bfd_set_error (bfd_error_wrong_format);
- return NULL;
- }
+ if (bfd_mach_o_scan (abfd, &header,
+ (bfd_mach_o_data_struct *) preserve.marker) != 0)
+ goto wrong;
+ bfd_preserve_finish (abfd, &preserve);
return abfd->xvec;
+
+ wrong:
+ bfd_set_error (bfd_error_wrong_format);
+
+ fail:
+ if (preserve.marker != NULL)
+ bfd_preserve_restore (abfd, &preserve);
+ return NULL;
}
const bfd_target *
-bfd_mach_o_core_p (abfd)
- bfd *abfd;
+bfd_mach_o_core_p (bfd *abfd)
{
+ struct bfd_preserve preserve;
bfd_mach_o_header header;
- bfd_set_error (bfd_error_wrong_format);
-
+ preserve.marker = NULL;
if (bfd_mach_o_read_header (abfd, &header) != 0)
- return NULL;
+ goto wrong;
- if (! ((header.byteorder == BFD_ENDIAN_BIG)
- || (header.byteorder == BFD_ENDIAN_LITTLE)))
+ if (! (header.byteorder == BFD_ENDIAN_BIG
+ || header.byteorder == BFD_ENDIAN_LITTLE))
{
- fprintf (stderr, "unknown header byte-order value 0x%lx\n", (long) header.byteorder);
+ fprintf (stderr, "unknown header byte-order value 0x%lx\n",
+ (long) header.byteorder);
abort ();
}
- if (! (((header.byteorder == BFD_ENDIAN_BIG)
- && (abfd->xvec->byteorder == BFD_ENDIAN_BIG)
- && (abfd->xvec->header_byteorder == BFD_ENDIAN_BIG))
- ||
- ((header.byteorder == BFD_ENDIAN_LITTLE)
- && (abfd->xvec->byteorder == BFD_ENDIAN_LITTLE)
- && (abfd->xvec->header_byteorder == BFD_ENDIAN_LITTLE))))
- return NULL;
+ if (! ((header.byteorder == BFD_ENDIAN_BIG
+ && abfd->xvec->byteorder == BFD_ENDIAN_BIG
+ && abfd->xvec->header_byteorder == BFD_ENDIAN_BIG)
+ || (header.byteorder == BFD_ENDIAN_LITTLE
+ && abfd->xvec->byteorder == BFD_ENDIAN_LITTLE
+ && abfd->xvec->header_byteorder == BFD_ENDIAN_LITTLE)))
+ goto wrong;
if (header.filetype != BFD_MACH_O_MH_CORE)
- return NULL;
+ goto wrong;
- abfd->tdata.mach_o_data = NULL;
- if (bfd_mach_o_scan (abfd, &header) != 0)
- {
- abfd->tdata.mach_o_data = NULL;
- return NULL;
- }
+ preserve.marker = bfd_zalloc (abfd, sizeof (bfd_mach_o_data_struct));
+ if (preserve.marker == NULL
+ || !bfd_preserve_save (abfd, &preserve))
+ goto fail;
+ if (bfd_mach_o_scan (abfd, &header,
+ (bfd_mach_o_data_struct *) preserve.marker) != 0)
+ goto wrong;
+
+ bfd_preserve_finish (abfd, &preserve);
return abfd->xvec;
+
+ wrong:
+ bfd_set_error (bfd_error_wrong_format);
+
+ fail:
+ if (preserve.marker != NULL)
+ bfd_preserve_restore (abfd, &preserve);
+ return NULL;
}
typedef struct mach_o_fat_archentry
} mach_o_fat_data_struct;
const bfd_target *
-bfd_mach_o_archive_p (abfd)
- bfd *abfd;
+bfd_mach_o_archive_p (bfd *abfd)
{
- mach_o_fat_data_struct *adata;
+ mach_o_fat_data_struct *adata = NULL;
unsigned char buf[20];
unsigned long i;
bfd_seek (abfd, 0, SEEK_SET);
if (bfd_bread ((PTR) buf, 8, abfd) != 8)
- return NULL;
+ goto error;
- adata = (mach_o_fat_data_struct *)
- bfd_alloc (abfd, sizeof (mach_o_fat_data_struct));
+ adata = bfd_alloc (abfd, sizeof (mach_o_fat_data_struct));
if (adata == NULL)
- return NULL;
+ goto error;
adata->magic = bfd_getb32 (buf);
adata->nfat_arch = bfd_getb32 (buf + 4);
if (adata->magic != 0xcafebabe)
- return NULL;
+ goto error;
- adata->archentries = (mach_o_fat_archentry *)
+ adata->archentries =
bfd_alloc (abfd, adata->nfat_arch * sizeof (mach_o_fat_archentry));
if (adata->archentries == NULL)
- return NULL;
+ goto error;
for (i = 0; i < adata->nfat_arch; i++)
{
bfd_seek (abfd, 8 + 20 * i, SEEK_SET);
if (bfd_bread ((PTR) buf, 20, abfd) != 20)
- return NULL;
+ goto error;
adata->archentries[i].cputype = bfd_getb32 (buf);
adata->archentries[i].cpusubtype = bfd_getb32 (buf + 4);
adata->archentries[i].offset = bfd_getb32 (buf + 8);
abfd->tdata.mach_o_fat_data = adata;
return abfd->xvec;
+
+ error:
+ if (adata != NULL)
+ bfd_release (abfd, adata);
+ bfd_set_error (bfd_error_wrong_format);
+ return NULL;
}
bfd *
-bfd_mach_o_openr_next_archived_file (archive, prev)
- bfd *archive;
- bfd *prev;
+bfd_mach_o_openr_next_archived_file (bfd *archive, bfd *prev)
{
- mach_o_fat_data_struct *adata = (mach_o_fat_data_struct *) archive->tdata.mach_o_fat_data;
+ mach_o_fat_data_struct *adata;
mach_o_fat_archentry *entry = NULL;
unsigned long i;
+ adata = (mach_o_fat_data_struct *) archive->tdata.mach_o_fat_data;
BFD_ASSERT (adata != NULL);
/* Find index of previous entry. */
return entry->abfd;
}
-int bfd_mach_o_lookup_section
- (bfd *abfd, asection *section,
- bfd_mach_o_load_command **mcommand, bfd_mach_o_section **msection)
+int
+bfd_mach_o_lookup_section (bfd *abfd,
+ asection *section,
+ bfd_mach_o_load_command **mcommand,
+ bfd_mach_o_section **msection)
{
struct mach_o_data_struct *md = abfd->tdata.mach_o_data;
unsigned int i, j, num;
}
int
-bfd_mach_o_lookup_command
- (bfd *abfd, bfd_mach_o_load_command_type type,
- bfd_mach_o_load_command **mcommand)
+bfd_mach_o_lookup_command (bfd *abfd,
+ bfd_mach_o_load_command_type type,
+ bfd_mach_o_load_command **mcommand)
{
struct mach_o_data_struct *md = NULL;
bfd_mach_o_load_command *ncmd = NULL;
}
unsigned long
-bfd_mach_o_stack_addr (type)
- enum bfd_mach_o_cpu_type type;
+bfd_mach_o_stack_addr (enum bfd_mach_o_cpu_type type)
{
switch (type)
{
case BFD_MACH_O_CPU_TYPE_I860:
return 0;
case BFD_MACH_O_CPU_TYPE_HPPA:
- return (0xc0000000-0x04000000);
+ return 0xc0000000 - 0x04000000;
default:
return 0;
}
}
int
-bfd_mach_o_core_fetch_environment (abfd, rbuf, rlen)
- bfd *abfd;
- unsigned char **rbuf;
- unsigned int *rlen;
+bfd_mach_o_core_fetch_environment (bfd *abfd,
+ unsigned char **rbuf,
+ unsigned int *rlen)
{
bfd_mach_o_data_struct *mdata = abfd->tdata.mach_o_data;
unsigned long stackaddr = bfd_mach_o_stack_addr (mdata->header.cputype);
for (offset = 4; offset <= size; offset += 4)
{
- unsigned long val = *((unsigned long *) (buf + size - offset));
+ unsigned long val;
+ val = *((unsigned long *) (buf + size - offset));
if (! found_nonnull)
{
if (val != 0)
}
else if (val == 0x0)
{
- unsigned long bottom = seg->fileoff + seg->filesize - offset;
- unsigned long top = seg->fileoff + seg->filesize - 4;
+ unsigned long bottom;
+ unsigned long top;
+ bottom = seg->fileoff + seg->filesize - offset;
+ top = seg->fileoff + seg->filesize - 4;
*rbuf = bfd_malloc (top - bottom);
*rlen = top - bottom;
}
char *
-bfd_mach_o_core_file_failing_command (abfd)
- bfd *abfd;
+bfd_mach_o_core_file_failing_command (bfd *abfd)
{
unsigned char *buf = NULL;
unsigned int len = 0;
if (ret < 0)
return NULL;
- return buf;
+ return (char *) buf;
}
int
-bfd_mach_o_core_file_failing_signal (abfd)
- bfd *abfd ATTRIBUTE_UNUSED;
+bfd_mach_o_core_file_failing_signal (bfd *abfd ATTRIBUTE_UNUSED)
{
return 0;
}
-boolean
-bfd_mach_o_core_file_matches_executable_p (core_bfd, exec_bfd)
- bfd *core_bfd ATTRIBUTE_UNUSED;
- bfd *exec_bfd ATTRIBUTE_UNUSED;
-{
- return true;
-}
-
-#define TARGET_NAME mach_o_be_vec
-#define TARGET_STRING "mach-o-be"
-#define TARGET_BIG_ENDIAN 1
-#define TARGET_ARCHIVE 0
+#define TARGET_NAME mach_o_be_vec
+#define TARGET_STRING "mach-o-be"
+#define TARGET_BIG_ENDIAN 1
+#define TARGET_ARCHIVE 0
#include "mach-o-target.c"
#undef TARGET_BIG_ENDIAN
#undef TARGET_ARCHIVE
-#define TARGET_NAME mach_o_le_vec
-#define TARGET_STRING "mach-o-le"
-#define TARGET_BIG_ENDIAN 0
-#define TARGET_ARCHIVE 0
+#define TARGET_NAME mach_o_le_vec
+#define TARGET_STRING "mach-o-le"
+#define TARGET_BIG_ENDIAN 0
+#define TARGET_ARCHIVE 0
#include "mach-o-target.c"
#undef TARGET_BIG_ENDIAN
#undef TARGET_ARCHIVE
-#define TARGET_NAME mach_o_fat_vec
-#define TARGET_STRING "mach-o-fat"
-#define TARGET_BIG_ENDIAN 1
-#define TARGET_ARCHIVE 1
+#define TARGET_NAME mach_o_fat_vec
+#define TARGET_STRING "mach-o-fat"
+#define TARGET_BIG_ENDIAN 1
+#define TARGET_ARCHIVE 1
#include "mach-o-target.c"
#undef TARGET_STRING
#undef TARGET_BIG_ENDIAN
#undef TARGET_ARCHIVE
-