diff options
author | Tristan Gingold <gingold@adacore.com> | 2011-08-08 08:59:33 +0000 |
---|---|---|
committer | Tristan Gingold <gingold@adacore.com> | 2011-08-08 08:59:33 +0000 |
commit | 46d1c23bceb2b8923af0d00a7f536a88524d6a74 (patch) | |
tree | 0cfdeb8d8cebbf5aecc43cffefa60d595aeca890 /include/mach-o | |
parent | fde3380891f9bd7fd64cc2226bd5541b9e4a530e (diff) | |
download | binutils-46d1c23bceb2b8923af0d00a7f536a88524d6a74.zip binutils-46d1c23bceb2b8923af0d00a7f536a88524d6a74.tar.gz binutils-46d1c23bceb2b8923af0d00a7f536a88524d6a74.tar.bz2 |
bfd/
2011-08-08 Tristan Gingold <gingold@adacore.com>
* mach-o.h: Move size macros to external.h
Move reloc macros to reloc.h and x86-64.h.
* mach-o-i386.c: Includes mach-o/reloc.h
* mach-o-x86-64.c: Ditto and includes mach-o/x86-64.h
* mach-o.c: Add includes.
(bfd_mach_o_write_header): Use structure from external.h to convert.
(bfd_mach_o_write_thread): Ditto.
(bfd_mach_o_write_relocs): Ditto.
(bfd_mach_o_write_section_32): Ditto.
(bfd_mach_o_write_section_64): Ditto.
(bfd_mach_o_write_segment_32): Ditto.
(bfd_mach_o_write_segment_64): Ditto.
(bfd_mach_o_write_symtab): Ditto.
(bfd_mach_o_write_contents): Ditto.
(bfd_mach_o_read_header): Ditto.
(bfd_mach_o_read_section_32): Ditto.
(bfd_mach_o_read_section_64): Ditto.
(bfd_mach_o_read_symtab_symbol): Ditto.
(bfd_mach_o_read_dylinker): Ditto.
(bfd_mach_o_read_dylib): Ditto.
(bfd_mach_o_read_dysymtab): Ditto.
(bfd_mach_o_read_symtab): Ditto.
(bfd_mach_o_read_linkedit): Ditto.
(bfd_mach_o_read_str): Ditto.
(bfd_mach_o_read_dyld_info): Ditto.
(bfd_mach_o_read_segment): Ditto.
(bfd_mach_o_read_command): Ditto.
(bfd_mach_o_archive_p): Ditto.
(bfd_mach_o_canonicalize_one_reloc): Ditto. Change the BUF parameter.
(bfd_mach_o_canonicalize_relocs): Adjust to call the above function.
(bfd_mach_o_read_dysymtab_symbol): Rename BUF variable.
(bfd_mach_o_read_uuid): Remove useless cast. Use a macro instead
of an hard-coded value.
include/mach-o
2011-08-08 Tristan Gingold <gingold@adacore.com>
* loader.h: Reorder declarations.
* x86-64.h: New file.
* external.h: New file.
* reloc.h: New file.
Diffstat (limited to 'include/mach-o')
-rw-r--r-- | include/mach-o/ChangeLog | 7 | ||||
-rw-r--r-- | include/mach-o/external.h | 267 | ||||
-rw-r--r-- | include/mach-o/loader.h | 257 | ||||
-rw-r--r-- | include/mach-o/reloc.h | 53 | ||||
-rw-r--r-- | include/mach-o/x86-64.h | 37 |
5 files changed, 498 insertions, 123 deletions
diff --git a/include/mach-o/ChangeLog b/include/mach-o/ChangeLog index 923f203..dff287a 100644 --- a/include/mach-o/ChangeLog +++ b/include/mach-o/ChangeLog @@ -1,3 +1,10 @@ +2011-08-08 Tristan Gingold <gingold@adacore.com> + + * loader.h: Reorder declarations. + * x86-64.h: New file. + * external.h: New file. + * reloc.h: New file. + 2011-07-06 Tristan Gingold <gingold@adacore.com> * loader.h: New file. diff --git a/include/mach-o/external.h b/include/mach-o/external.h new file mode 100644 index 0000000..c2fe7e3 --- /dev/null +++ b/include/mach-o/external.h @@ -0,0 +1,267 @@ +/* Mach-O support for BFD. + Copyright 2011 + Free Software Foundation, Inc. + + This file is part of BFD, the Binary File Descriptor library. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#ifndef _MACH_O_EXTERNAL_H +#define _MACH_O_EXTERNAL_H + +struct mach_o_header_external +{ + unsigned char magic[4]; /* Magic number. */ + unsigned char cputype[4]; /* CPU that this object is for. */ + unsigned char cpusubtype[4]; /* CPU subtype. */ + unsigned char filetype[4]; /* Type of file. */ + unsigned char ncmds[4]; /* Number of load commands. */ + unsigned char sizeofcmds[4]; /* Total size of load commands. */ + unsigned char flags[4]; /* Flags. */ + unsigned char reserved[4]; /* Reserved (on 64-bit version only). */ +}; + +#define BFD_MACH_O_HEADER_SIZE 28 +#define BFD_MACH_O_HEADER_64_SIZE 32 + +/* 32-bit section header. */ + +struct mach_o_section_32_external +{ + unsigned char sectname[16]; /* Section name. */ + unsigned char segname[16]; /* Segment that the section belongs to. */ + unsigned char addr[4]; /* Address of this section in memory. */ + unsigned char size[4]; /* Size in bytes of this section. */ + unsigned char offset[4]; /* File offset of this section. */ + unsigned char align[4]; /* log2 of this section's alignment. */ + unsigned char reloff[4]; /* File offset of this section's relocs. */ + unsigned char nreloc[4]; /* Number of relocs for this section. */ + unsigned char flags[4]; /* Section flags/attributes. */ + unsigned char reserved1[4]; + unsigned char reserved2[4]; +}; +#define BFD_MACH_O_SECTION_SIZE 68 + +/* 64-bit section header. */ + +struct mach_o_section_64_external +{ + unsigned char sectname[16]; /* Section name. */ + unsigned char segname[16]; /* Segment that the section belongs to. */ + unsigned char addr[8]; /* Address of this section in memory. */ + unsigned char size[8]; /* Size in bytes of this section. */ + unsigned char offset[4]; /* File offset of this section. */ + unsigned char align[4]; /* log2 of this section's alignment. */ + unsigned char reloff[4]; /* File offset of this section's relocs. */ + unsigned char nreloc[4]; /* Number of relocs for this section. */ + unsigned char flags[4]; /* Section flags/attributes. */ + unsigned char reserved1[4]; + unsigned char reserved2[4]; + unsigned char reserved3[4]; +}; +#define BFD_MACH_O_SECTION_64_SIZE 80 + +struct mach_o_load_command_external +{ + unsigned char cmd[4]; /* The type of load command. */ + unsigned char cmdsize[4]; /* Size in bytes of entire command. */ +}; +#define BFD_MACH_O_LC_SIZE 8 + +struct mach_o_segment_command_32_external +{ + unsigned char segname[16]; /* Name of this segment. */ + unsigned char vmaddr[4]; /* Virtual memory address of this segment. */ + unsigned char vmsize[4]; /* Size there, in bytes. */ + unsigned char fileoff[4]; /* Offset in bytes of the data to be mapped. */ + unsigned char filesize[4]; /* Size in bytes on disk. */ + unsigned char maxprot[4]; /* Maximum permitted vm protection. */ + unsigned char initprot[4]; /* Initial vm protection. */ + unsigned char nsects[4]; /* Number of sections in this segment. */ + unsigned char flags[4]; /* Flags that affect the loading. */ +}; +#define BFD_MACH_O_LC_SEGMENT_SIZE 56 /* Include the header. */ + +struct mach_o_segment_command_64_external +{ + unsigned char segname[16]; /* Name of this segment. */ + unsigned char vmaddr[8]; /* Virtual memory address of this segment. */ + unsigned char vmsize[8]; /* Size there, in bytes. */ + unsigned char fileoff[8]; /* Offset in bytes of the data to be mapped. */ + unsigned char filesize[8]; /* Size in bytes on disk. */ + unsigned char maxprot[4]; /* Maximum permitted vm protection. */ + unsigned char initprot[4]; /* Initial vm protection. */ + unsigned char nsects[4]; /* Number of sections in this segment. */ + unsigned char flags[4]; /* Flags that affect the loading. */ +}; +#define BFD_MACH_O_LC_SEGMENT_64_SIZE 72 /* Include the header. */ + +struct mach_o_reloc_info_external +{ + unsigned char r_address[4]; + unsigned char r_symbolnum[4]; +}; +#define BFD_MACH_O_RELENT_SIZE 8 + +struct mach_o_symtab_command_external +{ + unsigned char symoff[4]; + unsigned char nsyms[4]; + unsigned char stroff[4]; + unsigned char strsize[4]; +}; + +struct mach_o_nlist_external +{ + unsigned char n_strx[4]; + unsigned char n_type[1]; + unsigned char n_sect[1]; + unsigned char n_desc[2]; + unsigned char n_value[4]; +}; +#define BFD_MACH_O_NLIST_SIZE 12 + +struct mach_o_nlist_64_external +{ + unsigned char n_strx[4]; + unsigned char n_type[1]; + unsigned char n_sect[1]; + unsigned char n_desc[2]; + unsigned char n_value[8]; +}; +#define BFD_MACH_O_NLIST_64_SIZE 16 + +struct mach_o_thread_command_external +{ + unsigned char flavour[4]; + unsigned char count[4]; +}; + +/* For commands that just have a string or a path. */ +struct mach_o_str_command_external +{ + unsigned char str[4]; +}; + +struct mach_o_dylib_command_external +{ + unsigned char name[4]; + unsigned char timestamp[4]; + unsigned char current_version[4]; + unsigned char compatibility_version[4]; +}; + +struct mach_o_dysymtab_command_external +{ + unsigned char ilocalsym[4]; /* Index of. */ + unsigned char nlocalsym[4]; /* Number of. */ + unsigned char iextdefsym[4]; + unsigned char nextdefsym[4]; + unsigned char iundefsym[4]; + unsigned char nundefsym[4]; + unsigned char tocoff[4]; + unsigned char ntoc[4]; + unsigned char modtaboff[4]; + unsigned char nmodtab[4]; + unsigned char extrefsymoff[4]; + unsigned char nextrefsyms[4]; + unsigned char indirectsymoff[4]; + unsigned char nindirectsyms[4]; + unsigned char extreloff[4]; + unsigned char nextrel[4]; + unsigned char locreloff[4]; + unsigned char nlocrel[4]; +}; + +struct mach_o_dylib_module_external +{ + unsigned char module_name[4]; + unsigned char iextdefsym[4]; + unsigned char nextdefsym[4]; + unsigned char irefsym[4]; + unsigned char nrefsym[4]; + unsigned char ilocalsym[4]; + unsigned char nlocalsym[4]; + unsigned char iextrel[4]; + unsigned char nextrel[4]; + unsigned char iinit_iterm[4]; + unsigned char ninit_nterm[4]; + unsigned char objc_module_info_addr[4]; + unsigned char objc_module_info_size[4]; +}; +#define BFD_MACH_O_DYLIB_MODULE_SIZE 52 + +struct mach_o_dylib_module_64_external +{ + unsigned char module_name[4]; + unsigned char iextdefsym[4]; + unsigned char nextdefsym[4]; + unsigned char irefsym[4]; + unsigned char nrefsym[4]; + unsigned char ilocalsym[4]; + unsigned char nlocalsym[4]; + unsigned char iextrel[4]; + unsigned char nextrel[4]; + unsigned char iinit_iterm[4]; + unsigned char ninit_nterm[4]; + unsigned char objc_module_info_size[4]; + unsigned char objc_module_info_addr[8]; +}; +#define BFD_MACH_O_DYLIB_MODULE_64_SIZE 56 + +struct mach_o_dylib_table_of_contents_external +{ + unsigned char symbol_index[4]; + unsigned char module_index[4]; +}; +#define BFD_MACH_O_TABLE_OF_CONTENT_SIZE 8 + +struct mach_o_linkedit_data_command_external +{ + unsigned char dataoff[4]; + unsigned char datasize[4]; +}; + +struct mach_o_dyld_info_command_external +{ + unsigned char rebase_off[4]; + unsigned char rebase_size[4]; + unsigned char bind_off[4]; + unsigned char bind_size[4]; + unsigned char weak_bind_off[4]; + unsigned char weak_bind_size[4]; + unsigned char lazy_bind_off[4]; + unsigned char lazy_bind_size[4]; + unsigned char export_off[4]; + unsigned char export_size[4]; +}; + +struct mach_o_fat_header_external +{ + unsigned char magic[4]; + unsigned char nfat_arch[4]; /* Number of components. */ +}; + +struct mach_o_fat_arch_external +{ + unsigned char cputype[4]; + unsigned char cpusubtype[4]; + unsigned char offset[4]; /* File offset of the member. */ + unsigned char size[4]; /* Size of the member. */ + unsigned char align[4]; /* Power of 2. */ +}; + +#endif /* _MACH_O_EXTERNAL_H */ diff --git a/include/mach-o/loader.h b/include/mach-o/loader.h index 8ddf8e0..1105204 100644 --- a/include/mach-o/loader.h +++ b/include/mach-o/loader.h @@ -22,33 +22,7 @@ #ifndef _MACH_O_LOADER_H #define _MACH_O_LOADER_H -/* Symbol n_type values. */ -#define BFD_MACH_O_N_STAB 0xe0 /* If any of these bits set, a symbolic debugging entry. */ -#define BFD_MACH_O_N_PEXT 0x10 /* Private external symbol bit. */ -#define BFD_MACH_O_N_TYPE 0x0e /* Mask for the type bits. */ -#define BFD_MACH_O_N_EXT 0x01 /* External symbol bit, set for external symbols. */ -#define BFD_MACH_O_N_UNDF 0x00 /* Undefined, n_sect == NO_SECT. */ -#define BFD_MACH_O_N_ABS 0x02 /* Absolute, n_sect == NO_SECT. */ -#define BFD_MACH_O_N_INDR 0x0a /* Indirect. */ -#define BFD_MACH_O_N_PBUD 0x0c /* Prebound undefined (defined in a dylib). */ -#define BFD_MACH_O_N_SECT 0x0e /* Defined in section number n_sect. */ - -#define BFD_MACH_O_NO_SECT 0 /* Symbol not in any section of the image. */ - -/* Symbol n_desc reference flags. */ -#define BFD_MACH_O_REFERENCE_MASK 0x0f -#define BFD_MACH_O_REFERENCE_FLAG_UNDEFINED_NON_LAZY 0x00 -#define BFD_MACH_O_REFERENCE_FLAG_UNDEFINED_LAZY 0x01 -#define BFD_MACH_O_REFERENCE_FLAG_DEFINED 0x02 -#define BFD_MACH_O_REFERENCE_FLAG_PRIVATE_DEFINED 0x03 -#define BFD_MACH_O_REFERENCE_FLAG_PRIVATE_UNDEFINED_NON_LAZY 0x04 -#define BFD_MACH_O_REFERENCE_FLAG_PRIVATE_UNDEFINED_LAZY 0x05 - -#define BFD_MACH_O_REFERENCED_DYNAMICALLY 0x10 -#define BFD_MACH_O_N_DESC_DISCARDED 0x20 -#define BFD_MACH_O_N_NO_DEAD_STRIP 0x20 -#define BFD_MACH_O_N_WEAK_REF 0x40 -#define BFD_MACH_O_N_WEAK_DEF 0x80 +/* Constants for header. */ typedef enum bfd_mach_o_mach_header_magic { @@ -59,37 +33,80 @@ typedef enum bfd_mach_o_mach_header_magic } bfd_mach_o_mach_header_magic; -typedef enum bfd_mach_o_ppc_thread_flavour +#define BFD_MACH_O_CPU_IS64BIT 0x1000000 + +typedef enum bfd_mach_o_cpu_type { - BFD_MACH_O_PPC_THREAD_STATE = 1, - BFD_MACH_O_PPC_FLOAT_STATE = 2, - BFD_MACH_O_PPC_EXCEPTION_STATE = 3, - BFD_MACH_O_PPC_VECTOR_STATE = 4, - BFD_MACH_O_PPC_THREAD_STATE64 = 5, - BFD_MACH_O_PPC_EXCEPTION_STATE64 = 6, - BFD_MACH_O_PPC_THREAD_STATE_NONE = 7 + BFD_MACH_O_CPU_TYPE_VAX = 1, + BFD_MACH_O_CPU_TYPE_MC680x0 = 6, + BFD_MACH_O_CPU_TYPE_I386 = 7, + BFD_MACH_O_CPU_TYPE_MIPS = 8, + BFD_MACH_O_CPU_TYPE_MC98000 = 10, + BFD_MACH_O_CPU_TYPE_HPPA = 11, + BFD_MACH_O_CPU_TYPE_ARM = 12, + BFD_MACH_O_CPU_TYPE_MC88000 = 13, + BFD_MACH_O_CPU_TYPE_SPARC = 14, + BFD_MACH_O_CPU_TYPE_I860 = 15, + BFD_MACH_O_CPU_TYPE_ALPHA = 16, + BFD_MACH_O_CPU_TYPE_POWERPC = 18, + BFD_MACH_O_CPU_TYPE_POWERPC_64 = (BFD_MACH_O_CPU_TYPE_POWERPC | BFD_MACH_O_CPU_IS64BIT), + BFD_MACH_O_CPU_TYPE_X86_64 = (BFD_MACH_O_CPU_TYPE_I386 | BFD_MACH_O_CPU_IS64BIT) } -bfd_mach_o_ppc_thread_flavour; +bfd_mach_o_cpu_type; -/* Defined in <mach/i386/thread_status.h> */ -typedef enum bfd_mach_o_i386_thread_flavour +typedef enum bfd_mach_o_cpu_subtype { - BFD_MACH_O_x86_THREAD_STATE32 = 1, - BFD_MACH_O_x86_FLOAT_STATE32 = 2, - BFD_MACH_O_x86_EXCEPTION_STATE32 = 3, - BFD_MACH_O_x86_THREAD_STATE64 = 4, - BFD_MACH_O_x86_FLOAT_STATE64 = 5, - BFD_MACH_O_x86_EXCEPTION_STATE64 = 6, - BFD_MACH_O_x86_THREAD_STATE = 7, - BFD_MACH_O_x86_FLOAT_STATE = 8, - BFD_MACH_O_x86_EXCEPTION_STATE = 9, - BFD_MACH_O_x86_DEBUG_STATE32 = 10, - BFD_MACH_O_x86_DEBUG_STATE64 = 11, - BFD_MACH_O_x86_DEBUG_STATE = 12, - BFD_MACH_O_x86_THREAD_STATE_NONE = 13 + BFD_MACH_O_CPU_SUBTYPE_X86_ALL = 3 } -bfd_mach_o_i386_thread_flavour; +bfd_mach_o_cpu_subtype; + +typedef enum bfd_mach_o_filetype +{ + BFD_MACH_O_MH_OBJECT = 0x01, + BFD_MACH_O_MH_EXECUTE = 0x02, + BFD_MACH_O_MH_FVMLIB = 0x03, + BFD_MACH_O_MH_CORE = 0x04, + BFD_MACH_O_MH_PRELOAD = 0x05, + BFD_MACH_O_MH_DYLIB = 0x06, + BFD_MACH_O_MH_DYLINKER = 0x07, + BFD_MACH_O_MH_BUNDLE = 0x08, + BFD_MACH_O_MH_DYLIB_STUB = 0x09, + BFD_MACH_O_MH_DSYM = 0x0a, + BFD_MACH_O_MH_KEXT_BUNDLE = 0x0b +} +bfd_mach_o_filetype; +typedef enum bfd_mach_o_header_flags +{ + BFD_MACH_O_MH_NOUNDEFS = 0x0000001, + BFD_MACH_O_MH_INCRLINK = 0x0000002, + BFD_MACH_O_MH_DYLDLINK = 0x0000004, + BFD_MACH_O_MH_BINDATLOAD = 0x0000008, + BFD_MACH_O_MH_PREBOUND = 0x0000010, + BFD_MACH_O_MH_SPLIT_SEGS = 0x0000020, + BFD_MACH_O_MH_LAZY_INIT = 0x0000040, + BFD_MACH_O_MH_TWOLEVEL = 0x0000080, + BFD_MACH_O_MH_FORCE_FLAT = 0x0000100, + BFD_MACH_O_MH_NOMULTIDEFS = 0x0000200, + BFD_MACH_O_MH_NOFIXPREBINDING = 0x0000400, + BFD_MACH_O_MH_PREBINDABLE = 0x0000800, + BFD_MACH_O_MH_ALLMODSBOUND = 0x0001000, + BFD_MACH_O_MH_SUBSECTIONS_VIA_SYMBOLS = 0x0002000, + BFD_MACH_O_MH_CANONICAL = 0x0004000, + BFD_MACH_O_MH_WEAK_DEFINES = 0x0008000, + BFD_MACH_O_MH_BINDS_TO_WEAK = 0x0010000, + BFD_MACH_O_MH_ALLOW_STACK_EXECUTION = 0x0020000, + BFD_MACH_O_MH_ROOT_SAFE = 0x0040000, + BFD_MACH_O_MH_SETUID_SAFE = 0x0080000, + BFD_MACH_O_MH_NO_REEXPORTED_DYLIBS = 0x0100000, + BFD_MACH_O_MH_PIE = 0x0200000, + BFD_MACH_O_MH_DEAD_STRIPPABLE_DYLIB = 0x0400000, + BFD_MACH_O_MH_HAS_TLV_DESCRIPTORS = 0x0800000, + BFD_MACH_O_MH_NO_HEAP_EXECUTION = 0x1000000 +} +bfd_mach_o_header_flags; + +/* Load command constants. */ #define BFD_MACH_O_LC_REQ_DYLD 0x80000000 typedef enum bfd_mach_o_load_command_type @@ -134,77 +151,8 @@ typedef enum bfd_mach_o_load_command_type BFD_MACH_O_LC_DYLD_INFO = 0x22 /* Compressed dyld information. */ } bfd_mach_o_load_command_type; - -#define BFD_MACH_O_CPU_IS64BIT 0x1000000 - -typedef enum bfd_mach_o_cpu_type -{ - BFD_MACH_O_CPU_TYPE_VAX = 1, - BFD_MACH_O_CPU_TYPE_MC680x0 = 6, - BFD_MACH_O_CPU_TYPE_I386 = 7, - BFD_MACH_O_CPU_TYPE_MIPS = 8, - BFD_MACH_O_CPU_TYPE_MC98000 = 10, - BFD_MACH_O_CPU_TYPE_HPPA = 11, - BFD_MACH_O_CPU_TYPE_ARM = 12, - BFD_MACH_O_CPU_TYPE_MC88000 = 13, - BFD_MACH_O_CPU_TYPE_SPARC = 14, - BFD_MACH_O_CPU_TYPE_I860 = 15, - BFD_MACH_O_CPU_TYPE_ALPHA = 16, - BFD_MACH_O_CPU_TYPE_POWERPC = 18, - BFD_MACH_O_CPU_TYPE_POWERPC_64 = (BFD_MACH_O_CPU_TYPE_POWERPC | BFD_MACH_O_CPU_IS64BIT), - BFD_MACH_O_CPU_TYPE_X86_64 = (BFD_MACH_O_CPU_TYPE_I386 | BFD_MACH_O_CPU_IS64BIT) -} -bfd_mach_o_cpu_type; - -typedef enum bfd_mach_o_cpu_subtype -{ - BFD_MACH_O_CPU_SUBTYPE_X86_ALL = 3 -} -bfd_mach_o_cpu_subtype; - -typedef enum bfd_mach_o_filetype -{ - BFD_MACH_O_MH_OBJECT = 0x01, - BFD_MACH_O_MH_EXECUTE = 0x02, - BFD_MACH_O_MH_FVMLIB = 0x03, - BFD_MACH_O_MH_CORE = 0x04, - BFD_MACH_O_MH_PRELOAD = 0x05, - BFD_MACH_O_MH_DYLIB = 0x06, - BFD_MACH_O_MH_DYLINKER = 0x07, - BFD_MACH_O_MH_BUNDLE = 0x08, - BFD_MACH_O_MH_DYLIB_STUB = 0x09, - BFD_MACH_O_MH_DSYM = 0x0a, - BFD_MACH_O_MH_KEXT_BUNDLE = 0x0b -} -bfd_mach_o_filetype; - -typedef enum bfd_mach_o_header_flags -{ - BFD_MACH_O_MH_NOUNDEFS = 0x000001, - BFD_MACH_O_MH_INCRLINK = 0x000002, - BFD_MACH_O_MH_DYLDLINK = 0x000004, - BFD_MACH_O_MH_BINDATLOAD = 0x000008, - BFD_MACH_O_MH_PREBOUND = 0x000010, - BFD_MACH_O_MH_SPLIT_SEGS = 0x000020, - BFD_MACH_O_MH_LAZY_INIT = 0x000040, - BFD_MACH_O_MH_TWOLEVEL = 0x000080, - BFD_MACH_O_MH_FORCE_FLAT = 0x000100, - BFD_MACH_O_MH_NOMULTIDEFS = 0x000200, - BFD_MACH_O_MH_NOFIXPREBINDING = 0x000400, - BFD_MACH_O_MH_PREBINDABLE = 0x000800, - BFD_MACH_O_MH_ALLMODSBOUND = 0x001000, - BFD_MACH_O_MH_SUBSECTIONS_VIA_SYMBOLS = 0x002000, - BFD_MACH_O_MH_CANONICAL = 0x004000, - BFD_MACH_O_MH_WEAK_DEFINES = 0x008000, - BFD_MACH_O_MH_BINDS_TO_WEAK = 0x010000, - BFD_MACH_O_MH_ALLOW_STACK_EXECUTION = 0x020000, - BFD_MACH_O_MH_ROOT_SAFE = 0x040000, - BFD_MACH_O_MH_SETUID_SAFE = 0x080000, - BFD_MACH_O_MH_NO_REEXPORTED_DYLIBS = 0x100000, - BFD_MACH_O_MH_PIE = 0x200000 -} -bfd_mach_o_header_flags; - + +/* Section constants. */ /* Constants for the type of a section. */ typedef enum bfd_mach_o_section_type @@ -325,5 +273,68 @@ typedef enum bfd_mach_o_section_attribute BFD_MACH_O_S_ATTR_PURE_INSTRUCTIONS = 0x80000000 } bfd_mach_o_section_attribute; + +/* Symbol constants. */ + +/* Symbol n_type values. */ +#define BFD_MACH_O_N_STAB 0xe0 /* If any of these bits set, a symbolic debugging entry. */ +#define BFD_MACH_O_N_PEXT 0x10 /* Private external symbol bit. */ +#define BFD_MACH_O_N_TYPE 0x0e /* Mask for the type bits. */ +#define BFD_MACH_O_N_EXT 0x01 /* External symbol bit, set for external symbols. */ +#define BFD_MACH_O_N_UNDF 0x00 /* Undefined, n_sect == NO_SECT. */ +#define BFD_MACH_O_N_ABS 0x02 /* Absolute, n_sect == NO_SECT. */ +#define BFD_MACH_O_N_INDR 0x0a /* Indirect. */ +#define BFD_MACH_O_N_PBUD 0x0c /* Prebound undefined (defined in a dylib). */ +#define BFD_MACH_O_N_SECT 0x0e /* Defined in section number n_sect. */ + +#define BFD_MACH_O_NO_SECT 0 /* Symbol not in any section of the image. */ + +/* Symbol n_desc reference flags. */ +#define BFD_MACH_O_REFERENCE_MASK 0x0f +#define BFD_MACH_O_REFERENCE_FLAG_UNDEFINED_NON_LAZY 0x00 +#define BFD_MACH_O_REFERENCE_FLAG_UNDEFINED_LAZY 0x01 +#define BFD_MACH_O_REFERENCE_FLAG_DEFINED 0x02 +#define BFD_MACH_O_REFERENCE_FLAG_PRIVATE_DEFINED 0x03 +#define BFD_MACH_O_REFERENCE_FLAG_PRIVATE_UNDEFINED_NON_LAZY 0x04 +#define BFD_MACH_O_REFERENCE_FLAG_PRIVATE_UNDEFINED_LAZY 0x05 + +#define BFD_MACH_O_REFERENCED_DYNAMICALLY 0x10 +#define BFD_MACH_O_N_DESC_DISCARDED 0x20 +#define BFD_MACH_O_N_NO_DEAD_STRIP 0x20 +#define BFD_MACH_O_N_WEAK_REF 0x40 +#define BFD_MACH_O_N_WEAK_DEF 0x80 + +/* Thread constants. */ + +typedef enum bfd_mach_o_ppc_thread_flavour +{ + BFD_MACH_O_PPC_THREAD_STATE = 1, + BFD_MACH_O_PPC_FLOAT_STATE = 2, + BFD_MACH_O_PPC_EXCEPTION_STATE = 3, + BFD_MACH_O_PPC_VECTOR_STATE = 4, + BFD_MACH_O_PPC_THREAD_STATE64 = 5, + BFD_MACH_O_PPC_EXCEPTION_STATE64 = 6, + BFD_MACH_O_PPC_THREAD_STATE_NONE = 7 +} +bfd_mach_o_ppc_thread_flavour; + +/* Defined in <mach/i386/thread_status.h> */ +typedef enum bfd_mach_o_i386_thread_flavour +{ + BFD_MACH_O_x86_THREAD_STATE32 = 1, + BFD_MACH_O_x86_FLOAT_STATE32 = 2, + BFD_MACH_O_x86_EXCEPTION_STATE32 = 3, + BFD_MACH_O_x86_THREAD_STATE64 = 4, + BFD_MACH_O_x86_FLOAT_STATE64 = 5, + BFD_MACH_O_x86_EXCEPTION_STATE64 = 6, + BFD_MACH_O_x86_THREAD_STATE = 7, + BFD_MACH_O_x86_FLOAT_STATE = 8, + BFD_MACH_O_x86_EXCEPTION_STATE = 9, + BFD_MACH_O_x86_DEBUG_STATE32 = 10, + BFD_MACH_O_x86_DEBUG_STATE64 = 11, + BFD_MACH_O_x86_DEBUG_STATE = 12, + BFD_MACH_O_x86_THREAD_STATE_NONE = 13 +} +bfd_mach_o_i386_thread_flavour; #endif /* _MACH_O_LOADER_H */ diff --git a/include/mach-o/reloc.h b/include/mach-o/reloc.h new file mode 100644 index 0000000..93ebb8b --- /dev/null +++ b/include/mach-o/reloc.h @@ -0,0 +1,53 @@ +/* Mach-O support for BFD. + Copyright 2011 + Free Software Foundation, Inc. + + This file is part of BFD, the Binary File Descriptor library. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#ifndef _MACH_O_RELOC_H +#define _MACH_O_RELOC_H + +/* Fields for a normal (non-scattered) entry. */ +#define BFD_MACH_O_R_PCREL 0x01000000 +#define BFD_MACH_O_GET_R_LENGTH(s) (((s) >> 25) & 0x3) +#define BFD_MACH_O_R_EXTERN 0x08000000 +#define BFD_MACH_O_GET_R_TYPE(s) (((s) >> 28) & 0x0f) +#define BFD_MACH_O_GET_R_SYMBOLNUM(s) ((s) & 0x00ffffff) +#define BFD_MACH_O_SET_R_LENGTH(l) (((l) & 0x3) << 25) +#define BFD_MACH_O_SET_R_TYPE(t) (((t) & 0xf) << 28) +#define BFD_MACH_O_SET_R_SYMBOLNUM(s) ((s) & 0x00ffffff) + +/* Fields for a scattered entry. */ +#define BFD_MACH_O_SR_SCATTERED 0x80000000 +#define BFD_MACH_O_SR_PCREL 0x40000000 +#define BFD_MACH_O_GET_SR_LENGTH(s) (((s) >> 28) & 0x3) +#define BFD_MACH_O_GET_SR_TYPE(s) (((s) >> 24) & 0x0f) +#define BFD_MACH_O_GET_SR_ADDRESS(s) ((s) & 0x00ffffff) +#define BFD_MACH_O_SET_SR_LENGTH(l) (((l) & 0x3) << 28) +#define BFD_MACH_O_SET_SR_TYPE(t) (((t) & 0xf) << 24) +#define BFD_MACH_O_SET_SR_ADDRESS(s) ((s) & 0x00ffffff) + +/* Generic relocation types (used by i386). */ +#define BFD_MACH_O_GENERIC_RELOC_VANILLA 0 +#define BFD_MACH_O_GENERIC_RELOC_PAIR 1 +#define BFD_MACH_O_GENERIC_RELOC_SECTDIFF 2 +#define BFD_MACH_O_GENERIC_RELOC_PB_LA_PTR 3 +#define BFD_MACH_O_GENERIC_RELOC_LOCAL_SECTDIFF 4 +#define BFD_MACH_O_GENERIC_RELOC_TLV 5 + +#endif /* _MACH_O_RELOC_H */ diff --git a/include/mach-o/x86-64.h b/include/mach-o/x86-64.h new file mode 100644 index 0000000..d06bc26 --- /dev/null +++ b/include/mach-o/x86-64.h @@ -0,0 +1,37 @@ +/* Mach-O support for BFD. + Copyright 2011 + Free Software Foundation, Inc. + + This file is part of BFD, the Binary File Descriptor library. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#ifndef _MACH_O_X86_64_H +#define _MACH_O_X86_64_H + +/* X86-64 relocations. */ +#define BFD_MACH_O_X86_64_RELOC_UNSIGNED 0 /* Absolute addresses. */ +#define BFD_MACH_O_X86_64_RELOC_SIGNED 1 /* 32-bit disp. */ +#define BFD_MACH_O_X86_64_RELOC_BRANCH 2 /* 32-bit pcrel disp. */ +#define BFD_MACH_O_X86_64_RELOC_GOT_LOAD 3 /* Movq load of a GOT entry. */ +#define BFD_MACH_O_X86_64_RELOC_GOT 4 /* GOT reference. */ +#define BFD_MACH_O_X86_64_RELOC_SUBTRACTOR 5 /* Symbol difference. */ +#define BFD_MACH_O_X86_64_RELOC_SIGNED_1 6 /* 32-bit signed disp -1. */ +#define BFD_MACH_O_X86_64_RELOC_SIGNED_2 7 /* 32-bit signed disp -2. */ +#define BFD_MACH_O_X86_64_RELOC_SIGNED_4 8 /* 32-bit signed disp -4. */ +#define BFD_MACH_O_X86_64_RELOC_TLV 9 /* Thread local variables. */ + +#endif /* _MACH_O_X86_64_H */ |