>From 6b2f196b103d50acd74c7dae4fa7630c391c1cf5 Mon Sep 17 00:00:00 2001
From: Saagar Jha <saagar@saagarjha.com>
Date: Fri, 26 Oct 2018 04:50:12 -0700
Subject: [PATCH 4/5] Add LC_NOTE load command

This commit adds support for the new LC_NOTE load command from macOS
Mojave.

ChangeLog:
2018-10-26  Saagar Jha  <saagar@saagarjha.com>

	* include/mach-o/external.h: Define mach_o_note_command_external
	* include/mach-o/loader.h: Add BFD_MACH_O_LC_NOTE_VERSION

bfd/ChangeLog:
2018-10-26  Saagar Jha  <saagar@saagarjha.com>

	* mach-o.c: Add code to read in LC_NOTE commands
	* mach-o.h: Define bfd_mach_o_note_command

binutils/ChangeLog:
2018-10-26  Saagar Jha  <saagar@saagarjha.com>

	* od-macho.c: Add code to dump note commands
---
 bfd/mach-o.c              | 19 +++++++++++++++++++
 bfd/mach-o.h              |  9 +++++++++
 binutils/od-macho.c       |  8 ++++++++
 include/mach-o/external.h |  7 +++++++
 include/mach-o/loader.h   |  1 +
 5 files changed, 44 insertions(+)

diff --git a/bfd/mach-o.c b/bfd/mach-o.c
index f7fe74e291..a1a39e9ad6 100644
--- a/bfd/mach-o.c
+++ b/bfd/mach-o.c
@@ -4686,6 +4686,21 @@ 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, sizeof (raw.data_owner));
+  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_segment (bfd *abfd,
 			 bfd_mach_o_load_command *command,
@@ -4893,6 +4908,10 @@ bfd_mach_o_read_command (bfd *abfd, bfd_mach_o_load_command *command)
       if (!bfd_mach_o_read_source_version (abfd, command))
 	return FALSE;
       break;
+    case BFD_MACH_O_LC_NOTE:
+      if (!bfd_mach_o_read_note (abfd, command))
+  return FALSE;
+      break;
     default:
       command->len = 0;
       _bfd_error_handler (_("%pB: unknown load command %#x"),
diff --git a/bfd/mach-o.h b/bfd/mach-o.h
index 2741012799..743783feab 100644
--- a/bfd/mach-o.h
+++ b/bfd/mach-o.h
@@ -554,6 +554,14 @@ 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];
+  unsigned long offset;
+  unsigned long size;
+}
+bfd_mach_o_note_command;
+
 typedef struct bfd_mach_o_load_command
 {
   /* Next command in the single linked list.  */
@@ -587,6 +595,7 @@ 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;
   } command;
 }
 bfd_mach_o_load_command;
diff --git a/binutils/od-macho.c b/binutils/od-macho.c
index 67c9c35d9f..146e96fe25 100644
--- a/binutils/od-macho.c
+++ b/binutils/od-macho.c
@@ -209,6 +209,7 @@ 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},
+  { "note", BFD_MACH_O_LC_NOTE},
   { NULL, 0}
 };
 
@@ -1648,6 +1649,13 @@ 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: %s\n", note->data_owner);
+        printf ("       offset: 0x%08lx\n", note->offset);
+        printf ("         size: %lu", note->size);
+      }
     default:
       break;
     }
diff --git a/include/mach-o/external.h b/include/mach-o/external.h
index 3e1cdde249..4dab34550a 100644
--- a/include/mach-o/external.h
+++ b/include/mach-o/external.h
@@ -416,5 +416,12 @@ struct mach_o_dyld_cache_image_info_external
   unsigned char pad[4];
 };
 
+struct mach_o_note_command_external
+{
+  unsigned char data_owner[16];
+  unsigned char offset[8];
+  unsigned char size[8];
+};
+
 
 #endif /* _MACH_O_EXTERNAL_H */
diff --git a/include/mach-o/loader.h b/include/mach-o/loader.h
index 2c02102c9f..a00e92f503 100644
--- a/include/mach-o/loader.h
+++ b/include/mach-o/loader.h
@@ -186,6 +186,7 @@ typedef enum bfd_mach_o_load_command_type
   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_NOTE = 0x31, /* Data.  */
 }
 bfd_mach_o_load_command_type;
 
-- 
2.19.1

