]> oss.titaniummirror.com Git - msp430-binutils.git/blobdiff - bfd/mach-o.h
Merge commit 'upstream/2.20'
[msp430-binutils.git] / bfd / mach-o.h
index a5045396aa0863e37b407a544fd035c37721aabe..0f48324f52f2a0d543dd022cb76da9a7fbe4df4d 100644 (file)
@@ -1,5 +1,5 @@
 /* Mach-O support for BFD.
 /* Mach-O support for BFD.
-   Copyright 1999, 2000, 2001, 2002, 2003, 2005, 2007
+   Copyright 1999, 2000, 2001, 2002, 2003, 2005, 2007, 2008, 2009
    Free Software Foundation, Inc.
 
    This file is part of BFD, the Binary File Descriptor library.
    Free Software Foundation, Inc.
 
    This file is part of BFD, the Binary File Descriptor library.
 
 #include "bfd.h"
 
 
 #include "bfd.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_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_SECT  0x0e        /* Defined in section number n_sect.  */
-#define BFD_MACH_O_N_PBUD  0x0c /* Prebound undefined (defined in a dylib).  */
 #define BFD_MACH_O_N_INDR  0x0a        /* Indirect.  */
 #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
+{
+  BFD_MACH_O_MH_MAGIC    = 0xfeedface,
+  BFD_MACH_O_MH_CIGAM    = 0xcefaedfe,
+  BFD_MACH_O_MH_MAGIC_64 = 0xfeedfacf,
+  BFD_MACH_O_MH_CIGAM_64 = 0xcffaedfe
+}
+bfd_mach_o_mach_header_magic;
 
 typedef enum bfd_mach_o_ppc_thread_flavour
 {
 
 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_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;
 
 }
 bfd_mach_o_ppc_thread_flavour;
 
+/* Defined in <mach/i386/thread_status.h> */
 typedef enum bfd_mach_o_i386_thread_flavour
 {
 typedef enum bfd_mach_o_i386_thread_flavour
 {
-  BFD_MACH_O_i386_NEW_THREAD_STATE = 1,
-  BFD_MACH_O_i386_FLOAT_STATE = 2,
-  BFD_MACH_O_i386_ISA_PORT_MAP_STATE = 3,
-  BFD_MACH_O_i386_V86_ASSIST_STATE = 4,
-  BFD_MACH_O_i386_REGS_SEGS_STATE = 5,
-  BFD_MACH_O_i386_THREAD_SYSCALL_STATE = 6,
-  BFD_MACH_O_i386_THREAD_STATE_NONE = 7,
-  BFD_MACH_O_i386_SAVED_STATE = 8,
-  BFD_MACH_O_i386_THREAD_STATE = -1,
-  BFD_MACH_O_i386_THREAD_FPSTATE = -2,
-  BFD_MACH_O_i386_THREAD_EXCEPTSTATE = -3,
-  BFD_MACH_O_i386_THREAD_CTHREADSTATE = -4,
+  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;
 
 }
 bfd_mach_o_i386_thread_flavour;
 
@@ -89,10 +121,23 @@ typedef enum bfd_mach_o_load_command_type
   BFD_MACH_O_LC_PREBIND_CKSUM = 0x17,  /* Prebind checksum.  */
   /* Load a dynamically linked shared library that is allowed to be
        missing (weak).  */
   BFD_MACH_O_LC_PREBIND_CKSUM = 0x17,  /* Prebind checksum.  */
   /* Load a dynamically linked shared library that is allowed to be
        missing (weak).  */
-  BFD_MACH_O_LC_LOAD_WEAK_DYLIB = 0x18
+  BFD_MACH_O_LC_LOAD_WEAK_DYLIB = 0x18,
+  BFD_MACH_O_LC_SEGMENT_64 = 0x19,     /* 64-bit segment of this file to be 
+                                           mapped.  */
+  BFD_MACH_O_LC_ROUTINES_64 = 0x1a,     /* Address of the dyld init routine 
+                                           in a dylib.  */
+  BFD_MACH_O_LC_UUID = 0x1b,            /* 128-bit UUID of the executable.  */
+  BFD_MACH_O_LC_RPATH = 0x1c,          /* Run path addiions.  */
+  BFD_MACH_O_LC_CODE_SIGNATURE = 0x1d, /* Local of code signature.  */
+  BFD_MACH_O_LC_SEGMENT_SPLIT_INFO = 0x1e, /* Local of info to split seg.  */
+  BFD_MACH_O_LC_REEXPORT_DYLIB = 0x1f,  /* Load and re-export lib.  */
+  BFD_MACH_O_LC_LAZY_LOAD_DYLIB = 0x20, /* Delay load of lib until use.  */
+  BFD_MACH_O_LC_ENCRYPTION_INFO = 0x21  /* Encrypted segment info.  */
 }
 bfd_mach_o_load_command_type;
 
 }
 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,
 typedef enum bfd_mach_o_cpu_type
 {
   BFD_MACH_O_CPU_TYPE_VAX = 1,
@@ -106,10 +151,18 @@ typedef enum bfd_mach_o_cpu_type
   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_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 = 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;
 
 }
 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 = 1,
 typedef enum bfd_mach_o_filetype
 {
   BFD_MACH_O_MH_OBJECT = 1,
@@ -123,6 +176,33 @@ typedef enum bfd_mach_o_filetype
 }
 bfd_mach_o_filetype;
 
 }
 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
 /* Constants for the type of a section.  */
 
 typedef enum bfd_mach_o_section_type
