bfd/
authorTristan Gingold <gingold@adacore.com>
Mon, 8 Aug 2011 10:21:02 +0000 (10:21 +0000)
committerTristan Gingold <gingold@adacore.com>
Mon, 8 Aug 2011 10:21:02 +0000 (10:21 +0000)
2011-08-08  Tristan Gingold  <gingold@adacore.com>

* mach-o.h (bfd_mach_o_version_min_command): New structure.
(bfd_mach_o_load_command): Add version_min.
(mach_o_data_struct): Fix comment.
* mach-o.c (bfd_mach_o_read_version_min): New function.
(bfd_mach_o_read_command): Handle BFD_MACH_O_LC_FUNCTION_STARTS,
BFD_MACH_O_LC_VERSION_MIN_MACOSX and
BFD_MACH_O_LC_VERSION_MIN_IPHONEOS.
(bfd_mach_o_get_name_or_null): New function.
(bfd_mach_o_get_name): Use the above new one.
(bfd_mach_o_load_command_name): Add the above new commands.
(bfd_mach_o_bfd_print_private_bfd_data): Display numerically
unknown commands.  Handle BFD_MACH_O_LC_FUNCTION_STARTS,
BFD_MACH_O_LC_VERSION_MIN_MACOSX and
BFD_MACH_O_LC_VERSION_MIN_IPHONEOS.

include/mach-o/
2011-08-08  Tristan Gingold  <gingold@adacore.com>

* loader.h (bfd_mach_o_load_command_type): Add
BFD_MACH_O_LC_LOAD_UPWARD_DYLIB, BFD_MACH_O_LC_VERSION_MIN_MACOSX,
BFD_MACH_O_LC_VERSION_MIN_IPHONEOS, BFD_MACH_O_LC_FUNCTION_STARTS,
and BFD_MACH_O_LC_DYLD_ENVIRONMENT.
* external.h (mach_o_version_min_command_external): New structure.

bfd/ChangeLog
bfd/mach-o.c
bfd/mach-o.h
include/mach-o/ChangeLog
include/mach-o/external.h
include/mach-o/loader.h

index 9cad7fe9bc213aa48cb3a9f1bd2ade4e79e9a414..89b459e5e91f58d1f602fdae3388afcdff1d7d47 100644 (file)
@@ -1,3 +1,20 @@
+2011-08-08  Tristan Gingold  <gingold@adacore.com>
+
+       * mach-o.h (bfd_mach_o_version_min_command): New structure.
+       (bfd_mach_o_load_command): Add version_min.
+       (mach_o_data_struct): Fix comment.
+       * mach-o.c (bfd_mach_o_read_version_min): New function.
+       (bfd_mach_o_read_command): Handle BFD_MACH_O_LC_FUNCTION_STARTS,
+       BFD_MACH_O_LC_VERSION_MIN_MACOSX and
+       BFD_MACH_O_LC_VERSION_MIN_IPHONEOS.
+       (bfd_mach_o_get_name_or_null): New function.
+       (bfd_mach_o_get_name): Use the above new one.
+       (bfd_mach_o_load_command_name): Add the above new commands.
+       (bfd_mach_o_bfd_print_private_bfd_data): Display numerically
+       unknown commands.  Handle BFD_MACH_O_LC_FUNCTION_STARTS,
+       BFD_MACH_O_LC_VERSION_MIN_MACOSX and
+       BFD_MACH_O_LC_VERSION_MIN_IPHONEOS.
+
 2011-08-08  Tristan Gingold  <gingold@adacore.com>
 
        * mach-o.h: Move size macros to external.h
index 5973df790657d304a2411756c630c5ee26674f28..445ad185dd01007243f83ec089da14107ebfbcef 100644 (file)
@@ -2433,6 +2433,25 @@ bfd_mach_o_read_dyld_info (bfd *abfd, bfd_mach_o_load_command *command)
   return 0;
 }
 
