diff options
author | Roman Bolshakov <r.bolshakov@yadro.com> | 2018-11-07 15:20:22 +0000 |
---|---|---|
committer | Nick Clifton <nickc@redhat.com> | 2018-11-07 15:20:22 +0000 |
commit | fc7b364aba41819a5d74ae0ac69f050af282d057 (patch) | |
tree | 3822fd2dce022a7971badc51cf07800dc103786c /bfd | |
parent | 35ee2dc2e4de8b1ae73f420d5db3375f92300b70 (diff) | |
download | gdb-fc7b364aba41819a5d74ae0ac69f050af282d057.zip gdb-fc7b364aba41819a5d74ae0ac69f050af282d057.tar.gz gdb-fc7b364aba41819a5d74ae0ac69f050af282d057.tar.bz2 |
Add support for new load commands added by Apple to the MACH-O file format.
bfd * mach-o.h: Add new enums for BFD_MACH_O_PLATFORM_MACOS,
BFD_MACH_O_PLATFORM_IOS, BFD_MACH_O_PLATFORM_TVOS,
BFD_MACH_O_PLATFORM_WATCHOS, BFD_MACH_O_PLATFORM_BRIDGEOS,
BFD_MACH_O_TOOL_CLANG, BFD_MACH_O_TOOL_SWIFT, BFD_MACH_O_TOOL_LD.
(struct bfd_mach_o_note_command): New.
(struct bfd_mach_o_build_version_tool): New.
(struct bfd_mach_o_build_version_command): New.
(bfd_mach_o_read_version_min): Don't split version into
a few fields. Rename reserved to sdk.
* mach-o.c (bfd_mach_o_read_version_min): Don't split version into a
few fields. Rename reserved to sdk.
(bfd_mach_o_read_command): Handle LC_VERSION_MIN_TVOS, LC_NOTE,
LC_BUILD_VERSION.
(bfd_mach_o_read_note): New.
(bfd_mach_o_read_build_version): New.
PR 23728
binutils* od-macho.c (printf_version): New.
(dump_load_command): Use it to print version. Print sdk version. Print
version info for watchOS and tvOS. Print LC_NOTE, LC_BUILD_VERSION.
(dump_buld_version): New.
(bfd_mach_o_platform_name): New
(bfd_mach_o_tool_name): New
* mach-o/external.h (mach_o_nversion_min_command_external): Rename
reserved to sdk.
(mach_o_note_command_external): New.
(mach_o_build_version_command_external): New.
* mach-o/loader.h (BFD_MACH_O_LC_VERSION_MIN_TVOS): Define.
(BFD_MACH_O_LC_NOTE): Define.
Diffstat (limited to 'bfd')
-rw-r--r-- | bfd/ChangeLog | 19 | ||||
-rw-r--r-- | bfd/mach-o.c | 47 | ||||
-rw-r--r-- | bfd/mach-o.h | 48 |
3 files changed, 102 insertions, 12 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 71a8da8..ef97897 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,22 @@ +2018-11-06 Roman Bolshakov <r.bolshakov@yadro.com> + Saagar Jha <saagar@saagarjha.com> + + * mach-o.h: Add new enums for BFD_MACH_O_PLATFORM_MACOS, + BFD_MACH_O_PLATFORM_IOS, BFD_MACH_O_PLATFORM_TVOS, + BFD_MACH_O_PLATFORM_WATCHOS, BFD_MACH_O_PLATFORM_BRIDGEOS, + BFD_MACH_O_TOOL_CLANG, BFD_MACH_O_TOOL_SWIFT, BFD_MACH_O_TOOL_LD. + (struct bfd_mach_o_note_command): New. + (struct bfd_mach_o_build_version_tool): New. + (struct bfd_mach_o_build_version_command): New. + (bfd_mach_o_read_version_min): Don't split version into + a few fields. Rename reserved to sdk. + * mach-o.c (bfd_mach_o_read_version_min): Don't split version into a + few fields. Rename reserved to sdk. + (bfd_mach_o_read_command): Handle LC_VERSION_MIN_TVOS, LC_NOTE, + LC_BUILD_VERSION. + (bfd_mach_o_read_note): New. + (bfd_mach_o_read_build_version): New. + 2018-11-07 Yoshinori Sato <ysato@users.sourceforge.jp> * config.bfd: Add rx-*-linux. diff --git a/bfd/mach-o.c b/bfd/mach-o.c index 1d0ade3..5121715 100644 --- a/bfd/mach-o.c +++ b/bfd/mach-o.c @@ -4598,16 +4598,12 @@ bfd_mach_o_read_version_min (bfd *abfd, bfd_mach_o_load_command *command) { bfd_mach_o_version_min_command *cmd = &command->command.version_min; struct mach_o_version_min_command_external raw; - unsigned int ver; if (bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw)) return FALSE; - ver = bfd_get_32 (abfd, raw.version); - cmd->rel = ver >> 16; - cmd->maj = ver >> 8; - cmd->min = ver; - cmd->reserved = bfd_get_32 (abfd, raw.reserved); + cmd->version = bfd_get_32 (abfd, raw.version); + cmd->sdk = bfd_get_32 (abfd, raw.sdk); return TRUE; } @@ -4682,6 +4678,37 @@ bfd_mach_o_read_source_version (bfd *abfd, bfd_mach_o_load_command *command) } static bfd_boolean +bfd_mach_o_read_note (bfd *abfd, bfd_mach_o_load_command *command) +{ + bfd_mach_o_note_command *cmd = &command->command.note; + struct mach_o_note_command_external raw; + + if (bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw)) + return FALSE; + + memcpy (cmd->data_owner, raw.data_owner, 16); + cmd->offset = bfd_get_64 (abfd, raw.offset); + cmd->size = bfd_get_64 (abfd, raw.size); + return TRUE; +} + +static bfd_boolean +bfd_mach_o_read_build_version (bfd *abfd, bfd_mach_o_load_command *command) +{ + bfd_mach_o_build_version_command *cmd = &command->command.build_version; + struct mach_o_build_version_command_external raw; + + if (bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw)) + return FALSE; + + cmd->platform = bfd_get_32 (abfd, raw.platform); + cmd->minos = bfd_get_32 (abfd, raw.minos); + cmd->sdk = bfd_get_32 (abfd, raw.sdk); + cmd->ntools = bfd_get_32 (abfd, raw.ntools); + return TRUE; +} + +static bfd_boolean bfd_mach_o_read_segment (bfd *abfd, bfd_mach_o_load_command *command, unsigned int wide) @@ -4877,6 +4904,7 @@ bfd_mach_o_read_command (bfd *abfd, bfd_mach_o_load_command *command) case BFD_MACH_O_LC_VERSION_MIN_MACOSX: case BFD_MACH_O_LC_VERSION_MIN_IPHONEOS: case BFD_MACH_O_LC_VERSION_MIN_WATCHOS: + case BFD_MACH_O_LC_VERSION_MIN_TVOS: if (!bfd_mach_o_read_version_min (abfd, command)) return FALSE; break; @@ -4889,7 +4917,14 @@ bfd_mach_o_read_command (bfd *abfd, bfd_mach_o_load_command *command) return FALSE; break; case BFD_MACH_O_LC_LINKER_OPTIONS: + break; + case BFD_MACH_O_LC_NOTE: + if (!bfd_mach_o_read_note (abfd, command)) + return FALSE; + break; case BFD_MACH_O_LC_BUILD_VERSION: + if (!bfd_mach_o_read_build_version (abfd, command)) + return FALSE; break; default: command->len = 0; diff --git a/bfd/mach-o.h b/bfd/mach-o.h index d80d439..61428d6 100644 --- a/bfd/mach-o.h +++ b/bfd/mach-o.h @@ -113,6 +113,18 @@ bfd_mach_o_segment_command; #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 { @@ -519,10 +531,8 @@ bfd_mach_o_dyld_info_command; typedef struct bfd_mach_o_version_min_command { - unsigned char rel; - unsigned char maj; - unsigned char min; - unsigned int reserved; + uint32_t version; + uint32_t sdk; } bfd_mach_o_version_min_command; @@ -551,6 +561,30 @@ typedef struct bfd_mach_o_source_version_command } 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. */ @@ -584,6 +618,8 @@ typedef struct bfd_mach_o_load_command 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; @@ -617,10 +653,10 @@ typedef struct mach_o_data_struct /* A place to stash dwarf2 info for this bfd. */ void *dwarf2_find_line_info; - /* BFD of .dSYM file. */ + /* BFD of .dSYM file. */ bfd *dsym_bfd; - /* Cache of dynamic relocs. */ + /* Cache of dynamic relocs. */ arelent *dyn_reloc_cache; } bfd_mach_o_data_struct; |