* readelf.c (print_gnu_note): New function.
authorTom Tromey <tromey@redhat.com>
Mon, 25 Apr 2011 14:53:27 +0000 (14:53 +0000)
committerTom Tromey <tromey@redhat.com>
Mon, 25 Apr 2011 14:53:27 +0000 (14:53 +0000)
(process_note): Use it.

binutils/ChangeLog
binutils/readelf.c

index 74dd853..4db8572 100644 (file)
@@ -1,3 +1,8 @@
+2011-04-21  Tom Tromey  <tromey@redhat.com>
+
+       * readelf.c (print_gnu_note): New function.
+       (process_note): Use it.
+
 2011-04-21  Jie Zhang  <jzhang918@gmail.com>
 
        * MAINTAINERS: Update my email address.
index 7ac9914..2cc8cf3 100644 (file)
@@ -12231,6 +12231,63 @@ get_gnu_elf_note_type (unsigned e_type)
   return buff;
 }
 
+static int
+print_gnu_note (Elf_Internal_Note *pnote)
+{
+  switch (pnote->type)
+    {
+    case NT_GNU_BUILD_ID:
+      {
+       unsigned long i;
+
+       printf (_("    Build ID: "));
+       for (i = 0; i < pnote->descsz; ++i)
+         printf ("%02x", pnote->descdata[i] & 0xff);
+       printf (_("\n"));
+      }
+      break;
+
+    case NT_GNU_ABI_TAG:
+      {
+       unsigned long os, major, minor, subminor;
+       const char *osname;
+
+       os = byte_get ((unsigned char *) pnote->descdata, 4);
+       major = byte_get ((unsigned char *) pnote->descdata + 4, 4);
+       minor = byte_get ((unsigned char *) pnote->descdata + 8, 4);
+       subminor = byte_get ((unsigned char *) pnote->descdata + 12, 4);
+
+       switch (os)
+         {
+         case GNU_ABI_TAG_LINUX:
+           osname = "Linux";
+           break;
+         case GNU_ABI_TAG_HURD:
+           osname = "Hurd";
+           break;
+         case GNU_ABI_TAG_SOLARIS:
+           osname = "Solaris";
+           break;
+         case GNU_ABI_TAG_FREEBSD:
+           osname = "FreeBSD";
+           break;
+         case GNU_ABI_TAG_NETBSD:
+           osname = "NetBSD";
+           break;
+         default:
+           osname = "Unknown";
+           break;
+         }
+
+       printf (_("    OS: %s, ABI: %ld.%ld.%ld\n"), osname,
+               major, minor, subminor);
+      }
+      break;
+    }
+
+  return 1;
+}
+
 static const char *
 get_netbsd_elfcore_note_type (unsigned e_type)
 {
@@ -12448,6 +12505,8 @@ process_note (Elf_Internal_Note * pnote)
 
   if (const_strneq (pnote->namedata, "IPF/VMS"))
     return print_ia64_vms_note (pnote);
+  else if (const_strneq (pnote->namedata, "GNU"))
+    return print_gnu_note (pnote);
   else
     return 1;
 }