This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[mach-o/committed]: Split mach-o/loader.h and add external.h


Hi,

this patch adds the include/mach-o/external.h file.  It contains an external view of Mach-O records.
bfd/mach-o.c has been convert to use these structures.  That makes it more like other back-ends (coff, elf),
and this makes the code easier to debug as it avoids many hard-coded constants.

The macros for relocations are moved from loader.h to reloc.h and x86-64.h

Committed on trunk.

Tristan.

bfd/
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.

include/mach-o
2011-08-08  Tristan Gingold  <gingold@adacore.com>

	* loader.h: Reorder declarations.
	* x86-64.h: New file.
	* external.h: New file.
	* reloc.h: New file.

Index: bfd/mach-o-i386.c
===================================================================
RCS file: /cvs/src/src/bfd/mach-o-i386.c,v
retrieving revision 1.6
diff -c -r1.6 mach-o-i386.c
*** bfd/mach-o-i386.c	11 Jan 2010 15:39:41 -0000	1.6
--- bfd/mach-o-i386.c	8 Aug 2011 08:54:40 -0000
***************
*** 24,29 ****
--- 24,30 ----
  #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
Index: bfd/mach-o-x86-64.c
===================================================================
RCS file: /cvs/src/src/bfd/mach-o-x86-64.c,v
retrieving revision 1.2
diff -c -r1.2 mach-o-x86-64.c
*** bfd/mach-o-x86-64.c	8 Aug 2011 07:47:41 -0000	1.2
--- bfd/mach-o-x86-64.c	8 Aug 2011 08:54:40 -0000
***************
*** 24,29 ****
--- 24,30 ----
  #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
Index: bfd/mach-o.c
===================================================================
RCS file: /cvs/src/src/bfd/mach-o.c,v
retrieving revision 1.60
diff -c -r1.60 mach-o.c
*** bfd/mach-o.c	8 Aug 2011 07:39:44 -0000	1.60
--- bfd/mach-o.c	8 Aug 2011 08:54:41 -0000
***************
*** 26,31 ****
--- 26,33 ----
  #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,638 ****
  static bfd_boolean
  bfd_mach_o_write_header (bfd *abfd, bfd_mach_o_header *header)
  {
!   unsigned char buf[32];
    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);
  
    if (mach_o_wide_p (header))
!     bfd_h_put_32 (abfd, header->reserved, buf + 28);
  
    if (bfd_seek (abfd, 0, SEEK_SET) != 0
!       || bfd_bwrite ((void *) buf, size, abfd) != size)
      return FALSE;
  
    return TRUE;
--- 616,640 ----
  static bfd_boolean
  bfd_mach_o_write_header (bfd *abfd, bfd_mach_o_header *header)
  {
!   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, 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, raw.reserved);
  
    if (bfd_seek (abfd, 0, SEEK_SET) != 0
!       || bfd_bwrite (&raw, size, abfd) != size)
      return FALSE;
  
    return TRUE;
***************
*** 643,649 ****
  {
    bfd_mach_o_thread_command *cmd = &command->command.thread;
    unsigned int i;
!   unsigned char buf[8];
    unsigned int offset;
  
    BFD_ASSERT ((command->type == BFD_MACH_O_LC_THREAD)
--- 645,651 ----
  {
    bfd_mach_o_thread_command *cmd = &command->command.thread;
    unsigned int i;
!   struct mach_o_thread_command_external raw;
    unsigned int offset;
  
    BFD_ASSERT ((command->type == BFD_MACH_O_LC_THREAD)
***************
*** 653,668 ****
    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);
  
        if (bfd_seek (abfd, command->offset + offset, SEEK_SET) != 0
!           || bfd_bwrite ((void *) buf, 8, abfd) != 8)
  	return -1;
  
!       offset += cmd->flavours[i].size + 8;
      }
  
    return 0;
--- 655,671 ----
    for (i = 0; i < cmd->nflavours; i++)
      {
        BFD_ASSERT ((cmd->flavours[i].size % 4) == 0);
!       BFD_ASSERT (cmd->flavours[i].offset ==
!                   (command->offset + offset + BFD_MACH_O_LC_SIZE));
  
!       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 (&raw, sizeof (raw), abfd) != sizeof (raw))
  	return -1;
  
!       offset += cmd->flavours[i].size + sizeof (raw);
      }
  
    return 0;
***************
*** 676,682 ****
  }
  
  static int
! bfd_mach_o_canonicalize_one_reloc (bfd *abfd, char *buf,
                                     arelent *res, asymbol **syms)
  {
    bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
--- 679,686 ----
  }
  
  static int
! 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,693 ****
    bfd_vma symnum;
    asymbol **sym;
  
!   addr = bfd_get_32 (abfd, buf + 0);
!   symnum = bfd_get_32 (abfd, buf + 4);
    
    if (addr & BFD_MACH_O_SR_SCATTERED)
      {
--- 690,697 ----
    bfd_vma symnum;
    asymbol **sym;
  
!   addr = bfd_get_32 (abfd, raw->r_address);
!   symnum = bfd_get_32 (abfd, raw->r_symbolnum);
    
    if (addr & BFD_MACH_O_SR_SCATTERED)
      {
***************
*** 754,765 ****
                                  arelent *res, asymbol **syms)
  {
    unsigned long i;
!   char *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);
    if (native_relocs == NULL)
      return -1;
  
--- 758,770 ----
                                  arelent *res, asymbol **syms)
  {
    unsigned long i;
!   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 =
!     (struct mach_o_reloc_info_external *) bfd_malloc (native_size);
    if (native_relocs == NULL)
      return -1;
  
***************
*** 769,777 ****
  
    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)
          goto err;
      }
    free (native_relocs);
--- 774,781 ----
  
    for (i = 0; i < count; i++)
      {
!       if (bfd_mach_o_canonicalize_one_reloc (abfd, &native_relocs[i],
!                                              &res[i], syms) < 0)
          goto err;
      }
    free (native_relocs);
***************
*** 901,907 ****
    for (i = 0; i < section->nreloc; i++)
      {
        arelent *rel = entries[i];
!       char buf[8];
        bfd_mach_o_reloc_info info, *pinfo = &info;
  
        /* Convert relocation to an intermediate representation.  */
--- 905,911 ----
    for (i = 0; i < section->nreloc; i++)
      {
        arelent *rel = entries[i];
!       struct mach_o_reloc_info_external raw;
        bfd_mach_o_reloc_info info, *pinfo = &info;
  
        /* Convert relocation to an intermediate representation.  */
***************
*** 918,940 ****
              | 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);
          }
        else
          {
            unsigned long v;
  
!           bfd_put_32 (abfd, pinfo->r_address, buf);
            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);
          }
  
!       if (bfd_bwrite ((void *) buf, BFD_MACH_O_RELENT_SIZE, abfd)
            != BFD_MACH_O_RELENT_SIZE)
          return FALSE;
      }
--- 922,945 ----
              | 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);