@@ -164,15 +244,85 @@ typedef enum bfd_mach_o_section_type
   /* Section with only lazy symbol pointers.  */
   BFD_MACH_O_S_LAZY_SYMBOL_POINTERS = 0x7,
 
   /* Section with only lazy symbol pointers.  */
   BFD_MACH_O_S_LAZY_SYMBOL_POINTERS = 0x7,
 
-  /* Section with only symbol stubs, byte size of stub in the reserved2 field.  */
+  /* Section with only symbol stubs, byte size of stub in the reserved2
+     field.  */
   BFD_MACH_O_S_SYMBOL_STUBS = 0x8,
 
   /* Section with only function pointers for initialization.  */
   BFD_MACH_O_S_SYMBOL_STUBS = 0x8,
 
   /* Section with only function pointers for initialization.  */
-  BFD_MACH_O_S_MOD_INIT_FUNC_POINTERS = 0x9
+  BFD_MACH_O_S_MOD_INIT_FUNC_POINTERS = 0x9,
+
+  /* Section with only function pointers for termination.  */
+  BFD_MACH_O_S_MOD_FINI_FUNC_POINTERS = 0xa,
+
+  /* Section contains symbols that are coalesced by the linkers.  */
+  BFD_MACH_O_S_COALESCED = 0xb,
+
+  /* Zero fill on demand section (possibly larger than 4 GB).  */
+  BFD_MACH_O_S_GB_ZEROFILL = 0xc,
+
+  /* Section with only pairs of function pointers for interposing.  */
+  BFD_MACH_O_S_INTERPOSING = 0xd,
+
+  /* Section with only 16 byte literals.  */
+  BFD_MACH_O_S_16BYTE_LITERALS = 0xe,
+
+  /* Section contains DTrace Object Format.  */
+  BFD_MACH_O_S_DTRACE_DOF = 0xf,
+
+  /* Section with only lazy symbol pointers to lazy loaded dylibs.  */
+  BFD_MACH_O_S_LAZY_DYLIB_SYMBOL_POINTERS = 0x10
 }
 bfd_mach_o_section_type;
 
 }
 bfd_mach_o_section_type;
 
