diff options
Diffstat (limited to 'bfd')
-rw-r--r-- | bfd/ChangeLog | 36 | ||||
-rw-r--r-- | bfd/mach-o-i386.c | 1 | ||||
-rw-r--r-- | bfd/mach-o-x86-64.c | 1 | ||||
-rw-r--r-- | bfd/mach-o.c | 617 | ||||
-rw-r--r-- | bfd/mach-o.h | 53 |
5 files changed, 367 insertions, 341 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 99f221b011..9cad7fe9bc 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,5 +1,41 @@ 2011-08-08 Tristan Gingold <gingold@adacore.com> + * mach-o.h: Move size macros to external.h + Move reloc macros to reloc.h and x86-64.h. + * mach-o-i386.c: Includes mach-o/reloc.h + * mach-o-x86-64.c: Ditto and includes mach-o/x86-64.h + * mach-o.c: Add includes. + (bfd_mach_o_write_header): Use structure from external.h to convert. + (bfd_mach_o_write_thread): Ditto. + (bfd_mach_o_write_relocs): Ditto. + (bfd_mach_o_write_section_32): Ditto. + (bfd_mach_o_write_section_64): Ditto. + (bfd_mach_o_write_segment_32): Ditto. + (bfd_mach_o_write_segment_64): Ditto. + (bfd_mach_o_write_symtab): Ditto. + (bfd_mach_o_write_contents): Ditto. + (bfd_mach_o_read_header): Ditto. + (bfd_mach_o_read_section_32): Ditto. + (bfd_mach_o_read_section_64): Ditto. + (bfd_mach_o_read_symtab_symbol): Ditto. + (bfd_mach_o_read_dylinker): Ditto. + (bfd_mach_o_read_dylib): Ditto. + (bfd_mach_o_read_dysymtab): Ditto. + (bfd_mach_o_read_symtab): Ditto. + (bfd_mach_o_read_linkedit): Ditto. + (bfd_mach_o_read_str): Ditto. + (bfd_mach_o_read_dyld_info): Ditto. + (bfd_mach_o_read_segment): Ditto. + (bfd_mach_o_read_command): Ditto. + (bfd_mach_o_archive_p): Ditto. + (bfd_mach_o_canonicalize_one_reloc): Ditto. Change the BUF parameter. + (bfd_mach_o_canonicalize_relocs): Adjust to call the above function. + (bfd_mach_o_read_dysymtab_symbol): Rename BUF variable. + (bfd_mach_o_read_uuid): Remove useless cast. Use a macro instead + of an hard-coded value. + +2011-08-08 Tristan Gingold <gingold@adacore.com> + * mach-o-x86-64.c (bfd_mach_o_x86_64_mkobject): Fix cut-and-past typos. (bfd_mach_o_x86_64_swap_reloc_out): Handle BFD_RELOC_32_PCREL, BFD_RELOC_MACH_O_X86_64_SUBTRACTOR64 and diff --git a/bfd/mach-o-i386.c b/bfd/mach-o-i386.c index e46cbc6f57..11915604b3 100644 --- a/bfd/mach-o-i386.c +++ b/bfd/mach-o-i386.c @@ -24,6 +24,7 @@ #include "bfd.h" #include "libbfd.h" #include "libiberty.h" +#include "mach-o/reloc.h" #define bfd_mach_o_object_p bfd_mach_o_i386_object_p #define bfd_mach_o_core_p bfd_mach_o_i386_core_p diff --git a/bfd/mach-o-x86-64.c b/bfd/mach-o-x86-64.c index 561496bdc8..2248d976a7 100644 --- a/bfd/mach-o-x86-64.c +++ b/bfd/mach-o-x86-64.c @@ -24,6 +24,7 @@ #include "bfd.h" #include "libbfd.h" #include "libiberty.h" +#include "mach-o/x86-64.h" #define bfd_mach_o_object_p bfd_mach_o_x86_64_object_p #define bfd_mach_o_core_p bfd_mach_o_x86_64_core_p diff --git a/bfd/mach-o.c b/bfd/mach-o.c index 622cef54e6..5973df7906 100644 --- a/bfd/mach-o.c +++ b/bfd/mach-o.c @@ -26,6 +26,8 @@ #include "libbfd.h" #include "libiberty.h" #include "aout/stab_gnu.h" +#include "mach-o/reloc.h" +#include "mach-o/external.h" #include <ctype.h> #define bfd_mach_o_object_p bfd_mach_o_gen_object_p @@ -614,25 +616,25 @@ bfd_mach_o_convert_architecture (bfd_mach_o_cpu_type mtype, static bfd_boolean bfd_mach_o_write_header (bfd *abfd, bfd_mach_o_header *header) { - unsigned char buf[32]; + struct mach_o_header_external raw; unsigned int size; size = mach_o_wide_p (header) ? BFD_MACH_O_HEADER_64_SIZE : BFD_MACH_O_HEADER_SIZE; - 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_h_put_32 (abfd, header->magic, raw.magic); + bfd_h_put_32 (abfd, header->cputype, raw.cputype); + bfd_h_put_32 (abfd, header->cpusubtype, raw.cpusubtype); + bfd_h_put_32 (abfd, header->filetype, raw.filetype); + bfd_h_put_32 (abfd, header->ncmds, raw.ncmds); + bfd_h_put_32 (abfd, header->sizeofcmds, raw.sizeofcmds); + bfd_h_put_32 (abfd, header->flags, raw.flags); if (mach_o_wide_p (header)) - bfd_h_put_32 (abfd, header->reserved, buf + 28); + bfd_h_put_32 (abfd, header->reserved, raw.reserved); if (bfd_seek (abfd, 0, SEEK_SET) != 0 - || bfd_bwrite ((void *) buf, size, abfd) != size) + || bfd_bwrite (&raw, size, abfd) != size) return FALSE; return TRUE; @@ -643,7 +645,7 @@ bfd_mach_o_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]; + struct mach_o_thread_command_external raw; unsigned int offset; BFD_ASSERT ((command->type == BFD_MACH_O_LC_THREAD) @@ -653,16 +655,17 @@ bfd_mach_o_write_thread (bfd *abfd, bfd_mach_o_load_command *command) 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_ASSERT (cmd->flavours[i].offset == + (command->offset + offset + BFD_MACH_O_LC_SIZE)); - bfd_h_put_32 (abfd, cmd->flavours[i].flavour, buf); - bfd_h_put_32 (abfd, (cmd->flavours[i].size / 4), buf + 4); + bfd_h_put_32 (abfd, cmd->flavours[i].flavour, raw.flavour); + bfd_h_put_32 (abfd, (cmd->flavours[i].size / 4), raw.count); if (bfd_seek (abfd, command->offset + offset, SEEK_SET) != 0 - || bfd_bwrite ((void *) buf, 8, abfd) != 8) + || bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw)) return -1; - offset += cmd->flavours[i].size + 8; + offset += cmd->flavours[i].size + sizeof (raw); } return 0; @@ -676,7 +679,8 @@ bfd_mach_o_get_reloc_upper_bound (bfd *abfd ATTRIBUTE_UNUSED, } static int -bfd_mach_o_canonicalize_one_reloc (bfd *abfd, char *buf, +bfd_mach_o_canonicalize_one_reloc (bfd *abfd, + struct mach_o_reloc_info_external *raw, arelent *res, asymbol **syms) { bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd); @@ -686,8 +690,8 @@ bfd_mach_o_canonicalize_one_reloc (bfd *abfd, char *buf, bfd_vma symnum; asymbol **sym; - addr = bfd_get_32 (abfd, buf + 0); - symnum = bfd_get_32 (abfd, buf + 4); + addr = bfd_get_32 (abfd, raw->r_address); + symnum = bfd_get_32 (abfd, raw->r_symbolnum); if (addr & BFD_MACH_O_SR_SCATTERED) { @@ -754,12 +758,13 @@ bfd_mach_o_canonicalize_relocs (bfd *abfd, unsigned long filepos, arelent *res, asymbol **syms) { unsigned long i; - char *native_relocs; + struct mach_o_reloc_info_external *native_relocs; bfd_size_type native_size; /* Allocate and read relocs. */ native_size = count * BFD_MACH_O_RELENT_SIZE; - native_relocs = bfd_malloc (native_size); + native_relocs = + (struct mach_o_reloc_info_external *) bfd_malloc (native_size); if (native_relocs == NULL) return -1; @@ -769,9 +774,8 @@ bfd_mach_o_canonicalize_relocs (bfd *abfd, unsigned long filepos, for (i = 0; i < count; i++) { - char *buf = native_relocs + BFD_MACH_O_RELENT_SIZE * i; - - if (bfd_mach_o_canonicalize_one_reloc (abfd, buf, &res[i], syms) < 0) + if (bfd_mach_o_canonicalize_one_reloc (abfd, &native_relocs[i], + &res[i], syms) < 0) goto err; } free (native_relocs); @@ -901,7 +905,7 @@ bfd_mach_o_write_relocs (bfd *abfd, bfd_mach_o_section *section) for (i = 0; i < section->nreloc; i++) { arelent *rel = entries[i]; - char buf[8]; + struct mach_o_reloc_info_external raw; bfd_mach_o_reloc_info info, *pinfo = &info; /* Convert relocation to an intermediate representation. */ @@ -918,23 +922,24 @@ bfd_mach_o_write_relocs (bfd *abfd, bfd_mach_o_section *section) | BFD_MACH_O_SET_SR_LENGTH(pinfo->r_length) | BFD_MACH_O_SET_SR_TYPE(pinfo->r_type) | BFD_MACH_O_SET_SR_ADDRESS(pinfo->r_address); - bfd_put_32 (abfd, v, buf); - bfd_put_32 (abfd, pinfo->r_value, buf + 4); + /* Note: scattered relocs have field in reverse order... */ + bfd_put_32 (abfd, v, raw.r_address); + bfd_put_32 (abfd, pinfo->r_value, raw.r_symbolnum); } else { unsigned long v; - bfd_put_32 (abfd, pinfo->r_address, buf); + bfd_put_32 (abfd, pinfo->r_address, raw.r_address); v = BFD_MACH_O_SET_R_SYMBOLNUM (pinfo->r_value) | (pinfo->r_pcrel ? BFD_MACH_O_R_PCREL : 0) | BFD_MACH_O_SET_R_LENGTH (pinfo->r_length) | (pinfo->r_extern ? BFD_MACH_O_R_EXTERN : 0) | BFD_MACH_O_SET_R_TYPE (pinfo->r_type); - bfd_put_32 (abfd, v, buf + 4); + bfd_put_32 (abfd, v, raw.r_symbolnum); } - if (bfd_bwrite ((void *) buf, BFD_MACH_O_RELENT_SIZE, abfd) + if (bfd_bwrite (&raw, BFD_MACH_O_RELENT_SIZE, abfd) != BFD_MACH_O_RELENT_SIZE) return FALSE; } @@ -944,21 +949,21 @@ bfd_mach_o_write_relocs (bfd *abfd, bfd_mach_o_section *section) static int bfd_mach_o_write_section_32 (bfd *abfd, bfd_mach_o_section *section) { - unsigned char buf[BFD_MACH_O_SECTION_SIZE]; - - 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); - - if (bfd_bwrite ((void *) buf, BFD_MACH_O_SECTION_SIZE, abfd) + struct mach_o_section_32_external raw; + + memcpy (raw.sectname, section->sectname, 16); + memcpy (raw.segname + 16, section->segname, 16); + bfd_h_put_32 (abfd, section->addr, raw.addr); + bfd_h_put_32 (abfd, section->size, raw.size); + bfd_h_put_32 (abfd, section->offset, raw.offset); + bfd_h_put_32 (abfd, section->align, raw.align); + bfd_h_put_32 (abfd, section->reloff, raw.reloff); + bfd_h_put_32 (abfd, section->nreloc, raw.nreloc); + bfd_h_put_32 (abfd, section->flags, raw.flags); + bfd_h_put_32 (abfd, section->reserved1, raw.reserved1); + bfd_h_put_32 (abfd, section->reserved2, raw.reserved2); + + if (bfd_bwrite (&raw, BFD_MACH_O_SECTION_SIZE, abfd) != BFD_MACH_O_SECTION_SIZE) return -1; @@ -968,22 +973,22 @@ bfd_mach_o_write_section_32 (bfd *abfd, bfd_mach_o_section *section) static int bfd_mach_o_write_section_64 (bfd *abfd, bfd_mach_o_section *section) { - unsigned char buf[BFD_MACH_O_SECTION_64_SIZE]; - - memcpy (buf, section->sectname, 16); - memcpy (buf + 16, section->segname, 16); - bfd_h_put_64 (abfd, section->addr, buf + 32); - bfd_h_put_64 (abfd, section->size, buf + 40); - bfd_h_put_32 (abfd, section->offset, buf + 48); - bfd_h_put_32 (abfd, section->align, buf + 52); - bfd_h_put_32 (abfd, section->reloff, buf + 56); - bfd_h_put_32 (abfd, section->nreloc, buf + 60); - bfd_h_put_32 (abfd, section->flags, buf + 64); - bfd_h_put_32 (abfd, section->reserved1, buf + 68); - bfd_h_put_32 (abfd, section->reserved2, buf + 72); - bfd_h_put_32 (abfd, section->reserved3, buf + 76); - - if (bfd_bwrite ((void *) buf, BFD_MACH_O_SECTION_64_SIZE, abfd) + struct mach_o_section_64_external raw; + + memcpy (raw.sectname, section->sectname, 16); + memcpy (raw.segname, section->segname, 16); + bfd_h_put_64 (abfd, section->addr, raw.addr); + bfd_h_put_64 (abfd, section->size, raw.size); + bfd_h_put_32 (abfd, section->offset, raw.offset); + bfd_h_put_32 (abfd, section->align, raw.align); + bfd_h_put_32 (abfd, section->reloff, raw.reloff); + bfd_h_put_32 (abfd, section->nreloc, raw.nreloc); + bfd_h_put_32 (abfd, section->flags, raw.flags); + bfd_h_put_32 (abfd, section->reserved1, raw.reserved1); + bfd_h_put_32 (abfd, section->reserved2, raw.reserved2); + bfd_h_put_32 (abfd, section->reserved3, raw.reserved3); + + if (bfd_bwrite (&raw, BFD_MACH_O_SECTION_64_SIZE, abfd) != BFD_MACH_O_SECTION_64_SIZE) return -1; @@ -993,7 +998,7 @@ bfd_mach_o_write_section_64 (bfd *abfd, bfd_mach_o_section *section) static int bfd_mach_o_write_segment_32 (bfd *abfd, bfd_mach_o_load_command *command) { - unsigned char buf[BFD_MACH_O_LC_SEGMENT_SIZE]; + struct mach_o_segment_command_32_external raw; bfd_mach_o_segment_command *seg = &command->command.segment; unsigned long i; @@ -1003,19 +1008,18 @@ bfd_mach_o_write_segment_32 (bfd *abfd, bfd_mach_o_load_command *command) if (!bfd_mach_o_write_relocs (abfd, &seg->sections[i])) return -1; - 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, seg->maxprot, buf + 32); - bfd_h_put_32 (abfd, seg->initprot, buf + 36); - bfd_h_put_32 (abfd, seg->nsects, buf + 40); - bfd_h_put_32 (abfd, seg->flags, buf + 44); + memcpy (raw.segname, seg->segname, 16); + bfd_h_put_32 (abfd, seg->vmaddr, raw.vmaddr); + bfd_h_put_32 (abfd, seg->vmsize, raw.vmsize); + bfd_h_put_32 (abfd, seg->fileoff, raw.fileoff); + bfd_h_put_32 (abfd, seg->filesize, raw.filesize); + bfd_h_put_32 (abfd, seg->maxprot, raw.maxprot); + bfd_h_put_32 (abfd, seg->initprot, raw.initprot); + bfd_h_put_32 (abfd, seg->nsects, raw.nsects); + bfd_h_put_32 (abfd, seg->flags, raw.flags); - if (bfd_seek (abfd, command->offset + 8, SEEK_SET) != 0 - || (bfd_bwrite ((void *) buf, BFD_MACH_O_LC_SEGMENT_SIZE - 8, abfd) - != BFD_MACH_O_LC_SEGMENT_SIZE - 8)) + if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0 + || bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw)) return -1; for (i = 0; i < seg->nsects; i++) @@ -1028,7 +1032,7 @@ bfd_mach_o_write_segment_32 (bfd *abfd, bfd_mach_o_load_command *command) static int bfd_mach_o_write_segment_64 (bfd *abfd, bfd_mach_o_load_command *command) { - unsigned char buf[BFD_MACH_O_LC_SEGMENT_64_SIZE]; + struct mach_o_segment_command_64_external raw; bfd_mach_o_segment_command *seg = &command->command.segment; unsigned long i; @@ -1038,19 +1042,18 @@ bfd_mach_o_write_segment_64 (bfd *abfd, bfd_mach_o_load_command *command) if (!bfd_mach_o_write_relocs (abfd, &seg->sections[i])) return -1; - memcpy (buf, seg->segname, 16); - bfd_h_put_64 (abfd, seg->vmaddr, buf + 16); - bfd_h_put_64 (abfd, seg->vmsize, buf + 24); - bfd_h_put_64 (abfd, seg->fileoff, buf + 32); - bfd_h_put_64 (abfd, seg->filesize, buf + 40); - bfd_h_put_32 (abfd, seg->maxprot, buf + 48); - bfd_h_put_32 (abfd, seg->initprot, buf + 52); - bfd_h_put_32 (abfd, seg->nsects, buf + 56); - bfd_h_put_32 (abfd, seg->flags, buf + 60); - - if (bfd_seek (abfd, command->offset + 8, SEEK_SET) != 0 - || (bfd_bwrite ((void *) buf, BFD_MACH_O_LC_SEGMENT_64_SIZE - 8, abfd) - != BFD_MACH_O_LC_SEGMENT_64_SIZE - 8)) + memcpy (raw.segname, seg->segname, 16); + bfd_h_put_64 (abfd, seg->vmaddr, raw.vmaddr); + bfd_h_put_64 (abfd, seg->vmsize, raw.vmsize); + bfd_h_put_64 (abfd, seg->fileoff, raw.fileoff); + bfd_h_put_64 (abfd, seg->filesize, raw.filesize); + bfd_h_put_32 (abfd, seg->maxprot, raw.maxprot); + bfd_h_put_32 (abfd, seg->initprot, raw.initprot); + bfd_h_put_32 (abfd, seg->nsects, raw.nsects); + bfd_h_put_32 (abfd, seg->flags, raw.flags); + + if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0 + || bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw)) return -1; for (i = 0; i < seg->nsects; i++) @@ -1065,7 +1068,6 @@ bfd_mach_o_write_symtab (bfd *abfd, bfd_mach_o_load_command *command) { bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd); bfd_mach_o_symtab_command *sym = &command->command.symtab; - unsigned char buf[16]; unsigned long i; unsigned int wide = bfd_mach_o_wide_p (abfd); unsigned int symlen = wide ? BFD_MACH_O_NLIST_64_SIZE : BFD_MACH_O_NLIST_SIZE; @@ -1102,17 +1104,35 @@ bfd_mach_o_write_symtab (bfd *abfd, bfd_mach_o_load_command *command) if (str_index == (bfd_size_type) -1) goto err; } - bfd_h_put_32 (abfd, str_index, buf); - bfd_h_put_8 (abfd, s->n_type, buf + 4); - bfd_h_put_8 (abfd, s->n_sect, buf + 5); - bfd_h_put_16 (abfd, s->n_desc, buf + 6); + if (wide) - bfd_h_put_64 (abfd, s->symbol.section->vma + s->symbol.value, buf + 8); + { + struct mach_o_nlist_64_external raw; + + bfd_h_put_32 (abfd, str_index, raw.n_strx); + bfd_h_put_8 (abfd, s->n_type, raw.n_type); + bfd_h_put_8 (abfd, s->n_sect, raw.n_sect); + bfd_h_put_16 (abfd, s->n_desc, raw.n_desc); + bfd_h_put_64 (abfd, s->symbol.section->vma + s->symbol.value, + raw.n_value); + + if (bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw)) + goto err; + } else - bfd_h_put_32 (abfd, s->symbol.section->vma + s->symbol.value, buf + 8); + { + struct mach_o_nlist_external raw; - if (bfd_bwrite ((void *) buf, symlen, abfd) != symlen) - goto err; + bfd_h_put_32 (abfd, str_index, raw.n_strx); + bfd_h_put_8 (abfd, s->n_type, raw.n_type); + bfd_h_put_8 (abfd, s->n_sect, raw.n_sect); + bfd_h_put_16 (abfd, s->n_desc, raw.n_desc); + bfd_h_put_32 (abfd, s->symbol.section->vma + s->symbol.value, + raw.n_value); + + if (bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw)) + goto err; + } } sym->strsize = _bfd_stringtab_size (strtab); sym->stroff = mdata->filelen; @@ -1123,14 +1143,18 @@ bfd_mach_o_write_symtab (bfd *abfd, bfd_mach_o_load_command *command) _bfd_stringtab_free (strtab); /* The command. */ - bfd_h_put_32 (abfd, sym->symoff, buf); - bfd_h_put_32 (abfd, sym->nsyms, buf + 4); - bfd_h_put_32 (abfd, sym->stroff, buf + 8); - bfd_h_put_32 (abfd, sym->strsize, buf + 12); + { + struct mach_o_symtab_command_external raw; - if (bfd_seek (abfd, command->offset + 8, SEEK_SET) != 0 - || bfd_bwrite ((void *) buf, 16, abfd) != 16) - return FALSE; + bfd_h_put_32 (abfd, sym->symoff, raw.symoff); + bfd_h_put_32 (abfd, sym->nsyms, raw.nsyms); + bfd_h_put_32 (abfd, sym->stroff, raw.stroff); + bfd_h_put_32 (abfd, sym->strsize, raw.strsize); + + if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0 + || bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw)) + return FALSE; + } return TRUE; @@ -1215,17 +1239,17 @@ bfd_mach_o_write_contents (bfd *abfd) for (i = 0; i < mdata->header.ncmds; i++) { - unsigned char buf[8]; + struct mach_o_load_command_external raw; bfd_mach_o_load_command *cur = &mdata->commands[i]; unsigned long typeflag; typeflag = cur->type | (cur->type_required ? BFD_MACH_O_LC_REQ_DYLD : 0); - bfd_h_put_32 (abfd, typeflag, buf); - bfd_h_put_32 (abfd, cur->len, buf + 4); + bfd_h_put_32 (abfd, typeflag, raw.cmd); + bfd_h_put_32 (abfd, cur->len, raw.cmdsize); if (bfd_seek (abfd, cur->offset, SEEK_SET) != 0 - || bfd_bwrite ((void *) buf, 8, abfd) != 8) + || bfd_bwrite (&raw, BFD_MACH_O_LC_SIZE, abfd) != 8) return FALSE; switch (cur->type) @@ -1436,37 +1460,37 @@ bfd_mach_o_make_empty_symbol (bfd *abfd) static bfd_boolean bfd_mach_o_read_header (bfd *abfd, bfd_mach_o_header *header) { - unsigned char buf[32]; + struct mach_o_header_external raw; unsigned int size; bfd_vma (*get32) (const void *) = NULL; /* Just read the magic number. */ if (bfd_seek (abfd, 0, SEEK_SET) != 0 - || bfd_bread ((void *) buf, 4, abfd) != 4) + || bfd_bread (raw.magic, sizeof (raw.magic), abfd) != 4) return FALSE; - if (bfd_getb32 (buf) == BFD_MACH_O_MH_MAGIC) + if (bfd_getb32 (raw.magic) == BFD_MACH_O_MH_MAGIC) { header->byteorder = BFD_ENDIAN_BIG; header->magic = BFD_MACH_O_MH_MAGIC; header->version = 1; get32 = bfd_getb32; } - else if (bfd_getl32 (buf) == BFD_MACH_O_MH_MAGIC) + else if (bfd_getl32 (raw.magic) == BFD_MACH_O_MH_MAGIC) { header->byteorder = BFD_ENDIAN_LITTLE; header->magic = BFD_MACH_O_MH_MAGIC; header->version = 1; get32 = bfd_getl32; } - else if (bfd_getb32 (buf) == BFD_MACH_O_MH_MAGIC_64) + else if (bfd_getb32 (raw.magic) == BFD_MACH_O_MH_MAGIC_64) { header->byteorder = BFD_ENDIAN_BIG; header->magic = BFD_MACH_O_MH_MAGIC_64; header->version = 2; get32 = bfd_getb32; } - else if (bfd_getl32 (buf) == BFD_MACH_O_MH_MAGIC_64) + else if (bfd_getl32 (raw.magic) == BFD_MACH_O_MH_MAGIC_64) { header->byteorder = BFD_ENDIAN_LITTLE; header->magic = BFD_MACH_O_MH_MAGIC_64; @@ -1484,18 +1508,18 @@ bfd_mach_o_read_header (bfd *abfd, bfd_mach_o_header *header) BFD_MACH_O_HEADER_64_SIZE : BFD_MACH_O_HEADER_SIZE; if (bfd_seek (abfd, 0, SEEK_SET) != 0 - || bfd_bread ((void *) buf, size, abfd) != size) + || bfd_bread (&raw, size, abfd) != size) return FALSE; - header->cputype = (*get32) (buf + 4); - header->cpusubtype = (*get32) (buf + 8); - header->filetype = (*get32) (buf + 12); - header->ncmds = (*get32) (buf + 16); - header->sizeofcmds = (*get32) (buf + 20); - header->flags = (*get32) (buf + 24); + header->cputype = (*get32) (raw.cputype); + header->cpusubtype = (*get32) (raw.cpusubtype); + header->filetype = (*get32) (raw.filetype); + header->ncmds = (*get32) (raw.ncmds); + header->sizeofcmds = (*get32) (raw.sizeofcmds); + header->flags = (*get32) (raw.flags); if (mach_o_wide_p (header)) - header->reserved = (*get32) (buf + 28); + header->reserved = (*get32) (raw.reserved); return TRUE; } @@ -1566,26 +1590,26 @@ bfd_mach_o_read_section_32 (bfd *abfd, unsigned int offset, unsigned long prot) { - unsigned char buf[BFD_MACH_O_SECTION_SIZE]; + struct mach_o_section_32_external raw; if (bfd_seek (abfd, offset, SEEK_SET) != 0 - || (bfd_bread ((void *) buf, BFD_MACH_O_SECTION_SIZE, abfd) + || (bfd_bread (&raw, BFD_MACH_O_SECTION_SIZE, abfd) != BFD_MACH_O_SECTION_SIZE)) return -1; - memcpy (section->sectname, buf, 16); + memcpy (section->sectname, raw.sectname, 16); section->sectname[16] = '\0'; - memcpy (section->segname, buf + 16, 16); + memcpy (section->segname, raw.segname, 16); section->segname[16] = '\0'; - section->addr = bfd_h_get_32 (abfd, buf + 32); - section->size = bfd_h_get_32 (abfd, buf + 36); - section->offset = bfd_h_get_32 (abfd, buf + 40); - section->align = bfd_h_get_32 (abfd, buf + 44); - section->reloff = bfd_h_get_32 (abfd, buf + 48); - section->nreloc = bfd_h_get_32 (abfd, buf + 52); - section->flags = bfd_h_get_32 (abfd, buf + 56); - section->reserved1 = bfd_h_get_32 (abfd, buf + 60); - section->reserved2 = bfd_h_get_32 (abfd, buf + 64); + section->addr = bfd_h_get_32 (abfd, raw.addr); + section->size = bfd_h_get_32 (abfd, raw.size); + section->offset = bfd_h_get_32 (abfd, raw.offset); + section->align = bfd_h_get_32 (abfd, raw.align); + section->reloff = bfd_h_get_32 (abfd, raw.reloff); + section->nreloc = bfd_h_get_32 (abfd, raw.nreloc); + section->flags = bfd_h_get_32 (abfd, raw.flags); + section->reserved1 = bfd_h_get_32 (abfd, raw.reserved1); + section->reserved2 = bfd_h_get_32 (abfd, raw.reserved2); section->reserved3 = 0; section->bfdsection = bfd_mach_o_make_bfd_section (abfd, section, prot); @@ -1601,27 +1625,27 @@ bfd_mach_o_read_section_64 (bfd *abfd, unsigned int offset, unsigned long prot) { - unsigned char buf[BFD_MACH_O_SECTION_64_SIZE]; + struct mach_o_section_64_external raw; if (bfd_seek (abfd, offset, SEEK_SET) != 0 - || (bfd_bread ((void *) buf, BFD_MACH_O_SECTION_64_SIZE, abfd) + || (bfd_bread (&raw, BFD_MACH_O_SECTION_64_SIZE, abfd) != BFD_MACH_O_SECTION_64_SIZE)) return -1; - memcpy (section->sectname, buf, 16); + memcpy (section->sectname, raw.sectname, 16); section->sectname[16] = '\0'; - memcpy (section->segname, buf + 16, 16); + memcpy (section->segname, raw.segname, 16); section->segname[16] = '\0'; - section->addr = bfd_h_get_64 (abfd, buf + 32); - section->size = bfd_h_get_64 (abfd, buf + 40); - section->offset = bfd_h_get_32 (abfd, buf + 48); - section->align = bfd_h_get_32 (abfd, buf + 52); - section->reloff = bfd_h_get_32 (abfd, buf + 56); - section->nreloc = bfd_h_get_32 (abfd, buf + 60); - section->flags = bfd_h_get_32 (abfd, buf + 64); - section->reserved1 = bfd_h_get_32 (abfd, buf + 68); - section->reserved2 = bfd_h_get_32 (abfd, buf + 72); - section->reserved3 = bfd_h_get_32 (abfd, buf + 76); + section->addr = bfd_h_get_64 (abfd, raw.addr); + section->size = bfd_h_get_64 (abfd, raw.size); + section->offset = bfd_h_get_32 (abfd, raw.offset); + section->align = bfd_h_get_32 (abfd, raw.align); + section->reloff = bfd_h_get_32 (abfd, raw.reloff); + section->nreloc = bfd_h_get_32 (abfd, raw.nreloc); + section->flags = bfd_h_get_32 (abfd, raw.flags); + section->reserved1 = bfd_h_get_32 (abfd, raw.reserved1); + section->reserved2 = bfd_h_get_32 (abfd, raw.reserved2); + section->reserved3 = bfd_h_get_32 (abfd, raw.reserved3); section->bfdsection = bfd_mach_o_make_bfd_section (abfd, section, prot); if (section->bfdsection == NULL) @@ -1654,7 +1678,7 @@ bfd_mach_o_read_symtab_symbol (bfd *abfd, unsigned int symwidth = wide ? BFD_MACH_O_NLIST_64_SIZE : BFD_MACH_O_NLIST_SIZE; unsigned int symoff = sym->symoff + (i * symwidth); - unsigned char buf[16]; + struct mach_o_nlist_64_external raw; unsigned char type = -1; unsigned char section = -1; short desc = -1; @@ -1665,28 +1689,30 @@ bfd_mach_o_read_symtab_symbol (bfd *abfd, BFD_ASSERT (sym->strtab != NULL); if (bfd_seek (abfd, symoff, SEEK_SET) != 0 - || bfd_bread ((void *) buf, symwidth, abfd) != symwidth) + || bfd_bread (&raw, symwidth, abfd) != symwidth) { - (*_bfd_error_handler) (_("bfd_mach_o_read_symtab_symbol: unable to read %d bytes at %lu"), - symwidth, (unsigned long) symoff); + (*_bfd_error_handler) + (_("bfd_mach_o_read_symtab_symbol: unable to read %d bytes at %lu"), + symwidth, (unsigned long) symoff); return -1; } - stroff = bfd_h_get_32 (abfd, buf); - type = bfd_h_get_8 (abfd, buf + 4); + stroff = bfd_h_get_32 (abfd, raw.n_strx); + type = bfd_h_get_8 (abfd, raw.n_type); symtype = type & BFD_MACH_O_N_TYPE; - section = bfd_h_get_8 (abfd, buf + 5); - desc = bfd_h_get_16 (abfd, buf + 6); + section = bfd_h_get_8 (abfd, raw.n_sect); + desc = bfd_h_get_16 (abfd, raw.n_desc); if (wide) - value = bfd_h_get_64 (abfd, buf + 8); + value = bfd_h_get_64 (abfd, raw.n_value); else - value = bfd_h_get_32 (abfd, buf + 8); + value = bfd_h_get_32 (abfd, raw.n_value); if (stroff >= sym->strsize) { - (*_bfd_error_handler) (_("bfd_mach_o_read_symtab_symbol: symbol name out of range (%lu >= %lu)"), - (unsigned long) stroff, - (unsigned long) sym->strsize); + (*_bfd_error_handler) + (_("bfd_mach_o_read_symtab_symbol: name out of range (%lu >= %lu)"), + (unsigned long) stroff, + (unsigned long) sym->strsize); return -1; } @@ -1883,18 +1909,19 @@ bfd_mach_o_read_dysymtab_symbol (bfd *abfd, { unsigned long isymoff = dysym->indirectsymoff + (i * 4); unsigned long sym_index; - unsigned char buf[4]; + unsigned char raw[4]; BFD_ASSERT (i < dysym->nindirectsyms); if (bfd_seek (abfd, isymoff, SEEK_SET) != 0 - || bfd_bread ((void *) buf, 4, abfd) != 4) + || bfd_bread (raw, sizeof (raw), abfd) != sizeof (raw)) { - (*_bfd_error_handler) (_("bfd_mach_o_read_dysymtab_symbol: unable to read %lu bytes at %lu"), - (unsigned long) 4, isymoff); + (*_bfd_error_handler) + (_("bfd_mach_o_read_dysymtab_symbol: unable to read %lu bytes at %lu"), + (unsigned long) sizeof (raw), isymoff); return -1; } - sym_index = bfd_h_get_32 (abfd, buf); + sym_index = bfd_h_get_32 (abfd, raw); return bfd_mach_o_read_symtab_symbol (abfd, sym, s, sym_index); } @@ -1940,17 +1967,17 @@ static int bfd_mach_o_read_dylinker (bfd *abfd, bfd_mach_o_load_command *command) { bfd_mach_o_dylinker_command *cmd = &command->command.dylinker; - unsigned char buf[4]; + struct mach_o_str_command_external raw; unsigned int nameoff; BFD_ASSERT ((command->type == BFD_MACH_O_LC_ID_DYLINKER) || (command->type == BFD_MACH_O_LC_LOAD_DYLINKER)); - if (bfd_seek (abfd, command->offset + 8, SEEK_SET) != 0 - || bfd_bread ((void *) buf, 4, abfd) != 4) + if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0 + || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw)) return -1; - nameoff = bfd_h_get_32 (abfd, buf + 0); + nameoff = bfd_h_get_32 (abfd, raw.str); cmd->name_offset = command->offset + nameoff; cmd->name_len = command->len - nameoff; @@ -1967,7 +1994,7 @@ static int bfd_mach_o_read_dylib (bfd *abfd, bfd_mach_o_load_command *command) { bfd_mach_o_dylib_command *cmd = &command->command.dylib; - unsigned char buf[16]; + struct mach_o_dylib_command_external raw; unsigned int nameoff; switch (command->type) @@ -1982,14 +2009,14 @@ bfd_mach_o_read_dylib (bfd *abfd, bfd_mach_o_load_command *command) return -1; } - if (bfd_seek (abfd, command->offset + 8, SEEK_SET) != 0 - || bfd_bread ((void *) buf, 16, abfd) != 16) + if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0 + || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw)) return -1; - nameoff = bfd_h_get_32 (abfd, buf + 0); - cmd->timestamp = bfd_h_get_32 (abfd, buf + 4); - cmd->current_version = bfd_h_get_32 (abfd, buf + 8); - cmd->compatibility_version = bfd_h_get_32 (abfd, buf + 12); + nameoff = bfd_h_get_32 (abfd, raw.name); + cmd->timestamp = bfd_h_get_32 (abfd, raw.timestamp); + cmd->current_version = bfd_h_get_32 (abfd, raw.current_version); + cmd->compatibility_version = bfd_h_get_32 (abfd, raw.compatibility_version); cmd->name_offset = command->offset + nameoff; cmd->name_len = command->len - nameoff; @@ -2017,7 +2044,6 @@ bfd_mach_o_read_thread (bfd *abfd, bfd_mach_o_load_command *command) { bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd); bfd_mach_o_thread_command *cmd = &command->command.thread; - unsigned char buf[8]; unsigned int offset; unsigned int nflavours; unsigned int i; @@ -2030,14 +2056,16 @@ bfd_mach_o_read_thread (bfd *abfd, bfd_mach_o_load_command *command) nflavours = 0; while (offset != command->len) { + struct mach_o_thread_command_external raw; + if (offset >= command->len) return -1; if (bfd_seek (abfd, command->offset + offset, SEEK_SET) != 0 - || bfd_bread ((void *) buf, 8, abfd) != 8) + || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw)) return -1; - offset += 8 + bfd_h_get_32 (abfd, buf + 4) * 4; + offset += sizeof (raw) + bfd_h_get_32 (abfd, raw.count) * 4; nflavours++; } @@ -2052,6 +2080,8 @@ bfd_mach_o_read_thread (bfd *abfd, bfd_mach_o_load_command *command) nflavours = 0; while (offset != command->len) { + struct mach_o_thread_command_external raw; + if (offset >= command->len) return -1; @@ -2059,13 +2089,13 @@ bfd_mach_o_read_thread (bfd *abfd, bfd_mach_o_load_command *command) return -1; if (bfd_seek (abfd, command->offset + offset, SEEK_SET) != 0 - || bfd_bread ((void *) buf, 8, abfd) != 8) + || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw)) return -1; - cmd->flavours[nflavours].flavour = bfd_h_get_32 (abfd, buf); - cmd->flavours[nflavours].offset = command->offset + offset + 8; - cmd->flavours[nflavours].size = bfd_h_get_32 (abfd, buf + 4) * 4; - offset += cmd->flavours[nflavours].size + 8; + cmd->flavours[nflavours].flavour = bfd_h_get_32 (abfd, raw.flavour); + cmd->flavours[nflavours].offset = command->offset + offset + sizeof (raw); + cmd->flavours[nflavours].size = bfd_h_get_32 (abfd, raw.count) * 4; + offset += cmd->flavours[nflavours].size + sizeof (raw); nflavours++; } @@ -2125,32 +2155,35 @@ bfd_mach_o_read_dysymtab (bfd *abfd, bfd_mach_o_load_command *command) { bfd_mach_o_dysymtab_command *cmd = &command->command.dysymtab; bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd); - unsigned char buf[72]; BFD_ASSERT (command->type == BFD_MACH_O_LC_DYSYMTAB); - if (bfd_seek (abfd, command->offset + 8, SEEK_SET) != 0 - || bfd_bread ((void *) buf, 72, abfd) != 72) - return -1; + { + struct mach_o_dysymtab_command_external raw; - cmd->ilocalsym = bfd_h_get_32 (abfd, buf + 0); - cmd->nlocalsym = bfd_h_get_32 (abfd, buf + 4); - cmd->iextdefsym = bfd_h_get_32 (abfd, buf + 8); - cmd->nextdefsym = bfd_h_get_32 (abfd, buf + 12); - cmd->iundefsym = bfd_h_get_32 (abfd, buf + 16); - cmd->nundefsym = bfd_h_get_32 (abfd, buf + 20); - cmd->tocoff = bfd_h_get_32 (abfd, buf + 24); - cmd->ntoc = bfd_h_get_32 (abfd, buf + 28); - cmd->modtaboff = bfd_h_get_32 (abfd, buf + 32); - cmd->nmodtab = bfd_h_get_32 (abfd, buf + 36); - cmd->extrefsymoff = bfd_h_get_32 (abfd, buf + 40); - cmd->nextrefsyms = bfd_h_get_32 (abfd, buf + 44); - cmd->indirectsymoff = bfd_h_get_32 (abfd, buf + 48); - cmd->nindirectsyms = bfd_h_get_32 (abfd, buf + 52); - cmd->extreloff = bfd_h_get_32 (abfd, buf + 56); - cmd->nextrel = bfd_h_get_32 (abfd, buf + 60); - cmd->locreloff = bfd_h_get_32 (abfd, buf + 64); - cmd->nlocrel = bfd_h_get_32 (abfd, buf + 68); + if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0 + || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw)) + return -1; + + cmd->ilocalsym = bfd_h_get_32 (abfd, raw.ilocalsym); + cmd->nlocalsym = bfd_h_get_32 (abfd, raw.nlocalsym); + cmd->iextdefsym = bfd_h_get_32 (abfd, raw.iextdefsym); + cmd->nextdefsym = bfd_h_get_32 (abfd, raw.nextdefsym); + cmd->iundefsym = bfd_h_get_32 (abfd, raw.iundefsym); + cmd->nundefsym = bfd_h_get_32 (abfd, raw.nundefsym); + cmd->tocoff = bfd_h_get_32 (abfd, raw.tocoff); + cmd->ntoc = bfd_h_get_32 (abfd, raw.ntoc); + cmd->modtaboff = bfd_h_get_32 (abfd, raw.modtaboff); + cmd->nmodtab = bfd_h_get_32 (abfd, raw.nmodtab); + cmd->extrefsymoff = bfd_h_get_32 (abfd, raw.extrefsymoff); + cmd->nextrefsyms = bfd_h_get_32 (abfd, raw.nextrefsyms); + cmd->indirectsymoff = bfd_h_get_32 (abfd, raw.indirectsymoff); + cmd->nindirectsyms = bfd_h_get_32 (abfd, raw.nindirectsyms); + cmd->extreloff = bfd_h_get_32 (abfd, raw.extreloff); + cmd->nextrel = bfd_h_get_32 (abfd, raw.nextrel); + cmd->locreloff = bfd_h_get_32 (abfd, raw.locreloff); + cmd->nlocrel = bfd_h_get_32 (abfd, raw.nlocrel); + } if (cmd->nmodtab != 0) { @@ -2170,6 +2203,7 @@ bfd_mach_o_read_dysymtab (bfd *abfd, bfd_mach_o_load_command *command) { bfd_mach_o_dylib_module *module = &cmd->dylib_module[i]; unsigned long v; + unsigned char buf[56]; if (bfd_bread ((void *) buf, module_len, abfd) != module_len) return -1; @@ -2216,13 +2250,14 @@ bfd_mach_o_read_dysymtab (bfd *abfd, bfd_mach_o_load_command *command) for (i = 0; i < cmd->ntoc; i++) { + struct mach_o_dylib_table_of_contents_external raw; bfd_mach_o_dylib_table_of_content *toc = &cmd->dylib_toc[i]; - if (bfd_bread ((void *) buf, 8, abfd) != 8) + if (bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw)) return -1; - toc->symbol_index = bfd_h_get_32 (abfd, buf + 0); - toc->module_index = bfd_h_get_32 (abfd, buf + 4); + toc->symbol_index = bfd_h_get_32 (abfd, raw.symbol_index); + toc->module_index = bfd_h_get_32 (abfd, raw.module_index); } } @@ -2240,12 +2275,13 @@ bfd_mach_o_read_dysymtab (bfd *abfd, bfd_mach_o_load_command *command) for (i = 0; i < cmd->nindirectsyms; i++) { + unsigned char raw[4]; unsigned int *is = &cmd->indirect_syms[i]; - if (bfd_bread ((void *) buf, 4, abfd) != 4) + if (bfd_bread (raw, sizeof (raw), abfd) != sizeof (raw)) return -1; - *is = bfd_h_get_32 (abfd, buf + 0); + *is = bfd_h_get_32 (abfd, raw); } } @@ -2264,14 +2300,15 @@ bfd_mach_o_read_dysymtab (bfd *abfd, bfd_mach_o_load_command *command) for (i = 0; i < cmd->nextrefsyms; i++) { + unsigned char raw[4]; bfd_mach_o_dylib_reference *ref = &cmd->ext_refs[i]; - if (bfd_bread ((void *) buf, 4, abfd) != 4) + if (bfd_bread (raw, sizeof (raw), abfd) != sizeof (raw)) return -1; /* Fields isym and flags are written as bit-fields, thus we need a specific processing for endianness. */ - v = bfd_h_get_32 (abfd, buf + 0); + v = bfd_h_get_32 (abfd, raw); if (bfd_big_endian (abfd)) { ref->isym = (v >> 8) & 0xffffff; @@ -2297,18 +2334,18 @@ bfd_mach_o_read_symtab (bfd *abfd, bfd_mach_o_load_command *command) { bfd_mach_o_symtab_command *symtab = &command->command.symtab; bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd); - unsigned char buf[16]; + struct mach_o_symtab_command_external raw; BFD_ASSERT (command->type == BFD_MACH_O_LC_SYMTAB); - if (bfd_seek (abfd, command->offset + 8, SEEK_SET) != 0 - || bfd_bread ((void *) buf, 16, abfd) != 16) + if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0 + || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw)) return -1; - symtab->symoff = bfd_h_get_32 (abfd, buf); - symtab->nsyms = bfd_h_get_32 (abfd, buf + 4); - symtab->stroff = bfd_h_get_32 (abfd, buf + 8); - symtab->strsize = bfd_h_get_32 (abfd, buf + 12); + symtab->symoff = bfd_h_get_32 (abfd, raw.symoff); + symtab->nsyms = bfd_h_get_32 (abfd, raw.nsyms); + symtab->stroff = bfd_h_get_32 (abfd, raw.stroff); + symtab->strsize = bfd_h_get_32 (abfd, raw.strsize); symtab->symbols = NULL; symtab->strtab = NULL; @@ -2328,8 +2365,8 @@ bfd_mach_o_read_uuid (bfd *abfd, bfd_mach_o_load_command *command) BFD_ASSERT (command->type == BFD_MACH_O_LC_UUID); - if (bfd_seek (abfd, command->offset + 8, SEEK_SET) != 0 - || bfd_bread ((void *) cmd->uuid, 16, abfd) != 16) + if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0 + || bfd_bread (cmd->uuid, 16, abfd) != 16) return -1; return 0; @@ -2339,14 +2376,14 @@ static int bfd_mach_o_read_linkedit (bfd *abfd, bfd_mach_o_load_command *command) { bfd_mach_o_linkedit_command *cmd = &command->command.linkedit; - char buf[8]; + struct mach_o_linkedit_data_command_external raw; - if (bfd_seek (abfd, command->offset + 8, SEEK_SET) != 0 - || bfd_bread ((void *) buf, 8, abfd) != 8) + if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0 + || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw)) return -1; - cmd->dataoff = bfd_get_32 (abfd, buf + 0); - cmd->datasize = bfd_get_32 (abfd, buf + 4); + cmd->dataoff = bfd_get_32 (abfd, raw.dataoff); + cmd->datasize = bfd_get_32 (abfd, raw.datasize); return 0; } @@ -2354,14 +2391,14 @@ static int bfd_mach_o_read_str (bfd *abfd, bfd_mach_o_load_command *command) { bfd_mach_o_str_command *cmd = &command->command.str; - char buf[4]; + struct mach_o_str_command_external raw; unsigned long off; - if (bfd_seek (abfd, command->offset + 8, SEEK_SET) != 0 - || bfd_bread ((void *) buf, 4, abfd) != 4) + if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0 + || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw)) return -1; - off = bfd_get_32 (abfd, buf + 0); + off = bfd_get_32 (abfd, raw.str); cmd->stroff = command->offset + off; cmd->str_len = command->len - off; cmd->str = bfd_alloc (abfd, cmd->str_len); @@ -2377,22 +2414,22 @@ static int bfd_mach_o_read_dyld_info (bfd *abfd, bfd_mach_o_load_command *command) { bfd_mach_o_dyld_info_command *cmd = &command->command.dyld_info; - char buf[40]; + struct mach_o_dyld_info_command_external raw; - if (bfd_seek (abfd, command->offset + 8, SEEK_SET) != 0 - || bfd_bread ((void *) buf, sizeof (buf), abfd) != sizeof (buf)) + if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0 + || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw)) return -1; - cmd->rebase_off = bfd_get_32 (abfd, buf + 0); - cmd->rebase_size = bfd_get_32 (abfd, buf + 4); - cmd->bind_off = bfd_get_32 (abfd, buf + 8); - cmd->bind_size = bfd_get_32 (abfd, buf + 12); - cmd->weak_bind_off = bfd_get_32 (abfd, buf + 16); - cmd->weak_bind_size = bfd_get_32 (abfd, buf + 20); - cmd->lazy_bind_off = bfd_get_32 (abfd, buf + 24); - cmd->lazy_bind_size = bfd_get_32 (abfd, buf + 28); - cmd->export_off = bfd_get_32 (abfd, buf + 32); - cmd->export_size = bfd_get_32 (abfd, buf + 36); + cmd->rebase_off = bfd_get_32 (abfd, raw.rebase_off); + cmd->rebase_size = bfd_get_32 (abfd, raw.rebase_size); + cmd->bind_off = bfd_get_32 (abfd, raw.bind_off); + cmd->bind_size = bfd_get_32 (abfd, raw.bind_size); + cmd->weak_bind_off = bfd_get_32 (abfd, raw.weak_bind_off); + cmd->weak_bind_size = bfd_get_32 (abfd, raw.weak_bind_size); + cmd->lazy_bind_off = bfd_get_32 (abfd, raw.lazy_bind_off); + cmd->lazy_bind_size = bfd_get_32 (abfd, raw.lazy_bind_size); + cmd->export_off = bfd_get_32 (abfd, raw.export_off); + cmd->export_size = bfd_get_32 (abfd, raw.export_size); return 0; } @@ -2401,49 +2438,52 @@ bfd_mach_o_read_segment (bfd *abfd, bfd_mach_o_load_command *command, unsigned int wide) { - unsigned char buf[64]; bfd_mach_o_segment_command *seg = &command->command.segment; unsigned long i; if (wide) { + struct mach_o_segment_command_64_external raw; + BFD_ASSERT (command->type == BFD_MACH_O_LC_SEGMENT_64); - if (bfd_seek (abfd, command->offset + 8, SEEK_SET) != 0 - || bfd_bread ((void *) buf, 64, abfd) != 64) - return -1; + if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0 + || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw)) + return -1; - memcpy (seg->segname, buf, 16); + memcpy (seg->segname, raw.segname, 16); seg->segname[16] = '\0'; - seg->vmaddr = bfd_h_get_64 (abfd, buf + 16); - seg->vmsize = bfd_h_get_64 (abfd, buf + 24); - seg->fileoff = bfd_h_get_64 (abfd, buf + 32); - seg->filesize = bfd_h_get_64 (abfd, buf + 40); - seg->maxprot = bfd_h_get_32 (abfd, buf + 48); - seg->initprot = bfd_h_get_32 (abfd, buf + 52); - seg->nsects = bfd_h_get_32 (abfd, buf + 56); - seg->flags = bfd_h_get_32 (abfd, buf + 60); + seg->vmaddr = bfd_h_get_64 (abfd, raw.vmaddr); + seg->vmsize = bfd_h_get_64 (abfd, raw.vmsize); + seg->fileoff = bfd_h_get_64 (abfd, raw.fileoff); + seg->filesize = bfd_h_get_64 (abfd, raw.filesize); + seg->maxprot = bfd_h_get_32 (abfd, raw.maxprot); + seg->initprot = bfd_h_get_32 (abfd, raw.initprot); + seg->nsects = bfd_h_get_32 (abfd, raw.nsects); + seg->flags = bfd_h_get_32 (abfd, raw.flags); } else { + struct mach_o_segment_command_32_external raw; + BFD_ASSERT (command->type == BFD_MACH_O_LC_SEGMENT); - if (bfd_seek (abfd, command->offset + 8, SEEK_SET) != 0 - || bfd_bread ((void *) buf, 48, abfd) != 48) - return -1; + if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0 + || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw)) + return -1; - memcpy (seg->segname, buf, 16); + memcpy (seg->segname, raw.segname, 16); seg->segname[16] = '\0'; - seg->vmaddr = bfd_h_get_32 (abfd, buf + 16); - seg->vmsize = bfd_h_get_32 (abfd, buf + 20); - seg->fileoff = bfd_h_get_32 (abfd, buf + 24); - seg->filesize = bfd_h_get_32 (abfd, buf + 28); - seg->maxprot = bfd_h_get_32 (abfd, buf + 32); - seg->initprot = bfd_h_get_32 (abfd, buf + 36); - seg->nsects = bfd_h_get_32 (abfd, buf + 40); - seg->flags = bfd_h_get_32 (abfd, buf + 44); + seg->vmaddr = bfd_h_get_32 (abfd, raw.vmaddr); + seg->vmsize = bfd_h_get_32 (abfd, raw.vmsize); + seg->fileoff = bfd_h_get_32 (abfd, raw.fileoff); + seg->filesize = bfd_h_get_32 (abfd, raw.filesize); + seg->maxprot = bfd_h_get_32 (abfd, raw.maxprot); + seg->initprot = bfd_h_get_32 (abfd, raw.initprot); + seg->nsects = bfd_h_get_32 (abfd, raw.nsects); + seg->flags = bfd_h_get_32 (abfd, raw.flags); } if (seg->nsects != 0) @@ -2487,17 +2527,18 @@ bfd_mach_o_read_segment_64 (bfd *abfd, bfd_mach_o_load_command *command) static int bfd_mach_o_read_command (bfd *abfd, bfd_mach_o_load_command *command) { - unsigned char buf[8]; + struct mach_o_load_command_external raw; + unsigned int cmd; /* Read command type and length. */ if (bfd_seek (abfd, command->offset, SEEK_SET) != 0 - || bfd_bread ((void *) buf, 8, abfd) != 8) + || bfd_bread (&raw, BFD_MACH_O_LC_SIZE, abfd) != BFD_MACH_O_LC_SIZE) 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 - ? TRUE : FALSE); - command->len = bfd_h_get_32 (abfd, buf + 4); + cmd = bfd_h_get_32 (abfd, raw.cmd); + command->type = cmd & ~BFD_MACH_O_LC_REQ_DYLD; + command->type_required = cmd & BFD_MACH_O_LC_REQ_DYLD ? TRUE : FALSE; + command->len = bfd_h_get_32 (abfd, raw.cmdsize); switch (command->type) { @@ -2951,19 +2992,19 @@ const bfd_target * bfd_mach_o_archive_p (bfd *abfd) { mach_o_fat_data_struct *adata = NULL; - unsigned char buf[20]; + struct mach_o_fat_header_external hdr; unsigned long i; if (bfd_seek (abfd, 0, SEEK_SET) != 0 - || bfd_bread ((void *) buf, 8, abfd) != 8) + || bfd_bread (&hdr, sizeof (hdr), abfd) != sizeof (hdr)) goto error; adata = bfd_alloc (abfd, sizeof (mach_o_fat_data_struct)); if (adata == NULL) goto error; - adata->magic = bfd_getb32 (buf); - adata->nfat_arch = bfd_getb32 (buf + 4); + adata->magic = bfd_getb32 (hdr.magic); + adata->nfat_arch = bfd_getb32 (hdr.nfat_arch); if (adata->magic != 0xcafebabe) goto error; /* Avoid matching Java bytecode files, which have the same magic number. @@ -2979,14 +3020,14 @@ bfd_mach_o_archive_p (bfd *abfd) for (i = 0; i < adata->nfat_arch; i++) { - if (bfd_seek (abfd, 8 + 20 * i, SEEK_SET) != 0 - || bfd_bread ((void *) buf, 20, abfd) != 20) + struct mach_o_fat_arch_external arch; + if (bfd_bread (&arch, sizeof (arch), abfd) != sizeof (arch)) 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); - adata->archentries[i].size = bfd_getb32 (buf + 12); - adata->archentries[i].align = bfd_getb32 (buf + 16); + adata->archentries[i].cputype = bfd_getb32 (arch.cputype); + adata->archentries[i].cpusubtype = bfd_getb32 (arch.cpusubtype); + adata->archentries[i].offset = bfd_getb32 (arch.offset); + adata->archentries[i].size = bfd_getb32 (arch.size); + adata->archentries[i].align = bfd_getb32 (arch.align); } abfd->tdata.mach_o_fat_data = adata; diff --git a/bfd/mach-o.h b/bfd/mach-o.h index 183076b44b..de9640a880 100644 --- a/bfd/mach-o.h +++ b/bfd/mach-o.h @@ -41,9 +41,6 @@ typedef struct bfd_mach_o_header } bfd_mach_o_header; -#define BFD_MACH_O_HEADER_SIZE 28 -#define BFD_MACH_O_HEADER_64_SIZE 32 - typedef struct bfd_mach_o_section { /* Fields present in the file. */ @@ -64,8 +61,6 @@ typedef struct bfd_mach_o_section asection *bfdsection; } bfd_mach_o_section; -#define BFD_MACH_O_SECTION_SIZE 68 -#define BFD_MACH_O_SECTION_64_SIZE 80 typedef struct bfd_mach_o_segment_command { @@ -81,55 +76,12 @@ typedef struct bfd_mach_o_segment_command bfd_mach_o_section *sections; } bfd_mach_o_segment_command; -#define BFD_MACH_O_LC_SEGMENT_SIZE 56 -#define BFD_MACH_O_LC_SEGMENT_64_SIZE 72 /* Protection flags. */ #define BFD_MACH_O_PROT_READ 0x01 #define BFD_MACH_O_PROT_WRITE 0x02 #define BFD_MACH_O_PROT_EXECUTE 0x04 -/* Generic relocation types (used by i386). */ -#define BFD_MACH_O_GENERIC_RELOC_VANILLA 0 -#define BFD_MACH_O_GENERIC_RELOC_PAIR 1 -#define BFD_MACH_O_GENERIC_RELOC_SECTDIFF 2 -#define BFD_MACH_O_GENERIC_RELOC_PB_LA_PTR 3 -#define BFD_MACH_O_GENERIC_RELOC_LOCAL_SECTDIFF 4 - -/* X86-64 relocations. */ -#define BFD_MACH_O_X86_64_RELOC_UNSIGNED 0 /* Absolute addresses. */ -#define BFD_MACH_O_X86_64_RELOC_SIGNED 1 /* 32-bit disp. */ -#define BFD_MACH_O_X86_64_RELOC_BRANCH 2 /* 32-bit pcrel disp. */ -#define BFD_MACH_O_X86_64_RELOC_GOT_LOAD 3 /* Movq load of a GOT entry. */ -#define BFD_MACH_O_X86_64_RELOC_GOT 4 /* GOT reference. */ -#define BFD_MACH_O_X86_64_RELOC_SUBTRACTOR 5 /* Symbol difference. */ -#define BFD_MACH_O_X86_64_RELOC_SIGNED_1 6 /* 32-bit signed disp -1. */ -#define BFD_MACH_O_X86_64_RELOC_SIGNED_2 7 /* 32-bit signed disp -2. */ -#define BFD_MACH_O_X86_64_RELOC_SIGNED_4 8 /* 32-bit signed disp -4. */ - -/* Size of a relocation entry. */ -#define BFD_MACH_O_RELENT_SIZE 8 - -/* Fields for a normal (non-scattered) entry. */ -#define BFD_MACH_O_R_PCREL 0x01000000 -#define BFD_MACH_O_GET_R_LENGTH(s) (((s) >> 25) & 0x3) -#define BFD_MACH_O_R_EXTERN 0x08000000 -#define BFD_MACH_O_GET_R_TYPE(s) (((s) >> 28) & 0x0f) -#define BFD_MACH_O_GET_R_SYMBOLNUM(s) ((s) & 0x00ffffff) -#define BFD_MACH_O_SET_R_LENGTH(l) (((l) & 0x3) << 25) -#define BFD_MACH_O_SET_R_TYPE(t) (((t) & 0xf) << 28) -#define BFD_MACH_O_SET_R_SYMBOLNUM(s) ((s) & 0x00ffffff) - -/* Fields for a scattered entry. */ -#define BFD_MACH_O_SR_SCATTERED 0x80000000 -#define BFD_MACH_O_SR_PCREL 0x40000000 -#define BFD_MACH_O_GET_SR_LENGTH(s) (((s) >> 28) & 0x3) -#define BFD_MACH_O_GET_SR_TYPE(s) (((s) >> 24) & 0x0f) -#define BFD_MACH_O_GET_SR_ADDRESS(s) ((s) & 0x00ffffff) -#define BFD_MACH_O_SET_SR_LENGTH(l) (((l) & 0x3) << 28) -#define BFD_MACH_O_SET_SR_TYPE(t) (((t) & 0xf) << 24) -#define BFD_MACH_O_SET_SR_ADDRESS(s) ((s) & 0x00ffffff) - /* Expanded internal representation of a relocation entry. */ typedef struct bfd_mach_o_reloc_info { @@ -154,8 +106,6 @@ typedef struct bfd_mach_o_asymbol unsigned short n_desc; } bfd_mach_o_asymbol; -#define BFD_MACH_O_NLIST_SIZE 12 -#define BFD_MACH_O_NLIST_64_SIZE 16 typedef struct bfd_mach_o_symtab_command { @@ -262,8 +212,6 @@ typedef struct bfd_mach_o_dylib_module bfd_vma objc_module_info_addr; } bfd_mach_o_dylib_module; -#define BFD_MACH_O_DYLIB_MODULE_SIZE 52 -#define BFD_MACH_O_DYLIB_MODULE_64_SIZE 56 typedef struct bfd_mach_o_dylib_table_of_content { @@ -274,7 +222,6 @@ typedef struct bfd_mach_o_dylib_table_of_content unsigned long module_index; } bfd_mach_o_dylib_table_of_content; -#define BFD_MACH_O_TABLE_OF_CONTENT_SIZE 8 typedef struct bfd_mach_o_dylib_reference { |