From fc7b364aba41819a5d74ae0ac69f050af282d057 Mon Sep 17 00:00:00 2001 From: Roman Bolshakov Date: Wed, 7 Nov 2018 15:20:22 +0000 Subject: 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. --- bfd/mach-o.c | 47 +++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 41 insertions(+), 6 deletions(-) (limited to 'bfd/mach-o.c') 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; -- cgit v1.1