X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=bfd%2Fmach-o.h;h=278bdd531545a8668ff63e95945c42a56308dbb4;hb=refs%2Fheads%2Fconcurrent-displaced-stepping-2020-04-01;hp=5401587765dcfa4efba0afc8cb82ddbac484c1da;hpb=c2f09c751bc27ae3c27cbb19ed65678c39b0c565;p=deliverable%2Fbinutils-gdb.git diff --git a/bfd/mach-o.h b/bfd/mach-o.h index 5401587765..278bdd5315 100644 --- a/bfd/mach-o.h +++ b/bfd/mach-o.h @@ -1,6 +1,5 @@ /* Mach-O support for BFD. - Copyright 1999, 2000, 2001, 2002, 2003, 2005, 2007, 2008, 2009 - Free Software Foundation, Inc. + Copyright (C) 1999-2020 Free Software Foundation, Inc. This file is part of BFD, the Binary File Descriptor library. @@ -22,223 +21,12 @@ #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_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 - -#define BFD_MACH_O_SYM_NTYPE(SYM) (((SYM)->udata.i >> 24) & 0xff) -#define BFD_MACH_O_SYM_NSECT(SYM) (((SYM)->udata.i >> 16) & 0xff) -#define BFD_MACH_O_SYM_NDESC(SYM) ((SYM)->udata.i & 0xffff) - -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 -{ - 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; - -/* Defined in */ -typedef enum bfd_mach_o_i386_thread_flavour -{ - BFD_MACH_O_x86_THREAD_STATE32 = 1, - BFD_MACH_O_x86_FLOAT_STATE32 = 2, - BFD_MACH_O_x86_EXCEPTION_STATE32 = 3, - BFD_MACH_O_x86_THREAD_STATE64 = 4, - BFD_MACH_O_x86_FLOAT_STATE64 = 5, - BFD_MACH_O_x86_EXCEPTION_STATE64 = 6, - BFD_MACH_O_x86_THREAD_STATE = 7, - BFD_MACH_O_x86_FLOAT_STATE = 8, - BFD_MACH_O_x86_EXCEPTION_STATE = 9, - BFD_MACH_O_x86_DEBUG_STATE32 = 10, - BFD_MACH_O_x86_DEBUG_STATE64 = 11, - BFD_MACH_O_x86_DEBUG_STATE = 12, - BFD_MACH_O_THREAD_STATE_NONE = 13 -} -bfd_mach_o_i386_thread_flavour; - -#define BFD_MACH_O_LC_REQ_DYLD 0x80000000 - -typedef enum bfd_mach_o_load_command_type -{ - 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_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; - -#define BFD_MACH_O_CPU_IS64BIT 0x1000000 - -typedef enum bfd_mach_o_cpu_type -{ - BFD_MACH_O_CPU_TYPE_VAX = 1, - BFD_MACH_O_CPU_TYPE_MC680x0 = 6, - BFD_MACH_O_CPU_TYPE_I386 = 7, - BFD_MACH_O_CPU_TYPE_MIPS = 8, - BFD_MACH_O_CPU_TYPE_MC98000 = 10, - BFD_MACH_O_CPU_TYPE_HPPA = 11, - BFD_MACH_O_CPU_TYPE_ARM = 12, - BFD_MACH_O_CPU_TYPE_MC88000 = 13, - BFD_MACH_O_CPU_TYPE_SPARC = 14, - BFD_MACH_O_CPU_TYPE_I860 = 15, - BFD_MACH_O_CPU_TYPE_ALPHA = 16, - BFD_MACH_O_CPU_TYPE_POWERPC = 18, - BFD_MACH_O_CPU_TYPE_POWERPC_64 = (BFD_MACH_O_CPU_TYPE_POWERPC | BFD_MACH_O_CPU_IS64BIT), - BFD_MACH_O_CPU_TYPE_X86_64 = (BFD_MACH_O_CPU_TYPE_I386 | BFD_MACH_O_CPU_IS64BIT) -} -bfd_mach_o_cpu_type; - -typedef enum bfd_mach_o_cpu_subtype -{ - BFD_MACH_O_CPU_SUBTYPE_X86_ALL = 3 -} -bfd_mach_o_cpu_subtype; - -typedef enum bfd_mach_o_filetype -{ - BFD_MACH_O_MH_OBJECT = 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, +#include "mach-o/loader.h" +#include "mach-o/external.h" - /* 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; - -/* 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 - -/* Section has local relocation entries. */ -#define BFD_MACH_O_S_ATTR_LOC_RELOC 0x00000100 - -/* Section has external relocation entries. */ -#define BFD_MACH_O_S_ATTR_EXT_RELOC 0x00000200 - -/* Section contains some machine instructions. */ -#define BFD_MACH_O_S_ATTR_SOME_INSTRUCTIONS 0x00004000 - -#define BFD_MACH_O_S_ATTR_DEBUG 0x02000000 - -/* Section contains only true machine instructions. */ -#define BFD_MACH_O_S_ATTR_PURE_INSTRUCTIONS 0x80000000 +#ifdef __cplusplus +extern "C" { +#endif typedef struct bfd_mach_o_header { @@ -256,14 +44,26 @@ typedef struct bfd_mach_o_header } bfd_mach_o_header; -#define BFD_MACH_O_HEADER_SIZE 28 -#define BFD_MACH_O_HEADER_64_SIZE 32 +typedef struct bfd_mach_o_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; @@ -274,14 +74,24 @@ 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; -#define BFD_MACH_O_SECTION_SIZE 68 -#define BFD_MACH_O_SECTION_64_SIZE 80 typedef struct bfd_mach_o_segment_command { - char segname[16 + 1]; + char segname[BFD_MACH_O_SEGNAME_SIZE + 1]; bfd_vma vmaddr; bfd_vma vmsize; bfd_vma fileoff; @@ -290,25 +100,59 @@ typedef struct bfd_mach_o_segment_command 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; -#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 +/* 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; } bfd_mach_o_symtab_command; @@ -339,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 @@ -350,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 @@ -381,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 @@ -450,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 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; @@ -478,55 +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_DYLINKER or LC_LOAD_DYLINKER. */ - 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 long cmd; /* LC_PREBOUND_DYLIB. */ - unsigned long cmdsize; /* Includes uuid. */ - unsigned char uuid[16]; /* Uuid. */ - asection *section; + 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; bfd_boolean type_required; - bfd_vma offset; - bfd_vma len; + + /* Offset and length in the file. */ + unsigned int offset; + unsigned int len; + union { bfd_mach_o_segment_command segment; @@ -536,54 +606,106 @@ 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_prebind_cksum_command prebind_cksum; + bfd_mach_o_twolevel_hints_command twolevel_hints; bfd_mach_o_uuid_command uuid; - } - command; + 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; + + /* 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; } -mach_o_data_struct; +bfd_mach_o_data_struct; -#define bfd_get_mach_o_data(abfd) ((abfd)->tdata.mach_o_data) +typedef struct bfd_mach_o_xlat_name +{ + const char *name; + unsigned long val; +} +bfd_mach_o_xlat_name; + +/* Target specific routines. */ -typedef struct mach_o_data_struct bfd_mach_o_data_struct; +#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 *); -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_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 **); +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 *, 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 *); + 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 *, PTR, asymbol *, bfd_print_symbol_type); -bfd_boolean bfd_mach_o_bfd_print_private_bfd_data (bfd *, PTR); +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 *); @@ -591,13 +713,92 @@ 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 *abfd); +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); + 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_ */