Add support for new load commands added by Apple to the MACH-O file format.
authorRoman Bolshakov <r.bolshakov@yadro.com>
Wed, 7 Nov 2018 15:20:22 +0000 (15:20 +0000)
committerNick Clifton <nickc@redhat.com>
Wed, 7 Nov 2018 15:20:22 +0000 (15:20 +0000)
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/ChangeLog
bfd/mach-o.c
bfd/mach-o.h
binutils/ChangeLog
binutils/od-macho.c
include/ChangeLog
include/mach-o/external.h
include/mach-o/loader.h

index 71a8da80db3c2023e8c6cef4ffe90dabfdd6c6a5..ef97897faf2b015827f867c422f7f115c1491a1d 100644 (file)
@@ -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.
index 1d0ade3a02cd31a97faec061252ba5e3e65aff8a..51217158ce1d222c4e76a4ad49413d053d3e8b12 100644 (file)
@@ -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;
 }
 
@@ -4681,6 +4677,37 @@ bfd_mach_o_read_source_version (bfd *abfd, bfd_mach_o_load_command *command)
   return TRUE;
 }
 
+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,
@@ -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;
index d80d43991eaa8dbcf12e5441e061794d4b427c06..61428d6a3aef7b98c164f94cf553556ab74c2933 100644 (file)
@@ -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;
index 8964c96ff17ea902f85841c9d3080ca29c21b14c..2eab660faf887b754d75c3f9dbb47686add401af 100644 (file)
@@ -1,4 +1,16 @@
+2018-11-06  Roman Bolshakov  <r.bolshakov@yadro.com>
+           Saagar Jha  <saagar@saagarjha.com>
+
+       PR 23728
+       * 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
+
 2018-11-07  Yoshinori Sato  <ysato@users.sourceforge.jp>
+
        * testsuite/lib/binutils-common.exp: Special section name
        use only rx-*-elf.
 
index 8153adae92563240eb3e273f75dc0357dade562a..c5474c8af66ba423a5ea22b9fcd3447c49bc5c80 100644 (file)
@@ -209,6 +209,10 @@ static const bfd_mach_o_xlat_name bfd_mach_o_load_command_name[] =
   { "encryption_info_64", BFD_MACH_O_LC_ENCRYPTION_INFO_64},
   { "linker_options", BFD_MACH_O_LC_LINKER_OPTIONS},
   { "linker_optimization_hint", BFD_MACH_O_LC_LINKER_OPTIMIZATION_HINT},
+  { "version_min_tvos", BFD_MACH_O_LC_VERSION_MIN_TVOS},
+  { "version_min_watchos", BFD_MACH_O_LC_VERSION_MIN_WATCHOS},
+  { "note", BFD_MACH_O_LC_NOTE},
+  { "build_version", BFD_MACH_O_LC_BUILD_VERSION},
   { NULL, 0}
 };
 
@@ -229,7 +233,25 @@ static const bfd_mach_o_xlat_name bfd_mach_o_thread_x86_name[] =
   { "state_none", BFD_MACH_O_x86_THREAD_STATE_NONE},
   { NULL, 0 }
 };
-\f
+
+static const bfd_mach_o_xlat_name bfd_mach_o_platform_name[] =
+{
+  { "macos", BFD_MACH_O_PLATFORM_MACOS},
+  { "ios", BFD_MACH_O_PLATFORM_IOS},
+  { "tvos", BFD_MACH_O_PLATFORM_TVOS},
+  { "watchos", BFD_MACH_O_PLATFORM_WATCHOS},
+  { "bridgeos", BFD_MACH_O_PLATFORM_BRIDGEOS},
+  { NULL, 0 }
+};
+
+static const bfd_mach_o_xlat_name bfd_mach_o_tool_name[] =
+{
+  { "clang", BFD_MACH_O_TOOL_CLANG},
+  { "swift", BFD_MACH_O_TOOL_SWIFT},
+  { "ld", BFD_MACH_O_TOOL_LD},
+  { NULL, 0 }
+};
+
 static void
 bfd_mach_o_print_flags (const bfd_mach_o_xlat_name *table,
                         unsigned long val)
@@ -1438,6 +1460,68 @@ dump_twolevel_hints (bfd *abfd, bfd_mach_o_twolevel_hints_command *cmd)
   free (buf);
 }
 
