diff options
author | Tristan Gingold <gingold@adacore.com> | 2009-06-19 09:12:41 +0000 |
---|---|---|
committer | Tristan Gingold <gingold@adacore.com> | 2009-06-19 09:12:41 +0000 |
commit | 046b007d8597642e05e5b51d9e9e8fa15b9c839e (patch) | |
tree | c971c16a20cd2e70fa4851dd4614027fdde3c1b4 /bfd/mach-o.h | |
parent | 6d78d0b92e4cb8284544af89e9ca3452e46a0bd1 (diff) | |
download | gdb-046b007d8597642e05e5b51d9e9e8fa15b9c839e.zip gdb-046b007d8597642e05e5b51d9e9e8fa15b9c839e.tar.gz 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.h | 223 |
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 *); |