gdb: add target_ops::supports_displaced_step
[deliverable/binutils-gdb.git] / bfd / mach-o.h
index d73f205e6de9c69bb8cf424490e7de8cc4d05382..278bdd531545a8668ff63e95945c42a56308dbb4 100644 (file)
@@ -1,6 +1,5 @@
 /* Mach-O support for BFD.
-   Copyright 1999, 2000, 2001, 2002, 2003, 2005, 2007, 2008
-   Free Software Foundation, Inc.
+   Copyright (C) 1999-2020 Free Software Foundation, Inc.
 
    This file is part of BFD, the Binary File Descriptor library.
 
 #ifndef _BFD_MACH_O_H_
 #define _BFD_MACH_O_H_
 
-#include "bfd.h"
-
-#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.  */
-
-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_64 = 5
-}
-bfd_mach_o_ppc_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_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_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_i386_THREAD_STATE_NONE = 10,
-}
-bfd_mach_o_i386_thread_flavour;
-
-#define BFD_MACH_O_LC_REQ_DYLD 0x80000000
-
-typedef enum bfd_mach_o_load_command_type
-{
-  BFD_MACH_O_LC_SEGMENT = 0x1,         /* File segment to be mapped.  */
-  BFD_MACH_O_LC_SYMTAB = 0x2,          /* Link-edit stab symbol table info (obsolete).  */
-  BFD_MACH_O_LC_SYMSEG = 0x3,          /* Link-edit gdb symbol table info.  */
-  BFD_MACH_O_LC_THREAD = 0x4,          /* Thread.  */
-  BFD_MACH_O_LC_UNIXTHREAD = 0x5,      /* UNIX thread (includes a stack).  */
-  BFD_MACH_O_LC_LOADFVMLIB = 0x6,      /* Load a fixed VM shared library.  */
-  BFD_MACH_O_LC_IDFVMLIB = 0x7,                /* Fixed VM shared library id.  */
-  BFD_MACH_O_LC_IDENT = 0x8,           /* Object identification information (obsolete).  */
-  BFD_MACH_O_LC_FVMFILE = 0x9,         /* Fixed VM file inclusion.  */
-  BFD_MACH_O_LC_PREPAGE = 0xa,         /* Prepage command (internal use).  */
-  BFD_MACH_O_LC_DYSYMTAB = 0xb,                /* Dynamic link-edit symbol table info.  */
-  BFD_MACH_O_LC_LOAD_DYLIB = 0xc,      /* Load a dynamically linked shared library.  */
-  BFD_MACH_O_LC_ID_DYLIB = 0xd,                /* Dynamically linked shared lib identification.  */
-  BFD_MACH_O_LC_LOAD_DYLINKER = 0xe,   /* Load a dynamic linker.  */
-  BFD_MACH_O_LC_ID_DYLINKER = 0xf,     /* Dynamic linker identification.  */
-  BFD_MACH_O_LC_PREBOUND_DYLIB = 0x10, /* Modules prebound for a dynamically.  */
-  BFD_MACH_O_LC_ROUTINES = 0x11,       /* Image routines.  */
-  BFD_MACH_O_LC_SUB_FRAMEWORK = 0x12,  /* Sub framework.  */
-  BFD_MACH_O_LC_SUB_UMBRELLA = 0x13,   /* Sub umbrella.  */
-  BFD_MACH_O_LC_SUB_CLIENT = 0x14,     /* Sub client.  */
-  BFD_MACH_O_LC_SUB_LIBRARY = 0x15,    /* Sub library.  */
-  BFD_MACH_O_LC_TWOLEVEL_HINTS = 0x16, /* Two-level namespace lookup hints.  */
-  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_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_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_filetype
-{
-  BFD_MACH_O_MH_OBJECT = 1,
-  BFD_MACH_O_MH_EXECUTE = 2,
-  BFD_MACH_O_MH_FVMLIB = 3,
-  BFD_MACH_O_MH_CORE = 4,
-  BFD_MACH_O_MH_PRELOAD = 5,
-  BFD_MACH_O_MH_DYLIB = 6,
-  BFD_MACH_O_MH_DYLINKER = 7,
-  BFD_MACH_O_MH_BUNDLE = 8
-}
-bfd_mach_o_filetype;
-
-/* Constants for the type of a section.  */
-
-typedef enum bfd_mach_o_section_type
-{
-  /* Regular section.  */
-  BFD_MACH_O_S_REGULAR = 0x0,
-
-  /* Zero fill on demand section.  */
-  BFD_MACH_O_S_ZEROFILL = 0x1,
-
-  /* Section with only literal C strings.  */
-  BFD_MACH_O_S_CSTRING_LITERALS = 0x2,
-
-  /* Section with only 4 byte literals.  */
-  BFD_MACH_O_S_4BYTE_LITERALS = 0x3,
-
-  /* Section with only 8 byte literals.  */
-  BFD_MACH_O_S_8BYTE_LITERALS = 0x4,
-
-  /* Section with only pointers to literals.  */
-  BFD_MACH_O_S_LITERAL_POINTERS = 0x5,
-
-  /* For the two types of symbol pointers sections and the symbol stubs
-     section they have indirect symbol table entries.  For each of the
-     entries in the section the indirect symbol table entries, in
-     corresponding order in the indirect symbol table, start at the index
-     stored in the reserved1 field of the section structure.  Since the
-     indirect symbol table entries correspond to the entries in the
-     section the number of indirect symbol table entries is inferred from
-     the size of the section divided by the size of the entries in the
-     section.  For symbol pointers sections the size of the entries in
-     the section is 4 bytes and for symbol stubs sections the byte size
-     of the stubs is stored in the reserved2 field of the section
-     structure.  */
-
-  /* Section with only non-lazy symbol pointers.  */
-  BFD_MACH_O_S_NON_LAZY_SYMBOL_POINTERS = 0x6,
-
-  /* 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.  */
-  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_section_type;
-
-typedef unsigned long bfd_mach_o_cpu_subtype;
+#include "mach-o/loader.h"
+#include "mach-o/external.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
 
 typedef struct bfd_mach_o_header
 {
@@ -206,11 +44,26 @@ typedef struct bfd_mach_o_header
 }
 bfd_mach_o_header;
 
+typedef struct bfd_mach_o_asymbol
+{
+  /* The actual symbol which the rest of BFD works with.  */
+  asymbol symbol;
+
+  /* Mach-O symbol fields.  */
+  unsigned char n_type;
+  unsigned char n_sect;
+  unsigned short n_desc;
+}
+bfd_mach_o_asymbol;
+
+#define BFD_MACH_O_SEGNAME_SIZE 16
+#define BFD_MACH_O_SECTNAME_SIZE 16
+
 typedef struct bfd_mach_o_section
 {
-  asection *bfdsection;
-  char sectname[16 + 1];
-  char segname[16 + 1];
+  /* Fields present in the file.  */
+  char sectname[BFD_MACH_O_SECTNAME_SIZE + 1]; /* Always NUL padded.  */
+  char segname[BFD_MACH_O_SEGNAME_SIZE + 1];
   bfd_vma addr;
   bfd_vma size;
   bfd_vma offset;
@@ -221,35 +74,86 @@ typedef struct bfd_mach_o_section
   unsigned long reserved1;
   unsigned long reserved2;
   unsigned long reserved3;
+
+  /* Corresponding bfd section.  */
+  asection *bfdsection;
+
+  /* An array holding the indirect symbols for this section.
+     NULL values indicate local symbols.
+     The number of symbols is determined from the section size and type.  */
+
+  bfd_mach_o_asymbol **indirect_syms;
+
+  /* Simply linked list.  */
+  struct bfd_mach_o_section *next;
 }
 bfd_mach_o_section;
 
 typedef struct bfd_mach_o_segment_command
 {
-  char segname[16];
+  char segname[BFD_MACH_O_SEGNAME_SIZE + 1];
   bfd_vma vmaddr;
   bfd_vma vmsize;
   bfd_vma fileoff;
   unsigned long filesize;
-  unsigned long maxprot;
-  unsigned long initprot;
+  unsigned long maxprot;       /* Maximum permitted protection.  */
+  unsigned long initprot;      /* Initial protection.  */
   unsigned long nsects;
   unsigned long flags;
-  bfd_mach_o_section *sections;
-  asection *segment;
+
+  /* Linked list of sections.  */
+  bfd_mach_o_section *sect_head;
+  bfd_mach_o_section *sect_tail;
 }
 bfd_mach_o_segment_command;
 
+/* Protection flags.  */
+#define BFD_MACH_O_PROT_READ    0x01
+#define BFD_MACH_O_PROT_WRITE   0x02
+#define BFD_MACH_O_PROT_EXECUTE 0x04
+
+/* Target platforms.  */
+#define BFD_MACH_O_PLATFORM_MACOS    1
+#define BFD_MACH_O_PLATFORM_IOS      2
+#define BFD_MACH_O_PLATFORM_TVOS     3
+#define BFD_MACH_O_PLATFORM_WATCHOS  4
+#define BFD_MACH_O_PLATFORM_BRIDGEOS 5
+
+/* Build tools.  */
+#define BFD_MACH_O_TOOL_CLANG 1
+#define BFD_MACH_O_TOOL_SWIFT 2
+#define BFD_MACH_O_TOOL_LD    3
+
+/* 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;
+
+/* The symbol table is sorted like this:
+ (1) local.
+       (otherwise in order of generation)
+ (2) external defined
+       (sorted by name)
+ (3) external undefined / common
+       (sorted by name)
+*/
+
 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;
-  asection *stabs_segment;
-  asection *stabstr_segment;
 }
 bfd_mach_o_symtab_command;
 
@@ -279,7 +183,7 @@ bfd_mach_o_symtab_command;
    tables is determined as follows:
        table of contents - the defined external symbols are sorted by name
        module table - the file contains only one module so everything in the
-                      file is part of the module.
+                     file is part of the module.
        reference symbol table - is the defined and undefined external symbols
 
    For dynamically linked shared library files this load command also contains
@@ -290,6 +194,85 @@ bfd_mach_o_symtab_command;
    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;
+
+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;
+
+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
@@ -321,7 +304,7 @@ typedef struct bfd_mach_o_dysymtab_command
      symbols are sorted by name and is use as the table of contents.  */
 
   unsigned long tocoff;       /* File offset to table of contents.  */
-  unsigned long ntoc;         /* Number of entries in table of contents.  */
+  unsigned long ntoc;        /* Number of entries in table of contents.  */
 
   /* To support dynamic binding of "modules" (whole object files) the symbol
      table must reflect the modules that the file was created from.  This is
@@ -390,22 +373,51 @@ typedef struct bfd_mach_o_dysymtab_command
 
   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
-   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.  */
 
-#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_TWOLEVEL_HINTS.  */
+
+typedef struct bfd_mach_o_twolevel_hints_command
+{
+  /* Offset to the hint table.  */
+  unsigned int offset;
+
+  /* Number of entries in the table.  */
+  unsigned int nhints;
+}
+bfd_mach_o_twolevel_hints_command;
+
+/* For LC_PREBIND_CKSUM.  */
+
+typedef struct bfd_mach_o_prebind_cksum_command
+{
+  /* Checksum or zero.  */
+  unsigned int cksum;
+}
+bfd_mach_o_prebind_cksum_command;
+
+/* For LC_THREAD or LC_UNIXTHREAD.  */
 
 typedef struct bfd_mach_o_thread_flavour
 {
   unsigned long flavour;
-  bfd_vma offset;
+  unsigned long offset;
   unsigned long size;
 }
 bfd_mach_o_thread_flavour;
@@ -418,46 +430,173 @@ typedef struct 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
 {
-  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 int name_offset;        /* Offset to library's path name.  */
+  char *name_str;
 }
 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
 {
-  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 int name_offset;           /* 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;
 
+/* For LC_PREBOUND_DYLIB.  */
+
 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.  */
-  asection *section;
+  unsigned int name_offset;          /* Library's path name.  */
+  unsigned int nmodules;             /* Number of modules in library.  */
+  unsigned int linked_modules_offset; /* Bit vector of linked modules.  */
+
+  char *name_str;
+  unsigned char *linked_modules;
 }
 bfd_mach_o_prebound_dylib_command;
 
+/* For LC_UUID.  */
+
+typedef struct bfd_mach_o_uuid_command
+{
+  unsigned char uuid[16];
+}
+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_fvmlib_command
+{
+  unsigned int name_offset;
+  char *name_str;
+  unsigned int minor_version;
+  unsigned int header_addr;
+}
+bfd_mach_o_fvmlib_command;
+
+typedef struct bfd_mach_o_dyld_info_command
+{
+  /* File offset and size to rebase info.  */
+  unsigned int rebase_off;
+  unsigned int rebase_size;
+  unsigned char *rebase_content;
+
+  /* File offset and size of binding info.  */
+  unsigned int bind_off;
+  unsigned int bind_size;
+  unsigned char *bind_content;
+
+  /* File offset and size of weak binding info.  */
+  unsigned int weak_bind_off;
+  unsigned int weak_bind_size;
+  unsigned char *weak_bind_content;
+
+  /* File offset and size of lazy binding info.  */
+  unsigned int lazy_bind_off;
+  unsigned int lazy_bind_size;
+  unsigned char *lazy_bind_content;
+
+  /* File offset and size of export info.  */
+  unsigned int export_off;
+  unsigned int export_size;
+  unsigned char *export_content;
+}
+bfd_mach_o_dyld_info_command;
+
+typedef struct bfd_mach_o_version_min_command
+{
+  uint32_t version;
+  uint32_t sdk;
+}
+bfd_mach_o_version_min_command;
+
+typedef struct bfd_mach_o_encryption_info_command
+{
+  unsigned int cryptoff;
+  unsigned int cryptsize;
+  unsigned int cryptid;
+}
+bfd_mach_o_encryption_info_command;
+
+typedef struct bfd_mach_o_main_command
+{
+  bfd_uint64_t entryoff;
+  bfd_uint64_t stacksize;
+}
+bfd_mach_o_main_command;
+
+typedef struct bfd_mach_o_source_version_command
+{
+  unsigned int a;
+  unsigned short b;
+  unsigned short c;
+  unsigned short d;
+  unsigned short e;
+}
+bfd_mach_o_source_version_command;
+
+typedef struct bfd_mach_o_note_command
+{
+  char data_owner[16];
+  bfd_uint64_t offset;
+  bfd_uint64_t size;
+}
+bfd_mach_o_note_command;
+
+typedef struct bfd_mach_o_build_version_tool
+{
+  uint32_t tool;
+  uint32_t version;
+}
+bfd_mach_o_build_version_tool;
+
+typedef struct bfd_mach_o_build_version_command
+{
+  uint32_t platform;
+  uint32_t minos;
+  uint32_t sdk;
+  uint32_t ntools;
+}
+bfd_mach_o_build_version_command;
+
 typedef struct bfd_mach_o_load_command
 {
+  /* Next command in the single linked list.  */
+  struct bfd_mach_o_load_command *next;
+
+  /* Type and required flag.  */
   bfd_mach_o_load_command_type type;
-  unsigned int type_required;
-  bfd_vma offset;
-  bfd_vma len;
+  bfd_boolean type_required;
+
+  /* Offset and length in the file.  */
+  unsigned int offset;
+  unsigned int len;
+
   union
   {
     bfd_mach_o_segment_command segment;
@@ -467,47 +606,199 @@ 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;
-  }
-  command;
+    bfd_mach_o_prebind_cksum_command prebind_cksum;
+    bfd_mach_o_twolevel_hints_command twolevel_hints;
+    bfd_mach_o_uuid_command uuid;
+    bfd_mach_o_linkedit_command linkedit;
+    bfd_mach_o_str_command str;
+    bfd_mach_o_dyld_info_command dyld_info;
+    bfd_mach_o_version_min_command version_min;
+    bfd_mach_o_encryption_info_command encryption_info;
+    bfd_mach_o_fvmlib_command fvmlib;
+    bfd_mach_o_main_command main;
+    bfd_mach_o_source_version_command source_version;
+    bfd_mach_o_note_command note;
+    bfd_mach_o_build_version_command build_version;
+  } command;
 }
 bfd_mach_o_load_command;
 
 typedef struct mach_o_data_struct
 {
+  /* Mach-O header.  */
   bfd_mach_o_header header;
-  bfd_mach_o_load_command *commands;
-  unsigned long nsymbols;
-  asymbol *symbols;
+
+  /* File offset of the header.  Usually this is 0.  */
+  file_ptr hdr_offset;
+
+  /* Array of load commands (length is given by header.ncmds).  */
+  bfd_mach_o_load_command *first_command;
+  bfd_mach_o_load_command *last_command;
+
+  /* Flatten array of sections.  The array is 0-based.  */
   unsigned long nsects;
   bfd_mach_o_section **sections;
-  bfd *ibfd;
-}
-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;
+
+  /* Used while writing: 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.  Although it is not clearly stated, only one symtab
+     is expected.  */
+  bfd_mach_o_symtab_command *symtab;
+  bfd_mach_o_dysymtab_command *dysymtab;
+
+  /* A place to stash dwarf2 info for this bfd.  */
+  void *dwarf2_find_line_info;
+
+  /* BFD of .dSYM file.  */
+  bfd *dsym_bfd;
+
+  /* Cache of dynamic relocs.  */
+  arelent *dyn_reloc_cache;
+}
+bfd_mach_o_data_struct;
+
+typedef struct bfd_mach_o_xlat_name
+{
+  const char *name;
+  unsigned long val;
+}
+bfd_mach_o_xlat_name;
+
+/* Target specific routines.  */
+
+#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)
+
+/* Get the Mach-O header for section SEC.  */
+#define bfd_mach_o_get_mach_o_section(sec) \
+  ((bfd_mach_o_section *)(sec)->used_by_bfd)
+
+bfd_boolean bfd_mach_o_valid (bfd *);
+bfd_boolean bfd_mach_o_mkobject_init (bfd *);
+bfd_cleanup bfd_mach_o_object_p (bfd *);
+bfd_cleanup bfd_mach_o_core_p (bfd *);
+bfd_cleanup bfd_mach_o_fat_archive_p (bfd *);
+bfd *bfd_mach_o_fat_openr_next_archived_file (bfd *, bfd *);
+bfd_boolean bfd_mach_o_set_arch_mach (bfd *, enum bfd_architecture,
+                                     unsigned long);
+int bfd_mach_o_lookup_command (bfd *, bfd_mach_o_load_command_type, bfd_mach_o_load_command **);
+bfd_boolean bfd_mach_o_new_section_hook (bfd *, asection *);
+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_header_data (bfd *, bfd *);
+bfd_boolean bfd_mach_o_bfd_set_private_flags (bfd *, flagword);
+bfd_boolean bfd_mach_o_bfd_print_private_bfd_data (bfd *, void *);
+long bfd_mach_o_get_symtab_upper_bound (bfd *);
+long bfd_mach_o_canonicalize_symtab (bfd *, asymbol **);
+long bfd_mach_o_get_synthetic_symtab (bfd *, long, asymbol **, long,
+                                     asymbol **, asymbol **ret);
+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 *, void *, asymbol *, bfd_print_symbol_type);
+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 *);
+bfd_cleanup bfd_mach_o_header_p (bfd *, file_ptr, 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 *);
+
+unsigned int bfd_mach_o_get_section_type_from_name (bfd *, const char *);
+unsigned int bfd_mach_o_get_section_attribute_from_name (const char *);
+
+void bfd_mach_o_convert_section_name_to_bfd (bfd *, const char *, const char *,
+                                            const char **, flagword *);
+bfd_boolean bfd_mach_o_find_nearest_line (bfd *, asymbol **,
+                                         asection *, bfd_vma,
+                                         const char **, const char **,
+                                         unsigned int *, unsigned int *);
+#define bfd_mach_o_find_line _bfd_nosymbols_find_line
+bfd_boolean bfd_mach_o_close_and_cleanup (bfd *);
+bfd_boolean bfd_mach_o_free_cached_info (bfd *);
+
+unsigned int bfd_mach_o_section_get_nbr_indirect (bfd *, bfd_mach_o_section *);
+unsigned int bfd_mach_o_section_get_entry_size (bfd *, bfd_mach_o_section *);
+bfd_boolean bfd_mach_o_read_symtab_symbols (bfd *);
+bfd_boolean bfd_mach_o_read_symtab_strtab (bfd *abfd);
+
+bfd_vma bfd_mach_o_get_base_address (bfd *);
+
+void bfd_mach_o_swap_in_non_scattered_reloc (bfd *, bfd_mach_o_reloc_info *,
+                                            unsigned char *);
+bfd_boolean bfd_mach_o_canonicalize_non_scattered_reloc (bfd *, bfd_mach_o_reloc_info *, arelent *, asymbol **);
+bfd_boolean bfd_mach_o_pre_canonicalize_one_reloc (bfd *, struct mach_o_reloc_info_external *, bfd_mach_o_reloc_info *, arelent *, asymbol **);
+
+/* A placeholder in case we need to suppress emitting the dysymtab for some
+   reason (e.g. compatibility with older system versions).  */
+#define bfd_mach_o_should_emit_dysymtab(x) TRUE
+
+extern const bfd_mach_o_xlat_name bfd_mach_o_section_attribute_name[];
+extern const bfd_mach_o_xlat_name bfd_mach_o_section_type_name[];
+
 extern const bfd_target mach_o_fat_vec;
 