!           /* 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, 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, raw.r_symbolnum);
          }
  
!       if (bfd_bwrite (&raw, BFD_MACH_O_RELENT_SIZE, abfd)
            != BFD_MACH_O_RELENT_SIZE)
          return FALSE;
      }
***************
*** 944,964 ****
  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)
        != BFD_MACH_O_SECTION_SIZE)
      return -1;
  
--- 949,969 ----
  static int
  bfd_mach_o_write_section_32 (bfd *abfd, bfd_mach_o_section *section)
  {
!   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,989 ****
  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)
        != BFD_MACH_O_SECTION_64_SIZE)
      return -1;
  
--- 973,994 ----
  static int
  bfd_mach_o_write_section_64 (bfd *abfd, bfd_mach_o_section *section)
  {
!   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,999 ****
  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];
    bfd_mach_o_segment_command *seg = &command->command.segment;
    unsigned long i;
  
--- 998,1004 ----
  static int
  bfd_mach_o_write_segment_32 (bfd *abfd, bfd_mach_o_load_command *command)
  {
!   struct mach_o_segment_command_32_external raw;
    bfd_mach_o_segment_command *seg = &command->command.segment;
    unsigned long i;
  
***************
*** 1003,1021 ****
      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);
    
!   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))
      return -1;
  
    for (i = 0; i < seg->nsects; i++)
--- 1008,1025 ----
      if (!bfd_mach_o_write_relocs (abfd, &seg->sections[i]))
        return -1;
  
!   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 + 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,1034 ****
  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];
    bfd_mach_o_segment_command *seg = &command->command.segment;
    unsigned long i;
  
--- 1032,1038 ----
  static int
  bfd_mach_o_write_segment_64 (bfd *abfd, bfd_mach_o_load_command *command)
  {
!   struct mach_o_segment_command_64_external raw;
    bfd_mach_o_segment_command *seg = &command->command.segment;
    unsigned long i;
  
***************
*** 1038,1056 ****
      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))
      return -1;
  
    for (i = 0; i < seg->nsects; i++)
--- 1042,1059 ----
      if (!bfd_mach_o_write_relocs (abfd, &seg->sections[i]))
        return -1;
  
!   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,1071 ****
  {
    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;
--- 1068,1073 ----
***************
*** 1102,1118 ****
            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);
        else
!         bfd_h_put_32 (abfd, s->symbol.section->vma + s->symbol.value, buf + 8);
  
!       if (bfd_bwrite ((void *) buf, symlen, abfd) != symlen)
!         goto err;
      }
    sym->strsize = _bfd_stringtab_size (strtab);
    sym->stroff = mdata->filelen;
--- 1104,1138 ----
            if (str_index == (bfd_size_type) -1)
              goto err;
          }
! 
        if (wide)
!         {
!           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
!         {
!           struct mach_o_nlist_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_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,1136 ****
    _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);
  
!   if (bfd_seek (abfd, command->offset + 8, SEEK_SET) != 0
!       || bfd_bwrite ((void *) buf, 16, abfd) != 16)
!     return FALSE;
  
    return TRUE;
  
--- 1143,1160 ----
    _bfd_stringtab_free (strtab);
  
    /* The command.  */
!   {
!     struct mach_o_symtab_command_external raw;
  
!     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,1231 ****
  
    for (i = 0; i < mdata->header.ncmds; i++)
      {
!       unsigned char buf[8];
        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);
  
        if (bfd_seek (abfd, cur->offset, SEEK_SET) != 0
!           || bfd_bwrite ((void *) buf, 8, abfd) != 8)
  	return FALSE;
  
        switch (cur->type)
--- 1239,1255 ----
  
    for (i = 0; i < mdata->header.ncmds; i++)
      {
!       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, raw.cmd);
!       bfd_h_put_32 (abfd, cur->len, raw.cmdsize);
  
        if (bfd_seek (abfd, cur->offset, SEEK_SET) != 0
!           || bfd_bwrite (&raw, BFD_MACH_O_LC_SIZE, abfd) != 8)
  	return FALSE;
  
        switch (cur->type)
***************
*** 1436,1472 ****
  static bfd_boolean
  bfd_mach_o_read_header (bfd *abfd, bfd_mach_o_header *header)
  {
!   unsigned char buf[32];
    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)
      return FALSE;
  
!   if (bfd_getb32 (buf) == 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)
      {
        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)
      {
        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)
      {
        header->byteorder = BFD_ENDIAN_LITTLE;
        header->magic = BFD_MACH_O_MH_MAGIC_64;
--- 1460,1496 ----
  static bfd_boolean
  bfd_mach_o_read_header (bfd *abfd, bfd_mach_o_header *header)
  {
!   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 (raw.magic, sizeof (raw.magic), abfd) != 4)
      return FALSE;
  
!   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 (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 (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 (raw.magic) == BFD_MACH_O_MH_MAGIC_64)
      {
        header->byteorder = BFD_ENDIAN_LITTLE;
        header->magic = BFD_MACH_O_MH_MAGIC_64;
***************
*** 1484,1501 ****
      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)
      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);
  
    if (mach_o_wide_p (header))
!     header->reserved = (*get32) (buf + 28);
  
    return TRUE;
  }
--- 1508,1525 ----
      BFD_MACH_O_HEADER_64_SIZE : BFD_MACH_O_HEADER_SIZE;
  
    if (bfd_seek (abfd, 0, SEEK_SET) != 0
!       || bfd_bread (&raw, size, abfd) != size)
      return FALSE;
  
!   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) (raw.reserved);
  
    return TRUE;
  }
***************
*** 1566,1591 ****
                              unsigned int offset,
                              unsigned long prot)
  {
!   unsigned char buf[BFD_MACH_O_SECTION_SIZE];
  
    if (bfd_seek (abfd, offset, SEEK_SET) != 0
!       || (bfd_bread ((void *) buf, BFD_MACH_O_SECTION_SIZE, abfd)
            != BFD_MACH_O_SECTION_SIZE))
      return -1;
  
!   memcpy (section->sectname, buf, 16);
    section->sectname[16] = '\0';
!   memcpy (section->segname, buf + 16, 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->reserved3 = 0;
    section->bfdsection = bfd_mach_o_make_bfd_section (abfd, section, prot);
  
--- 1590,1615 ----
                              unsigned int offset,
                              unsigned long prot)
  {
!   struct mach_o_section_32_external raw;
  
    if (bfd_seek (abfd, offset, SEEK_SET) != 0
!       || (bfd_bread (&raw, BFD_MACH_O_SECTION_SIZE, abfd)
            != BFD_MACH_O_SECTION_SIZE))
      return -1;
  
!   memcpy (section->sectname, raw.sectname, 16);
    section->sectname[16] = '\0';
!   memcpy (section->segname, raw.segname, 16);
    section->segname[16] = '\0';
!   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,1627 ****
                              unsigned int offset,
                              unsigned long prot)
  {
!   unsigned char buf[BFD_MACH_O_SECTION_64_SIZE];
  
    if (bfd_seek (abfd, offset, SEEK_SET) != 0
!       || (bfd_bread ((void *) buf, BFD_MACH_O_SECTION_64_SIZE, abfd)
            != BFD_MACH_O_SECTION_64_SIZE))
      return -1;
  
!   memcpy (section->sectname, buf, 16);
    section->sectname[16] = '\0';
!   memcpy (section->segname, buf + 16, 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->bfdsection = bfd_mach_o_make_bfd_section (abfd, section, prot);
  
    if (section->bfdsection == NULL)
--- 1625,1651 ----
                              unsigned int offset,
                              unsigned long prot)
  {
!   struct mach_o_section_64_external raw;
  
    if (bfd_seek (abfd, offset, SEEK_SET) != 0
!       || (bfd_bread (&raw, BFD_MACH_O_SECTION_64_SIZE, abfd)
            != BFD_MACH_O_SECTION_64_SIZE))
      return -1;
  
!   memcpy (section->sectname, raw.sectname, 16);
    section->sectname[16] = '\0';
!   memcpy (section->segname, raw.segname, 16);
    section->segname[16] = '\0';
!   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,1660 ****
    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];
    unsigned char type = -1;
    unsigned char section = -1;
    short desc = -1;
--- 1678,1684 ----
    unsigned int symwidth =
      wide ? BFD_MACH_O_NLIST_64_SIZE : BFD_MACH_O_NLIST_SIZE;
    unsigned int symoff = sym->symoff + (i * symwidth);
!   struct mach_o_nlist_64_external raw;
    unsigned char type = -1;
    unsigned char section = -1;
    short desc = -1;
***************
*** 1665,1692 ****
    BFD_ASSERT (sym->strtab != NULL);
  
    if (bfd_seek (abfd, symoff, SEEK_SET) != 0
!       || bfd_bread ((void *) buf, symwidth, abfd) != symwidth)
      {
!       (*_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);
    symtype = type & BFD_MACH_O_N_TYPE;
!   section = bfd_h_get_8 (abfd, buf + 5);
!   desc = bfd_h_get_16 (abfd, buf + 6);
    if (wide)
!     value = bfd_h_get_64 (abfd, buf + 8);
    else
!     value = bfd_h_get_32 (abfd, buf + 8);
  
    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);
        return -1;
      }
  
--- 1689,1718 ----
    BFD_ASSERT (sym->strtab != NULL);
  
    if (bfd_seek (abfd, symoff, SEEK_SET) != 0
!       || 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);
        return -1;
      }
  
