X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=bfd%2Fmach-o.c;h=b2401c4359c839cda271e4d8293c7b3243efc2d9;hb=80fccad2d4ce82a2ed9a5d8d081eb2daefa09f9d;hp=4c3551e11bd224d39636836f2428cb68438cadf2;hpb=a95a455043ac1febbb0afec2decb2feb8b7fc436;p=deliverable%2Fbinutils-gdb.git diff --git a/bfd/mach-o.c b/bfd/mach-o.c index 4c3551e11b..b2401c4359 100644 --- a/bfd/mach-o.c +++ b/bfd/mach-o.c @@ -1,5 +1,5 @@ /* Mach-O support for BFD. - Copyright 1999, 2000, 2001, 2002 + Copyright 1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. This file is part of BFD, the Binary File Descriptor library. @@ -68,40 +68,75 @@ #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 - -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_copy_private_header_data _bfd_generic_bfd_copy_private_header_data + +static bfd_boolean bfd_mach_o_bfd_copy_private_symbol_data + PARAMS ((bfd *, asymbol *, bfd *, asymbol *)); +static bfd_boolean bfd_mach_o_bfd_copy_private_section_data + PARAMS ((bfd *, asection *, bfd *, asection *)); +static bfd_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_canonicalize_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 bfd_boolean bfd_mach_o_write_contents + PARAMS ((bfd *)); +static int bfd_mach_o_sizeof_headers + PARAMS ((bfd *, 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)); /* 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 @@ -129,7 +164,7 @@ static const char * bfd_mach_o_ppc_flavour_string PARAMS ((unsigned int)); #define N_SECT 0xe #define N_INDR 0xa -boolean +bfd_boolean bfd_mach_o_valid (abfd) bfd *abfd; { @@ -149,33 +184,33 @@ bfd_mach_o_valid (abfd) /* Copy any private info we understand from the input symbol to the output symbol. */ -static boolean +static bfd_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; { - return true; + return TRUE; } /* Copy any private info we understand from the input section to the output section. */ -static boolean +static bfd_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; { - return true; + return TRUE; } /* Copy any private info we understand from the input bfd to the output bfd. */ -static boolean +static bfd_boolean bfd_mach_o_bfd_copy_private_bfd_data (ibfd, obfd) bfd *ibfd; bfd *obfd; @@ -185,7 +220,7 @@ bfd_mach_o_bfd_copy_private_bfd_data (ibfd, obfd) obfd->tdata.mach_o_data = ibfd->tdata.mach_o_data; obfd->tdata.mach_o_data->ibfd = ibfd; - return true; + return TRUE; } static long @@ -222,7 +257,7 @@ bfd_mach_o_get_symtab_upper_bound (abfd) } static long -bfd_mach_o_get_symtab (abfd, alocation) +bfd_mach_o_canonicalize_symtab (abfd, alocation) bfd *abfd; asymbol **alocation; { @@ -242,7 +277,7 @@ bfd_mach_o_get_symtab (abfd, alocation) 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; } @@ -325,7 +360,7 @@ bfd_mach_o_convert_architecture (mtype, msubtype, type, subtype) } } -static boolean +static bfd_boolean bfd_mach_o_write_contents (abfd) bfd *abfd; { @@ -362,11 +397,11 @@ bfd_mach_o_write_contents (abfd) bfd_seek (abfd, curoff, SEEK_SET); if (bfd_bread ((PTR) buf, thisread, abfd) != thisread) - return false; + return FALSE; bfd_seek (abfd, curoff, SEEK_SET); if (bfd_bwrite ((PTR) buf, thisread, abfd) != thisread) - return false; + return FALSE; nbytes -= thisread; curoff += thisread; @@ -377,7 +412,7 @@ bfd_mach_o_write_contents (abfd) /* 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++) { @@ -392,24 +427,24 @@ bfd_mach_o_write_contents (abfd) 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: @@ -430,17 +465,17 @@ bfd_mach_o_write_contents (abfd) 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_boolean b ATTRIBUTE_UNUSED; { return 0; } @@ -489,7 +524,7 @@ bfd_mach_o_read_header (abfd, header) 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); @@ -691,7 +726,7 @@ bfd_mach_o_scan_read_symtab_symbol (abfd, sym, s, i) 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; @@ -1374,7 +1409,8 @@ bfd_mach_o_scan_read_segment (abfd, command) { 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; } } @@ -1455,7 +1491,8 @@ bfd_mach_o_scan_read_command (abfd, command) 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) @@ -1531,20 +1568,24 @@ bfd_mach_o_flatten_sections (abfd) { 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++) @@ -1579,7 +1620,8 @@ bfd_mach_o_scan_start_address (abfd) 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]; @@ -1608,27 +1650,24 @@ bfd_mach_o_scan_start_address (abfd) } int -bfd_mach_o_scan (abfd, header) +bfd_mach_o_scan (abfd, header, mdata) 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", @@ -1678,7 +1717,7 @@ bfd_mach_o_scan (abfd, header) return 0; } -boolean +bfd_boolean bfd_mach_o_mkobject (abfd) bfd *abfd; { @@ -1687,7 +1726,7 @@ bfd_mach_o_mkobject (abfd) mdata = ((bfd_mach_o_data_struct *) 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; @@ -1705,91 +1744,106 @@ bfd_mach_o_mkobject (abfd) mdata->sections = NULL; mdata->ibfd = NULL; - return true; + return TRUE; } const bfd_target * bfd_mach_o_object_p (abfd) 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; { + 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 @@ -1813,35 +1867,35 @@ const bfd_target * bfd_mach_o_archive_p (abfd) 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)); 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 *) 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); @@ -1852,6 +1906,12 @@ bfd_mach_o_archive_p (abfd) 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 * @@ -1859,10 +1919,11 @@ bfd_mach_o_openr_next_archived_file (archive, prev) 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. */ @@ -1913,9 +1974,12 @@ bfd_mach_o_openr_next_archived_file (archive, prev) 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 (abfd, section, mcommand, msection) + 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; @@ -1962,9 +2026,10 @@ int bfd_mach_o_lookup_section } 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 (abfd, type, mcommand) + 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; @@ -2011,7 +2076,7 @@ bfd_mach_o_stack_addr (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; } @@ -2063,8 +2128,9 @@ bfd_mach_o_core_fetch_environment (abfd, rbuf, rlen) 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) @@ -2072,9 +2138,11 @@ bfd_mach_o_core_fetch_environment (abfd, rbuf, rlen) } 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; @@ -2116,12 +2184,12 @@ bfd_mach_o_core_file_failing_signal (abfd) return 0; } -boolean +bfd_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; + return TRUE; } #define TARGET_NAME mach_o_be_vec @@ -2159,4 +2227,3 @@ bfd_mach_o_core_file_matches_executable_p (core_bfd, exec_bfd) #undef TARGET_STRING #undef TARGET_BIG_ENDIAN #undef TARGET_ARCHIVE -