aboutsummaryrefslogtreecommitdiff
path: root/bfd/mach-o.h
diff options
context:
space:
mode:
authorTristan Gingold <gingold@adacore.com>2009-06-19 09:12:41 +0000
committerTristan Gingold <gingold@adacore.com>2009-06-19 09:12:41 +0000
commit046b007d8597642e05e5b51d9e9e8fa15b9c839e (patch)
treec971c16a20cd2e70fa4851dd4614027fdde3c1b4 /bfd/mach-o.h
parent6d78d0b92e4cb8284544af89e9ca3452e46a0bd1 (diff)
downloadfsf-binutils-gdb-046b007d8597642e05e5b51d9e9e8fa15b9c839e.zip
fsf-binutils-gdb-046b007d8597642e05e5b51d9e9e8fa15b9c839e.tar.gz
fsf-binutils-gdb-046b007d8597642e05e5b51d9e9e8fa15b9c839e.tar.bz2
2009-06-19 Tristan Gingold <gingold@adacore.com>
* mach-o.c (bfd_mach_o_scan_read_symtab_symbols): Add prototype. (bfd_mach_o_version): Use bfd_mach_o_get_data instead of direct access. (bfd_mach_o_valid): Ditto. (bfd_mach_o_wide_p): Ditto. (bfd_mach_o_canonicalize_reloc): Ditto. (bfd_mach_o_build_commands): Ditto. (bfd_mach_o_scan_read_thread): Ditto. (bfd_mach_o_flatten_sections): Ditto. (bfd_mach_o_scan_start_address): Ditto. (bfd_mach_o_lookup_section): Ditto. (bfd_mach_o_core_fetch_environment): Ditto. (bfd_mach_o_write_contents): Ditto. Handle reexport_dylib. (bfd_mach_o_scan_write_relocs): Adjust for bfd_mach_o_get_data. (bfd_mach_o_scan_write_symtab): Ditto. Use macros instead of hard-coded values. (bfd_mach_o_scan_read_symtab_symbol): Make the function static. Use bfd_mach_o_get_data instead of direct access. Use macros instead of hard-coded values. (bfd_mach_o_scan_read_symtab_strtab): Make the function static. Remove sym argument and get section from mdata. Move code into the else branch. (bfd_mach_o_scan_read_symtab_symbols): Make the function static. Remove sym argument and get section from mdata. Adjust code. (bfd_mach_o_scan_read_dylib): Move assertion into the created switch (which replaces consecutive if statements). (bfd_mach_o_scan_read_dysymtab): Rename seg to cmd. Load module table, table of content, indirect symbols and external referenced symbols. (bfd_mach_o_scan_read_symtab): Renames seg to symtab. Set symtab field. (bfd_mach_o_scan_read_linkedit): New function. (bfd_mach_o_scan_read_str): Ditto. (bfd_mach_o_count_symbols): Simplify the code by using the symtab field of mdata. (bfd_mach_o_get_symtab_upper_bound): Remove check as bfd_mach_o_count_symbols never returns an error. (bfd_mach_o_canonicalize_symtab): Simplify the code by using the symtab field (there might be only one symtab). (bfd_mach_o_scan_read_command): Handle reexported dylib. Handle sub frameworks, sub umbrella, sub library and sub client. Read code signature and segment split info commands. (bfd_mach_o_scan): Reindent. (bfd_mach_o_xlat_name): New type. (bfd_mach_o_print_flags): New function. (bfd_mach_o_get_name): Ditto. (bfd_mach_o_cpu_name): New variable. (bfd_mach_o_filetype_name, bfd_mach_o_header_flags_name) (bfd_mach_o_section_type_name) (bfd_mach_o_section_attribute_name) (bfd_mach_o_load_command_name): New variables. (bfd_mach_o_print_private_header): New function. (bfd_mach_o_print_section_map): New function extracted from bfd_mach_o_print_private_bfd_data. (bfd_mach_o_print_section): Ditto. Print more infos. (bfd_mach_o_print_segment): Ditto. (bfd_mach_o_print_dysymtab): Ditto. (bfd_mach_o_bfd_print_private_bfd_data): Reworked. Handle load weak dylib, reexport dylib and id dylib. Handle code signature and segment_split info. Handle sub frameworks, sub umbrella, sub library and sub client. (bfd_mach_o_section_get_nbr_indirect): New function. * mach-o.h (BFD_MACH_O_REFERENCE_MASK): New macro. Add comment. (bfd_mach_o_header_flags): New enum to define header flags. (bfd_mach_o_section_attribute): New enum to replace ... (BFD_MACH_O_S_ATTR_LOC_RELOC, BFD_MACH_O_S_ATTR_EXT_RELOC, BFD_MACH_O_S_ATTR_SOME_INSTRUCTIONS, BFD_MACH_O_S_ATTR_DEBUG, BFD_MACH_O_S_SELF_MODIFYING_CODE, BFD_MACH_O_S_ATTR_LIVE_SUPPORT, BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, BFD_MACH_O_S_ATTR_STRIP_STATIC_SYMS, BFD_MACH_O_S_ATTR_NO_TOC, BFD_MACH_O_S_ATTR_PURE_INSTRUCTIONS): ... these removed macros. (BFD_MACH_O_NLIST_SIZE, BFD_MACH_O_NLIST_64_SIZE): New macros. (bfd_mach_o_dylib_module): New type. (BFD_MACH_O_DYLIB_MODULE_SIZE, BFD_MACH_O_DYLIB_MODULE_64_SIZE): New macros. (bfd_mach_o_dylib_table_of_content): New type. (BFD_MACH_O_TABLE_OF_CONTENT_SIZE): New macro. (bfd_mach_o_dylib_reference): New type. (BFD_MACH_O_REFERENCE_SIZE): New macro. (bfd_mach_o_dysymtab_command): Add fields for loaded and decoded modules, toc, references and indirect syms. (BFD_MACH_O_INDIRECT_SYMBOL_SIZE): New macro. (bfd_mach_o_dylinker_command): Remove cmd and cmdsize fields (were unused). Add comment. (bfd_mach_o_dylib_command): Ditto. (bfd_mach_o_prebound_dylib_command): Ditto. (bfd_mach_o_linkedit_command): New type. (bfd_mach_o_str_command): New type. (bfd_mach_o_load_command): Add linkedit and str fields. (mach_o_data_struct): Add symtab field. (bfd_get_mach_o_data): Renamed to ... (bfd_mach_o_get_data): ... this new macro. (bfd_mach_o_scan_read_symtab_symbol, bfd_mach_o_scan_read_symtab_strtab, bfd_mach_o_scan_read_symtab_symbols): Prototypes removed. * mach-o-i386.c (bfd_mach_o_i386_mkobject): Use bfd_mach_o_get_data instead of direct access.
Diffstat (limited to 'bfd/mach-o.h')
-rw-r--r--bfd/mach-o.h223
1 files changed, 183 insertions, 40 deletions
diff --git a/bfd/mach-o.h b/bfd/mach-o.h
index 766a68a..252991d 100644
--- a/bfd/mach-o.h
+++ b/bfd/mach-o.h
@@ -37,13 +37,15 @@
#define BFD_MACH_O_NO_SECT 0 /* Symbol not in any section of the image. */
-/* Symbol n_desc flags. */
+/* 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
@@ -172,6 +174,33 @@ typedef enum bfd_mach_o_filetype
}
bfd_mach_o_filetype;
+typedef enum bfd_mach_o_header_flags
+{
+ BFD_MACH_O_MH_NOUNDEFS = 0x000001,
+ BFD_MACH_O_MH_INCRLINK = 0x000002,
+ BFD_MACH_O_MH_DYLDLINK = 0x000004,
+ BFD_MACH_O_MH_BINDATLOAD = 0x000008,
+ BFD_MACH_O_MH_PREBOUND = 0x000010,
+ BFD_MACH_O_MH_SPLIT_SEGS = 0x000020,
+ BFD_MACH_O_MH_LAZY_INIT = 0x000040,
+ BFD_MACH_O_MH_TWOLEVEL = 0x000080,
+ BFD_MACH_O_MH_FORCE_FLAT = 0x000100,
+ BFD_MACH_O_MH_NOMULTIDEFS = 0x000200,
+ BFD_MACH_O_MH_NOFIXPREBINDING = 0x000400,
+ BFD_MACH_O_MH_PREBINDABLE = 0x000800,
+ BFD_MACH_O_MH_ALLMODSBOUND = 0x001000,
+ BFD_MACH_O_MH_SUBSECTIONS_VIA_SYMBOLS = 0x002000,
+ BFD_MACH_O_MH_CANONICAL = 0x004000,
+ BFD_MACH_O_MH_WEAK_DEFINES = 0x008000,
+ BFD_MACH_O_MH_BINDS_TO_WEAK = 0x010000,
+ BFD_MACH_O_MH_ALLOW_STACK_EXECUTION = 0x020000,
+ BFD_MACH_O_MH_ROOT_SAFE = 0x040000,
+ BFD_MACH_O_MH_SETUID_SAFE = 0x080000,
+ BFD_MACH_O_MH_NO_REEXPORTED_DYLIBS = 0x100000,
+ BFD_MACH_O_MH_PIE = 0x200000
+}
+bfd_mach_o_header_flags;
+
/* Constants for the type of a section. */
typedef enum bfd_mach_o_section_type
@@ -258,36 +287,40 @@ bfd_mach_o_section_type;
/* 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
+typedef enum bfd_mach_o_section_attribute
+{
+ /* Section has local relocation entries. */
+ BFD_MACH_O_S_ATTR_LOC_RELOC = 0x00000100,
-/* Section contains some machine instructions. */
-#define BFD_MACH_O_S_ATTR_SOME_INSTRUCTIONS 0x00000400
+ /* Section has external relocation entries. */
+ BFD_MACH_O_S_ATTR_EXT_RELOC = 0x00000200,
-/* A debug section. */
-#define BFD_MACH_O_S_ATTR_DEBUG 0x02000000
+ /* Section contains some machine instructions. */
+ BFD_MACH_O_S_ATTR_SOME_INSTRUCTIONS = 0x00000400,
-/* Used with i386 stubs. */
-#define BFD_MACH_O_S_SELF_MODIFYING_CODE 0x04000000
+ /* A debug section. */
+ BFD_MACH_O_S_ATTR_DEBUG = 0x02000000,
-/* Blocks are live if they reference live blocks. */
-#define BFD_MACH_O_S_ATTR_LIVE_SUPPORT 0x08000000
+ /* Used with i386 stubs. */
+ BFD_MACH_O_S_SELF_MODIFYING_CODE = 0x04000000,
+
+ /* Blocks are live if they reference live blocks. */
+ BFD_MACH_O_S_ATTR_LIVE_SUPPORT = 0x08000000,
-/* No dead stripping. */
-#define BFD_MACH_O_S_ATTR_NO_DEAD_STRIP 0x10000000
+ /* No dead stripping. */
+ BFD_MACH_O_S_ATTR_NO_DEAD_STRIP = 0x10000000,
-/* Section symbols can be stripped in files with MH_DYLDLINK flag. */
-#define BFD_MACH_O_S_ATTR_STRIP_STATIC_SYMS 0x20000000
+ /* Section symbols can be stripped in files with MH_DYLDLINK flag. */
+ BFD_MACH_O_S_ATTR_STRIP_STATIC_SYMS = 0x20000000,
-/* Section contains coalesced symbols that are not to be in the TOC of an
- archive. */
-#define BFD_MACH_O_S_ATTR_NO_TOC 0x40000000
+ /* Section contains coalesced symbols that are not to be in the TOC of an
+ archive. */
+ BFD_MACH_O_S_ATTR_NO_TOC = 0x40000000,
-/* Section contains only true machine instructions. */
-#define BFD_MACH_O_S_ATTR_PURE_INSTRUCTIONS 0x80000000
+ /* Section contains only true machine instructions. */
+ BFD_MACH_O_S_ATTR_PURE_INSTRUCTIONS = 0x80000000
+}
+bfd_mach_o_section_attribute;
typedef struct bfd_mach_o_header
{
@@ -405,6 +438,8 @@ typedef struct bfd_mach_o_asymbol
unsigned short n_desc;
}
bfd_mach_o_asymbol;
+#define BFD_MACH_O_NLIST_SIZE 12
+#define BFD_MACH_O_NLIST_64_SIZE 16
typedef struct bfd_mach_o_symtab_command
{
@@ -454,6 +489,88 @@ 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;
+#define BFD_MACH_O_DYLIB_MODULE_SIZE 52
+#define BFD_MACH_O_DYLIB_MODULE_64_SIZE 56
+
+typedef struct bfd_mach_o_dylib_table_of_content
+{
+ /* Index into the symbol table to the defined external symbol. */
+ unsigned long symbol_index;
+
+ /* Index into the module table to the module for this entry. */
+ unsigned long module_index;
+}
+bfd_mach_o_dylib_table_of_content;
+#define BFD_MACH_O_TABLE_OF_CONTENT_SIZE 8
+
+typedef struct bfd_mach_o_dylib_reference
+{
+ /* Index into the symbol table for the symbol being referenced. */
+ unsigned long isym;
+
+ /* Type of the reference being made (use REFERENCE_FLAGS constants). */
+ unsigned long flags;
+}
+bfd_mach_o_dylib_reference;
+#define BFD_MACH_O_REFERENCE_SIZE 4
+
typedef struct bfd_mach_o_dysymtab_command
{
/* The symbols indicated by symoff and nsyms of the LC_SYMTAB load command
@@ -554,17 +671,23 @@ 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
typedef struct bfd_mach_o_thread_flavour
{
@@ -582,20 +705,21 @@ 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;
}
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 long timestamp; /* Library's build time stamp. */
@@ -605,10 +729,10 @@ typedef struct bfd_mach_o_dylib_command
}
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. */
@@ -616,15 +740,32 @@ typedef struct bfd_mach_o_prebound_dylib_command
}
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. */
+ unsigned char uuid[16];
asection *section;
}
bfd_mach_o_uuid_command;
+/* For LC_CODE_SIGNATURE or LC_SEGMENT_SPLIT_INFO. */
+
+typedef struct bfd_mach_o_linkedit_command
+{
+ unsigned long dataoff;
+ unsigned long datasize;
+}
+bfd_mach_o_linkedit_command;
+
+typedef struct bfd_mach_o_str_command
+{
+ unsigned long stroff;
+ unsigned long str_len;
+ char *str;
+}
+bfd_mach_o_str_command;
+
typedef struct bfd_mach_o_load_command
{
bfd_mach_o_load_command_type type;
@@ -641,6 +782,8 @@ typedef struct bfd_mach_o_load_command
bfd_mach_o_dylinker_command dylinker;
bfd_mach_o_prebound_dylib_command prebound_dylib;
bfd_mach_o_uuid_command uuid;
+ bfd_mach_o_linkedit_command linkedit;
+ bfd_mach_o_str_command str;
}
command;
}
@@ -660,9 +803,13 @@ typedef struct mach_o_data_struct
/* Used while writting: current length of the output file. This is used
to allocate space in the file. */
ufile_ptr filelen;
+
+ /* As symtab is referenced by other load command, it is handy to have
+ a direct access to it. Also it is not clearly stated, only one symtab
+ is expected. */
+ bfd_mach_o_symtab_command *symtab;
}
-mach_o_data_struct;
-typedef struct mach_o_data_struct bfd_mach_o_data_struct;
+bfd_mach_o_data_struct;
/* Target specific routines. */
typedef struct bfd_mach_o_backend_data
@@ -672,15 +819,11 @@ typedef struct bfd_mach_o_backend_data
}
bfd_mach_o_backend_data;
-#define bfd_get_mach_o_data(abfd) ((abfd)->tdata.mach_o_data)
+#define bfd_mach_o_get_data(abfd) ((abfd)->tdata.mach_o_data)
#define bfd_mach_o_get_backend_data(abfd) \
((bfd_mach_o_backend_data*)(abfd)->xvec->backend_data)
bfd_boolean bfd_mach_o_valid (bfd *);
-int bfd_mach_o_scan_read_symtab_symbol (bfd *, bfd_mach_o_symtab_command *,
- bfd_mach_o_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 *, bfd_mach_o_asymbol *, unsigned long);
int bfd_mach_o_scan_start_address (bfd *);
int bfd_mach_o_scan (bfd *, bfd_mach_o_header *, bfd_mach_o_data_struct *);