!   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, raw.n_sect);
!   desc = bfd_h_get_16 (abfd, raw.n_desc);
    if (wide)
!     value = bfd_h_get_64 (abfd, raw.n_value);
    else
!     value = bfd_h_get_32 (abfd, raw.n_value);
  
    if (stroff >= 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,1900 ****
  {
    unsigned long isymoff = dysym->indirectsymoff + (i * 4);
    unsigned long sym_index;
!   unsigned char buf[4];
  
    BFD_ASSERT (i < dysym->nindirectsyms);
  
    if (bfd_seek (abfd, isymoff, SEEK_SET) != 0
!       || bfd_bread ((void *) buf, 4, abfd) != 4)
      {
!       (*_bfd_error_handler) (_("bfd_mach_o_read_dysymtab_symbol: unable to read %lu bytes at %lu"),
! 			       (unsigned long) 4, isymoff);
        return -1;
      }
!   sym_index = bfd_h_get_32 (abfd, buf);
  
    return bfd_mach_o_read_symtab_symbol (abfd, sym, s, sym_index);
  }
--- 1909,1927 ----
  {
    unsigned long isymoff = dysym->indirectsymoff + (i * 4);
    unsigned long sym_index;
!   unsigned char raw[4];
  
    BFD_ASSERT (i < dysym->nindirectsyms);
  
    if (bfd_seek (abfd, isymoff, SEEK_SET) != 0
!       || 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) sizeof (raw), isymoff);
        return -1;
      }
!   sym_index = bfd_h_get_32 (abfd, raw);
  
    return bfd_mach_o_read_symtab_symbol (abfd, sym, s, sym_index);
  }
***************
*** 1940,1956 ****
  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];
    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)
      return -1;
  
!   nameoff = bfd_h_get_32 (abfd, buf + 0);
  
    cmd->name_offset = command->offset + nameoff;
    cmd->name_len = command->len - nameoff;
--- 1967,1983 ----
  bfd_mach_o_read_dylinker (bfd *abfd, bfd_mach_o_load_command *command)
  {
    bfd_mach_o_dylinker_command *cmd = &command->command.dylinker;
!   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 + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
!       || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
      return -1;
  
!   nameoff = bfd_h_get_32 (abfd, raw.str);
  
    cmd->name_offset = command->offset + nameoff;
    cmd->name_len = command->len - nameoff;
***************
*** 1967,1973 ****
  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];
    unsigned int nameoff;
  
    switch (command->type)
--- 1994,2000 ----
  bfd_mach_o_read_dylib (bfd *abfd, bfd_mach_o_load_command *command)
  {
    bfd_mach_o_dylib_command *cmd = &command->command.dylib;
!   struct mach_o_dylib_command_external raw;
    unsigned int nameoff;
  
    switch (command->type)
***************
*** 1982,1995 ****
        return -1;
      }
  
!   if (bfd_seek (abfd, command->offset + 8, SEEK_SET) != 0
!       || bfd_bread ((void *) buf, 16, abfd) != 16)
      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);
  
    cmd->name_offset = command->offset + nameoff;
    cmd->name_len = command->len - nameoff;
--- 2009,2022 ----
        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;
  
!   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,2023 ****
  {
    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;
--- 2044,2049 ----
***************
*** 2030,2043 ****
    nflavours = 0;
    while (offset != command->len)
      {
        if (offset >= command->len)
  	return -1;
  
        if (bfd_seek (abfd, command->offset + offset, SEEK_SET) != 0
!           || bfd_bread ((void *) buf, 8, abfd) != 8)
  	return -1;
  
!       offset += 8 + bfd_h_get_32 (abfd, buf + 4) * 4;
        nflavours++;
      }
  
--- 2056,2071 ----
    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 (&raw, sizeof (raw), abfd) != sizeof (raw))
  	return -1;
  
!       offset += sizeof (raw) + bfd_h_get_32 (abfd, raw.count) * 4;
        nflavours++;
      }
  
***************
*** 2052,2057 ****
--- 2080,2087 ----
    nflavours = 0;
    while (offset != command->len)
      {
+       struct mach_o_thread_command_external raw;
+ 
        if (offset >= command->len)
  	return -1;
  
***************
*** 2059,2071 ****
  	return -1;
  
        if (bfd_seek (abfd, command->offset + offset, SEEK_SET) != 0
!           || bfd_bread ((void *) buf, 8, abfd) != 8)
  	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;
        nflavours++;
      }
  
--- 2089,2101 ----
  	return -1;
  
        if (bfd_seek (abfd, command->offset + offset, SEEK_SET) != 0
!           || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
  	return -1;
  
!       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,2156 ****
  {
    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;
  
!   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 (cmd->nmodtab != 0)
      {
--- 2155,2189 ----
  {
    bfd_mach_o_dysymtab_command *cmd = &command->command.dysymtab;
    bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
  
    BFD_ASSERT (command->type == BFD_MACH_O_LC_DYSYMTAB);
  
!   {
!     struct mach_o_dysymtab_command_external raw;
  
!     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,2175 ****
--- 2203,2209 ----
          {
            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,2228 ****
  
        for (i = 0; i < cmd->ntoc; i++)
          {
            bfd_mach_o_dylib_table_of_content *toc = &cmd->dylib_toc[i];
  
!           if (bfd_bread ((void *) buf, 8, abfd) != 8)
              return -1;
  
!           toc->symbol_index = bfd_h_get_32 (abfd, buf + 0);
!           toc->module_index = bfd_h_get_32 (abfd, buf + 4);
          }
      }
  
--- 2250,2263 ----
  
        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 (&raw, sizeof (raw), abfd) != sizeof (raw))
              return -1;
  
!           toc->symbol_index = bfd_h_get_32 (abfd, raw.symbol_index);
!           toc->module_index = bfd_h_get_32 (abfd, raw.module_index);
          }
      }
  
***************
*** 2240,2251 ****
  
        for (i = 0; i < cmd->nindirectsyms; i++)
          {
            unsigned int *is = &cmd->indirect_syms[i];
  
!           if (bfd_bread ((void *) buf, 4, abfd) != 4)
              return -1;
  
!           *is = bfd_h_get_32 (abfd, buf + 0);
          }
      }
  
--- 2275,2287 ----
  
        for (i = 0; i < cmd->nindirectsyms; i++)
          {
+           unsigned char raw[4];
            unsigned int *is = &cmd->indirect_syms[i];
  
!           if (bfd_bread (raw, sizeof (raw), abfd) != sizeof (raw))
              return -1;
  
!           *is = bfd_h_get_32 (abfd, raw);
          }
      }
  
