diff options
author | Alan Modra <amodra@gmail.com> | 2002-11-12 15:44:24 +0000 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2002-11-12 15:44:24 +0000 |
commit | e84d6fca26caaf6b02718efa0f1a4fb0d344348c (patch) | |
tree | 7dfaac5631eded3e7fcacfd1097415db98d4841a /bfd/mach-o.c | |
parent | c4c41219636642438223c7b46a2c8e1467faba06 (diff) | |
download | gdb-e84d6fca26caaf6b02718efa0f1a4fb0d344348c.zip gdb-e84d6fca26caaf6b02718efa0f1a4fb0d344348c.tar.gz gdb-e84d6fca26caaf6b02718efa0f1a4fb0d344348c.tar.bz2 |
* bfd.c (struct bfd_preserve): New.
(bfd_preserve_save): New function.
(bfd_preserve_restore): Ditto.
(bfd_preserve_finish): Ditto.
* bfd-in2.h: Regenerate.
* mach-o.c: Formatting.
(bfd_mach_o_scan_read_symtab_symbol): Make "value" unsigned.
(bfd_mach_o_object_p): Use bfd_preserve_save/restore/finish.
(bfd_mach_o_core_p): Ditto.
(bfd_mach_o_scan): Pass in mdata.
* mach-o.h (bfd_mach_o_scan): Update prototype.
* pef.c: Formatting.
(bfd_pef_object_p): Use bfd_preserve_save/restore/finish.
(bfd_pef_xlib_object_p): Ditto.
(bfd_pef_scan): Pass in mdata. Move version check to bfd_pef_object_p.
* pef.h (bfd_pef_scan): Update prototype.
* xsym.c: Formatting, K&R fixes.
(bfd_sym_object_p): Use bfd_preserve_save/restore/finish.
(bfd_sym_scan): New function split out from bfd_sym_object_p.
* xsym.h (bfd_sym_scan): Declare.
* elfcode.h (elf_object_p): Use bfd_preserve_save/restore/finish.
(elf_core_file_p): Likewise.
* targets.c (_bfd_target_vector): Revert 2002-11-08 change.
Diffstat (limited to 'bfd/mach-o.c')
-rw-r--r-- | bfd/mach-o.c | 196 |
1 files changed, 114 insertions, 82 deletions
diff --git a/bfd/mach-o.c b/bfd/mach-o.c index 4c3551e..1daaf98 100644 --- a/bfd/mach-o.c +++ b/bfd/mach-o.c @@ -691,7 +691,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 +1374,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 +1456,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 +1533,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 +1585,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 +1615,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", @@ -1712,84 +1716,99 @@ 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 +1832,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 +1871,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 +1884,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 +1939,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 +1991,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 +2041,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 +2093,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 +2103,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; @@ -2159,4 +2192,3 @@ bfd_mach_o_core_file_matches_executable_p (core_bfd, exec_bfd) #undef TARGET_STRING #undef TARGET_BIG_ENDIAN #undef TARGET_ARCHIVE - |