]> code.ossystems Code Review - openembedded-core.git/commitdiff
elfutils: Fix build for gcc-6
authorTim Orling <timothy.t.orling@linux.intel.com>
Fri, 15 Jul 2016 01:49:34 +0000 (18:49 -0700)
committerRichard Purdie <richard.purdie@linuxfoundation.org>
Wed, 27 Jul 2016 07:32:57 +0000 (08:32 +0100)
Backport patch from upstream.

[YOCTO #9897] (Fedora-24)

Signed-off-by: Tim Orling <timothy.t.orling@linux.intel.com>
Signed-off-by: Armin Kuster <akuster808@gmail.com>
meta/recipes-devtools/elfutils/elfutils-0.164/libebl-Fix-missing-brackets-around-if-statement-body.patch [new file with mode: 0644]
meta/recipes-devtools/elfutils/elfutils_0.164.bb

diff --git a/meta/recipes-devtools/elfutils/elfutils-0.164/libebl-Fix-missing-brackets-around-if-statement-body.patch b/meta/recipes-devtools/elfutils/elfutils-0.164/libebl-Fix-missing-brackets-around-if-statement-body.patch
new file mode 100644 (file)
index 0000000..8399133
--- /dev/null
@@ -0,0 +1,419 @@
+The upstream patch libebl/Changelog does not apply cleanly.
+Modify the patch to skip that change only.
+
+Upstream-Status: Backport
+
+Signed-off-by: Tim Orling <timothy.t.orling@linux.intel.com>
+
+From c5da7c9e08c2bdb6dba8e115dcc09ed51a07f0e4 Mon Sep 17 00:00:00 2001
+From: Mark Wielaard <mjw@redhat.com>
+Date: Sat, 9 Jan 2016 22:09:48 +0100
+Subject: libebl: Fix missing brackets around if statement body.
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+GCC6 [will have] a nice new warning that showed a real bug:
+
+elfutils/libebl/eblobjnote.c: In function ‘ebl_object_note’:
+elfutils/libebl/eblobjnote.c:135:5: error: statement is indented as if it were guarded by... [-Werror=misleading-indentation]
+     switch (type)
+     ^~~~~~
+
+elfutils/libebl/eblobjnote.c:45:3: note: ...this ‘if’ clause, but it is not
+   if (! ebl->object_note (name, type, descsz, desc))
+   ^~
+
+And indeed, it should have been under the if, but wasn't because of missing
+brackets. Added brackets (and reindent).
+
+Signed-off-by: Mark Wielaard <mjw@redhat.com>
+---
+ libebl/eblobjnote.c | 362 ++++++++++++++++++++++++++--------------------------
+ 2 files changed, 187 insertions(+), 180 deletions(-)
+
+diff --git a/libebl/eblobjnote.c b/libebl/eblobjnote.c
+index fa1eb93..f80a1a5 100644
+--- a/libebl/eblobjnote.c
++++ b/libebl/eblobjnote.c
+@@ -1,5 +1,5 @@
+ /* Print contents of object file note.
+-   Copyright (C) 2002, 2007, 2009, 2011, 2015 Red Hat, Inc.
++   Copyright (C) 2002, 2007, 2009, 2011, 2015, 2016 Red Hat, Inc.
+    This file is part of elfutils.
+    Written by Ulrich Drepper <drepper@redhat.com>, 2002.
+@@ -43,189 +43,191 @@ ebl_object_note (Ebl *ebl, const char *name, uint32_t type,
+                uint32_t descsz, const char *desc)
+ {
+   if (! ebl->object_note (name, type, descsz, desc))
+-    /* The machine specific function did not know this type.  */
++    {
++      /* The machine specific function did not know this type.  */
+-    if (strcmp ("stapsdt", name) == 0)
+-      {
+-      if (type != 3)
+-        {
+-          printf (gettext ("unknown SDT version %u\n"), type);
+-          return;
+-        }
+-
+-      /* Descriptor starts with three addresses, pc, base ref and
+-         semaphore.  Then three zero terminated strings provider,
+-         name and arguments.  */
+-
+-      union
++      if (strcmp ("stapsdt", name) == 0)
+       {
+-        Elf64_Addr a64[3];
+-        Elf32_Addr a32[3];
+-      } addrs;
++        if (type != 3)
++          {
++            printf (gettext ("unknown SDT version %u\n"), type);
++            return;
++          }
+-      size_t addrs_size = gelf_fsize (ebl->elf, ELF_T_ADDR, 3, EV_CURRENT);
+-      if (descsz < addrs_size + 3)
+-        {
+-        invalid_sdt:
+-          printf (gettext ("invalid SDT probe descriptor\n"));
+-          return;
+-        }
++        /* Descriptor starts with three addresses, pc, base ref and
++           semaphore.  Then three zero terminated strings provider,
++           name and arguments.  */
+-      Elf_Data src =
++        union
+         {
+-          .d_type = ELF_T_ADDR, .d_version = EV_CURRENT,
+-          .d_buf = (void *) desc, .d_size = addrs_size
+-        };
+-
+-      Elf_Data dst =
+-        {
+-          .d_type = ELF_T_ADDR, .d_version = EV_CURRENT,
+-          .d_buf = &addrs, .d_size = addrs_size
+-        };
+-
+-      if (gelf_xlatetom (ebl->elf, &dst, &src,
+-                         elf_getident (ebl->elf, NULL)[EI_DATA]) == NULL)
+-        {
+-          printf ("%s\n", elf_errmsg (-1));
+-          return;
+-        }
+-
+-      const char *provider = desc + addrs_size;
+-      const char *pname = memchr (provider, '\0', desc + descsz - provider);
+-      if (pname == NULL)
+-        goto invalid_sdt;
+-
+-      ++pname;
+-      const char *args = memchr (pname, '\0', desc + descsz - pname);
+-      if (args == NULL ||
+-          memchr (++args, '\0', desc + descsz - pname) != desc + descsz - 1)
+-        goto invalid_sdt;
+-
+-      GElf_Addr pc;
+-      GElf_Addr base;
+-      GElf_Addr sem;
+-      if (gelf_getclass (ebl->elf) == ELFCLASS32)
+-        {
+-          pc = addrs.a32[0];
+-          base = addrs.a32[1];
+-          sem = addrs.a32[2];
+-        }
+-      else
+-        {
+-          pc = addrs.a64[0];
+-          base = addrs.a64[1];
+-          sem = addrs.a64[2];
+-        }
+-
+-      printf (gettext ("    PC: "));
+-      printf ("%#" PRIx64 ",", pc);
+-      printf (gettext (" Base: "));
+-      printf ("%#" PRIx64 ",", base);
+-      printf (gettext (" Semaphore: "));
+-      printf ("%#" PRIx64 "\n", sem);
+-      printf (gettext ("    Provider: "));
+-      printf ("%s,", provider);
+-      printf (gettext (" Name: "));
+-      printf ("%s,", pname);
+-      printf (gettext (" Args: "));
+-      printf ("'%s'\n", args);
+-      return;
+-      }
+-
+-    switch (type)
+-      {
+-      case NT_GNU_BUILD_ID:
+-      if (strcmp (name, "GNU") == 0 && descsz > 0)
+-        {
+-          printf (gettext ("    Build ID: "));
+-          uint_fast32_t i;
+-          for (i = 0; i < descsz - 1; ++i)
+-            printf ("%02" PRIx8, (uint8_t) desc[i]);
+-          printf ("%02" PRIx8 "\n", (uint8_t) desc[i]);
+-        }
+-      break;
+-
+-      case NT_GNU_GOLD_VERSION:
+-      if (strcmp (name, "GNU") == 0 && descsz > 0)
+-        /* A non-null terminated version string.  */
+-        printf (gettext ("    Linker version: %.*s\n"),
+-                (int) descsz, desc);
+-      break;
+-
+-      case NT_GNU_ABI_TAG:
+-      if (strcmp (name, "GNU") == 0 && descsz >= 8 && descsz % 4 == 0)
+-        {
+-          Elf_Data in =
+-            {
+-              .d_version = EV_CURRENT,
+-              .d_type = ELF_T_WORD,
+-              .d_size = descsz,
+-              .d_buf = (void *) desc
+-            };
+-          /* Normally NT_GNU_ABI_TAG is just 4 words (16 bytes).  If it
+-             is much (4*) larger dynamically allocate memory to convert.  */
++          Elf64_Addr a64[3];
++          Elf32_Addr a32[3];
++        } addrs;
++
++        size_t addrs_size = gelf_fsize (ebl->elf, ELF_T_ADDR, 3, EV_CURRENT);
++        if (descsz < addrs_size + 3)
++          {
++          invalid_sdt:
++            printf (gettext ("invalid SDT probe descriptor\n"));
++            return;
++          }
++
++        Elf_Data src =
++          {
++            .d_type = ELF_T_ADDR, .d_version = EV_CURRENT,
++            .d_buf = (void *) desc, .d_size = addrs_size
++          };
++
++        Elf_Data dst =
++          {
++            .d_type = ELF_T_ADDR, .d_version = EV_CURRENT,
++            .d_buf = &addrs, .d_size = addrs_size
++          };
++
++        if (gelf_xlatetom (ebl->elf, &dst, &src,
++                           elf_getident (ebl->elf, NULL)[EI_DATA]) == NULL)
++          {
++            printf ("%s\n", elf_errmsg (-1));
++            return;
++          }
++
++        const char *provider = desc + addrs_size;
++        const char *pname = memchr (provider, '\0', desc + descsz - provider);
++        if (pname == NULL)
++          goto invalid_sdt;
++
++        ++pname;
++        const char *args = memchr (pname, '\0', desc + descsz - pname);
++        if (args == NULL ||
++            memchr (++args, '\0', desc + descsz - pname) != desc + descsz - 1)
++          goto invalid_sdt;
++
++        GElf_Addr pc;
++        GElf_Addr base;
++        GElf_Addr sem;
++        if (gelf_getclass (ebl->elf) == ELFCLASS32)
++          {
++            pc = addrs.a32[0];
++            base = addrs.a32[1];
++            sem = addrs.a32[2];
++          }
++        else
++          {
++            pc = addrs.a64[0];
++            base = addrs.a64[1];
++            sem = addrs.a64[2];
++          }
++
++        printf (gettext ("    PC: "));
++        printf ("%#" PRIx64 ",", pc);
++        printf (gettext (" Base: "));
++        printf ("%#" PRIx64 ",", base);
++        printf (gettext (" Semaphore: "));
++        printf ("%#" PRIx64 "\n", sem);
++        printf (gettext ("    Provider: "));
++        printf ("%s,", provider);
++        printf (gettext (" Name: "));
++        printf ("%s,", pname);
++        printf (gettext (" Args: "));
++        printf ("'%s'\n", args);
++        return;
++      }
++
++      switch (type)
++      {
++      case NT_GNU_BUILD_ID:
++        if (strcmp (name, "GNU") == 0 && descsz > 0)
++          {
++            printf (gettext ("    Build ID: "));
++            uint_fast32_t i;
++            for (i = 0; i < descsz - 1; ++i)
++              printf ("%02" PRIx8, (uint8_t) desc[i]);
++            printf ("%02" PRIx8 "\n", (uint8_t) desc[i]);
++          }
++        break;
++
++      case NT_GNU_GOLD_VERSION:
++        if (strcmp (name, "GNU") == 0 && descsz > 0)
++          /* A non-null terminated version string.  */
++          printf (gettext ("    Linker version: %.*s\n"),
++                  (int) descsz, desc);
++        break;
++
++      case NT_GNU_ABI_TAG:
++        if (strcmp (name, "GNU") == 0 && descsz >= 8 && descsz % 4 == 0)
++          {
++            Elf_Data in =
++              {
++                .d_version = EV_CURRENT,
++                .d_type = ELF_T_WORD,
++                .d_size = descsz,
++                .d_buf = (void *) desc
++              };
++            /* Normally NT_GNU_ABI_TAG is just 4 words (16 bytes).  If it
++               is much (4*) larger dynamically allocate memory to convert.  */
+ #define FIXED_TAG_BYTES 16
+-          uint32_t sbuf[FIXED_TAG_BYTES];
+-          uint32_t *buf;
+-          if (unlikely (descsz / 4 > FIXED_TAG_BYTES))
+-            {
+-              buf = malloc (descsz);
+-              if (unlikely (buf == NULL))
+-                return;
+-            }
+-          else
+-            buf = sbuf;
+-          Elf_Data out =
+-            {
+-              .d_version = EV_CURRENT,
+-              .d_type = ELF_T_WORD,
+-              .d_size = descsz,
+-              .d_buf = buf
+-            };
+-
+-          if (elf32_xlatetom (&out, &in, ebl->data) != NULL)
+-            {
+-              const char *os;
+-              switch (buf[0])
+-                {
+-                case ELF_NOTE_OS_LINUX:
+-                  os = "Linux";
+-                  break;
+-
+-                case ELF_NOTE_OS_GNU:
+-                  os = "GNU";
+-                  break;
+-
+-                case ELF_NOTE_OS_SOLARIS2:
+-                  os = "Solaris";
+-                  break;
+-
+-                case ELF_NOTE_OS_FREEBSD:
+-                  os = "FreeBSD";
+-                  break;
+-
+-                default:
+-                  os = "???";
+-                  break;
+-                }
+-
+-              printf (gettext ("    OS: %s, ABI: "), os);
+-              for (size_t cnt = 1; cnt < descsz / 4; ++cnt)
+-                {
+-                  if (cnt > 1)
+-                    putchar_unlocked ('.');
+-                  printf ("%" PRIu32, buf[cnt]);
+-                }
+-              putchar_unlocked ('\n');
+-            }
+-          if (descsz / 4 > FIXED_TAG_BYTES)
+-            free (buf);
+-          break;
+-        }
+-      /* FALLTHROUGH */
+-
+-      default:
+-      /* Unknown type.  */
+-      break;
+-      }
++            uint32_t sbuf[FIXED_TAG_BYTES];
++            uint32_t *buf;
++            if (unlikely (descsz / 4 > FIXED_TAG_BYTES))
++              {
++                buf = malloc (descsz);
++                if (unlikely (buf == NULL))
++                  return;
++              }
++            else
++              buf = sbuf;
++            Elf_Data out =
++              {
++                .d_version = EV_CURRENT,
++                .d_type = ELF_T_WORD,
++                .d_size = descsz,
++                .d_buf = buf
++              };
++
++            if (elf32_xlatetom (&out, &in, ebl->data) != NULL)
++              {
++                const char *os;
++                switch (buf[0])
++                  {
++                  case ELF_NOTE_OS_LINUX:
++                    os = "Linux";
++                    break;
++
++                  case ELF_NOTE_OS_GNU:
++                    os = "GNU";
++                    break;
++
++                  case ELF_NOTE_OS_SOLARIS2:
++                    os = "Solaris";
++                    break;
++
++                  case ELF_NOTE_OS_FREEBSD:
++                    os = "FreeBSD";
++                    break;
++
++                  default:
++                    os = "???";
++                    break;
++                  }
++
++                printf (gettext ("    OS: %s, ABI: "), os);
++                for (size_t cnt = 1; cnt < descsz / 4; ++cnt)
++                  {
++                    if (cnt > 1)
++                      putchar_unlocked ('.');
++                    printf ("%" PRIu32, buf[cnt]);
++                  }
++                putchar_unlocked ('\n');
++              }
++            if (descsz / 4 > FIXED_TAG_BYTES)
++              free (buf);
++            break;
++          }
++        /* FALLTHROUGH */
++
++      default:
++        /* Unknown type.  */
++        break;
++      }
++    }
+ }
+-- 
+cgit v0.12
+
index 4964c0507854d5ecb202e6b95e13d4151ad3b5af..2b23025adab38abd786f6f67f46a391ceebf8f8e 100644 (file)
@@ -20,6 +20,7 @@ SRC_URI += "\
         file://0001-fix-a-stack-usage-warning.patch \
         file://aarch64_uio.patch \
         file://shadow.patch \
+       file://libebl-Fix-missing-brackets-around-if-statement-body.patch \
 "
 
 # pick the patch from debian