***************
*** 2264,2277 ****
  
        for (i = 0; i < cmd->nextrefsyms; i++)
          {
            bfd_mach_o_dylib_reference *ref = &cmd->ext_refs[i];
  
!           if (bfd_bread ((void *) buf, 4, abfd) != 4)
              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);
            if (bfd_big_endian (abfd))
              {
                ref->isym = (v >> 8) & 0xffffff;
--- 2300,2314 ----
  
        for (i = 0; i < cmd->nextrefsyms; i++)
          {
+           unsigned char raw[4];
            bfd_mach_o_dylib_reference *ref = &cmd->ext_refs[i];
  
!           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, raw);
            if (bfd_big_endian (abfd))
              {
                ref->isym = (v >> 8) & 0xffffff;
***************
*** 2297,2314 ****
  {
    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];
  
    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)
      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->symbols = NULL;
    symtab->strtab = NULL;
  
--- 2334,2351 ----
  {
    bfd_mach_o_symtab_command *symtab = &command->command.symtab;
    bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
!   struct mach_o_symtab_command_external raw;
  
    BFD_ASSERT (command->type == BFD_MACH_O_LC_SYMTAB);
  
!   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, 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,2335 ****
  
    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)
      return -1;
  
    return 0;
--- 2365,2372 ----
  
    BFD_ASSERT (command->type == BFD_MACH_O_LC_UUID);
  
!   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,2352 ****
  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];
  
!   if (bfd_seek (abfd, command->offset + 8, SEEK_SET) != 0
!       || bfd_bread ((void *) buf, 8, abfd) != 8)
      return -1;
  
!   cmd->dataoff = bfd_get_32 (abfd, buf + 0);
!   cmd->datasize = bfd_get_32 (abfd, buf + 4);
    return 0;
  }
  
--- 2376,2389 ----
  bfd_mach_o_read_linkedit (bfd *abfd, bfd_mach_o_load_command *command)
  {
    bfd_mach_o_linkedit_command *cmd = &command->command.linkedit;
!   struct mach_o_linkedit_data_command_external raw;
  
!   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, raw.dataoff);
!   cmd->datasize = bfd_get_32 (abfd, raw.datasize);
    return 0;
  }
  
***************
*** 2354,2367 ****
  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];
    unsigned long off;
  
!   if (bfd_seek (abfd, command->offset + 8, SEEK_SET) != 0
!       || bfd_bread ((void *) buf, 4, abfd) != 4)
      return -1;
  
!   off = bfd_get_32 (abfd, buf + 0);
    cmd->stroff = command->offset + off;
    cmd->str_len = command->len - off;
    cmd->str = bfd_alloc (abfd, cmd->str_len);
--- 2391,2404 ----
  bfd_mach_o_read_str (bfd *abfd, bfd_mach_o_load_command *command)
  {
    bfd_mach_o_str_command *cmd = &command->command.str;
!   struct mach_o_str_command_external raw;
    unsigned long off;
  
!   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, raw.str);
    cmd->stroff = command->offset + off;
    cmd->str_len = command->len - off;
    cmd->str = bfd_alloc (abfd, cmd->str_len);
***************
*** 2377,2398 ****
  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];
  
!   if (bfd_seek (abfd, command->offset + 8, SEEK_SET) != 0
!       || bfd_bread ((void *) buf, sizeof (buf), abfd) != sizeof (buf))
      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);
    return 0;
  }
  
--- 2414,2435 ----
  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;
!   struct mach_o_dyld_info_command_external raw;
  
!   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, 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,2449 ****
                           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)
      {
        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;
  
!       memcpy (seg->segname, buf, 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);
      }
    else
      {
        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;
  
!       memcpy (seg->segname, buf, 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);
      }
  
    if (seg->nsects != 0)