-typedef unsigned long bfd_mach_o_cpu_subtype;
+/* The flags field of a section structure is separated into two parts a section
+   type and section attributes.  The section types are mutually exclusive (it
+   can only have one type) but the section attributes are not (it may have more
+   than one attribute).  */
+
+#define BFD_MACH_O_SECTION_TYPE_MASK        0x000000ff
+
+/* Constants for the section attributes part of the flags field of a section
+   structure.  */
+#define BFD_MACH_O_SECTION_ATTRIBUTES_MASK  0xffffff00
+/* System setable attributes.  */
+#define BFD_MACH_O_SECTION_ATTRIBUTES_SYS   0x00ffff00
+/* User attributes.  */   
+#define BFD_MACH_O_SECTION_ATTRIBUTES_USR   0xff000000
+
+typedef enum bfd_mach_o_section_attribute
+{
+  /* Section has local relocation entries.  */
+  BFD_MACH_O_S_ATTR_LOC_RELOC         = 0x00000100,
+
+  /* Section has external relocation entries.  */  
+  BFD_MACH_O_S_ATTR_EXT_RELOC         = 0x00000200,
+
+  /* Section contains some machine instructions.  */
+  BFD_MACH_O_S_ATTR_SOME_INSTRUCTIONS = 0x00000400,
+
+  /* A debug section.  */
+  BFD_MACH_O_S_ATTR_DEBUG             = 0x02000000,
+
+  /* Used with i386 stubs.  */
+  BFD_MACH_O_S_SELF_MODIFYING_CODE    = 0x04000000,
+  
+  /* Blocks are live if they reference live blocks.  */
+  BFD_MACH_O_S_ATTR_LIVE_SUPPORT      = 0x08000000,
+
+  /* No dead stripping.  */
+  BFD_MACH_O_S_ATTR_NO_DEAD_STRIP     = 0x10000000,
+
+  /* Section symbols can be stripped in files with MH_DYLDLINK flag.  */
+  BFD_MACH_O_S_ATTR_STRIP_STATIC_SYMS = 0x20000000,
+
+  /* Section contains coalesced symbols that are not to be in the TOC of an
+     archive.  */
+  BFD_MACH_O_S_ATTR_NO_TOC            = 0x40000000,
+
+  /* Section contains only true machine instructions.  */
+  BFD_MACH_O_S_ATTR_PURE_INSTRUCTIONS = 0x80000000
+}
+bfd_mach_o_section_attribute;
 
 typedef struct bfd_mach_o_header
 {
 
 typedef struct bfd_mach_o_header
 {
@@ -183,10 +333,16 @@ typedef struct bfd_mach_o_header
   unsigned long ncmds;
   unsigned long sizeofcmds;
   unsigned long flags;
   unsigned long ncmds;
   unsigned long sizeofcmds;
   unsigned long flags;
+  unsigned int reserved;
+  /* Version 1: 32 bits, version 2: 64 bits.  */
+  unsigned int version;
   enum bfd_endian byteorder;
 }
 bfd_mach_o_header;
 
   enum bfd_endian byteorder;
 }
 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
 {
   asection *bfdsection;
 typedef struct bfd_mach_o_section
 {
   asection *bfdsection;
@@ -201,33 +357,99 @@ typedef struct bfd_mach_o_section
   unsigned long flags;
   unsigned long reserved1;
   unsigned long reserved2;
   unsigned long flags;
   unsigned long reserved1;
   unsigned long reserved2;
+  unsigned long reserved3;
 }
 bfd_mach_o_section;
 }
 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
 {
 
 typedef struct bfd_mach_o_segment_command
 {
-  char segname[16];
+  char segname[16 + 1];
   bfd_vma vmaddr;
   bfd_vma vmsize;
   bfd_vma fileoff;
   unsigned long filesize;
   bfd_vma vmaddr;
   bfd_vma vmsize;
   bfd_vma fileoff;
   unsigned long filesize;
+  unsigned long maxprot;       /* Maximum permitted protection.  */
+  unsigned long initprot;      /* Initial protection.  */
   unsigned long nsects;
   unsigned long flags;
   bfd_mach_o_section *sections;
   unsigned long nsects;
   unsigned long flags;
   bfd_mach_o_section *sections;
-  asection *segment;
 }
 bfd_mach_o_segment_command;
 }
 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
