(root)/
binutils-2.41/
bfd/
mach-o.h
       1  /* Mach-O support for BFD.
       2     Copyright (C) 1999-2023 Free Software Foundation, Inc.
       3  
       4     This file is part of BFD, the Binary File Descriptor library.
       5  
       6     This program is free software; you can redistribute it and/or modify
       7     it under the terms of the GNU General Public License as published by
       8     the Free Software Foundation; either version 3 of the License, or
       9     (at your option) any later version.
      10  
      11     This program is distributed in the hope that it will be useful,
      12     but WITHOUT ANY WARRANTY; without even the implied warranty of
      13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      14     GNU General Public License for more details.
      15  
      16     You should have received a copy of the GNU General Public License
      17     along with this program; if not, write to the Free Software
      18     Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
      19     MA 02110-1301, USA.  */
      20  
      21  #ifndef _BFD_MACH_O_H_
      22  #define _BFD_MACH_O_H_
      23  
      24  #include "mach-o/loader.h"
      25  #include "mach-o/external.h"
      26  
      27  #ifdef __cplusplus
      28  extern "C" {
      29  #endif
      30  
      31  typedef struct bfd_mach_o_header
      32  {
      33    unsigned long magic;
      34    unsigned long cputype;
      35    unsigned long cpusubtype;
      36    unsigned long filetype;
      37    unsigned long ncmds;
      38    unsigned long sizeofcmds;
      39    unsigned long flags;
      40    unsigned int reserved;
      41    /* Version 1: 32 bits, version 2: 64 bits.  */
      42    unsigned int version;
      43    enum bfd_endian byteorder;
      44  }
      45  bfd_mach_o_header;
      46  
      47  typedef struct bfd_mach_o_asymbol
      48  {
      49    /* The actual symbol which the rest of BFD works with.  */
      50    asymbol symbol;
      51  
      52    /* Mach-O symbol fields.  */
      53    unsigned char n_type;
      54    unsigned char n_sect;
      55    unsigned short n_desc;
      56  }
      57  bfd_mach_o_asymbol;
      58  
      59  #define BFD_MACH_O_SEGNAME_SIZE 16
      60  #define BFD_MACH_O_SECTNAME_SIZE 16
      61  
      62  typedef struct bfd_mach_o_section
      63  {
      64    /* Fields present in the file.  */
      65    char sectname[BFD_MACH_O_SECTNAME_SIZE + 1];	/* Always NUL padded.  */
      66    char segname[BFD_MACH_O_SEGNAME_SIZE + 1];
      67    bfd_vma addr;
      68    bfd_vma size;
      69    bfd_vma offset;
      70    unsigned long align;
      71    bfd_vma reloff;
      72    unsigned long nreloc;
      73    unsigned long flags;
      74    unsigned long reserved1;
      75    unsigned long reserved2;
      76    unsigned long reserved3;
      77  
      78    /* Corresponding bfd section.  */
      79    asection *bfdsection;
      80  
      81    /* An array holding the indirect symbols for this section.
      82       NULL values indicate local symbols.
      83       The number of symbols is determined from the section size and type.  */
      84  
      85    bfd_mach_o_asymbol **indirect_syms;
      86  
      87    /* Simply linked list.  */
      88    struct bfd_mach_o_section *next;
      89  }
      90  bfd_mach_o_section;
      91  
      92  typedef struct bfd_mach_o_segment_command
      93  {
      94    char segname[BFD_MACH_O_SEGNAME_SIZE + 1];
      95    bfd_vma vmaddr;
      96    bfd_vma vmsize;
      97    bfd_vma fileoff;
      98    unsigned long filesize;
      99    unsigned long maxprot;	/* Maximum permitted protection.  */
     100    unsigned long initprot;	/* Initial protection.  */
     101    unsigned long nsects;
     102    unsigned long flags;
     103  
     104    /* Linked list of sections.  */
     105    bfd_mach_o_section *sect_head;
     106    bfd_mach_o_section *sect_tail;
     107  }
     108  bfd_mach_o_segment_command;
     109  
     110  /* Protection flags.  */
     111  #define BFD_MACH_O_PROT_READ    0x01
     112  #define BFD_MACH_O_PROT_WRITE   0x02
     113  #define BFD_MACH_O_PROT_EXECUTE 0x04
     114  
     115  /* Target platforms.  */
     116  #define BFD_MACH_O_PLATFORM_MACOS    1
     117  #define BFD_MACH_O_PLATFORM_IOS      2
     118  #define BFD_MACH_O_PLATFORM_TVOS     3
     119  #define BFD_MACH_O_PLATFORM_WATCHOS  4
     120  #define BFD_MACH_O_PLATFORM_BRIDGEOS 5
     121  
     122  /* Build tools.  */
     123  #define BFD_MACH_O_TOOL_CLANG 1
     124  #define BFD_MACH_O_TOOL_SWIFT 2
     125  #define BFD_MACH_O_TOOL_LD    3
     126  
     127  /* Expanded internal representation of a relocation entry.  */
     128  typedef struct bfd_mach_o_reloc_info
     129  {
     130    bfd_vma r_address;
     131    bfd_vma r_value;
     132    unsigned int r_scattered : 1;
     133    unsigned int r_type : 4;
     134    unsigned int r_pcrel : 1;
     135    unsigned int r_length : 2;
     136    unsigned int r_extern : 1;
     137  }
     138  bfd_mach_o_reloc_info;
     139  
     140  /* The symbol table is sorted like this:
     141   (1) local.
     142  	(otherwise in order of generation)
     143   (2) external defined
     144  	(sorted by name)
     145   (3) external undefined / common
     146  	(sorted by name)
     147  */
     148  
     149  typedef struct bfd_mach_o_symtab_command
     150  {
     151    unsigned int symoff;
     152    unsigned int nsyms;
     153    unsigned int stroff;
     154    unsigned int strsize;
     155    bfd_mach_o_asymbol *symbols;
     156    char *strtab;
     157  }
     158  bfd_mach_o_symtab_command;
     159  
     160  /* This is the second set of the symbolic information which is used to support
     161     the data structures for the dynamically link editor.
     162  
     163     The original set of symbolic information in the symtab_command which contains
     164     the symbol and string tables must also be present when this load command is
     165     present.  When this load command is present the symbol table is organized
     166     into three groups of symbols:
     167         local symbols (static and debugging symbols) - grouped by module
     168         defined external symbols - grouped by module (sorted by name if not lib)
     169         undefined external symbols (sorted by name)
     170     In this load command there are offsets and counts to each of the three groups
     171     of symbols.
     172  
     173     This load command contains a the offsets and sizes of the following new
     174     symbolic information tables:
     175         table of contents
     176         module table
     177         reference symbol table
     178         indirect symbol table
     179     The first three tables above (the table of contents, module table and
     180     reference symbol table) are only present if the file is a dynamically linked
     181     shared library.  For executable and object modules, which are files
     182     containing only one module, the information that would be in these three
     183     tables is determined as follows:
     184         table of contents - the defined external symbols are sorted by name
     185         module table - the file contains only one module so everything in the
     186  		      file is part of the module.
     187         reference symbol table - is the defined and undefined external symbols
     188  
     189     For dynamically linked shared library files this load command also contains
     190     offsets and sizes to the pool of relocation entries for all sections
     191     separated into two groups:
     192         external relocation entries
     193         local relocation entries
     194     For executable and object modules the relocation entries continue to hang
     195     off the section structures.  */
     196  
     197  typedef struct bfd_mach_o_dylib_module
     198  {
     199    /* Index into the string table indicating the name of the module.  */
     200    unsigned long module_name_idx;
     201    char *module_name;
     202  
     203    /* Index into the symbol table of the first defined external symbol provided
     204       by the module.  */
     205    unsigned long iextdefsym;
     206  
     207    /* Number of external symbols provided by this module.  */
     208    unsigned long nextdefsym;
     209  
     210    /* Index into the external reference table of the first entry
     211       provided by this module.  */
     212    unsigned long irefsym;
     213  
     214    /* Number of external reference entries provided by this module.  */
     215    unsigned long nrefsym;
     216  
     217    /* Index into the symbol table of the first local symbol provided by this
     218       module.  */
     219    unsigned long ilocalsym;
     220  
     221    /* Number of local symbols provided by this module.  */
     222    unsigned long nlocalsym;
     223  
     224    /* Index into the external relocation table of the first entry provided
     225       by this module.  */
     226    unsigned long iextrel;
     227  
     228    /* Number of external relocation entries provided by this module.  */
     229    unsigned long nextrel;
     230  
     231    /* Index in the module initialization section to the pointers for this
     232       module.  */
     233    unsigned short iinit;
     234  
     235    /* Index in the module termination section to the pointers for this
     236       module.  */
     237    unsigned short iterm;
     238  
     239    /* Number of pointers in the module initialization for this module.  */
     240    unsigned short ninit;
     241  
     242    /* Number of pointers in the module termination for this module.  */
     243    unsigned short nterm;
     244  
     245    /* Number of data byte for this module that are used in the __module_info
     246       section of the __OBJC segment.  */
     247    unsigned long objc_module_info_size;
     248  
     249    /* Statically linked address of the start of the data for this module
     250       in the __module_info section of the __OBJC_segment.  */
     251    bfd_vma objc_module_info_addr;
     252  }
     253  bfd_mach_o_dylib_module;
     254  
     255  typedef struct bfd_mach_o_dylib_table_of_content
     256  {
     257    /* Index into the symbol table to the defined external symbol.  */
     258    unsigned long symbol_index;
     259  
     260    /* Index into the module table to the module for this entry.  */
     261    unsigned long module_index;
     262  }
     263  bfd_mach_o_dylib_table_of_content;
     264  
     265  typedef struct bfd_mach_o_dylib_reference
     266  {
     267    /* Index into the symbol table for the symbol being referenced.  */
     268    unsigned long isym;
     269  
     270    /* Type of the reference being made (use REFERENCE_FLAGS constants).  */
     271    unsigned long flags;
     272  }
     273  bfd_mach_o_dylib_reference;
     274  #define BFD_MACH_O_REFERENCE_SIZE 4
     275  
     276  typedef struct bfd_mach_o_dysymtab_command
     277  {
     278    /* The symbols indicated by symoff and nsyms of the LC_SYMTAB load command
     279       are grouped into the following three groups:
     280         local symbols (further grouped by the module they are from)
     281         defined external symbols (further grouped by the module they are from)
     282         undefined symbols
     283  
     284       The local symbols are used only for debugging.  The dynamic binding
     285       process may have to use them to indicate to the debugger the local
     286       symbols for a module that is being bound.
     287  
     288       The last two groups are used by the dynamic binding process to do the
     289       binding (indirectly through the module table and the reference symbol
     290       table when this is a dynamically linked shared library file).  */
     291  
     292    unsigned long ilocalsym;    /* Index to local symbols.  */
     293    unsigned long nlocalsym;    /* Number of local symbols.  */
     294    unsigned long iextdefsym;   /* Index to externally defined symbols.  */
     295    unsigned long nextdefsym;   /* Number of externally defined symbols.  */
     296    unsigned long iundefsym;    /* Index to undefined symbols.  */
     297    unsigned long nundefsym;    /* Number of undefined symbols.  */
     298  
     299    /* For the for the dynamic binding process to find which module a symbol
     300       is defined in the table of contents is used (analogous to the ranlib
     301       structure in an archive) which maps defined external symbols to modules
     302       they are defined in.  This exists only in a dynamically linked shared
     303       library file.  For executable and object modules the defined external
     304       symbols are sorted by name and is use as the table of contents.  */
     305  
     306    unsigned long tocoff;       /* File offset to table of contents.  */
     307    unsigned long ntoc;	      /* Number of entries in table of contents.  */
     308  
     309    /* To support dynamic binding of "modules" (whole object files) the symbol
     310       table must reflect the modules that the file was created from.  This is
     311       done by having a module table that has indexes and counts into the merged
     312       tables for each module.  The module structure that these two entries
     313       refer to is described below.  This exists only in a dynamically linked
     314       shared library file.  For executable and object modules the file only
     315       contains one module so everything in the file belongs to the module.  */
     316  
     317    unsigned long modtaboff;    /* File offset to module table.  */
     318    unsigned long nmodtab;      /* Number of module table entries.  */
     319  
     320    /* To support dynamic module binding the module structure for each module
     321       indicates the external references (defined and undefined) each module
     322       makes.  For each module there is an offset and a count into the
     323       reference symbol table for the symbols that the module references.
     324       This exists only in a dynamically linked shared library file.  For
     325       executable and object modules the defined external symbols and the
     326       undefined external symbols indicates the external references.  */
     327  
     328    unsigned long extrefsymoff;  /* Offset to referenced symbol table.  */
     329    unsigned long nextrefsyms;   /* Number of referenced symbol table entries.  */
     330  
     331    /* The sections that contain "symbol pointers" and "routine stubs" have
     332       indexes and (implied counts based on the size of the section and fixed
     333       size of the entry) into the "indirect symbol" table for each pointer
     334       and stub.  For every section of these two types the index into the
     335       indirect symbol table is stored in the section header in the field
     336       reserved1.  An indirect symbol table entry is simply a 32bit index into
     337       the symbol table to the symbol that the pointer or stub is referring to.
     338       The indirect symbol table is ordered to match the entries in the section.  */
     339  
     340    unsigned long indirectsymoff; /* File offset to the indirect symbol table.  */
     341    unsigned long nindirectsyms;  /* Number of indirect symbol table entries.  */
     342  
     343    /* To support relocating an individual module in a library file quickly the
     344       external relocation entries for each module in the library need to be
     345       accessed efficiently.  Since the relocation entries can't be accessed
     346       through the section headers for a library file they are separated into
     347       groups of local and external entries further grouped by module.  In this
     348       case the presents of this load command who's extreloff, nextrel,
     349       locreloff and nlocrel fields are non-zero indicates that the relocation
     350       entries of non-merged sections are not referenced through the section
     351       structures (and the reloff and nreloc fields in the section headers are
     352       set to zero).
     353  
     354       Since the relocation entries are not accessed through the section headers
     355       this requires the r_address field to be something other than a section
     356       offset to identify the item to be relocated.  In this case r_address is
     357       set to the offset from the vmaddr of the first LC_SEGMENT command.
     358  
     359       The relocation entries are grouped by module and the module table
     360       entries have indexes and counts into them for the group of external
     361       relocation entries for that the module.
     362  
     363       For sections that are merged across modules there must not be any
     364       remaining external relocation entries for them (for merged sections
     365       remaining relocation entries must be local).  */
     366  
     367    unsigned long extreloff;    /* Offset to external relocation entries.  */
     368    unsigned long nextrel;      /* Number of external relocation entries.  */
     369  
     370    /* All the local relocation entries are grouped together (they are not
     371       grouped by their module since they are only used if the object is moved
     372       from it statically link edited address).  */
     373  
     374    unsigned long locreloff;    /* Offset to local relocation entries.  */
     375    unsigned long nlocrel;      /* Number of local relocation entries.  */
     376  
     377    bfd_mach_o_dylib_module *dylib_module;
     378    bfd_mach_o_dylib_table_of_content *dylib_toc;
     379    unsigned int *indirect_syms;
     380    bfd_mach_o_dylib_reference *ext_refs;
     381  }
     382  bfd_mach_o_dysymtab_command;
     383  
     384  /* An indirect symbol table entry is simply a 32bit index into the symbol table
     385     to the symbol that the pointer or stub is refering to.  Unless it is for a
     386     non-lazy symbol pointer section for a defined symbol which strip(1) has
     387     removed.  In which case it has the value INDIRECT_SYMBOL_LOCAL.  If the
     388     symbol was also absolute INDIRECT_SYMBOL_ABS is or'ed with that.  */
     389  
     390  #define BFD_MACH_O_INDIRECT_SYMBOL_LOCAL 0x80000000
     391  #define BFD_MACH_O_INDIRECT_SYMBOL_ABS   0x40000000
     392  #define BFD_MACH_O_INDIRECT_SYMBOL_SIZE  4
     393  
     394  /* For LC_TWOLEVEL_HINTS.  */
     395  
     396  typedef struct bfd_mach_o_twolevel_hints_command
     397  {
     398    /* Offset to the hint table.  */
     399    unsigned int offset;
     400  
     401    /* Number of entries in the table.  */
     402    unsigned int nhints;
     403  }
     404  bfd_mach_o_twolevel_hints_command;
     405  
     406  /* For LC_PREBIND_CKSUM.  */
     407  
     408  typedef struct bfd_mach_o_prebind_cksum_command
     409  {
     410    /* Checksum or zero.  */
     411    unsigned int cksum;
     412  }
     413  bfd_mach_o_prebind_cksum_command;
     414  
     415  /* For LC_THREAD or LC_UNIXTHREAD.  */
     416  
     417  typedef struct bfd_mach_o_thread_flavour
     418  {
     419    unsigned long flavour;
     420    unsigned long offset;
     421    unsigned long size;
     422  }
     423  bfd_mach_o_thread_flavour;
     424  
     425  typedef struct bfd_mach_o_thread_command
     426  {
     427    unsigned long nflavours;
     428    bfd_mach_o_thread_flavour *flavours;
     429    asection *section;
     430  }
     431  bfd_mach_o_thread_command;
     432  
     433  /* For LC_LOAD_DYLINKER and LC_ID_DYLINKER.  */
     434  
     435  typedef struct bfd_mach_o_dylinker_command
     436  {
     437    unsigned int name_offset;	    /* Offset to library's path name.  */
     438    char *name_str;
     439  }
     440  bfd_mach_o_dylinker_command;
     441  
     442  /* For LC_LOAD_DYLIB, LC_LOAD_WEAK_DYLIB, LC_ID_DYLIB
     443     or LC_REEXPORT_DYLIB.  */
     444  
     445  typedef struct bfd_mach_o_dylib_command
     446  {
     447    unsigned int name_offset;	       /* Offset to library's path name.  */
     448    unsigned long timestamp;	       /* Library's build time stamp.  */
     449    unsigned long current_version;       /* Library's current version number.  */
     450    unsigned long compatibility_version; /* Library's compatibility vers number.  */
     451    char *name_str;
     452  }
     453  bfd_mach_o_dylib_command;
     454  
     455  /* For LC_PREBOUND_DYLIB.  */
     456  
     457  typedef struct bfd_mach_o_prebound_dylib_command
     458  {
     459    unsigned int name_offset;	      /* Library's path name.  */
     460    unsigned int nmodules;	      /* Number of modules in library.  */
     461    unsigned int linked_modules_offset; /* Bit vector of linked modules.  */
     462  
     463    char *name_str;
     464    unsigned char *linked_modules;
     465  }
     466  bfd_mach_o_prebound_dylib_command;
     467  
     468  /* For LC_UUID.  */
     469  
     470  typedef struct bfd_mach_o_uuid_command
     471  {
     472    unsigned char uuid[16];
     473  }
     474  bfd_mach_o_uuid_command;
     475  
     476  /* For LC_CODE_SIGNATURE or LC_SEGMENT_SPLIT_INFO.  */
     477  
     478  typedef struct bfd_mach_o_linkedit_command
     479  {
     480    unsigned long dataoff;
     481    unsigned long datasize;
     482  }
     483  bfd_mach_o_linkedit_command;
     484  
     485  typedef struct bfd_mach_o_str_command
     486  {
     487    unsigned long stroff;
     488    unsigned long str_len;
     489    char *str;
     490  }
     491  bfd_mach_o_str_command;
     492  
     493  typedef struct bfd_mach_o_fvmlib_command
     494  {
     495    unsigned int name_offset;
     496    char *name_str;
     497    unsigned int minor_version;
     498    unsigned int header_addr;
     499  }
     500  bfd_mach_o_fvmlib_command;
     501  
     502  typedef struct bfd_mach_o_dyld_info_command
     503  {
     504    /* File offset and size to rebase info.  */
     505    unsigned int rebase_off;
     506    unsigned int rebase_size;
     507    unsigned char *rebase_content;
     508  
     509    /* File offset and size of binding info.  */
     510    unsigned int bind_off;
     511    unsigned int bind_size;
     512    unsigned char *bind_content;
     513  
     514    /* File offset and size of weak binding info.  */
     515    unsigned int weak_bind_off;
     516    unsigned int weak_bind_size;
     517    unsigned char *weak_bind_content;
     518  
     519    /* File offset and size of lazy binding info.  */
     520    unsigned int lazy_bind_off;
     521    unsigned int lazy_bind_size;
     522    unsigned char *lazy_bind_content;
     523  
     524    /* File offset and size of export info.  */
     525    unsigned int export_off;
     526    unsigned int export_size;
     527    unsigned char *export_content;
     528  }
     529  bfd_mach_o_dyld_info_command;
     530  
     531  typedef struct bfd_mach_o_version_min_command
     532  {
     533    uint32_t version;
     534    uint32_t sdk;
     535  }
     536  bfd_mach_o_version_min_command;
     537  
     538  typedef struct bfd_mach_o_encryption_info_command
     539  {
     540    unsigned int cryptoff;
     541    unsigned int cryptsize;
     542    unsigned int cryptid;
     543  }
     544  bfd_mach_o_encryption_info_command;
     545  
     546  typedef struct bfd_mach_o_main_command
     547  {
     548    uint64_t entryoff;
     549    uint64_t stacksize;
     550  }
     551  bfd_mach_o_main_command;
     552  
     553  typedef struct bfd_mach_o_source_version_command
     554  {
     555    unsigned int a;
     556    unsigned short b;
     557    unsigned short c;
     558    unsigned short d;
     559    unsigned short e;
     560  }
     561  bfd_mach_o_source_version_command;
     562  
     563  typedef struct bfd_mach_o_note_command
     564  {
     565    char data_owner[16];
     566    uint64_t offset;
     567    uint64_t size;
     568  }
     569  bfd_mach_o_note_command;
     570  
     571  typedef struct bfd_mach_o_build_version_tool
     572  {
     573    uint32_t tool;
     574    uint32_t version;
     575  }
     576  bfd_mach_o_build_version_tool;
     577  
     578  typedef struct bfd_mach_o_build_version_command
     579  {
     580    uint32_t platform;
     581    uint32_t minos;
     582    uint32_t sdk;
     583    uint32_t ntools;
     584  }
     585  bfd_mach_o_build_version_command;
     586  
     587  typedef struct bfd_mach_o_load_command
     588  {
     589    /* Next command in the single linked list.  */
     590    struct bfd_mach_o_load_command *next;
     591  
     592    /* Type and required flag.  */
     593    bfd_mach_o_load_command_type type;
     594    bool type_required;
     595  
     596    /* Offset and length in the file.  */
     597    unsigned int offset;
     598    unsigned int len;
     599  
     600    union
     601    {
     602      bfd_mach_o_segment_command segment;
     603      bfd_mach_o_symtab_command symtab;
     604      bfd_mach_o_dysymtab_command dysymtab;
     605      bfd_mach_o_thread_command thread;
     606      bfd_mach_o_dylib_command dylib;
     607      bfd_mach_o_dylinker_command dylinker;
     608      bfd_mach_o_prebound_dylib_command prebound_dylib;
     609      bfd_mach_o_prebind_cksum_command prebind_cksum;
     610      bfd_mach_o_twolevel_hints_command twolevel_hints;
     611      bfd_mach_o_uuid_command uuid;
     612      bfd_mach_o_linkedit_command linkedit;
     613      bfd_mach_o_str_command str;
     614      bfd_mach_o_dyld_info_command dyld_info;
     615      bfd_mach_o_version_min_command version_min;
     616      bfd_mach_o_encryption_info_command encryption_info;
     617      bfd_mach_o_fvmlib_command fvmlib;
     618      bfd_mach_o_main_command main;
     619      bfd_mach_o_source_version_command source_version;
     620      bfd_mach_o_note_command note;
     621      bfd_mach_o_build_version_command build_version;
     622    } command;
     623  }
     624  bfd_mach_o_load_command;
     625  
     626  typedef struct mach_o_data_struct
     627  {
     628    /* Mach-O header.  */
     629    bfd_mach_o_header header;
     630  
     631    /* File offset of the header.  Usually this is 0.  */
     632    file_ptr hdr_offset;
     633  
     634    /* Array of load commands (length is given by header.ncmds).  */
     635    bfd_mach_o_load_command *first_command;
     636    bfd_mach_o_load_command *last_command;
     637  
     638    /* Flatten array of sections.  The array is 0-based.  */
     639    unsigned long nsects;
     640    bfd_mach_o_section **sections;
     641  
     642    /* Used while writing: current length of the output file.  This is used
     643       to allocate space in the file.  */
     644    ufile_ptr filelen;
     645  
     646    /* As symtab is referenced by other load command, it is handy to have
     647       a direct access to it.  Although it is not clearly stated, only one symtab
     648       is expected.  */
     649    bfd_mach_o_symtab_command *symtab;
     650    bfd_mach_o_dysymtab_command *dysymtab;
     651  
     652    /* A place to stash dwarf2 info for this bfd.  */
     653    void *dwarf2_find_line_info;
     654  
     655    /* BFD of .dSYM file.  */
     656    bfd *dsym_bfd;
     657  
     658    /* Cache of dynamic relocs.  */
     659    arelent *dyn_reloc_cache;
     660  }
     661  bfd_mach_o_data_struct;
     662  
     663  typedef struct bfd_mach_o_xlat_name
     664  {
     665    const char *name;
     666    unsigned long val;
     667  }
     668  bfd_mach_o_xlat_name;
     669  
     670  /* Target specific routines.  */
     671  
     672  #define bfd_mach_o_get_data(abfd) ((abfd)->tdata.mach_o_data)
     673  #define bfd_mach_o_get_backend_data(abfd) \
     674    ((bfd_mach_o_backend_data*)(abfd)->xvec->backend_data)
     675  
     676  /* Get the Mach-O header for section SEC.  */
     677  #define bfd_mach_o_get_mach_o_section(sec) \
     678    ((bfd_mach_o_section *)(sec)->used_by_bfd)
     679  
     680  bool bfd_mach_o_valid (bfd *);
     681  bool bfd_mach_o_mkobject_init (bfd *);
     682  bfd_cleanup bfd_mach_o_object_p (bfd *);
     683  bfd_cleanup bfd_mach_o_core_p (bfd *);
     684  bfd_cleanup bfd_mach_o_fat_archive_p (bfd *);
     685  bfd *bfd_mach_o_fat_openr_next_archived_file (bfd *, bfd *);
     686  bool bfd_mach_o_set_arch_mach (bfd *, enum bfd_architecture, unsigned long);
     687  int bfd_mach_o_lookup_command (bfd *, bfd_mach_o_load_command_type,
     688  			       bfd_mach_o_load_command **);
     689  bool bfd_mach_o_new_section_hook (bfd *, asection *);
     690  bool bfd_mach_o_write_contents (bfd *);
     691  bool bfd_mach_o_bfd_copy_private_symbol_data (bfd *, asymbol *,
     692  					      bfd *, asymbol *);
     693  bool bfd_mach_o_bfd_copy_private_section_data (bfd *, asection *,
     694  					       bfd *, asection *);
     695  bool bfd_mach_o_bfd_copy_private_header_data (bfd *, bfd *);
     696  bool bfd_mach_o_bfd_set_private_flags (bfd *, flagword);
     697  bool bfd_mach_o_bfd_print_private_bfd_data (bfd *, void *);
     698  long bfd_mach_o_get_symtab_upper_bound (bfd *);
     699  long bfd_mach_o_canonicalize_symtab (bfd *, asymbol **);
     700  long bfd_mach_o_get_synthetic_symtab (bfd *, long, asymbol **, long,
     701  				      asymbol **, asymbol **ret);
     702  long bfd_mach_o_get_reloc_upper_bound (bfd *, asection *);
     703  long bfd_mach_o_canonicalize_reloc (bfd *, asection *, arelent **, asymbol **);
     704  long bfd_mach_o_get_dynamic_reloc_upper_bound (bfd *);
     705  long bfd_mach_o_canonicalize_dynamic_reloc (bfd *, arelent **, asymbol **);
     706  asymbol *bfd_mach_o_make_empty_symbol (bfd *);
     707  void bfd_mach_o_get_symbol_info (bfd *, asymbol *, symbol_info *);
     708  void bfd_mach_o_print_symbol (bfd *, void *, asymbol *, bfd_print_symbol_type);
     709  int bfd_mach_o_sizeof_headers (bfd *, struct bfd_link_info *);
     710  unsigned long bfd_mach_o_stack_addr (enum bfd_mach_o_cpu_type);
     711  int bfd_mach_o_core_fetch_environment (bfd *, unsigned char **, unsigned int *);
     712  char *bfd_mach_o_core_file_failing_command (bfd *);
     713  int bfd_mach_o_core_file_failing_signal (bfd *);
     714  bool bfd_mach_o_core_file_matches_executable_p (bfd *, bfd *);
     715  bfd *bfd_mach_o_fat_extract (bfd *, bfd_format , const bfd_arch_info_type *);
     716  bfd_cleanup bfd_mach_o_header_p (bfd *, file_ptr, bfd_mach_o_filetype,
     717  				 bfd_mach_o_cpu_type);
     718  bool bfd_mach_o_build_commands (bfd *);
     719  bool bfd_mach_o_set_section_contents (bfd *, asection *, const void *,
     720  				      file_ptr, bfd_size_type);
     721  unsigned int bfd_mach_o_version (bfd *);
     722  
     723  unsigned int bfd_mach_o_get_section_type_from_name (bfd *, const char *);
     724  unsigned int bfd_mach_o_get_section_attribute_from_name (const char *);
     725  
     726  void bfd_mach_o_convert_section_name_to_bfd (bfd *, const char *, const char *,
     727  					     const char **, flagword *);
     728  bool bfd_mach_o_find_nearest_line (bfd *, asymbol **,
     729  					  asection *, bfd_vma,
     730  					  const char **, const char **,
     731  					  unsigned int *, unsigned int *);
     732  #define bfd_mach_o_find_nearest_line_with_alt \
     733    _bfd_nosymbols_find_nearest_line_with_alt
     734  #define bfd_mach_o_find_line _bfd_nosymbols_find_line
     735  bool bfd_mach_o_close_and_cleanup (bfd *);
     736  bool bfd_mach_o_bfd_free_cached_info (bfd *);
     737  
     738  unsigned int bfd_mach_o_section_get_nbr_indirect (bfd *, bfd_mach_o_section *);
     739  unsigned int bfd_mach_o_section_get_entry_size (bfd *, bfd_mach_o_section *);
     740  bool bfd_mach_o_read_symtab_symbols (bfd *);
     741  bool bfd_mach_o_read_symtab_strtab (bfd *abfd);
     742  
     743  bfd_vma bfd_mach_o_get_base_address (bfd *);
     744  
     745  void bfd_mach_o_swap_in_non_scattered_reloc (bfd *, bfd_mach_o_reloc_info *,
     746  					     unsigned char *);
     747  bool bfd_mach_o_canonicalize_non_scattered_reloc (bfd *, bfd_mach_o_reloc_info *, arelent *, asymbol **);
     748  bool bfd_mach_o_pre_canonicalize_one_reloc (bfd *, struct mach_o_reloc_info_external *, bfd_mach_o_reloc_info *, arelent *, asymbol **);
     749  
     750  /* A placeholder in case we need to suppress emitting the dysymtab for some
     751     reason (e.g. compatibility with older system versions).  */
     752  #define bfd_mach_o_should_emit_dysymtab(x) true
     753  
     754  extern const bfd_mach_o_xlat_name bfd_mach_o_section_attribute_name[];
     755  extern const bfd_mach_o_xlat_name bfd_mach_o_section_type_name[];
     756  
     757  extern const bfd_target mach_o_fat_vec;
     758  
     759  /* Interfaces between BFD names and Mach-O names.  */
     760  
     761  typedef struct mach_o_section_name_xlat
     762  {
     763    const char *bfd_name;
     764    const char *mach_o_name;
     765    flagword bfd_flags;
     766    unsigned int macho_sectype;
     767    unsigned int macho_secattr;
     768    unsigned int sectalign;
     769  } mach_o_section_name_xlat;
     770  
     771  typedef struct mach_o_segment_name_xlat
     772  {
     773    const char *segname;
     774    const mach_o_section_name_xlat *sections;
     775  } mach_o_segment_name_xlat;
     776  
     777  const mach_o_section_name_xlat *
     778  bfd_mach_o_section_data_for_mach_sect (bfd *, const char *, const char *);
     779  const mach_o_section_name_xlat *
     780  bfd_mach_o_section_data_for_bfd_name (bfd *, const char *, const char **);
     781  
     782  typedef struct bfd_mach_o_backend_data
     783  {
     784    enum bfd_architecture arch;
     785    bfd_vma page_size;
     786    bool (*_bfd_mach_o_canonicalize_one_reloc)
     787    (bfd *, struct mach_o_reloc_info_external *, arelent *, asymbol **, arelent *);
     788    bool (*_bfd_mach_o_swap_reloc_out)(arelent *, bfd_mach_o_reloc_info *);
     789    bool (*_bfd_mach_o_print_thread)(bfd *, bfd_mach_o_thread_flavour *,
     790  					  void *, char *);
     791    const mach_o_segment_name_xlat *segsec_names_xlat;
     792    bool (*bfd_mach_o_section_type_valid_for_target) (unsigned long);
     793  }
     794  bfd_mach_o_backend_data;
     795  
     796  /* Values used in symbol.udata.i, to signal that the mach-o-specific data in the
     797     symbol are not yet set, or need validation (where this is possible).  */
     798  
     799  #define SYM_MACHO_FIELDS_UNSET ((bfd_vma) -1)
     800  #define SYM_MACHO_FIELDS_NOT_VALIDATED ((bfd_vma) -2)
     801  
     802  #ifdef __cplusplus
     803  }
     804  #endif
     805  
     806  #endif /* _BFD_MACH_O_H_ */