+/* Interfaces between BFD names and Mach-O names.  */
+
+typedef struct mach_o_section_name_xlat
+{
+  const char *bfd_name;
+  const char *mach_o_name;
+  flagword bfd_flags;
+  unsigned int macho_sectype;
+  unsigned int macho_secattr;
+  unsigned int sectalign;
+} mach_o_section_name_xlat;
+
+typedef struct mach_o_segment_name_xlat
+{
+  const char *segname;
+  const mach_o_section_name_xlat *sections;
+} mach_o_segment_name_xlat;
+
+const mach_o_section_name_xlat *
+bfd_mach_o_section_data_for_mach_sect (bfd *, const char *, const char *);
+const mach_o_section_name_xlat *
+bfd_mach_o_section_data_for_bfd_name (bfd *, const char *, const char **);
+
+typedef struct bfd_mach_o_backend_data
+{
+  enum bfd_architecture arch;
+  bfd_vma page_size;
+  bfd_boolean (*_bfd_mach_o_canonicalize_one_reloc)
+  (bfd *, struct mach_o_reloc_info_external *, arelent *, asymbol **, arelent *);
+  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 *);
+  const mach_o_segment_name_xlat *segsec_names_xlat;
+  bfd_boolean (*bfd_mach_o_section_type_valid_for_target) (unsigned long);
+}
+bfd_mach_o_backend_data;
+
+/* Values used in symbol.udata.i, to signal that the mach-o-specific data in the
+   symbol are not yet set, or need validation (where this is possible).  */
+
+#define SYM_MACHO_FIELDS_UNSET ((bfd_vma) -1)
+#define SYM_MACHO_FIELDS_NOT_VALIDATED ((bfd_vma) -2)
+
+#ifdef __cplusplus
+}
+#endif
+
 #endif /* _BFD_MACH_O_H_ */
This page took 0.031096 seconds and 4 git commands to generate.