+
+/* 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
+{
+  bfd_vma r_address;
+  bfd_vma r_value;
+  unsigned int r_scattered : 1;
+  unsigned int r_type : 4;
+  unsigned int r_pcrel : 1;
+  unsigned int r_length : 2;
+  unsigned int r_extern : 1;
+}
+bfd_mach_o_reloc_info;
+
+typedef struct bfd_mach_o_asymbol
+{
+  /* The actual symbol which the rest of BFD works with.  */
+  asymbol symbol;
+
+  /* Fields from Mach-O symbol.  */
+  unsigned char n_type;
+  unsigned char n_sect;
+  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
 {
 
 typedef struct bfd_mach_o_symtab_command
 {
-  unsigned long symoff;
-  unsigned long nsyms;
-  unsigned long stroff;
-  unsigned long strsize;
-  asymbol *symbols;
+  unsigned int symoff;
+  unsigned int nsyms;
+  unsigned int stroff;
+  unsigned int strsize;
+  bfd_mach_o_asymbol *symbols;
   char *strtab;
   char *strtab;
-  asection *stabs_segment;
-  asection *stabstr_segment;
 }
 bfd_mach_o_symtab_command;
 
 }
 bfd_mach_o_symtab_command;
 
@@ -268,6 +490,88 @@ bfd_mach_o_symtab_command;
    For executable and object modules the relocation entries continue to hang
    off the section structures.  */
 
    For executable and object modules the relocation entries continue to hang
    off the section structures.  */
 