+static bfd_boolean
+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_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
+      || 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);
+  return TRUE;
+}
+
 static int
 bfd_mach_o_read_segment (bfd *abfd,
                          bfd_mach_o_load_command *command,
@@ -2606,6 +2625,7 @@ bfd_mach_o_read_command (bfd *abfd, bfd_mach_o_load_command *command)
       break;
     case BFD_MACH_O_LC_CODE_SIGNATURE:
     case BFD_MACH_O_LC_SEGMENT_SPLIT_INFO:
+    case BFD_MACH_O_LC_FUNCTION_STARTS:
       if (bfd_mach_o_read_linkedit (abfd, command) != 0)
        return -1;
       break;
@@ -2613,6 +2633,11 @@ bfd_mach_o_read_command (bfd *abfd, bfd_mach_o_load_command *command)
       if (bfd_mach_o_read_dyld_info (abfd, command) != 0)
        return -1;
       break;
+    case BFD_MACH_O_LC_VERSION_MIN_MACOSX:
+    case BFD_MACH_O_LC_VERSION_MIN_IPHONEOS:
+      if (!bfd_mach_o_read_version_min (abfd, command))
+       return -1;
+      break;
     default:
       (*_bfd_error_handler) (_("unable to read unknown load command 0x%lx"),
                             (unsigned long) command->type);
@@ -3308,12 +3333,24 @@ bfd_mach_o_print_flags (const bfd_mach_o_xlat_name *table,
 }
 
 static const char *
-bfd_mach_o_get_name (const bfd_mach_o_xlat_name *table, unsigned long val)
+bfd_mach_o_get_name_or_null (const bfd_mach_o_xlat_name *table,
+                             unsigned long val)
 {
   for (; table->name; table++)
     if (table->val == val)
       return table->name;
-  return "*UNKNOWN*";
+  return NULL;
+}
+
+static const char *
+bfd_mach_o_get_name (const bfd_mach_o_xlat_name *table, unsigned long val)
+{
+  const char *res = bfd_mach_o_get_name_or_null (table, val);
+
+  if (res == NULL)
+    return "*UNKNOWN*";
+  else
+    return res;
 }
 
 static bfd_mach_o_xlat_name bfd_mach_o_cpu_name[] =
@@ -3451,6 +3488,11 @@ static bfd_mach_o_xlat_name bfd_mach_o_load_command_name[] =
   { "lazy_load_dylib", BFD_MACH_O_LC_LAZY_LOAD_DYLIB},
   { "encryption_info", BFD_MACH_O_LC_ENCRYPTION_INFO},
   { "dyld_info", BFD_MACH_O_LC_DYLD_INFO},
+  { "load_upward_lib", BFD_MACH_O_LC_LOAD_UPWARD_DYLIB},
+  { "version_min_macosx", BFD_MACH_O_LC_VERSION_MIN_MACOSX},
+  { "version_min_iphoneos", BFD_MACH_O_LC_VERSION_MIN_IPHONEOS},
+  { "function_starts", BFD_MACH_O_LC_FUNCTION_STARTS},
+  { "dyld_environment", BFD_MACH_O_LC_DYLD_ENVIRONMENT},
   { NULL, 0}
 };
 