--- 2438,2489 ----
                           bfd_mach_o_load_command *command,
                           unsigned int wide)
  {
    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 + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
!           || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
!         return -1;
  
!       memcpy (seg->segname, raw.segname, 16);
        seg->segname[16] = '\0';
  
!       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 + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
!           || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
!         return -1;
  
!       memcpy (seg->segname, raw.segname, 16);
        seg->segname[16] = '\0';
  
!       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,2503 ****
  static int
  bfd_mach_o_read_command (bfd *abfd, bfd_mach_o_load_command *command)
  {
!   unsigned char buf[8];
  
    /* Read command type and length.  */
    if (bfd_seek (abfd, command->offset, SEEK_SET) != 0
!       || bfd_bread ((void *) buf, 8, abfd) != 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
! 			    ? TRUE : FALSE);
!   command->len = bfd_h_get_32 (abfd, buf + 4);
  
    switch (command->type)
      {
--- 2527,2544 ----
  static int
  bfd_mach_o_read_command (bfd *abfd, bfd_mach_o_load_command *command)
  {
!   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 (&raw, BFD_MACH_O_LC_SIZE, abfd) != BFD_MACH_O_LC_SIZE)
      return -1;
  
!   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,2969 ****
  bfd_mach_o_archive_p (bfd *abfd)
  {
    mach_o_fat_data_struct *adata = NULL;
!   unsigned char buf[20];
    unsigned long i;
  
    if (bfd_seek (abfd, 0, SEEK_SET) != 0
!       || bfd_bread ((void *) buf, 8, abfd) != 8)
      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);
    if (adata->magic != 0xcafebabe)
      goto error;
    /* Avoid matching Java bytecode files, which have the same magic number.
--- 2992,3010 ----
  bfd_mach_o_archive_p (bfd *abfd)
  {
    mach_o_fat_data_struct *adata = NULL;
!   struct mach_o_fat_header_external hdr;
    unsigned long i;
  
    if (bfd_seek (abfd, 0, SEEK_SET) != 0
!       || 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 (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,2992 ****
  
    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)
  	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);
      }
  
    abfd->tdata.mach_o_fat_data = adata;
--- 3020,3033 ----
  
    for (i = 0; i < adata->nfat_arch; i++)
      {
!       struct mach_o_fat_arch_external arch;
!       if (bfd_bread (&arch, sizeof (arch), abfd) != sizeof (arch))
  	goto error;
!       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;
Index: bfd/mach-o.h
===================================================================
RCS file: /cvs/src/src/bfd/mach-o.h,v
retrieving revision 1.26
diff -c -r1.26 mach-o.h
*** bfd/mach-o.h	8 Aug 2011 07:39:44 -0000	1.26
--- bfd/mach-o.h	8 Aug 2011 08:54:41 -0000
***************
*** 41,49 ****
  }
  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.  */
--- 41,46 ----
***************
*** 64,71 ****
    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
  {
--- 61,66 ----
***************
*** 81,135 ****
    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
  {
--- 76,87 ----
***************
*** 154,161 ****
    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
  {
--- 106,111 ----
***************
*** 262,269 ****
    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
  {
--- 212,217 ----
***************
*** 274,280 ****
    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
  {
--- 222,227 ----
Index: include/mach-o/external.h
===================================================================
RCS file: include/mach-o/external.h
diff -N include/mach-o/external.h
*** /dev/null	1 Jan 1970 00:00:00 -0000
--- include/mach-o/external.h	8 Aug 2011 08:54:42 -0000
***************
*** 0 ****
--- 1,267 ----
+ /* Mach-O support for BFD.
+    Copyright 2011
+    Free Software Foundation, Inc.
+ 
+    This file is part of BFD, the Binary File Descriptor library.
+ 
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 3 of the License, or
+    (at your option) any later version.
+ 
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+ 
+    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., 51 Franklin Street - Fifth Floor, Boston,
+    MA 02110-1301, USA.  */
+ 
+ #ifndef _MACH_O_EXTERNAL_H
+ #define _MACH_O_EXTERNAL_H
+ 
+ struct mach_o_header_external
+ {
+   unsigned char magic[4];	/* Magic number.  */
+   unsigned char cputype[4];	/* CPU that this object is for.  */
+   unsigned char cpusubtype[4];	/* CPU subtype.  */
+   unsigned char filetype[4];	/* Type of file.  */
+   unsigned char ncmds[4];	/* Number of load commands.  */
+   unsigned char sizeofcmds[4];	/* Total size of load commands.  */
+   unsigned char flags[4];	/* Flags.  */
+   unsigned char reserved[4];	/* Reserved (on 64-bit version only).  */
+ };
+ 
+ #define BFD_MACH_O_HEADER_SIZE 28
+ #define BFD_MACH_O_HEADER_64_SIZE 32
+ 
+ /* 32-bit section header.  */
+ 
+ struct mach_o_section_32_external
+ {
+   unsigned char sectname[16];   /* Section name.  */
+   unsigned char segname[16];    /* Segment that the section belongs to.  */
+   unsigned char addr[4];        /* Address of this section in memory.  */
+   unsigned char size[4];        /* Size in bytes of this section.  */
+   unsigned char offset[4];      /* File offset of this section.  */
+   unsigned char align[4];       /* log2 of this section's alignment.  */
+   unsigned char reloff[4];      /* File offset of this section's relocs.  */
+   unsigned char nreloc[4];      /* Number of relocs for this section.  */
+   unsigned char flags[4];       /* Section flags/attributes.  */
+   unsigned char reserved1[4];
+   unsigned char reserved2[4];
+ };
+ #define BFD_MACH_O_SECTION_SIZE 68
+ 
+ /* 64-bit section header.  */
+ 
+ struct mach_o_section_64_external
+ {
+   unsigned char sectname[16];   /* Section name.  */
+   unsigned char segname[16];    /* Segment that the section belongs to.  */
+   unsigned char addr[8];        /* Address of this section in memory.  */
+   unsigned char size[8];        /* Size in bytes of this section.  */
+   unsigned char offset[4];      /* File offset of this section.  */
+   unsigned char align[4];       /* log2 of this section's alignment.  */
+   unsigned char reloff[4];      /* File offset of this section's relocs.  */
+   unsigned char nreloc[4];      /* Number of relocs for this section.  */
+   unsigned char flags[4];       /* Section flags/attributes.  */
+   unsigned char reserved1[4];
+   unsigned char reserved2[4];
+   unsigned char reserved3[4];
+ };
+ #define BFD_MACH_O_SECTION_64_SIZE 80
+ 
+ struct mach_o_load_command_external
+ {
+   unsigned char cmd[4];         /* The type of load command.  */
+   unsigned char cmdsize[4];     /* Size in bytes of entire command.  */
+ };
+ #define BFD_MACH_O_LC_SIZE 8
+ 
+ struct mach_o_segment_command_32_external
+ {
+   unsigned char segname[16];    /* Name of this segment.  */
+   unsigned char vmaddr[4];      /* Virtual memory address of this segment.  */
+   unsigned char vmsize[4];      /* Size there, in bytes.  */
+   unsigned char fileoff[4];     /* Offset in bytes of the data to be mapped.  */
+   unsigned char filesize[4];    /* Size in bytes on disk.  */
+   unsigned char maxprot[4];     /* Maximum permitted vm protection.  */
+   unsigned char initprot[4];    /* Initial vm protection.  */
+   unsigned char nsects[4];      /* Number of sections in this segment.  */
+   unsigned char flags[4];       /* Flags that affect the loading.  */
+ };
+ #define BFD_MACH_O_LC_SEGMENT_SIZE 56 /* Include the header.  */
+ 
+ struct mach_o_segment_command_64_external
+ {
+   unsigned char segname[16];    /* Name of this segment.  */
+   unsigned char vmaddr[8];      /* Virtual memory address of this segment.  */
+   unsigned char vmsize[8];      /* Size there, in bytes.  */
+   unsigned char fileoff[8];     /* Offset in bytes of the data to be mapped.  */
+   unsigned char filesize[8];    /* Size in bytes on disk.  */
+   unsigned char maxprot[4];     /* Maximum permitted vm protection.  */
+   unsigned char initprot[4];    /* Initial vm protection.  */
+   unsigned char nsects[4];      /* Number of sections in this segment.  */
+   unsigned char flags[4];       /* Flags that affect the loading.  */
+ };
+ #define BFD_MACH_O_LC_SEGMENT_64_SIZE 72 /* Include the header.  */
+ 
+ struct mach_o_reloc_info_external
+ {
+   unsigned char r_address[4];
+   unsigned char r_symbolnum[4];
+ };
+ #define BFD_MACH_O_RELENT_SIZE 8
+ 
+ struct mach_o_symtab_command_external
+ {
+   unsigned char symoff[4];
+   unsigned char nsyms[4];
+   unsigned char stroff[4];
+   unsigned char strsize[4];
+ };
+ 
+ struct mach_o_nlist_external
+ {
+   unsigned char n_strx[4];
+   unsigned char n_type[1];
+   unsigned char n_sect[1];
+   unsigned char n_desc[2];
+   unsigned char n_value[4];
+ };
+ #define BFD_MACH_O_NLIST_SIZE 12
+ 
+ struct mach_o_nlist_64_external
+ {
+   unsigned char n_strx[4];
+   unsigned char n_type[1];
+   unsigned char n_sect[1];
+   unsigned char n_desc[2];
+   unsigned char n_value[8];
+ };
+ #define BFD_MACH_O_NLIST_64_SIZE 16
+ 
+ struct mach_o_thread_command_external
+ {
+   unsigned char flavour[4];
+   unsigned char count[4];
+ };
+ 
+ /* For commands that just have a string or a path.  */
+ struct mach_o_str_command_external
+ {
+   unsigned char str[4];
+ };
+ 
+ struct mach_o_dylib_command_external
+ {
+   unsigned char name[4];
+   unsigned char timestamp[4];
+   unsigned char current_version[4];
+   unsigned char compatibility_version[4];
+ };
+ 
+ struct mach_o_dysymtab_command_external
+ {
+   unsigned char ilocalsym[4];	/* Index of.  */
+   unsigned char nlocalsym[4];	/* Number of.  */
+   unsigned char iextdefsym[4];
+   unsigned char nextdefsym[4];
+   unsigned char iundefsym[4];
+   unsigned char nundefsym[4];
+   unsigned char tocoff[4];
+   unsigned char ntoc[4];
+   unsigned char modtaboff[4];
+   unsigned char nmodtab[4];
+   unsigned char extrefsymoff[4];
+   unsigned char nextrefsyms[4];
+   unsigned char indirectsymoff[4];
+   unsigned char nindirectsyms[4];
+   unsigned char extreloff[4];
+   unsigned char nextrel[4];
+   unsigned char locreloff[4];
+   unsigned char nlocrel[4];
+ };
+ 
+ struct mach_o_dylib_module_external
+ {
+   unsigned char module_name[4];
+   unsigned char iextdefsym[4];
+   unsigned char nextdefsym[4];
+   unsigned char irefsym[4];
+   unsigned char nrefsym[4];
+   unsigned char ilocalsym[4];
+   unsigned char nlocalsym[4];
+   unsigned char iextrel[4];
+   unsigned char nextrel[4];
+   unsigned char iinit_iterm[4];
+   unsigned char ninit_nterm[4];
+   unsigned char objc_module_info_addr[4];
+   unsigned char objc_module_info_size[4];
+ };
+ #define BFD_MACH_O_DYLIB_MODULE_SIZE 52
+ 
+ struct mach_o_dylib_module_64_external
+ {
+   unsigned char module_name[4];
+   unsigned char iextdefsym[4];
+   unsigned char nextdefsym[4];
+   unsigned char irefsym[4];
+   unsigned char nrefsym[4];
+   unsigned char ilocalsym[4];
+   unsigned char nlocalsym[4];
+   unsigned char iextrel[4];
+   unsigned char nextrel[4];
+   unsigned char iinit_iterm[4];
+   unsigned char ninit_nterm[4];
+   unsigned char objc_module_info_size[4];
+   unsigned char objc_module_info_addr[8];
+ };
+ #define BFD_MACH_O_DYLIB_MODULE_64_SIZE 56
+ 
+ struct mach_o_dylib_table_of_contents_external
+ {
+   unsigned char symbol_index[4];
+   unsigned char module_index[4];
+ };
+ #define BFD_MACH_O_TABLE_OF_CONTENT_SIZE 8
+ 
+ struct mach_o_linkedit_data_command_external
+ {
+   unsigned char dataoff[4];
+   unsigned char datasize[4];
+ };
+ 
+ struct mach_o_dyld_info_command_external
+ {
+   unsigned char rebase_off[4];
+   unsigned char rebase_size[4];
+   unsigned char bind_off[4];
+   unsigned char bind_size[4];
+   unsigned char weak_bind_off[4];
+   unsigned char weak_bind_size[4];
+   unsigned char lazy_bind_off[4];
+   unsigned char lazy_bind_size[4];
+   unsigned char export_off[4];
+   unsigned char export_size[4];
+ };
+ 
+ struct mach_o_fat_header_external
+ {
+   unsigned char magic[4];
+   unsigned char nfat_arch[4];	/* Number of components.  */
+ };
+ 
+ struct mach_o_fat_arch_external
+ {
+   unsigned char cputype[4];
+   unsigned char cpusubtype[4];
+   unsigned char offset[4];	/* File offset of the member.  */
+   unsigned char size[4];	/* Size of the member.  */
+   unsigned char align[4];	/* Power of 2.  */
+ };
+ 
+ #endif /* _MACH_O_EXTERNAL_H */
Index: include/mach-o/loader.h
===================================================================
RCS file: /cvs/src/src/include/mach-o/loader.h,v
retrieving revision 1.1
diff -c -r1.1 loader.h
*** include/mach-o/loader.h	6 Jul 2011 07:22:20 -0000	1.1
--- include/mach-o/loader.h	8 Aug 2011 08:54:42 -0000
***************
*** 22,54 ****
  #ifndef _MACH_O_LOADER_H
  #define _MACH_O_LOADER_H
  
! /* Symbol n_type values.  */
! #define BFD_MACH_O_N_STAB  0xe0	/* If any of these bits set, a symbolic debugging entry.  */
! #define BFD_MACH_O_N_PEXT  0x10	/* Private external symbol bit.  */
! #define BFD_MACH_O_N_TYPE  0x0e	/* Mask for the type bits.  */
! #define BFD_MACH_O_N_EXT   0x01	/* External symbol bit, set for external symbols.  */
! #define BFD_MACH_O_N_UNDF  0x00	/* Undefined, n_sect == NO_SECT.  */
! #define BFD_MACH_O_N_ABS   0x02	/* Absolute, n_sect == NO_SECT.  */
! #define BFD_MACH_O_N_INDR  0x0a	/* Indirect.  */
! #define BFD_MACH_O_N_PBUD  0x0c /* Prebound undefined (defined in a dylib).  */
! #define BFD_MACH_O_N_SECT  0x0e	/* Defined in section number n_sect.  */
! 
! #define BFD_MACH_O_NO_SECT 0	/* Symbol not in any section of the image.  */
! 
! /* Symbol n_desc reference flags.  */
! #define BFD_MACH_O_REFERENCE_MASK 				0x0f
! #define BFD_MACH_O_REFERENCE_FLAG_UNDEFINED_NON_LAZY		0x00
! #define BFD_MACH_O_REFERENCE_FLAG_UNDEFINED_LAZY		0x01
! #define BFD_MACH_O_REFERENCE_FLAG_DEFINED			0x02
! #define BFD_MACH_O_REFERENCE_FLAG_PRIVATE_DEFINED		0x03
! #define BFD_MACH_O_REFERENCE_FLAG_PRIVATE_UNDEFINED_NON_LAZY	0x04
! #define BFD_MACH_O_REFERENCE_FLAG_PRIVATE_UNDEFINED_LAZY	0x05
! 
! #define BFD_MACH_O_REFERENCED_DYNAMICALLY			0x10
! #define BFD_MACH_O_N_DESC_DISCARDED				0x20
! #define BFD_MACH_O_N_NO_DEAD_STRIP				0x20
! #define BFD_MACH_O_N_WEAK_REF					0x40
! #define BFD_MACH_O_N_WEAK_DEF					0x80
  
  typedef enum bfd_mach_o_mach_header_magic
  {
--- 22,28 ----
  #ifndef _MACH_O_LOADER_H
  #define _MACH_O_LOADER_H
  
! /* Constants for header. */
  
  typedef enum bfd_mach_o_mach_header_magic
  {
***************
*** 59,95 ****
  }
  bfd_mach_o_mach_header_magic;
  
! typedef enum bfd_mach_o_ppc_thread_flavour
  {
!   BFD_MACH_O_PPC_THREAD_STATE      = 1,
!   BFD_MACH_O_PPC_FLOAT_STATE       = 2,
!   BFD_MACH_O_PPC_EXCEPTION_STATE   = 3,
!   BFD_MACH_O_PPC_VECTOR_STATE      = 4,
!   BFD_MACH_O_PPC_THREAD_STATE64    = 5,
!   BFD_MACH_O_PPC_EXCEPTION_STATE64 = 6,
!   BFD_MACH_O_PPC_THREAD_STATE_NONE = 7
  }
! bfd_mach_o_ppc_thread_flavour;
  
! /* Defined in <mach/i386/thread_status.h> */
! typedef enum bfd_mach_o_i386_thread_flavour
  {
!   BFD_MACH_O_x86_THREAD_STATE32    = 1,
!   BFD_MACH_O_x86_FLOAT_STATE32     = 2,
!   BFD_MACH_O_x86_EXCEPTION_STATE32 = 3,
!   BFD_MACH_O_x86_THREAD_STATE64    = 4,
!   BFD_MACH_O_x86_FLOAT_STATE64     = 5,
!   BFD_MACH_O_x86_EXCEPTION_STATE64 = 6,
!   BFD_MACH_O_x86_THREAD_STATE      = 7,
!   BFD_MACH_O_x86_FLOAT_STATE       = 8,
!   BFD_MACH_O_x86_EXCEPTION_STATE   = 9,
!   BFD_MACH_O_x86_DEBUG_STATE32     = 10,
!   BFD_MACH_O_x86_DEBUG_STATE64     = 11,
!   BFD_MACH_O_x86_DEBUG_STATE       = 12,
!   BFD_MACH_O_x86_THREAD_STATE_NONE = 13
  }
! bfd_mach_o_i386_thread_flavour;
  
  #define BFD_MACH_O_LC_REQ_DYLD 0x80000000
  
  typedef enum bfd_mach_o_load_command_type
--- 33,112 ----
  }
  bfd_mach_o_mach_header_magic;
  
! #define BFD_MACH_O_CPU_IS64BIT 0x1000000
! 
! typedef enum bfd_mach_o_cpu_type
  {
!   BFD_MACH_O_CPU_TYPE_VAX = 1,
!   BFD_MACH_O_CPU_TYPE_MC680x0 = 6,
!   BFD_MACH_O_CPU_TYPE_I386 = 7,
!   BFD_MACH_O_CPU_TYPE_MIPS = 8,
!   BFD_MACH_O_CPU_TYPE_MC98000 = 10,
!   BFD_MACH_O_CPU_TYPE_HPPA = 11,
!   BFD_MACH_O_CPU_TYPE_ARM = 12,
!   BFD_MACH_O_CPU_TYPE_MC88000 = 13,
!   BFD_MACH_O_CPU_TYPE_SPARC = 14,
!   BFD_MACH_O_CPU_TYPE_I860 = 15,
!   BFD_MACH_O_CPU_TYPE_ALPHA = 16,
!   BFD_MACH_O_CPU_TYPE_POWERPC = 18,
!   BFD_MACH_O_CPU_TYPE_POWERPC_64 = (BFD_MACH_O_CPU_TYPE_POWERPC | BFD_MACH_O_CPU_IS64BIT),
!   BFD_MACH_O_CPU_TYPE_X86_64 = (BFD_MACH_O_CPU_TYPE_I386 | BFD_MACH_O_CPU_IS64BIT)
  }
! bfd_mach_o_cpu_type;
  
! typedef enum bfd_mach_o_cpu_subtype
  {
!   BFD_MACH_O_CPU_SUBTYPE_X86_ALL = 3
  }
! bfd_mach_o_cpu_subtype;
! 
! typedef enum bfd_mach_o_filetype
! {
!   BFD_MACH_O_MH_OBJECT      = 0x01,
!   BFD_MACH_O_MH_EXECUTE     = 0x02,
!   BFD_MACH_O_MH_FVMLIB      = 0x03,
!   BFD_MACH_O_MH_CORE        = 0x04,
!   BFD_MACH_O_MH_PRELOAD     = 0x05,
!   BFD_MACH_O_MH_DYLIB       = 0x06,
!   BFD_MACH_O_MH_DYLINKER    = 0x07,
!   BFD_MACH_O_MH_BUNDLE      = 0x08,
!   BFD_MACH_O_MH_DYLIB_STUB  = 0x09,
!   BFD_MACH_O_MH_DSYM        = 0x0a,
!   BFD_MACH_O_MH_KEXT_BUNDLE = 0x0b
! }
! bfd_mach_o_filetype;
  
+ typedef enum bfd_mach_o_header_flags
+ {
+   BFD_MACH_O_MH_NOUNDEFS		= 0x0000001,
+   BFD_MACH_O_MH_INCRLINK		= 0x0000002,
+   BFD_MACH_O_MH_DYLDLINK		= 0x0000004,
+   BFD_MACH_O_MH_BINDATLOAD		= 0x0000008,
+   BFD_MACH_O_MH_PREBOUND		= 0x0000010,
+   BFD_MACH_O_MH_SPLIT_SEGS		= 0x0000020,
+   BFD_MACH_O_MH_LAZY_INIT		= 0x0000040,
+   BFD_MACH_O_MH_TWOLEVEL		= 0x0000080,
+   BFD_MACH_O_MH_FORCE_FLAT		= 0x0000100,
+   BFD_MACH_O_MH_NOMULTIDEFS		= 0x0000200,
+   BFD_MACH_O_MH_NOFIXPREBINDING		= 0x0000400,
+   BFD_MACH_O_MH_PREBINDABLE		= 0x0000800,
+   BFD_MACH_O_MH_ALLMODSBOUND		= 0x0001000,
+   BFD_MACH_O_MH_SUBSECTIONS_VIA_SYMBOLS = 0x0002000,
+   BFD_MACH_O_MH_CANONICAL		= 0x0004000,
+   BFD_MACH_O_MH_WEAK_DEFINES		= 0x0008000,
+   BFD_MACH_O_MH_BINDS_TO_WEAK		= 0x0010000,
+   BFD_MACH_O_MH_ALLOW_STACK_EXECUTION	= 0x0020000,
+   BFD_MACH_O_MH_ROOT_SAFE		= 0x0040000,
+   BFD_MACH_O_MH_SETUID_SAFE		= 0x0080000,
+   BFD_MACH_O_MH_NO_REEXPORTED_DYLIBS	= 0x0100000,
+   BFD_MACH_O_MH_PIE			= 0x0200000,
+   BFD_MACH_O_MH_DEAD_STRIPPABLE_DYLIB   = 0x0400000,
+   BFD_MACH_O_MH_HAS_TLV_DESCRIPTORS     = 0x0800000,
+   BFD_MACH_O_MH_NO_HEAP_EXECUTION       = 0x1000000
+ }
+ bfd_mach_o_header_flags;
+ 

+ /* Load command constants.  */
  #define BFD_MACH_O_LC_REQ_DYLD 0x80000000
  
  typedef enum bfd_mach_o_load_command_type
***************
*** 134,210 ****
    BFD_MACH_O_LC_DYLD_INFO = 0x22	/* Compressed dyld information.  */
  }
  bfd_mach_o_load_command_type;
! 
! #define BFD_MACH_O_CPU_IS64BIT 0x1000000
! 
! typedef enum bfd_mach_o_cpu_type
! {
!   BFD_MACH_O_CPU_TYPE_VAX = 1,
!   BFD_MACH_O_CPU_TYPE_MC680x0 = 6,
!   BFD_MACH_O_CPU_TYPE_I386 = 7,
!   BFD_MACH_O_CPU_TYPE_MIPS = 8,
!   BFD_MACH_O_CPU_TYPE_MC98000 = 10,
!   BFD_MACH_O_CPU_TYPE_HPPA = 11,
!   BFD_MACH_O_CPU_TYPE_ARM = 12,
!   BFD_MACH_O_CPU_TYPE_MC88000 = 13,
!   BFD_MACH_O_CPU_TYPE_SPARC = 14,
!   BFD_MACH_O_CPU_TYPE_I860 = 15,
!   BFD_MACH_O_CPU_TYPE_ALPHA = 16,
!   BFD_MACH_O_CPU_TYPE_POWERPC = 18,
!   BFD_MACH_O_CPU_TYPE_POWERPC_64 = (BFD_MACH_O_CPU_TYPE_POWERPC | BFD_MACH_O_CPU_IS64BIT),
!   BFD_MACH_O_CPU_TYPE_X86_64 = (BFD_MACH_O_CPU_TYPE_I386 | BFD_MACH_O_CPU_IS64BIT)
! }
! bfd_mach_o_cpu_type;
! 
! typedef enum bfd_mach_o_cpu_subtype
! {
!   BFD_MACH_O_CPU_SUBTYPE_X86_ALL = 3
! }
! bfd_mach_o_cpu_subtype;
! 
! typedef enum bfd_mach_o_filetype
! {
!   BFD_MACH_O_MH_OBJECT      = 0x01,
!   BFD_MACH_O_MH_EXECUTE     = 0x02,
!   BFD_MACH_O_MH_FVMLIB      = 0x03,
!   BFD_MACH_O_MH_CORE        = 0x04,
!   BFD_MACH_O_MH_PRELOAD     = 0x05,
!   BFD_MACH_O_MH_DYLIB       = 0x06,
!   BFD_MACH_O_MH_DYLINKER    = 0x07,
!   BFD_MACH_O_MH_BUNDLE      = 0x08,
!   BFD_MACH_O_MH_DYLIB_STUB  = 0x09,
!   BFD_MACH_O_MH_DSYM        = 0x0a,
!   BFD_MACH_O_MH_KEXT_BUNDLE = 0x0b
! }
! bfd_mach_o_filetype;
! 
! typedef enum bfd_mach_o_header_flags
! {
!   BFD_MACH_O_MH_NOUNDEFS		= 0x000001,
!   BFD_MACH_O_MH_INCRLINK		= 0x000002,
!   BFD_MACH_O_MH_DYLDLINK		= 0x000004,
!   BFD_MACH_O_MH_BINDATLOAD		= 0x000008,
!   BFD_MACH_O_MH_PREBOUND		= 0x000010,
!   BFD_MACH_O_MH_SPLIT_SEGS		= 0x000020,
!   BFD_MACH_O_MH_LAZY_INIT		= 0x000040,
!   BFD_MACH_O_MH_TWOLEVEL		= 0x000080,
!   BFD_MACH_O_MH_FORCE_FLAT		= 0x000100,
!   BFD_MACH_O_MH_NOMULTIDEFS		= 0x000200,
!   BFD_MACH_O_MH_NOFIXPREBINDING		= 0x000400,
!   BFD_MACH_O_MH_PREBINDABLE		= 0x000800,
!   BFD_MACH_O_MH_ALLMODSBOUND		= 0x001000,
!   BFD_MACH_O_MH_SUBSECTIONS_VIA_SYMBOLS = 0x002000,
!   BFD_MACH_O_MH_CANONICAL		= 0x004000,
!   BFD_MACH_O_MH_WEAK_DEFINES		= 0x008000,
!   BFD_MACH_O_MH_BINDS_TO_WEAK		= 0x010000,
!   BFD_MACH_O_MH_ALLOW_STACK_EXECUTION	= 0x020000,
!   BFD_MACH_O_MH_ROOT_SAFE		= 0x040000,
!   BFD_MACH_O_MH_SETUID_SAFE		= 0x080000,
!   BFD_MACH_O_MH_NO_REEXPORTED_DYLIBS	= 0x100000,
!   BFD_MACH_O_MH_PIE			= 0x200000
! }
! bfd_mach_o_header_flags;
! 
  /* Constants for the type of a section.  */
  
  typedef enum bfd_mach_o_section_type
--- 151,158 ----
    BFD_MACH_O_LC_DYLD_INFO = 0x22	/* Compressed dyld information.  */
  }
  bfd_mach_o_load_command_type;
! 

! /* Section constants.  */
  /* Constants for the type of a section.  */
  
  typedef enum bfd_mach_o_section_type
***************
*** 325,329 ****
--- 273,340 ----
    BFD_MACH_O_S_ATTR_PURE_INSTRUCTIONS = 0x80000000
  }
  bfd_mach_o_section_attribute;
+ 

+ /* Symbol constants.  */
+ 
+ /* Symbol n_type values.  */
+ #define BFD_MACH_O_N_STAB  0xe0	/* If any of these bits set, a symbolic debugging entry.  */
+ #define BFD_MACH_O_N_PEXT  0x10	/* Private external symbol bit.  */
+ #define BFD_MACH_O_N_TYPE  0x0e	/* Mask for the type bits.  */
+ #define BFD_MACH_O_N_EXT   0x01	/* External symbol bit, set for external symbols.  */
+ #define BFD_MACH_O_N_UNDF  0x00	/* Undefined, n_sect == NO_SECT.  */
+ #define BFD_MACH_O_N_ABS   0x02	/* Absolute, n_sect == NO_SECT.  */
+ #define BFD_MACH_O_N_INDR  0x0a	/* Indirect.  */
+ #define BFD_MACH_O_N_PBUD  0x0c /* Prebound undefined (defined in a dylib).  */
+ #define BFD_MACH_O_N_SECT  0x0e	/* Defined in section number n_sect.  */
+ 
+ #define BFD_MACH_O_NO_SECT 0	/* Symbol not in any section of the image.  */
+ 
+ /* Symbol n_desc reference flags.  */
+ #define BFD_MACH_O_REFERENCE_MASK 				0x0f
+ #define BFD_MACH_O_REFERENCE_FLAG_UNDEFINED_NON_LAZY		0x00
+ #define BFD_MACH_O_REFERENCE_FLAG_UNDEFINED_LAZY		0x01
+ #define BFD_MACH_O_REFERENCE_FLAG_DEFINED			0x02
+ #define BFD_MACH_O_REFERENCE_FLAG_PRIVATE_DEFINED		0x03
+ #define BFD_MACH_O_REFERENCE_FLAG_PRIVATE_UNDEFINED_NON_LAZY	0x04
+ #define BFD_MACH_O_REFERENCE_FLAG_PRIVATE_UNDEFINED_LAZY	0x05
+ 
+ #define BFD_MACH_O_REFERENCED_DYNAMICALLY			0x10
+ #define BFD_MACH_O_N_DESC_DISCARDED				0x20
+ #define BFD_MACH_O_N_NO_DEAD_STRIP				0x20
+ #define BFD_MACH_O_N_WEAK_REF					0x40
+ #define BFD_MACH_O_N_WEAK_DEF					0x80
+ 

+ /* Thread constants.  */
+ 
+ typedef enum bfd_mach_o_ppc_thread_flavour
+ {
+   BFD_MACH_O_PPC_THREAD_STATE      = 1,
+   BFD_MACH_O_PPC_FLOAT_STATE       = 2,
+   BFD_MACH_O_PPC_EXCEPTION_STATE   = 3,
+   BFD_MACH_O_PPC_VECTOR_STATE      = 4,
+   BFD_MACH_O_PPC_THREAD_STATE64    = 5,
+   BFD_MACH_O_PPC_EXCEPTION_STATE64 = 6,
+   BFD_MACH_O_PPC_THREAD_STATE_NONE = 7
+ }
+ bfd_mach_o_ppc_thread_flavour;
+ 
+ /* Defined in <mach/i386/thread_status.h> */
+ typedef enum bfd_mach_o_i386_thread_flavour
+ {
+   BFD_MACH_O_x86_THREAD_STATE32    = 1,
+   BFD_MACH_O_x86_FLOAT_STATE32     = 2,
+   BFD_MACH_O_x86_EXCEPTION_STATE32 = 3,
+   BFD_MACH_O_x86_THREAD_STATE64    = 4,
+   BFD_MACH_O_x86_FLOAT_STATE64     = 5,
+   BFD_MACH_O_x86_EXCEPTION_STATE64 = 6,
+   BFD_MACH_O_x86_THREAD_STATE      = 7,
+   BFD_MACH_O_x86_FLOAT_STATE       = 8,
+   BFD_MACH_O_x86_EXCEPTION_STATE   = 9,
+   BFD_MACH_O_x86_DEBUG_STATE32     = 10,
+   BFD_MACH_O_x86_DEBUG_STATE64     = 11,
+   BFD_MACH_O_x86_DEBUG_STATE       = 12,
+   BFD_MACH_O_x86_THREAD_STATE_NONE = 13
+ }
+ bfd_mach_o_i386_thread_flavour;
  
  #endif /* _MACH_O_LOADER_H */
Index: include/mach-o/reloc.h
===================================================================
RCS file: include/mach-o/reloc.h
diff -N include/mach-o/reloc.h
*** /dev/null	1 Jan 1970 00:00:00 -0000
--- include/mach-o/reloc.h	8 Aug 2011 08:54:42 -0000
***************
*** 0 ****
--- 1,53 ----
+ /* Mach-O support for BFD.
+    Copyright 2011
+    Free Software Foundation, Inc.
+ 
+    This file is part of BFD, the Binary File Descriptor library.
+ 
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 3 of the License, or
+    (at your option) any later version.
+ 
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+ 
+    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., 51 Franklin Street - Fifth Floor, Boston,
+    MA 02110-1301, USA.  */
+ 
+ #ifndef _MACH_O_RELOC_H
+ #define _MACH_O_RELOC_H
+ 
+ /* 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)
+ 
+ /* 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
+ #define BFD_MACH_O_GENERIC_RELOC_TLV		5
+ 
+ #endif /* _MACH_O_RELOC_H */
Index: include/mach-o/x86-64.h
===================================================================
RCS file: include/mach-o/x86-64.h
diff -N include/mach-o/x86-64.h
*** /dev/null	1 Jan 1970 00:00:00 -0000
--- include/mach-o/x86-64.h	8 Aug 2011 08:54:42 -0000
***************
*** 0 ****
--- 1,37 ----
+ /* Mach-O support for BFD.
+    Copyright 2011
+    Free Software Foundation, Inc.
+ 
+    This file is part of BFD, the Binary File Descriptor library.
+ 
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 3 of the License, or
+    (at your option) any later version.
+ 
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    GNU General Public License for more details.
+ 
+    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., 51 Franklin Street - Fifth Floor, Boston,
+    MA 02110-1301, USA.  */
+ 
+ #ifndef _MACH_O_X86_64_H
+ #define _MACH_O_X86_64_H
+ 
+ /* 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.  */
+ #define BFD_MACH_O_X86_64_RELOC_TLV	   9 /* Thread local variables.  */
+ 
+ #endif /* _MACH_O_X86_64_H */



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]