bfd/
authorTristan Gingold <gingold@adacore.com>
Mon, 8 Aug 2011 08:59:33 +0000 (08:59 +0000)
committerTristan Gingold <gingold@adacore.com>
Mon, 8 Aug 2011 08:59:33 +0000 (08:59 +0000)
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.

bfd/ChangeLog
bfd/mach-o-i386.c
bfd/mach-o-x86-64.c
bfd/mach-o.c
bfd/mach-o.h
include/mach-o/ChangeLog
include/mach-o/external.h [new file with mode: 0644]
include/mach-o/loader.h
include/mach-o/reloc.h [new file with mode: 0644]
include/mach-o/x86-64.h [new file with mode: 0644]

index 99f221b011cfa67da3b021ef319f0ad0d97fb41c..9cad7fe9bc213aa48cb3a9f1bd2ade4e79e9a414 100644 (file)
@@ -1,3 +1,39 @@
+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.
index e46cbc6f57ed45929a990e515e4276fc1dff24ff..11915604b32b324675a93654626ef1568220541a 100644 (file)
@@ -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
index 561496bdc83ec2719f5a9942f47121c5d4ab2016..2248d976a74e5e3da4d409454ebd48c76b05c6cb 100644 (file)
@@ -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
index 622cef54e615e1336676b82284de2866789acf9d..5973df790657d304a2411756c630c5ee26674f28 100644 (file)
@@ -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;
index 183076b44bdbe9199a07af513b4bce9ea53087d4..de9640a88026b2166aa2a2f3bfef89a819769d1b 100644 (file)
@@ -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
 {
index 923f2034976a2d7fb3734c009e46db97711b8dc2..dff287a52158ef6a8a74f272f9851a89ba05fed7 100644 (file)
@@ -1,3 +1,10 @@
+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.
+
 2011-07-06  Tristan Gingold  <gingold@adacore.com>
 
        * loader.h: New file.
diff --git a/include/mach-o/external.h b/include/mach-o/external.h
new file mode 100644 (file)
index 0000000..c2fe7e3
--- /dev/null
@@ -0,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 8ddf8e03792a9d9253574f0ca9a9131d32935a35..1105204edb9f50ecc771640ba19cc2260c820330 100644 (file)
 #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
+/* Constants for header. */
 
 typedef enum bfd_mach_o_mach_header_magic
 {
@@ -59,37 +33,80 @@ typedef enum bfd_mach_o_mach_header_magic
 }
 bfd_mach_o_mach_header_magic;
 
-typedef enum bfd_mach_o_ppc_thread_flavour
+#define BFD_MACH_O_CPU_IS64BIT 0x1000000
+
+typedef enum bfd_mach_o_cpu_type
 {
-  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_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_ppc_thread_flavour;
+bfd_mach_o_cpu_type;
 
-/* Defined in <mach/i386/thread_status.h> */
-typedef enum bfd_mach_o_i386_thread_flavour
+typedef enum bfd_mach_o_cpu_subtype
 {
-  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_CPU_SUBTYPE_X86_ALL = 3
 }
-bfd_mach_o_i386_thread_flavour;
+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;
+\f
+/* Load command constants.  */
 #define BFD_MACH_O_LC_REQ_DYLD 0x80000000
 
 typedef enum bfd_mach_o_load_command_type
@@ -134,77 +151,8 @@ typedef enum bfd_mach_o_load_command_type
   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;
-
+\f
+/* Section constants.  */
 /* Constants for the type of a section.  */
 
 typedef enum bfd_mach_o_section_type
@@ -325,5 +273,68 @@ typedef enum bfd_mach_o_section_attribute
   BFD_MACH_O_S_ATTR_PURE_INSTRUCTIONS = 0x80000000
 }
 bfd_mach_o_section_attribute;
+\f
+/* 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
+\f
+/* 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 */
diff --git a/include/mach-o/reloc.h b/include/mach-o/reloc.h
new file mode 100644 (file)
index 0000000..93ebb8b
--- /dev/null
@@ -0,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 */
diff --git a/include/mach-o/x86-64.h b/include/mach-o/x86-64.h
new file mode 100644 (file)
index 0000000..d06bc26
--- /dev/null
@@ -0,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
+   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_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 */