+typedef struct bfd_mach_o_dylib_module
+{
+  /* Index into the string table indicating the name of the module.  */
+  unsigned long module_name_idx;
+  char *module_name;
+
+  /* Index into the symbol table of the first defined external symbol provided
+     by the module.  */
+  unsigned long iextdefsym;
+
+  /* Number of external symbols provided by this module.  */
+  unsigned long nextdefsym;
+
+  /* Index into the external reference table of the first entry
+     provided by this module.  */
+  unsigned long irefsym;
+
+  /* Number of external reference entries provided by this module.  */
+  unsigned long nrefsym;
+
+  /* Index into the symbol table of the first local symbol provided by this
+     module.  */
+  unsigned long ilocalsym;
+
+  /* Number of local symbols provided by this module.  */
+  unsigned long nlocalsym;
+
+  /* Index into the external relocation table of the first entry provided
+     by this module.  */
+  unsigned long iextrel;
+
+  /* Number of external relocation entries provided by this module.  */
+  unsigned long nextrel;
+
+  /* Index in the module initialization section to the pointers for this
+     module.  */
+  unsigned short iinit;
+
+  /* Index in the module termination section to the pointers for this
+     module.  */
+  unsigned short iterm;
+
+  /* Number of pointers in the module initialization for this module.  */
+  unsigned short ninit;
+
+  /* Number of pointers in the module termination for this module.  */
+  unsigned short nterm;
+
+  /* Number of data byte for this module that are used in the __module_info
+     section of the __OBJC segment.  */
+  unsigned long objc_module_info_size;
+
+  /* Statically linked address of the start of the data for this module
+     in the __module_info section of the __OBJC_segment.  */
+  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
+{
+  /* Index into the symbol table to the defined external symbol.  */
+  unsigned long symbol_index;
+
+  /* Index into the module table to the module for this entry.  */
+  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 into the symbol table for the symbol being referenced.  */
+  unsigned long isym;
+
+  /* Type of the reference being made (use REFERENCE_FLAGS constants).  */
+  unsigned long flags;
+}
+bfd_mach_o_dylib_reference;
+#define BFD_MACH_O_REFERENCE_SIZE 4
+
 typedef struct bfd_mach_o_dysymtab_command
 {
   /* The symbols indicated by symoff and nsyms of the LC_SYMTAB load command
 typedef struct bfd_mach_o_dysymtab_command
 {
   /* The symbols indicated by symoff and nsyms of the LC_SYMTAB load command
@@ -368,22 +672,30 @@ typedef struct bfd_mach_o_dysymtab_command
 
   unsigned long locreloff;    /* Offset to local relocation entries.  */
   unsigned long nlocrel;      /* Number of local relocation entries.  */
 
   unsigned long locreloff;    /* Offset to local relocation entries.  */
   unsigned long nlocrel;      /* Number of local relocation entries.  */
+
+  bfd_mach_o_dylib_module *dylib_module;
+  bfd_mach_o_dylib_table_of_content *dylib_toc;
+  unsigned int *indirect_syms;
+  bfd_mach_o_dylib_reference *ext_refs;
 }
 bfd_mach_o_dysymtab_command;
 
 /* An indirect symbol table entry is simply a 32bit index into the symbol table
    to the symbol that the pointer or stub is refering to.  Unless it is for a
 }
 bfd_mach_o_dysymtab_command;
 
 /* An indirect symbol table entry is simply a 32bit index into the symbol table
    to the symbol that the pointer or stub is refering to.  Unless it is for a
-   non-lazy symbol pointer section for a defined symbol which strip(1) as
+   non-lazy symbol pointer section for a defined symbol which strip(1) has
    removed.  In which case it has the value INDIRECT_SYMBOL_LOCAL.  If the
    symbol was also absolute INDIRECT_SYMBOL_ABS is or'ed with that.  */
 
    removed.  In which case it has the value INDIRECT_SYMBOL_LOCAL.  If the
    symbol was also absolute INDIRECT_SYMBOL_ABS is or'ed with that.  */
 
-#define INDIRECT_SYMBOL_LOCAL 0x80000000
-#define INDIRECT_SYMBOL_ABS   0x40000000
+#define BFD_MACH_O_INDIRECT_SYMBOL_LOCAL 0x80000000
+#define BFD_MACH_O_INDIRECT_SYMBOL_ABS   0x40000000
+#define BFD_MACH_O_INDIRECT_SYMBOL_SIZE  4
+
+/* For LC_THREAD or LC_UNIXTHREAD.  */
 
 typedef struct bfd_mach_o_thread_flavour
 {
   unsigned long flavour;
 
 typedef struct bfd_mach_o_thread_flavour
 {
   unsigned long flavour;
-  bfd_vma offset;
+  unsigned long offset;
   unsigned long size;
 }
 bfd_mach_o_thread_flavour;
   unsigned long size;
 }
 bfd_mach_o_thread_flavour;
@@ -396,46 +708,72 @@ typedef struct bfd_mach_o_thread_command
 }
 bfd_mach_o_thread_command;
 
 }
 bfd_mach_o_thread_command;
 
+/* For LC_LOAD_DYLINKER and LC_ID_DYLINKER.  */
+
 typedef struct bfd_mach_o_dylinker_command
 {
 typedef struct bfd_mach_o_dylinker_command
 {
-  unsigned long cmd;                   /* LC_ID_DYLIB or LC_LOAD_DYLIB.  */
-  unsigned long cmdsize;               /* Includes pathname string.  */
-  unsigned long name_offset;           /* Offset to library's path name.  */
-  unsigned long name_len;              /* Offset to library's path name.  */
-  asection *section;
+  unsigned long name_offset;         /* Offset to library's path name.  */
+  unsigned long name_len;            /* Offset to library's path name.  */
+  char *name_str;
 }
 bfd_mach_o_dylinker_command;
 
 }
 bfd_mach_o_dylinker_command;
 