+static void
+printf_version (uint32_t version)
+{
+  uint32_t maj, min, upd;
+
+  maj = (version >> 16) & 0xffff;
+  min = (version >> 8) & 0xff;
+  upd = version & 0xff;
+
+  printf ("%u.%u.%u", maj, min, upd);
+}
+
+static void
+dump_build_version (bfd *abfd, bfd_mach_o_load_command *cmd)
+{
+  const char *platform_name;
+  size_t tools_len, tools_offset;
+  bfd_mach_o_build_version_tool *tools, *tool;
+  bfd_mach_o_build_version_command *ver = &cmd->command.build_version;
+  uint32_t i;
+
+  platform_name = bfd_mach_o_get_name_or_null
+    (bfd_mach_o_platform_name, ver->platform);
+  if (platform_name == NULL)
+    printf ("   platform: 0x%08x\n", ver->platform);
+  else
+    printf ("   platform: %s\n", platform_name);
+  printf ("   os:       ");
+  printf_version (ver->minos);
+  printf ("\n   sdk:      ");
+  printf_version (ver->sdk);
+  printf ("\n   ntools:   %u\n", ver->ntools);
+
+  tools_len = sizeof (bfd_mach_o_build_version_tool) * ver->ntools;
+  tools_offset = cmd->offset + cmd->len - tools_len;
+
+  tools = xmalloc (tools_len);
+  if (bfd_seek (abfd, tools_offset, SEEK_SET) != 0
+      || bfd_bread (tools, tools_len, abfd) != tools_len)
+    {
+      non_fatal (_("cannot read build tools"));
+      free (tools);
+      return;
+    }
+
+  for (i = 0, tool = tools; i < ver->ntools; i++, tool++)
+    {
+      const char * tool_name;
+
+      tool_name = bfd_mach_o_get_name_or_null
+       (bfd_mach_o_tool_name, tool->tool);
+      if (tool_name == NULL)
+       printf ("   tool:     0x%08x\n", tool->tool);
+      else
+       printf ("   tool:     %s\n", tool_name);
+      printf ("   version:  ");
+      printf_version (tool->version);
+      printf ("\n");
+    }
+  free (tools);
+}
+
 static void
 dump_load_command (bfd *abfd, bfd_mach_o_load_command *cmd,
                    unsigned int idx, bfd_boolean verbose)
@@ -1582,10 +1666,16 @@ dump_load_command (bfd *abfd, bfd_mach_o_load_command *cmd,
       break;
     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:
       {
         bfd_mach_o_version_min_command *ver = &cmd->command.version_min;
 
-        printf ("    %u.%u.%u\n", ver->rel, ver->maj, ver->min);
+        printf ("   os: ");
+        printf_version (ver->version);
+        printf ("\n   sdk: ");
+        printf_version (ver->sdk);
+        printf ("\n");
       }
       break;
     case BFD_MACH_O_LC_SOURCE_VERSION:
@@ -1643,6 +1733,21 @@ dump_load_command (bfd *abfd, bfd_mach_o_load_command *cmd,
        printf ("\n");
         break;
       }
+    case BFD_MACH_O_LC_NOTE:
+      {
+        bfd_mach_o_note_command *note = &cmd->command.note;
+        printf ("   data owner: %.16s\n", note->data_owner);
+        printf ("   offset:     ");
+       printf_uint64 (note->offset);
+        printf ("\n"
+                "   size:       ");
+       printf_uint64 (note->size);
+       printf ("\n");
+        break;
+      }
+    case BFD_MACH_O_LC_BUILD_VERSION:
+      dump_build_version (abfd, cmd);
+      break;
     default:
       break;
     }
@@ -2205,9 +2310,9 @@ mach_o_dump (bfd *abfd)
 /* Vector for Mach-O.  */
 
 const struct objdump_private_desc objdump_private_desc_mach_o =
-  {
   mach_o_help,
   mach_o_filter,
   mach_o_dump,
   options
-  };
+{
+ mach_o_help,
+ mach_o_filter,
+ mach_o_dump,
+ options
+};
index 3bcf18047b49921e5055ffa7719ae09de096f8aa..cd31f1cd61af3d8b4c03999a18992d862c56338a 100644 (file)
@@ -1,3 +1,13 @@
+2018-11-07  Roman Bolshakov <r.bolshakov@yadro.com>
+           Saagar Jha  <saagar@saagarjha.com>
+
+       * 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.
+
 2018-11-06  Romain Margheriti  <lilrom13@gmail.com>
 
        PR 23742