@@ -3843,9 +3885,16 @@ bfd_mach_o_bfd_print_private_bfd_data (bfd *abfd, void * ptr)
   for (i = 0; i < mdata->header.ncmds; i++)
     {
       bfd_mach_o_load_command *cmd = &mdata->commands[i];
+      const char *cmd_name;
       
-      fprintf (file, "Load command %s:",
-               bfd_mach_o_get_name (bfd_mach_o_load_command_name, cmd->type));
+      cmd_name = bfd_mach_o_get_name_or_null
+        (bfd_mach_o_load_command_name, cmd->type);
+      fprintf (file, "Load command ");
+      if (cmd_name == NULL)
+        fprintf (file, "0x%02x:", cmd->type);
+      else
+        fprintf (file, "%s:", cmd_name);
+
       switch (cmd->type)
        {
        case BFD_MACH_O_LC_SEGMENT:
@@ -3903,6 +3952,7 @@ bfd_mach_o_bfd_print_private_bfd_data (bfd *abfd, void * ptr)
           break;
         case BFD_MACH_O_LC_CODE_SIGNATURE:
         case BFD_MACH_O_LC_SEGMENT_SPLIT_INFO:
+        case BFD_MACH_O_LC_FUNCTION_STARTS:
          {
            bfd_mach_o_linkedit_command *linkedit = &cmd->command.linkedit;
            fprintf
@@ -3957,8 +4007,18 @@ bfd_mach_o_bfd_print_private_bfd_data (bfd *abfd, void * ptr)
           fprintf (file, "\n");
           bfd_mach_o_print_dyld_info (abfd, cmd, file);
           break;
+       case BFD_MACH_O_LC_VERSION_MIN_MACOSX:
+       case BFD_MACH_O_LC_VERSION_MIN_IPHONEOS:
+          {
+            bfd_mach_o_version_min_command *ver = &cmd->command.version_min;
+
+            fprintf (file, " %u.%u.%u\n", ver->rel, ver->maj, ver->min);
+          }
+          break;
        default:
          fprintf (file, "\n");
+          fprintf (file, "  offset: 0x%08lx\n", (unsigned long)cmd->offset);
+          fprintf (file, "    size: 0x%08lx\n", (unsigned long)cmd->len);
          break;
        }
       fputc ('\n', file);
index de9640a88026b2166aa2a2f3bfef89a819769d1b..1da79ffaff1e7eb9a9c1f993323feba1ff4dab0c 100644 (file)
@@ -453,6 +453,15 @@ typedef struct bfd_mach_o_dyld_info_command
 }
 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;
+}
+bfd_mach_o_version_min_command;
+
 typedef struct bfd_mach_o_load_command
 {
   bfd_mach_o_load_command_type type;
@@ -472,6 +481,7 @@ typedef struct bfd_mach_o_load_command
     bfd_mach_o_linkedit_command linkedit;
     bfd_mach_o_str_command str;
     bfd_mach_o_dyld_info_command dyld_info;
+    bfd_mach_o_version_min_command version_min;
   }
   command;
 }
@@ -493,7 +503,7 @@ typedef struct mach_o_data_struct
   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
+     a direct access to it.  Although it is not clearly stated, only one symtab
      is expected.  */
   bfd_mach_o_symtab_command *symtab;
   bfd_mach_o_dysymtab_command *dysymtab;
index dff287a52158ef6a8a74f272f9851a89ba05fed7..2276d01459edbc8d4cf0b43efab343ac7092fd78 100644 (file)
@@ -1,3 +1,11 @@
+2011-08-08  Tristan Gingold  <gingold@adacore.com>
+
+       * loader.h (bfd_mach_o_load_command_type): Add
+       BFD_MACH_O_LC_LOAD_UPWARD_DYLIB, BFD_MACH_O_LC_VERSION_MIN_MACOSX,
+       BFD_MACH_O_LC_VERSION_MIN_IPHONEOS, BFD_MACH_O_LC_FUNCTION_STARTS,
+       and BFD_MACH_O_LC_DYLD_ENVIRONMENT.
+       * external.h (mach_o_version_min_command_external): New structure.
+
 2011-08-08  Tristan Gingold  <gingold@adacore.com>
 
        * loader.h: Reorder declarations.
index c2fe7e333d94acd9374d706cbb941fb2f396a14b..ebb09a7761e11d0a659798b1f59e804e5abbfad7 100644 (file)
@@ -249,6 +249,12 @@ struct mach_o_dyld_info_command_external
   unsigned char export_size[4];
 };
 
+struct mach_o_version_min_command_external
+{
+  unsigned char version[4];
+  unsigned char reserved[4];
+};
+
 struct mach_o_fat_header_external
 {
   unsigned char magic[4];
index 1105204edb9f50ecc771640ba19cc2260c820330..357f65e54646a3b96b53e7d6fe69396d11bb7df1 100644 (file)
@@ -148,7 +148,12 @@ typedef enum bfd_mach_o_load_command_type
   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_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_load_command_type;
 \f