+/* For LC_LOAD_DYLIB, LC_LOAD_WEAK_DYLIB, LC_ID_DYLIB
+   or LC_REEXPORT_DYLIB.  */
+
 typedef struct bfd_mach_o_dylib_command
 {
 typedef struct bfd_mach_o_dylib_command
 {
-  unsigned long cmd;                   /* LC_ID_DYLIB or LC_LOAD_DYLIB.  */
-  unsigned long cmdsize;               /* Includes pathname string.  */
   unsigned long name_offset;           /* Offset to library's path name.  */
   unsigned long name_len;              /* Offset to library's path name.  */
   unsigned long timestamp;            /* Library's build time stamp.  */
   unsigned long current_version;       /* Library's current version number.  */
   unsigned long compatibility_version; /* Library's compatibility vers number.  */
   unsigned long name_offset;           /* Offset to library's path name.  */
   unsigned long name_len;              /* Offset to library's path name.  */
   unsigned long timestamp;            /* Library's build time stamp.  */
   unsigned long current_version;       /* Library's current version number.  */
   unsigned long compatibility_version; /* Library's compatibility vers number.  */
-  asection *section;
+  char *name_str;
 }
 bfd_mach_o_dylib_command;
 
 }
 bfd_mach_o_dylib_command;
 
+/* For LC_PREBOUND_DYLIB.  */
+
 typedef struct bfd_mach_o_prebound_dylib_command
 {
 typedef struct bfd_mach_o_prebound_dylib_command
 {
-  unsigned long cmd;                 /* LC_PREBOUND_DYLIB.  */
-  unsigned long cmdsize;             /* Includes strings.  */
   unsigned long name;                /* Library's path name.  */
   unsigned long nmodules;            /* Number of modules in library.  */
   unsigned long linked_modules;      /* Bit vector of linked modules.  */
   unsigned long name;                /* Library's path name.  */
   unsigned long nmodules;            /* Number of modules in library.  */
   unsigned long linked_modules;      /* Bit vector of linked modules.  */
-  asection *section;
 }
 bfd_mach_o_prebound_dylib_command;
 
 }
 bfd_mach_o_prebound_dylib_command;
 
+/* For LC_UUID.  */
+
+typedef struct bfd_mach_o_uuid_command
+{
+  unsigned char uuid[16];
+  asection *section;
+}
+bfd_mach_o_uuid_command;
+
+/* For LC_CODE_SIGNATURE or LC_SEGMENT_SPLIT_INFO.  */
+
+typedef struct bfd_mach_o_linkedit_command
+{
+  unsigned long dataoff;
+  unsigned long datasize;
+}
+bfd_mach_o_linkedit_command;
+
+typedef struct bfd_mach_o_str_command
+{
+  unsigned long stroff;
+  unsigned long str_len;
+  char *str;
+}
+bfd_mach_o_str_command;
+
 typedef struct bfd_mach_o_load_command
 {
   bfd_mach_o_load_command_type type;
 typedef struct bfd_mach_o_load_command
 {
   bfd_mach_o_load_command_type type;
-  unsigned int type_required;
-  bfd_vma offset;
-  bfd_vma len;
+  bfd_boolean type_required;
+  unsigned int offset;
+  unsigned int len;
   union
   {
     bfd_mach_o_segment_command segment;
   union
   {
     bfd_mach_o_segment_command segment;
@@ -445,6 +783,9 @@ typedef struct bfd_mach_o_load_command
     bfd_mach_o_dylib_command dylib;
     bfd_mach_o_dylinker_command dylinker;
     bfd_mach_o_prebound_dylib_command prebound_dylib;
     bfd_mach_o_dylib_command dylib;
     bfd_mach_o_dylinker_command dylinker;
     bfd_mach_o_prebound_dylib_command prebound_dylib;
+    bfd_mach_o_uuid_command uuid;
+    bfd_mach_o_linkedit_command linkedit;
+    bfd_mach_o_str_command str;
   }
   command;
 }
   }
   command;
 }