index 2609bad982a4dffd384877c867ad947a9a2c527b..bf3c0c890ad422ae8b094915043a22dc24b2fb98 100644 (file)
@@ -308,7 +308,7 @@ struct mach_o_twolevel_hints_command_external
 struct mach_o_version_min_command_external
 {
   unsigned char version[4];
-  unsigned char reserved[4];
+  unsigned char sdk[4];
 };
 
 struct mach_o_encryption_info_command_external
@@ -345,12 +345,27 @@ struct mach_o_source_version_command_external
                                   and 24 bits for A.  */
 };
 
+struct mach_o_note_command_external
+{
+  unsigned char data_owner[16]; /* Owner name for this note.  */
+  unsigned char offset[8];      /* File offset of the note.  */
+  unsigned char size[8];        /* Length of the note.  */
+};
+
+struct mach_o_build_version_command_external
+{
+  unsigned char platform[4];    /* Target platform.  */
+  unsigned char minos[4];       /* X.Y.Z is encoded in nibbles xxxx.yy.zz.  */
+  unsigned char sdk[4];         /* X.Y.Z is encoded in nibbles xxxx.yy.zz.  */
+  unsigned char ntools[4];      /* Number of tool entries following this.  */
+};
+
 /* The LD_DATA_IN_CODE command use a linkedit_data_command that points to
    a table of entries.  */
 
 struct mach_o_data_in_code_entry_external
 {
-  unsigned char offset[4];     /* Offset from the mach_header. */
+  unsigned char offset[4];     /* Offset from the mach_header.  */
   unsigned char length[2];     /* Number of bytes.  */
   unsigned char kind[2];       /* Kind.  See BFD_MACH_O_DICE_ values.  */
 };
index 9abc51c35dda34cde5001312d7dc823bd5288f18..7b0a8067e0b2196dd1a23892544ce66e3f15cd7f 100644 (file)
@@ -161,32 +161,34 @@ typedef enum bfd_mach_o_load_command_type
   /* Load a dynamically linked shared library that is allowed to be
        missing (weak).  */
   BFD_MACH_O_LC_LOAD_WEAK_DYLIB = 0x18,
