SHA256
1
0
forked from pool/elfutils

Accepting request 483764 from home:rguenther:branches:Base:System

- Update to version 0.168:
  libelf: gelf_newehdr and gelf_newehdr now return void *.
  libdw: dwarf.h corrected the DW_LANG_PLI constant name (was DW_LANG_PL1).
  readelf: Add optional --symbols[=SECTION] argument to select section name.
- Includes changes from 0001-Add-GCC7-Wimplicit-fallthrough-support-fixes.patch
  and 0001-ar-Fix-GCC7-Wformat-length-issues.patch.
- Remove elfutils-0.137-dwarf-header-check-fix.diff which is no longer
  required after a debugedit fix.

OBS-URL: https://build.opensuse.org/request/show/483764
OBS-URL: https://build.opensuse.org/package/show/Base:System/elfutils?expand=0&rev=87
This commit is contained in:
Richard Biener 2017-03-30 13:36:37 +00:00 committed by Git OBS Bridge
parent efd8a1cc59
commit 41afbe1a42
9 changed files with 19 additions and 490 deletions

View File

@ -1,323 +0,0 @@
From a3cc8182b2ae05290b0eafa74b70746d7befc0e4 Mon Sep 17 00:00:00 2001
From: Mark Wielaard <mjw@redhat.com>
Date: Wed, 2 Nov 2016 13:29:26 +0100
Subject: [PATCH] Add GCC7 -Wimplicit-fallthrough support/fixes.
GCC7 will have a new -Wimplicit-fallthrough warning. It did catch one
small buglet in elflint option procession. So it seems useful to enable
to make sure all swatch case fallthroughs are deliberate.
Add configure check to detect whether gcc support -Wimplicit-fallthrough
and enable it. Add fixes and explicit fallthrough comments where necessary.
Signed-off-by: Mark Wielaard <mjw@redhat.com>
---
ChangeLog | 7 ++++++-
backends/ChangeLog | 11 +++++++++++
backends/i386_regs.c | 1 +
backends/i386_retval.c | 3 +--
backends/linux-core-note.c | 4 ++--
backends/m68k_retval.c | 4 +---
backends/ppc_regs.c | 2 +-
backends/x86_64_regs.c | 1 +
config/ChangeLog | 5 +++++
config/eu.am | 8 +++++++-
configure.ac | 10 ++++++++++
libcpu/ChangeLog | 6 +++++-
libcpu/i386_disasm.c | 2 +-
libdw/ChangeLog | 10 +++++++++-
libdw/cfi.c | 2 ++
libdw/encoded-value.h | 1 +
libdwfl/dwfl_report_elf.c | 2 +-
src/ChangeLog | 8 ++++++++
src/addr2line.c | 1 +
src/elfcompress.c | 3 ++-
src/elflint.c | 4 +++-
src/objdump.c | 4 +++-
tests/ChangeLog | 5 +++++
tests/backtrace-data.c | 1 +
tests/backtrace.c | 2 +-
25 files changed, 89 insertions(+), 18 deletions(-)
diff --git a/backends/i386_regs.c b/backends/i386_regs.c
index fb8ded3..fd963a6 100644
--- a/backends/i386_regs.c
+++ b/backends/i386_regs.c
@@ -92,6 +92,7 @@ i386_register_info (Ebl *ebl __attribute__ ((unused)),
case 5:
case 8:
*type = DW_ATE_address;
+ /* Fallthrough */
case 0 ... 3:
case 6 ... 7:
name[0] = 'e';
diff --git a/backends/i386_retval.c b/backends/i386_retval.c
index 9da797d..4aa646f 100644
--- a/backends/i386_retval.c
+++ b/backends/i386_retval.c
@@ -122,9 +122,8 @@ i386_return_value_location (Dwarf_Die *functypedie, const Dwarf_Op **locp)
return nloc_intreg;
if (size <= 8)
return nloc_intregpair;
-
- /* Else fall through. */
}
+ /* Fallthrough */
case DW_TAG_structure_type:
case DW_TAG_class_type:
diff --git a/backends/linux-core-note.c b/backends/linux-core-note.c
index a4ec0be..67638d7 100644
--- a/backends/linux-core-note.c
+++ b/backends/linux-core-note.c
@@ -225,8 +225,8 @@ EBLHOOK(core_note) (const GElf_Nhdr *nhdr, const char *name,
case sizeof "CORE":
if (memcmp (name, "CORE", nhdr->n_namesz) == 0)
break;
- /* Buggy old Linux kernels didn't terminate "LINUX".
- Fall through. */
+ /* Buggy old Linux kernels didn't terminate "LINUX". */
+ /* Fall through. */
case sizeof "LINUX":
if (memcmp (name, "LINUX", nhdr->n_namesz) == 0)
diff --git a/backends/m68k_retval.c b/backends/m68k_retval.c
index 2dd285a..c68ed02 100644
--- a/backends/m68k_retval.c
+++ b/backends/m68k_retval.c
@@ -134,10 +134,8 @@ m68k_return_value_location (Dwarf_Die *functypedie, const Dwarf_Op **locp)
return nloc_intreg;
if (size <= 8)
return nloc_intregpair;
-
- /* Else fall through. */
}
-
+ /* Fallthrough */
case DW_TAG_structure_type:
case DW_TAG_class_type:
case DW_TAG_union_type:
diff --git a/backends/ppc_regs.c b/backends/ppc_regs.c
index 4b92a9a..bcf4f7a 100644
--- a/backends/ppc_regs.c
+++ b/backends/ppc_regs.c
@@ -140,7 +140,7 @@ ppc_register_info (Ebl *ebl __attribute__ ((unused)),
case 100:
if (*bits == 32)
return stpcpy (name, "mq") + 1 - name;
-
+ /* Fallthrough */
case 102 ... 107:
name[0] = 's';
name[1] = 'p';
diff --git a/backends/x86_64_regs.c b/backends/x86_64_regs.c
index 2172d9f..8430440 100644
--- a/backends/x86_64_regs.c
+++ b/backends/x86_64_regs.c
@@ -87,6 +87,7 @@ x86_64_register_info (Ebl *ebl __attribute__ ((unused)),
case 6 ... 7:
*type = DW_ATE_address;
+ /* Fallthrough */
case 0 ... 5:
name[0] = 'r';
name[1] = baseregs[regno][0];
diff --git a/config/eu.am b/config/eu.am
index 4998771..8fe1e25 100644
--- a/config/eu.am
+++ b/config/eu.am
@@ -61,10 +61,16 @@ else
NULL_DEREFERENCE_WARNING=
endif
+if HAVE_IMPLICIT_FALLTHROUGH_WARNING
+IMPLICIT_FALLTHROUGH_WARNING=-Wimplicit-fallthrough
+else
+IMPLICIT_FALLTHROUGH_WARNING=
+endif
+
AM_CFLAGS = -std=gnu99 -Wall -Wshadow -Wformat=2 \
-Wold-style-definition -Wstrict-prototypes \
$(LOGICAL_OP_WARNING) $(DUPLICATED_COND_WARNING) \
- $(NULL_DEREFERENCE_WARNING) \
+ $(NULL_DEREFERENCE_WARNING) $(IMPLICIT_FALLTHROUGH_WARNING) \
$(if $($(*F)_no_Werror),,-Werror) \
$(if $($(*F)_no_Wunused),,-Wunused -Wextra) \
$(if $($(*F)_no_Wstack_usage),,$(STACK_USAGE_WARNING)) \
diff --git a/configure.ac b/configure.ac
index c02d4c2..c55fb9b 100644
--- a/configure.ac
+++ b/configure.ac
@@ -311,6 +311,16 @@ CFLAGS="$old_CFLAGS"])
AM_CONDITIONAL(HAVE_NULL_DEREFERENCE_WARNING,
[test "x$ac_cv_null_dereference" != "xno"])
+# -Wimplicit-fallthrough was added by GCC7
+AC_CACHE_CHECK([whether gcc accepts -Wimplicit-fallthrough], ac_cv_implicit_fallthrough, [dnl
+old_CFLAGS="$CFLAGS"
+CFLAGS="$CFLAGS -Wimplicit-fallthrough -Werror"
+AC_COMPILE_IFELSE([AC_LANG_SOURCE([])],
+ ac_cv_implicit_fallthrough=yes, ac_cv_implicit_fallthrough=no)
+CFLAGS="$old_CFLAGS"])
+AM_CONDITIONAL(HAVE_IMPLICIT_FALLTHROUGH_WARNING,
+ [test "x$ac_cv_implicit_fallthrough" != "xno"])
+
dnl Check if we have argp available from our libc
AC_LINK_IFELSE(
[AC_LANG_PROGRAM(
diff --git a/libcpu/i386_disasm.c b/libcpu/i386_disasm.c
index 699dd61..831afbe 100644
--- a/libcpu/i386_disasm.c
+++ b/libcpu/i386_disasm.c
@@ -819,7 +819,7 @@ i386_disasm (Ebl *ebl __attribute__((unused)),
++param_start;
break;
}
-
+ /* Fallthrough */
default:
assert (! "INVALID not handled");
}
diff --git a/libdw/cfi.c b/libdw/cfi.c
index 1fd668d..daa845f 100644
--- a/libdw/cfi.c
+++ b/libdw/cfi.c
@@ -138,6 +138,7 @@ execute_cfi (Dwarf_CFI *cache,
case DW_CFA_advance_loc1:
operand = *program++;
+ /* Fallthrough */
case DW_CFA_advance_loc + 0 ... DW_CFA_advance_loc + CFI_PRIMARY_MAX:
advance_loc:
loc += operand * cie->code_alignment_factor;
@@ -300,6 +301,7 @@ execute_cfi (Dwarf_CFI *cache,
case DW_CFA_restore_extended:
get_uleb128 (operand, program, end);
+ /* Fallthrough */
case DW_CFA_restore + 0 ... DW_CFA_restore + CFI_PRIMARY_MAX:
if (unlikely (abi_cfi) && likely (opcode == DW_CFA_restore))
diff --git a/libdw/encoded-value.h b/libdw/encoded-value.h
index 48d868f..f0df4ce 100644
--- a/libdw/encoded-value.h
+++ b/libdw/encoded-value.h
@@ -64,6 +64,7 @@ encoded_value_size (const Elf_Data *data, const unsigned char e_ident[],
if (*end++ & 0x80u)
return end - p;
}
+ return 0;
default:
return 0;
diff --git a/libdwfl/dwfl_report_elf.c b/libdwfl/dwfl_report_elf.c
index 1c6e401..73a5511 100644
--- a/libdwfl/dwfl_report_elf.c
+++ b/libdwfl/dwfl_report_elf.c
@@ -170,7 +170,7 @@ __libdwfl_elf_address_range (Elf *elf, GElf_Addr base, bool add_p_vaddr,
/* An assigned base address is meaningless for these. */
base = 0;
add_p_vaddr = true;
-
+ /* Fallthrough. */
case ET_DYN:
default:;
size_t phnum;
diff --git a/src/addr2line.c b/src/addr2line.c
index 0ce854f..bea24ae 100644
--- a/src/addr2line.c
+++ b/src/addr2line.c
@@ -632,6 +632,7 @@ handle_address (const char *string, Dwfl *dwfl)
case 1:
addr = 0;
j = i;
+ /* Fallthrough */
case 2:
if (string[j] != '\0')
break;
diff --git a/src/elfcompress.c b/src/elfcompress.c
index 7392cb7..82ab965 100644
--- a/src/elfcompress.c
+++ b/src/elfcompress.c
@@ -155,7 +155,8 @@ parse_opt (int key, char *arg __attribute__ ((unused)),
argp_error (state,
N_("Only one input file allowed together with '-o'"));
/* We only use this for checking the number of arguments, we don't
- actually want to consume them, so fallthrough. */
+ actually want to consume them. */
+ /* Fallthrough */
default:
return ARGP_ERR_UNKNOWN;
}
diff --git a/src/elflint.c b/src/elflint.c
index 8b52ee2..b304a30 100644
--- a/src/elflint.c
+++ b/src/elflint.c
@@ -210,6 +210,7 @@ parse_opt (int key, char *arg __attribute__ ((unused)),
case 'd':
is_debuginfo = true;
+ break;
case ARGP_gnuld:
gnuld = true;
@@ -3963,6 +3964,7 @@ section [%2zu] '%s': merge flag set but entry size is zero\n"),
case SHT_NOBITS:
if (is_debuginfo)
break;
+ /* Fallthrough */
default:
ERROR (gettext ("\
section [%2zu] '%s' has unexpected type %d for an executable section\n"),
@@ -4305,7 +4307,7 @@ section [%2d] '%s': unknown core file note type %" PRIu32
if (nhdr.n_namesz == sizeof "Linux"
&& !memcmp (data->d_buf + name_offset, "Linux", sizeof "Linux"))
break;
-
+ /* Fallthrough */
default:
if (shndx == 0)
ERROR (gettext ("\
diff --git a/src/objdump.c b/src/objdump.c
index 1afcd57..f84513c 100644
--- a/src/objdump.c
+++ b/src/objdump.c
@@ -234,7 +234,9 @@ parse_opt (int key, char *arg,
program_invocation_short_name);
exit (EXIT_FAILURE);
}
-
+ /* We only use this for checking the number of arguments, we don't
+ actually want to consume them. */
+ /* Fallthrough */
default:
return ARGP_ERR_UNKNOWN;
}
diff --git a/tests/backtrace-data.c b/tests/backtrace-data.c
index bc5ceba..b7158da 100644
--- a/tests/backtrace-data.c
+++ b/tests/backtrace-data.c
@@ -250,6 +250,7 @@ thread_callback (Dwfl_Thread *thread, void *thread_arg __attribute__ ((unused)))
break;
case -1:
error (1, 0, "dwfl_thread_getframes: %s", dwfl_errmsg (-1));
+ break;
default:
abort ();
}
diff --git a/tests/backtrace.c b/tests/backtrace.c
index 2440ab3..1ff6353 100644
--- a/tests/backtrace.c
+++ b/tests/backtrace.c
@@ -123,7 +123,7 @@ callback_verify (pid_t tid, unsigned frameno, Dwarf_Addr pc,
assert (symname2 == NULL || strcmp (symname2, "jmp") != 0);
break;
}
- /* PASSTHRU */
+ /* FALLTHRU */
case 4:
assert (symname != NULL && strcmp (symname, "stdarg") == 0);
break;
--
2.10.2

View File

@ -1,123 +0,0 @@
From d5afff85e22b38949f3e7936231c67de16e180e8 Mon Sep 17 00:00:00 2001
From: Mark Wielaard <mjw@redhat.com>
Date: Thu, 10 Nov 2016 18:45:02 +0100
Subject: [PATCH] ar: Fix GCC7 -Wformat-length issues.
GCC7 adds warnings for snprintf formatting into too small buffers.
Fix the two issues pointed out by the new warning. The ar header
fields are fixed length containing left-justified strings without
zero terminator. snprintf always adds a '\0' char at the end (which
we then don't copy into the ar header field) and numbers are decimal
strings of fixed 10 chars (-Wformat-length thinks formatting
them as size_t might overflow the buffer on 64bit arches).
Signed-off-by: Mark Wielaard <mjw@redhat.com>
---
src/ChangeLog | 7 +++++++
src/ar.c | 15 +++++++++++----
src/arlib.c | 16 ++++++++++------
3 files changed, 28 insertions(+), 10 deletions(-)
diff --git a/src/ar.c b/src/ar.c
index 1320d07..f2160d3 100644
--- a/src/ar.c
+++ b/src/ar.c
@@ -1,5 +1,5 @@
/* Create, modify, and extract from archives.
- Copyright (C) 2005-2012 Red Hat, Inc.
+ Copyright (C) 2005-2012, 2016 Red Hat, Inc.
This file is part of elfutils.
Written by Ulrich Drepper <drepper@redhat.com>, 2005.
@@ -853,7 +853,10 @@ write_member (struct armem *memb, off_t *startp, off_t *lenp, Elf *elf,
off_t end_off, int newfd)
{
struct ar_hdr arhdr;
- char tmpbuf[sizeof (arhdr.ar_name) + 1];
+ /* The ar_name is not actually zero teminated, but we need that for
+ snprintf. Also if the name is too long, then the string starts
+ with '/' plus an index off number (decimal). */
+ char tmpbuf[sizeof (arhdr.ar_name) + 2];
bool changed_header = memb->long_name_off != -1;
if (changed_header)
@@ -1455,7 +1458,11 @@ do_oper_insert (int oper, const char *arfname, char **argv, int argc,
/* Create the header. */
struct ar_hdr arhdr;
- char tmpbuf[sizeof (arhdr.ar_name) + 1];
+ /* The ar_name is not actually zero teminated, but we
+ need that for snprintf. Also if the name is too
+ long, then the string starts with '/' plus an index
+ off number (decimal). */
+ char tmpbuf[sizeof (arhdr.ar_name) + 2];
if (all->long_name_off == -1)
{
size_t namelen = strlen (all->name);
@@ -1465,7 +1472,7 @@ do_oper_insert (int oper, const char *arfname, char **argv, int argc,
}
else
{
- snprintf (tmpbuf, sizeof (arhdr.ar_name) + 1, "/%-*ld",
+ snprintf (tmpbuf, sizeof (tmpbuf), "/%-*ld",
(int) sizeof (arhdr.ar_name), all->long_name_off);
memcpy (arhdr.ar_name, tmpbuf, sizeof (arhdr.ar_name));
}
diff --git a/src/arlib.c b/src/arlib.c
index c3cf47f..e0839aa 100644
--- a/src/arlib.c
+++ b/src/arlib.c
@@ -1,5 +1,5 @@
/* Functions to handle creation of Linux archives.
- Copyright (C) 2007-2012 Red Hat, Inc.
+ Copyright (C) 2007-2012, 2016 Red Hat, Inc.
This file is part of elfutils.
Written by Ulrich Drepper <drepper@redhat.com>, 2007.
@@ -23,6 +23,7 @@
#include <assert.h>
#include <error.h>
#include <gelf.h>
+#include <inttypes.h>
#include <libintl.h>
#include <stdio.h>
#include <stdlib.h>
@@ -107,6 +108,9 @@ arlib_init (void)
void
arlib_finalize (void)
{
+ /* Note that the size is stored as decimal string in 10 chars,
+ without zero terminator (we add + 1 here only so snprintf can
+ put it at the end, we then don't use it when we memcpy it). */
char tmpbuf[sizeof (((struct ar_hdr *) NULL)->ar_size) + 1];
symtab.longnameslen = obstack_object_size (&symtab.longnamesob);
@@ -121,9 +125,9 @@ arlib_finalize (void)
symtab.longnames = obstack_finish (&symtab.longnamesob);
- int s = snprintf (tmpbuf, sizeof (tmpbuf), "%-*zu",
+ int s = snprintf (tmpbuf, sizeof (tmpbuf), "%-*" PRIu32 "",
(int) sizeof (((struct ar_hdr *) NULL)->ar_size),
- symtab.longnameslen - sizeof (struct ar_hdr));
+ (uint32_t) (symtab.longnameslen - sizeof (struct ar_hdr)));
memcpy (&((struct ar_hdr *) symtab.longnames)->ar_size, tmpbuf, s);
}
@@ -169,10 +173,10 @@ arlib_finalize (void)
/* See comment for ar_date above. */
memcpy (&((struct ar_hdr *) symtab.symsoff)->ar_size, tmpbuf,
- snprintf (tmpbuf, sizeof (tmpbuf), "%-*zu",
+ snprintf (tmpbuf, sizeof (tmpbuf), "%-*" PRIu32 "",
(int) sizeof (((struct ar_hdr *) NULL)->ar_size),
- symtab.symsofflen + symtab.symsnamelen
- - sizeof (struct ar_hdr)));
+ (uint32_t) (symtab.symsofflen + symtab.symsnamelen
+ - sizeof (struct ar_hdr))));
}
--
2.10.2

View File

@ -1,31 +0,0 @@
From: Takashi Iwai <tiwai@novell.com>
Subject: Fix for kernel debuginfo files
References: https://bugzilla.novell.com/show_bug.cgi?id=468247, comments 17-20
References: https://bugzilla.novell.com/show_bug.cgi?id=433182
Above BZ originally occured with Systemtap testsuite (stmt_rel.exp).
# stap -e 'probe kernel.statement("bio_put@fs/bio.c:*") {}'
semantic error: libdw failure (dwarf_getsrcfiles): invalid DWARF
...
---
libdw/dwarf_getsrclines.c | 2 ++
1 file changed, 2 insertions(+)
Index: elfutils-0.166/libdw/dwarf_getsrclines.c
===================================================================
--- elfutils-0.166.orig/libdw/dwarf_getsrclines.c 2016-03-02 17:25:38.000000000 +0100
+++ elfutils-0.166/libdw/dwarf_getsrclines.c 2016-06-27 14:23:58.787633776 +0200
@@ -404,8 +404,10 @@
/* Consistency check. */
if (unlikely (linep != header_start + header_length))
{
+#if 0
__libdw_seterrno (DWARF_E_INVALID_DWARF);
goto out;
+#endif
}
state.is_stmt = default_is_stmt;

View File

@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:3f300087c42b6f35591163b48246b4098ce39c4c6f5d55a83023c903c5776553
size 6456047

Binary file not shown.

3
elfutils-0.168.tar.bz2 Normal file
View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:b88d07893ba1373c7dd69a7855974706d05377766568a7d9002706d5de72c276
size 6840399

BIN
elfutils-0.168.tar.bz2.sig Normal file

Binary file not shown.

View File

@ -1,3 +1,15 @@
-------------------------------------------------------------------
Thu Mar 30 08:07:10 UTC 2017 - rguenther@suse.com
- Update to version 0.168:
libelf: gelf_newehdr and gelf_newehdr now return void *.
libdw: dwarf.h corrected the DW_LANG_PLI constant name (was DW_LANG_PL1).
readelf: Add optional --symbols[=SECTION] argument to select section name.
- Includes changes from 0001-Add-GCC7-Wimplicit-fallthrough-support-fixes.patch
and 0001-ar-Fix-GCC7-Wformat-length-issues.patch.
- Remove elfutils-0.137-dwarf-header-check-fix.diff which is no longer
required after a debugedit fix.
-------------------------------------------------------------------
Fri Dec 9 12:19:24 UTC 2016 - mliska@suse.cz

View File

@ -1,7 +1,7 @@
#
# spec file for package elfutils
#
# Copyright (c) 2016 SUSE LINUX GmbH, Nuernberg, Germany.
# Copyright (c) 2017 SUSE LINUX GmbH, Nuernberg, Germany.
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
@ -17,7 +17,7 @@
Name: elfutils
Version: 0.167
Version: 0.168
Release: 0
Summary: Higher-level library to access ELF
License: SUSE-GPL-2.0-with-OSI-exception
@ -30,10 +30,7 @@ Source4: https://fedorahosted.org/releases/e/l/%{name}/%{version}/%{name}
Source1: README-BEFORE-ADDING-PATCHES
Source2: baselibs.conf
Source3: %{name}.changes
Patch1: elfutils-0.137-dwarf-header-check-fix.diff
Patch2: disable-tests-with-ptrace.patch
Patch3: 0001-Add-GCC7-Wimplicit-fallthrough-support-fixes.patch
Patch4: 0001-ar-Fix-GCC7-Wformat-length-issues.patch
Patch1: disable-tests-with-ptrace.patch
BuildRoot: %{_tmppath}/%{name}-%{version}-build
BuildRequires: autoconf
BuildRequires: automake
@ -141,13 +138,10 @@ to develop applications that require these.
%prep
%setup -q
%patch1 -p1
%if 0%{?qemu_user_space_build}
# qemu does not support ptrace
%patch2 -p1
%patch1 -p1
%endif
%patch3 -p1
%patch4 -p1
%build
# Change DATE/TIME macros to use last change time of elfutils.changes