Mach-O: Add objdump -P dyld_info to dump dyld data.

include/mach-o/
	* loader.h: Add macros for rebase, bind and export constants.

binutils/
	* od-macho.c (OPT_DYLD_INFO): New macro.
	(options): Add entry for dyld_info.
	(mach_o_help): Likewise.
	(load_and_dump, dump_dyld_info_rebase, dump_dyld_info_bind)
	(dump_dyld_info_export_1, dump_dyld_info_export): New functions.
	(bfd_mach_o_dyld_rebase_type_name): New array.
	(export_info_data): New struct.
	(dump_dyld_info): Add verbose argument.  Dump rebase, bind and
	exports data.
	(dump_load_command): Adjust dump_dyld_info call.
	(mach_o_dump): Handle dyld_info.
This commit is contained in:
Tristan Gingold
2014-04-11 17:10:03 +02:00
parent 47f8a1070c
commit e89d3dee76
4 changed files with 426 additions and 8 deletions

View File

@@ -342,6 +342,63 @@ bfd_mach_o_section_attribute;
#define BFD_MACH_O_INDIRECT_SYM_LOCAL 0x80000000
#define BFD_MACH_O_INDIRECT_SYM_ABS 0x40000000
/* Constants for dyld info rebase. */
#define BFD_MACH_O_REBASE_OPCODE_MASK 0xf0
#define BFD_MACH_O_REBASE_IMMEDIATE_MASK 0x0f
/* The rebase opcodes. */
#define BFD_MACH_O_REBASE_OPCODE_DONE 0x00
#define BFD_MACH_O_REBASE_OPCODE_SET_TYPE_IMM 0x10
#define BFD_MACH_O_REBASE_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB 0x20
#define BFD_MACH_O_REBASE_OPCODE_ADD_ADDR_ULEB 0x30
#define BFD_MACH_O_REBASE_OPCODE_ADD_ADDR_IMM_SCALED 0x40
#define BFD_MACH_O_REBASE_OPCODE_DO_REBASE_IMM_TIMES 0x50
#define BFD_MACH_O_REBASE_OPCODE_DO_REBASE_ULEB_TIMES 0x60
#define BFD_MACH_O_REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB 0x70
#define BFD_MACH_O_REBASE_OPCODE_DO_REBASE_ULEB_TIMES_SKIPPING_ULEB 0x80
/* The rebase type. */
#define BFD_MACH_O_REBASE_TYPE_POINTER 1
#define BFD_MACH_O_REBASE_TYPE_TEXT_ABSOLUTE32 2
#define BFD_MACH_O_REBASE_TYPE_TEXT_PCREL32 3
/* Constants for dyld info bind. */
#define BFD_MACH_O_BIND_OPCODE_MASK 0xf0
#define BFD_MACH_O_BIND_IMMEDIATE_MASK 0x0f
/* The bind opcodes. */
#define BFD_MACH_O_BIND_OPCODE_DONE 0x00
#define BFD_MACH_O_BIND_OPCODE_SET_DYLIB_ORDINAL_IMM 0x10
#define BFD_MACH_O_BIND_OPCODE_SET_DYLIB_ORDINAL_ULEB 0x20
#define BFD_MACH_O_BIND_OPCODE_SET_DYLIB_SPECIAL_IMM 0x30
#define BFD_MACH_O_BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM 0x40
#define BFD_MACH_O_BIND_OPCODE_SET_TYPE_IMM 0x50
#define BFD_MACH_O_BIND_OPCODE_SET_ADDEND_SLEB 0x60
#define BFD_MACH_O_BIND_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB 0x70
#define BFD_MACH_O_BIND_OPCODE_ADD_ADDR_ULEB 0x80
#define BFD_MACH_O_BIND_OPCODE_DO_BIND 0x90
#define BFD_MACH_O_BIND_OPCODE_DO_BIND_ADD_ADDR_ULEB 0xa0
#define BFD_MACH_O_BIND_OPCODE_DO_BIND_ADD_ADDR_IMM_SCALED 0xb0
#define BFD_MACH_O_BIND_OPCODE_DO_BIND_ULEB_TIMES_SKIPPING_ULEB 0xc0
/* The bind types. */
#define BFD_MACH_O_BIND_TYPE_POINTER 1
#define BFD_MACH_O_BIND_TYPE_TEXT_ABSOLUTE32 2
#define BFD_MACH_O_BIND_TYPE_TEXT_PCREL32 3
/* The special dylib. */
#define BFD_MACH_O_BIND_SPECIAL_DYLIB_SELF 0
#define BFD_MACH_O_BIND_SPECIAL_DYLIB_MAIN_EXECUTABLE -1
#define BFD_MACH_O_BIND_SPECIAL_DYLIB_FLAT_LOOKUP -2
/* Constants for dyld info export. */
#define BFD_MACH_O_EXPORT_SYMBOL_FLAGS_KIND_MASK 0x03
#define BFD_MACH_O_EXPORT_SYMBOL_FLAGS_KIND_REGULAR 0x00
#define BFD_MACH_O_EXPORT_SYMBOL_FLAGS_KIND_THREAD_LOCAL 0x01
#define BFD_MACH_O_EXPORT_SYMBOL_FLAGS_WEAK_DEFINITION 0x04
#define BFD_MACH_O_EXPORT_SYMBOL_FLAGS_REEXPORT 0x08
#define BFD_MACH_O_EXPORT_SYMBOL_FLAGS_STUB_AND_RESOLVER 0x10
/* Constants for DATA_IN_CODE entries. */
typedef enum bfd_mach_o_data_in_code_entry_kind
{