Squashed 'third_party/elfutils/' content from commit 555e15e

Change-Id: I61cde98949e47e5c8c09c33260de17f30921be79
git-subtree-dir: third_party/elfutils
git-subtree-split: 555e15ebe8bf1eb33d00747173cfc80cc65648a4
diff --git a/libelf/note_xlate.h b/libelf/note_xlate.h
new file mode 100644
index 0000000..62c6f63
--- /dev/null
+++ b/libelf/note_xlate.h
@@ -0,0 +1,64 @@
+/* Conversion functions for notes.
+   Copyright (C) 2007, 2009, 2014 Red Hat, Inc.
+   This file is part of elfutils.
+
+   This file is free software; you can redistribute it and/or modify
+   it under the terms of either
+
+     * the GNU Lesser General Public License as published by the Free
+       Software Foundation; either version 3 of the License, or (at
+       your option) any later version
+
+   or
+
+     * the GNU General Public License as published by the Free
+       Software Foundation; either version 2 of the License, or (at
+       your option) any later version
+
+   or both in parallel, as here.
+
+   elfutils is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received copies of the GNU General Public License and
+   the GNU Lesser General Public License along with this program.  If
+   not, see <http://www.gnu.org/licenses/>.  */
+
+static void
+elf_cvt_note (void *dest, const void *src, size_t len, int encode)
+{
+  assert (sizeof (Elf32_Nhdr) == sizeof (Elf64_Nhdr));
+
+  while (len >= sizeof (Elf32_Nhdr))
+    {
+      (1 ? Elf32_cvt_Nhdr : Elf64_cvt_Nhdr) (dest, src, sizeof (Elf32_Nhdr),
+					     encode);
+      const Elf32_Nhdr *n = encode ? src : dest;
+      Elf32_Word namesz = NOTE_ALIGN (n->n_namesz);
+      Elf32_Word descsz = NOTE_ALIGN (n->n_descsz);
+
+      len -= sizeof *n;
+      src += sizeof *n;
+      dest += sizeof *n;
+
+      if (namesz > len)
+	break;
+      len -= namesz;
+      if (descsz > len)
+	break;
+      len -= descsz;
+
+      if (src != dest)
+	memcpy (dest, src, namesz + descsz);
+
+      src += namesz + descsz;
+      dest += namesz + descsz;
+    }
+
+    /* Copy opver any leftover data unconcerted.  Probably part of
+       truncated name/desc data.  */
+    if (unlikely (len > 0) && src != dest)
+      memcpy (dest, src, len);
+}