@@ -452,40 +793,82 @@ bfd_mach_o_load_command;
 
 typedef struct mach_o_data_struct
 {
 
 typedef struct mach_o_data_struct
 {
+  /* Mach-O header.  */
   bfd_mach_o_header header;
   bfd_mach_o_header header;
+  /* Array of load commands (length is given by header.ncmds).  */
   bfd_mach_o_load_command *commands;
   bfd_mach_o_load_command *commands;
-  unsigned long nsymbols;
-  asymbol *symbols;
+
+  /* Flatten array of sections.  The array is 0-based.  */
   unsigned long nsects;
   bfd_mach_o_section **sections;
   unsigned long nsects;
   bfd_mach_o_section **sections;
-  bfd *ibfd;
+
+  /* Used while writting: current length of the output file.  This is used
+     to allocate space in the file.  */
+  ufile_ptr filelen;
+
+  /* As symtab is referenced by other load command, it is handy to have
+     a direct access to it.  Also it is not clearly stated, only one symtab
+     is expected.  */
+  bfd_mach_o_symtab_command *symtab;
+  bfd_mach_o_dysymtab_command *dysymtab;
+}
+bfd_mach_o_data_struct;
+
+/* Target specific routines.  */
+typedef struct bfd_mach_o_backend_data
+{
+  bfd_boolean (*_bfd_mach_o_swap_reloc_in)(arelent *, bfd_mach_o_reloc_info *);
+  bfd_boolean (*_bfd_mach_o_swap_reloc_out)(arelent *, bfd_mach_o_reloc_info *);
+  bfd_boolean (*_bfd_mach_o_print_thread)(bfd *, bfd_mach_o_thread_flavour *,
+                                          void *, char *);
 }
 }