-  BFD_MACH_O_LC_SEGMENT_64 = 0x19,     /* 64-bit segment of this file to be
-                                           mapped.  */
-  BFD_MACH_O_LC_ROUTINES_64 = 0x1a,     /* Address of the dyld init routine
-                                           in a dylib.  */
-  BFD_MACH_O_LC_UUID = 0x1b,            /* 128-bit UUID of the executable.  */
-  BFD_MACH_O_LC_RPATH = 0x1c,          /* Run path addiions.  */
-  BFD_MACH_O_LC_CODE_SIGNATURE = 0x1d, /* Local of code signature.  */
-  BFD_MACH_O_LC_SEGMENT_SPLIT_INFO = 0x1e, /* Local of info to split seg.  */
-  BFD_MACH_O_LC_REEXPORT_DYLIB = 0x1f,  /* Load and re-export lib.  */
-  BFD_MACH_O_LC_LAZY_LOAD_DYLIB = 0x20, /* Delay load of lib until use.  */
-  BFD_MACH_O_LC_ENCRYPTION_INFO = 0x21, /* Encrypted segment info.  */
-  BFD_MACH_O_LC_DYLD_INFO = 0x22,      /* Compressed dyld information.  */
-  BFD_MACH_O_LC_LOAD_UPWARD_DYLIB = 0x23, /* Load upward dylib.  */
-  BFD_MACH_O_LC_VERSION_MIN_MACOSX = 0x24,   /* Minimal MacOSX version.  */
-  BFD_MACH_O_LC_VERSION_MIN_IPHONEOS = 0x25, /* Minimal IOS version.  */
-  BFD_MACH_O_LC_FUNCTION_STARTS = 0x26,  /* Compressed table of func start.  */
-  BFD_MACH_O_LC_DYLD_ENVIRONMENT = 0x27, /* Env variable string for dyld.  */
-  BFD_MACH_O_LC_MAIN = 0x28,             /* Entry point.  */
-  BFD_MACH_O_LC_DATA_IN_CODE = 0x29,     /* Table of non-instructions.  */
-  BFD_MACH_O_LC_SOURCE_VERSION = 0x2a,   /* Source version.  */
-  BFD_MACH_O_LC_DYLIB_CODE_SIGN_DRS = 0x2b, /* DRs from dylibs.  */
-  BFD_MACH_O_LC_ENCRYPTION_INFO_64 = 0x2c, /* Encrypted 64 bit seg info.  */
-  BFD_MACH_O_LC_LINKER_OPTIONS = 0x2d, /* Linker options.  */
-  BFD_MACH_O_LC_LINKER_OPTIMIZATION_HINT = 0x2e, /* Optimization hints.  */
-  BFD_MACH_O_LC_VERSION_MIN_WATCHOS = 0x30, /* Minimal WatchOS version.  */
-  BFD_MACH_O_LC_BUILD_VERSION = 0x32     /* Records linker, SDK, OS, and tools version used.  */
+  BFD_MACH_O_LC_SEGMENT_64 = 0x19,             /* 64-bit segment of this file to be
+                                                  mapped.  */
+  BFD_MACH_O_LC_ROUTINES_64 = 0x1a,            /* Address of the dyld init routine
+                                                  in a dylib.  */
+  BFD_MACH_O_LC_UUID = 0x1b,                   /* 128-bit UUID of the executable.  */
+  BFD_MACH_O_LC_RPATH = 0x1c,                  /* Run path addiions.  */
+  BFD_MACH_O_LC_CODE_SIGNATURE = 0x1d,         /* Local of code signature.  */
+  BFD_MACH_O_LC_SEGMENT_SPLIT_INFO = 0x1e,     /* Local of info to split seg.  */
+  BFD_MACH_O_LC_REEXPORT_DYLIB = 0x1f,         /* Load and re-export lib.  */
+  BFD_MACH_O_LC_LAZY_LOAD_DYLIB = 0x20,                /* Delay load of lib until use.  */
+  BFD_MACH_O_LC_ENCRYPTION_INFO = 0x21,                /* Encrypted segment info.  */
+  BFD_MACH_O_LC_DYLD_INFO = 0x22,              /* Compressed dyld information.  */
+  BFD_MACH_O_LC_LOAD_UPWARD_DYLIB = 0x23,      /* Load upward dylib.  */
+  BFD_MACH_O_LC_VERSION_MIN_MACOSX = 0x24,     /* Minimal MacOSX version.  */
+  BFD_MACH_O_LC_VERSION_MIN_IPHONEOS = 0x25,   /* Minimal IOS version.  */
+  BFD_MACH_O_LC_FUNCTION_STARTS = 0x26,        /* Compressed table of func start.  */
+  BFD_MACH_O_LC_DYLD_ENVIRONMENT = 0x27,       /* Env variable string for dyld.  */
+  BFD_MACH_O_LC_MAIN = 0x28,                   /* Entry point.  */
+  BFD_MACH_O_LC_DATA_IN_CODE = 0x29,           /* Table of non-instructions.  */
+  BFD_MACH_O_LC_SOURCE_VERSION = 0x2a,         /* Source version.  */
+  BFD_MACH_O_LC_DYLIB_CODE_SIGN_DRS = 0x2b,    /* DRs from dylibs.  */
+  BFD_MACH_O_LC_ENCRYPTION_INFO_64 = 0x2c,     /* Encrypted 64 bit seg info.  */
+  BFD_MACH_O_LC_LINKER_OPTIONS = 0x2d,         /* Linker options.  */
+  BFD_MACH_O_LC_LINKER_OPTIMIZATION_HINT = 0x2e,/* Optimization hints.  */
+  BFD_MACH_O_LC_VERSION_MIN_TVOS = 0x2f,       /* Minimal tvOS version.  */
+  BFD_MACH_O_LC_VERSION_MIN_WATCHOS = 0x30,    /* Minimal WatchOS version.  */
+  BFD_MACH_O_LC_NOTE = 0x31,                   /* Region of arbitrary data.  */
+  BFD_MACH_O_LC_BUILD_VERSION = 0x32,          /* Generic build version.  */
 }
 bfd_mach_o_load_command_type;
 \f