-mach_o_data_struct;
-
-typedef struct mach_o_data_struct bfd_mach_o_data_struct;
-
-bfd_boolean        bfd_mach_o_valid  (bfd *);
-int                bfd_mach_o_scan_read_symtab_symbol        (bfd *, bfd_mach_o_symtab_command *, asymbol *, unsigned long);
-int                bfd_mach_o_scan_read_symtab_strtab        (bfd *, bfd_mach_o_symtab_command *);
-int                bfd_mach_o_scan_read_symtab_symbols       (bfd *, bfd_mach_o_symtab_command *);
-int                bfd_mach_o_scan_read_dysymtab_symbol      (bfd *, bfd_mach_o_dysymtab_command *, bfd_mach_o_symtab_command *, asymbol *, unsigned long);
-int                bfd_mach_o_scan_start_address             (bfd *);
-int                bfd_mach_o_scan                           (bfd *, bfd_mach_o_header *, bfd_mach_o_data_struct *);
-bfd_boolean        bfd_mach_o_mkobject                       (bfd *);
-const bfd_target * bfd_mach_o_object_p                       (bfd *);
-const bfd_target * bfd_mach_o_core_p                         (bfd *);
-const bfd_target * bfd_mach_o_archive_p                      (bfd *);
-bfd *              bfd_mach_o_openr_next_archived_file       (bfd *, bfd *);
-int                bfd_mach_o_lookup_section                 (bfd *, asection *, bfd_mach_o_load_command **, bfd_mach_o_section **);
-int                bfd_mach_o_lookup_command                 (bfd *, bfd_mach_o_load_command_type, bfd_mach_o_load_command **);
-unsigned long      bfd_mach_o_stack_addr                     (enum bfd_mach_o_cpu_type);
-int                bfd_mach_o_core_fetch_environment         (bfd *, unsigned char **, unsigned int *);
-char *             bfd_mach_o_core_file_failing_command      (bfd *);
-int                bfd_mach_o_core_file_failing_signal       (bfd *);
-bfd_boolean        bfd_mach_o_core_file_matches_executable_p (bfd *, bfd *);
-
-extern const bfd_target mach_o_be_vec;
-extern const bfd_target mach_o_le_vec;
+bfd_mach_o_backend_data;
+
+#define bfd_mach_o_get_data(abfd) ((abfd)->tdata.mach_o_data)
+#define bfd_mach_o_get_backend_data(abfd) \
+  ((bfd_mach_o_backend_data*)(abfd)->xvec->backend_data)
+
+bfd_boolean bfd_mach_o_valid (bfd *);
+int bfd_mach_o_scan_read_dysymtab_symbol (bfd *, bfd_mach_o_dysymtab_command *, bfd_mach_o_symtab_command *, bfd_mach_o_asymbol *, unsigned long);
+int bfd_mach_o_scan_start_address (bfd *);
+int bfd_mach_o_scan (bfd *, bfd_mach_o_header *, bfd_mach_o_data_struct *);
+bfd_boolean bfd_mach_o_mkobject_init (bfd *);
+const bfd_target *bfd_mach_o_object_p (bfd *);
+const bfd_target *bfd_mach_o_core_p (bfd *);
+const bfd_target *bfd_mach_o_archive_p (bfd *);
+bfd *bfd_mach_o_openr_next_archived_file (bfd *, bfd *);
+int bfd_mach_o_lookup_section (bfd *, asection *, bfd_mach_o_load_command **, bfd_mach_o_section **);
+int bfd_mach_o_lookup_command (bfd *, bfd_mach_o_load_command_type, bfd_mach_o_load_command **);
+bfd_boolean bfd_mach_o_write_contents (bfd *);
+bfd_boolean bfd_mach_o_bfd_copy_private_symbol_data (bfd *, asymbol *,
+                                                     bfd *, asymbol *);
+bfd_boolean bfd_mach_o_bfd_copy_private_section_data (bfd *, asection *,
+                                                      bfd *, asection *);
+bfd_boolean bfd_mach_o_bfd_copy_private_bfd_data (bfd *, bfd *);
+long bfd_mach_o_get_symtab_upper_bound (bfd *);
+long bfd_mach_o_canonicalize_symtab (bfd *, asymbol **);
+long bfd_mach_o_get_reloc_upper_bound (bfd *, asection *);
+long bfd_mach_o_canonicalize_reloc (bfd *, asection *, arelent **, asymbol **);
+long bfd_mach_o_get_dynamic_reloc_upper_bound (bfd *);
+long bfd_mach_o_canonicalize_dynamic_reloc (bfd *, arelent **, asymbol **);
+asymbol *bfd_mach_o_make_empty_symbol (bfd *);
+void bfd_mach_o_get_symbol_info (bfd *, asymbol *, symbol_info *);
+void bfd_mach_o_print_symbol (bfd *, PTR, asymbol *, bfd_print_symbol_type);
+bfd_boolean bfd_mach_o_bfd_print_private_bfd_data (bfd *, PTR);
+int bfd_mach_o_sizeof_headers (bfd *, struct bfd_link_info *);
+unsigned long bfd_mach_o_stack_addr (enum bfd_mach_o_cpu_type);
+int bfd_mach_o_core_fetch_environment (bfd *, unsigned char **, unsigned int *);
+char *bfd_mach_o_core_file_failing_command (bfd *);
+int bfd_mach_o_core_file_failing_signal (bfd *);
+bfd_boolean bfd_mach_o_core_file_matches_executable_p (bfd *, bfd *);
+bfd *bfd_mach_o_fat_extract (bfd *, bfd_format , const bfd_arch_info_type *);
+const bfd_target *bfd_mach_o_header_p (bfd *, bfd_mach_o_filetype,
+                                       bfd_mach_o_cpu_type);
+bfd_boolean bfd_mach_o_build_commands (bfd *);
+bfd_boolean bfd_mach_o_set_section_contents (bfd *, asection *, const void *,
+                                             file_ptr, bfd_size_type);
+unsigned int bfd_mach_o_version (bfd *);
+
 extern const bfd_target mach_o_fat_vec;
 
 #endif /* _BFD_MACH_O_H_ */
 extern const bfd_target mach_o_fat_vec;
 
 #endif /* _BFD_MACH_O_H_ */