Snap for 8564071 from cf803a80b3135abe66f38db75d4e0b00928f4059 to mainline-permission-release

Change-Id: Iadff7cd905b69083b6d8a7ece15c8551037baaef
diff --git a/Android.bp b/Android.bp
index 2ca70cc..9d73c19 100644
--- a/Android.bp
+++ b/Android.bp
@@ -62,6 +62,7 @@
         "//external/elfutils:__subpackages__",
         "//external/libabigail:__subpackages__",
         "//external/libbpf:__subpackages__",
+        "//external/stg:__subpackages__",
     ],
 }
 
@@ -90,10 +91,17 @@
                 enabled: false,
             },
         },
+        musl: {
+            cflags: [
+                "-include AndroidFixup.h",
+            ],
+        },
     },
 
     visibility: [
         "//device/google/contexthub/util/nanoapp_postprocess",
+        "//external/bcc/libbpf-tools",
+        "//external/bpftool",
         "//external/igt-gpu-tools",
         "//external/mesa3d",
     ],
@@ -112,6 +120,9 @@
         android: {
             export_include_dirs: ["bionic-fixup"],
         },
+        musl: {
+            export_include_dirs: ["bionic-fixup"],
+        },
     },
     visibility: [":__subpackages__"],
 }
@@ -123,6 +134,12 @@
         darwin: {
             enabled: false,
         },
+        musl: {
+            static_libs: [
+                "libfts",
+                "libz",
+            ],
+        },
     },
     srcs: [
         "backends/*.c",
@@ -149,6 +166,8 @@
         "libdwfl/debuginfod-client.c",
         "libdwfl/elf-from-memory.c",
         "libdwfl/link_map.c",
+        // These depend on argp which doesn't exist in musl
+        "libdwfl/argp-std.c",
         // Those are common source files actually used as headers and not
         // compiled standalone.
         "backends/common-reloc.c",
@@ -168,5 +187,8 @@
     static_libs: [
         "libelf"
     ],
+    whole_static_libs: [
+        "libeu",
+    ],
     compile_multilib: "64",
 }
diff --git a/ChangeLog b/ChangeLog
index d379e71..d61b21c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,46 @@
+2021-11-10  Mark Wielaard  <mark@klomp.org>
+
+	* configure.ac (AC_INIT): Set version to 0.186.
+	* NEWS: Add translation item.
+
+2021-09-03  John Mellor-Crummey <johnmc@rice.edu>
+
+	* NEWS: Read inlining info in NVIDIA extended line map
+
+2021-08-10  Adrian Ratiu  <adrian.ratiu@collabora.com>
+
+	* configure.ac (AC_CACHE_CHECK): Rework std=gnu99 check to allow clang.
+
+2021-08-20  Saleem Abdulrasool  <abdulras@google.com>
+
+	* Add AC_CHECK_HEADERS for error.h and err.h.
+
+2021-07-28  Mark Wielaard  <mark@klomp.org>
+
+	* configure.ac (AC_CHECK_DECLS): Add reallocarray check.
+
+2021-05-22  Mark Wielaard  <mark@klomp.org>
+
+	* configure.ac (AC_INIT): Set version to 0.185.
+	* NEWS: Add 0.185 entries.
+
+2021-05-10  Mark Wielaard  <mark@klomp.org>
+
+	* configure.ac (AC_INIT): Set version to 0.184.
+	* NEWS: Add libdw, translation and debuginfod-client entries.
+
+2021-03-30  Frank Ch. Eigler  <fche@redhat.com>
+
+	* configure.ac: Look for pthread_setname_np.
+
+2021-02-17  Timm Bäder  <tbaeder@redhat.com>
+
+	* configure.ac: Add -Wno-packed-not-aligned check.
+
+2021-02-17  Timm Bäder  <tbaeder@redhat.com>
+
+	* configure.ac: Add -Wtrampolines check.
+
 2021-02-05  Mark Wielaard  <mark@klomp.org>
 
 	* configure.ac (AC_INIT): Set version to 0.183.
diff --git a/NEWS b/NEWS
index 6437f20..490932a 100644
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,56 @@
+Version 0.186
+
+debuginfod-client: Default $DEBUGINFOD_URLS is computed from drop-in files
+                   /etc/debuginfod/*.urls rather than hardcoded into the
+                   /etc/profile.d/debuginfod* scripts.
+                   Add $DEBUGINFOD_MAXSIZE and $DEBUGINFOD_MAXTIME settings
+                   for skipping large/slow transfers.
+                   Add $DEBUGINFOD_RETRY for retrying aborted lookups.
+
+debuginfod: Supply extra HTTP response headers, describing archive/file
+            names that satisfy the requested buildid content.
+            Support -d :memory: option for in-memory databases.
+            Protect against loops in federated server configurations.
+            Add -r option to use -I/-X regexes for grooming stale files.
+            Protect against wasted CPU from duplicate concurrent requests.
+            Limit the duration of groom ops roughly to rescan (-t) times.
+            Add --passive mode for serving from read-only database.
+            Several other performance improvements & prometheus metrics.
+
+libdw: Support for the NVIDIA Cuda line map extensions.
+       DW_LNE_NVIDIA_inlined_call and DW_LNE_NVIDIA_set_function_name
+       are defined in dwarf.h. New functions dwarf_linecontext and
+       dwarf_linefunctionname
+
+translations: Update Japanese translation.
+
+Version 0.185
+
+debuginfod-client: Simplify curl handle reuse so downloads which
+                   return an error are retried.
+
+elfcompress: Always exit with code 0 when the operation succeeds (even
+             when nothing was done). On error the exit code is now always 1.
+
+Version 0.184
+
+debuginfod: Use libarchive's bsdtar as the .deb-family file unpacker.
+
+debuginfod-client: Client caches negative results. If a query for a
+		   file failed with 404, an empty 000 permission
+		   file is created in the cache. This will prevent
+		   requesting the same file for the next 10 minutes.
+
+		   Client objects now carry long-lived curl handles
+		   for outgoing connections.  This makes it more
+		   efficient for multiple sequential queries, because
+		   the TCP connections and/or TLS state info are kept
+		   around awhile, avoiding O(100ms) setup latencies.
+
+libdw: handle DW_FORM_indirect when reading attributes
+
+translations: Update Polish translation.
+
 Version 0.183
 
 debuginfod: New thread-busy metric and more detailed error metrics.
diff --git a/backends/ChangeLog b/backends/ChangeLog
index eb15c81..b48af4e 100644
--- a/backends/ChangeLog
+++ b/backends/ChangeLog
@@ -1,3 +1,21 @@
+2021-09-29  William Cohen  <wcohen@redhat.com>
+
+	* riscv_init.c (riscv_return_value_location_lp64f): New function
+	declaration.
+	(riscv_return_value_location_lp64): Likewise.
+	(riscv_init): Set return_value_location based on elf class and
+	ehdr flags.
+	* riscv_retval.c (riscv_return_value_location_lp64d): Renamed to...
+	(riscv_return_value_location_lp64ifd): ...this. Handle single,
+	double, float _Complex and double _Complex cases.
+	(riscv_return_value_location_lp64d): New function.
+	(riscv_return_value_location_lp64f): Likewise.
+
+2021-04-19  Martin Liska  <mliska@suse.cz>
+
+	* aarch64_symbol.c (aarch64_data_marker_symbol): Use startswith.
+	* arm_symbol.c (arm_data_marker_symbol): Likewise.
+
 2021-02-01  Érico Nogueira  <ericonr@disroot.org>
 
 	* ppc_initreg.c: Also include <asm/ptrace.h>.
diff --git a/backends/aarch64_symbol.c b/backends/aarch64_symbol.c
index 464a569..15e0805 100644
--- a/backends/aarch64_symbol.c
+++ b/backends/aarch64_symbol.c
@@ -30,6 +30,8 @@
 # include <config.h>
 #endif
 
+#include <system.h>
+
 #include <elf.h>
 #include <stddef.h>
 #include <string.h>
@@ -104,7 +106,7 @@
   return (sym != NULL && sname != NULL
 	  && sym->st_size == 0 && GELF_ST_BIND (sym->st_info) == STB_LOCAL
 	  && GELF_ST_TYPE (sym->st_info) == STT_NOTYPE
-	  && (strcmp (sname, "$d") == 0 || strncmp (sname, "$d.", 3) == 0));
+	  && (strcmp (sname, "$d") == 0 || startswith (sname, "$d.")));
 }
 
 const char *
diff --git a/backends/arm_symbol.c b/backends/arm_symbol.c
index c8e1d7f..a733cff 100644
--- a/backends/arm_symbol.c
+++ b/backends/arm_symbol.c
@@ -30,6 +30,8 @@
 # include <config.h>
 #endif
 
+#include <system.h>
+
 #include <elf.h>
 #include <stddef.h>
 #include <string.h>
@@ -154,5 +156,5 @@
   return (sym != NULL && sname != NULL
           && sym->st_size == 0 && GELF_ST_BIND (sym->st_info) == STB_LOCAL
           && GELF_ST_TYPE (sym->st_info) == STT_NOTYPE
-          && (strcmp (sname, "$d") == 0 || strncmp (sname, "$d.", 3) == 0));
+          && (strcmp (sname, "$d") == 0 || startswith (sname, "$d.")));
 }
diff --git a/backends/riscv_init.c b/backends/riscv_init.c
index 551e7bb..141e082 100644
--- a/backends/riscv_init.c
+++ b/backends/riscv_init.c
@@ -41,6 +41,12 @@
 extern __typeof (EBLHOOK (return_value_location))
   riscv_return_value_location_lp64d attribute_hidden;
 
+extern __typeof (EBLHOOK (return_value_location))
+    riscv_return_value_location_lp64f attribute_hidden;
+
+extern __typeof (EBLHOOK (return_value_location))
+    riscv_return_value_location_lp64 attribute_hidden;
+
 extern __typeof (EBLHOOK (core_note)) riscv64_core_note attribute_hidden;
 
 Ebl *
@@ -63,10 +69,17 @@
     eh->core_note = riscv64_core_note;
   else
     HOOK (eh, core_note);
-  if (eh->class == ELFCLASS64
-      && ((elf->state.elf64.ehdr->e_flags & EF_RISCV_FLOAT_ABI)
-	  == EF_RISCV_FLOAT_ABI_DOUBLE))
-    eh->return_value_location = riscv_return_value_location_lp64d;
+  if (eh->class == ELFCLASS64)
+    {
+      if ((elf->state.elf64.ehdr->e_flags & EF_RISCV_FLOAT_ABI)
+          == EF_RISCV_FLOAT_ABI_DOUBLE)
+        eh->return_value_location = riscv_return_value_location_lp64d;
+      else if ((elf->state.elf64.ehdr->e_flags & EF_RISCV_FLOAT_ABI)
+               == EF_RISCV_FLOAT_ABI_SINGLE)
+        eh->return_value_location = riscv_return_value_location_lp64f;
+      else
+        eh->return_value_location = riscv_return_value_location_lp64;
+    }
 
   return eh;
 }
diff --git a/backends/riscv_retval.c b/backends/riscv_retval.c
index 35b6010..3476148 100644
--- a/backends/riscv_retval.c
+++ b/backends/riscv_retval.c
@@ -125,8 +125,8 @@
 }
 
 int
-riscv_return_value_location_lp64d (Dwarf_Die *functypedie,
-				   const Dwarf_Op **locp)
+riscv_return_value_location_lp64ifd (int fp, Dwarf_Die *functypedie,
+                                     const Dwarf_Op **locp)
 {
   /* Start with the function's type, and get the DW_AT_type attribute,
      which is the type of the return value.  */
@@ -211,10 +211,29 @@
 	      switch (size)
 		{
 		case 4: /* single */
-		case 8: /* double */
-		  return pass_in_fpr_lp64d (locp, size);
+                  switch (fp)
+                    {
+                    case EF_RISCV_FLOAT_ABI_DOUBLE:
+                    case EF_RISCV_FLOAT_ABI_SINGLE:
+                      return pass_in_fpr_lp64d (locp, size);
+                    case EF_RISCV_FLOAT_ABI_SOFT:
+                      return pass_in_gpr_lp64 (locp, size);
+                    default:
+                      return -2;
+                    }
+                case 8: /* double */
+                  switch (fp)
+                    {
+                    case EF_RISCV_FLOAT_ABI_DOUBLE:
+                      return pass_in_fpr_lp64d (locp, size);
+                    case EF_RISCV_FLOAT_ABI_SINGLE:
+                    case EF_RISCV_FLOAT_ABI_SOFT:
+                      return pass_in_gpr_lp64 (locp, size);
+                    default:
+                      return -2;
+                    }
 
-		case 16: /* quad */
+                case 16: /* quad */
 		  return pass_in_gpr_lp64 (locp, size);
 
 		default:
@@ -227,12 +246,31 @@
 	      switch (size)
 		{
 		case 8: /* float _Complex */
-		  return pass_in_fpr_lp64f (locp, size);
+                  switch (fp)
+                    {
+                    case EF_RISCV_FLOAT_ABI_DOUBLE:
+                    case EF_RISCV_FLOAT_ABI_SINGLE:
+                      return pass_in_fpr_lp64f (locp, size);
+                    case EF_RISCV_FLOAT_ABI_SOFT:
+                      /* Double the size so the vals are two registers. */
+                      return pass_in_gpr_lp64 (locp, size * 2);
+                    default:
+                      return -2;
+                    }
 
-		case 16: /* double _Complex */
-		  return pass_in_fpr_lp64d (locp, size);
+                case 16: /* double _Complex */
+                  switch (fp)
+                    {
+                    case EF_RISCV_FLOAT_ABI_DOUBLE:
+                      return pass_in_fpr_lp64d (locp, size);
+                    case EF_RISCV_FLOAT_ABI_SINGLE:
+                    case EF_RISCV_FLOAT_ABI_SOFT:
+                      return pass_in_gpr_lp64 (locp, size);
+                    default:
+                      return -2;
+                    }
 
-		case 32: /* long double _Complex */
+                case 32: /* long double _Complex */
 		  return pass_by_ref (locp);
 
 		default:
@@ -249,3 +287,27 @@
   *locp = NULL;
   return 0;
 }
+
+int
+riscv_return_value_location_lp64d (Dwarf_Die *functypedie,
+                                   const Dwarf_Op **locp)
+{
+  return riscv_return_value_location_lp64ifd (EF_RISCV_FLOAT_ABI_DOUBLE,
+                                              functypedie, locp);
+}
+
+int
+riscv_return_value_location_lp64f (Dwarf_Die *functypedie,
+                                   const Dwarf_Op **locp)
+{
+  return riscv_return_value_location_lp64ifd (EF_RISCV_FLOAT_ABI_SINGLE,
+                                              functypedie, locp);
+}
+
+int
+riscv_return_value_location_lp64 (Dwarf_Die *functypedie,
+                                  const Dwarf_Op **locp)
+{
+  return riscv_return_value_location_lp64ifd (EF_RISCV_FLOAT_ABI_SOFT,
+                                              functypedie, locp);
+}
diff --git a/config.h b/config.h
index 5a31eb5..ea86194 100644
--- a/config.h
+++ b/config.h
@@ -51,10 +51,22 @@
    don't. */
 #define HAVE_DECL_RAWMEMCHR 1
 
+/* Define to 1 if you have the declaration of `reallocarray', and to 0 if you
+   don't. */
+#define HAVE_DECL_REALLOCARRAY 1
+
 /* Define to 1 if you have the declaration of `strerror_r', and to 0 if you
    don't. */
 #define HAVE_DECL_STRERROR_R 1
 
+/* Define to 1 if you have the <error.h> header file. */
+#if defined(__BIONIC__) || defined(__GLIBC__)
+#define HAVE_ERROR_H 1
+#endif
+
+/* Define to 1 if you have the <err.h> header file. */
+#define HAVE_ERR_H 1
+
 /* Defined if __attribute__((fallthrough)) is supported */
 #define HAVE_FALLTHROUGH 1
 
@@ -70,22 +82,25 @@
 /* Define to 1 if you have the <inttypes.h> header file. */
 #define HAVE_INTTYPES_H 1
 
-/* Define to 1 if you have the <memory.h> header file. */
-#define HAVE_MEMORY_H 1
-
 /* Define to 1 if you have the `process_vm_readv' function. */
 #define HAVE_PROCESS_VM_READV 1
 
+/* Enable pthread_setname_np */
+#define HAVE_PTHREAD_SETNAME_NP 1
+
 /* Define to 1 if `stdatomic.h` is provided by the system, 0 otherwise. */
 #define HAVE_STDATOMIC_H 1
 
 /* Define to 1 if you have the <stdint.h> header file. */
 #define HAVE_STDINT_H 1
 
+/* Define to 1 if you have the <stdio.h> header file. */
+#define HAVE_STDIO_H 1
+
 /* Define to 1 if you have the <stdlib.h> header file. */
 #define HAVE_STDLIB_H 1
 
-/* Define to 1 if you have the `strerror_r' function. */
+/* Define if you have `strerror_r'. */
 #define HAVE_STRERROR_R 1
 
 /* Define to 1 if you have the <strings.h> header file. */
@@ -119,7 +134,7 @@
 #define PACKAGE_NAME "elfutils"
 
 /* Define to the full name and version of this package. */
-#define PACKAGE_STRING "elfutils 0.183"
+#define PACKAGE_STRING "elfutils 0.186"
 
 /* Define to the one symbol short name of this package. */
 #define PACKAGE_TARNAME "elfutils"
@@ -128,16 +143,20 @@
 #define PACKAGE_URL "http://elfutils.org/"
 
 /* Define to the version of this package. */
-#define PACKAGE_VERSION "0.183"
+#define PACKAGE_VERSION "0.186"
 
 /* The size of `long', as computed by sizeof. */
 #define SIZEOF_LONG 8
 
-/* Define to 1 if you have the ANSI C header files. */
+/* Define to 1 if all of the C90 standard headers exist (not just the ones
+   required in a freestanding environment). This macro is provided for
+   backward compatibility; new code need not use it. */
 #define STDC_HEADERS 1
 
 /* Define to 1 if strerror_r returns char *. */
+#if defined(__GLIBC__) || defined(__BIONIC__)
 #define STRERROR_R_CHAR_P 1
+#endif
 
 /* Support bzip2 decompression via -lbz2. */
 /* #undef USE_BZLIB */
@@ -158,17 +177,12 @@
 /* #undef USE_ZSTD */
 
 /* Version number of package */
-#define VERSION "0.183"
+#define VERSION "0.186"
 
 /* Define to 1 if `lex' declares `yytext' as a `char *' by default, not a
    `char[]'. */
 #define YYTEXT_POINTER 1
 
-/* Enable large inode numbers on Mac OS X 10.5.  */
-#ifndef _DARWIN_USE_64_BIT_INODE
-# define _DARWIN_USE_64_BIT_INODE 1
-#endif
-
 /* Number of bits in a file offset, on hosts where this is settable. */
 /* #undef _FILE_OFFSET_BITS */
 
diff --git a/config/ChangeLog b/config/ChangeLog
index d84d38c..acbaaa8 100644
--- a/config/ChangeLog
+++ b/config/ChangeLog
@@ -1,3 +1,51 @@
+2021-11-10  Mark Wielaard  <mark@klomp.org>
+
+	* elfutils.spec.in: Update for 0.186.
+
+2021-10-03  Frank Ch. Eigler  <fche@redhat.com>
+
+	PR27783
+	* profile.sh, profile.csh: Rewrite to document and set DEBUGINFOD_URLS
+	from /etc/debuginfod/*.urls files.
+	* Makefile.am: Install the configury-specified .urls file.
+	* elfutils.spec: Package it.
+
+2021-09-05  Dmitry V. Levin  <ldv@altlinux.org>
+
+	* eu.am (STACK_USAGE_NO_ERROR): New variable.
+
+2021-07-06  Alice Zhang  <alizhang@redhat.com>
+
+	* debuginfod.sysconfig: Introduce default retry limit.
+
+2021-05-10  Mark Wielaard  <mark@klomp.org>
+
+	* elfutils.spec.in: Update for 0.185.
+
+2021-05-11  Frank Ch. Eigler  <fche@redhat.com>
+
+	* elfutils.spec.in: Add procps to BuildRequires: for %check.
+
+2021-05-10  Mark Wielaard  <mark@klomp.org>
+
+	* elfutils.spec.in: Update for 0.184.
+
+2021-02-17  Timm Bäder  <tbaeder@redhat.com>
+
+	* eu.am (NO_PACKED_NOT_ALIGNED_WARNING): New variable.
+	(AM_CFLAGS): Use NO_PACKED_NOT_ALIGNED_WARNING.
+	(AM_CXXFLAGS): Likewise.
+
+2021-02-17  Timm Bäder  <tbaeder@redhat.com>
+
+	* eu.am (TRAMPOLINES_WARNING): New variable.
+	(AM_CFLAGS): Use TRAMPOLINES_WARNING.
+	(AM_CXXFLAGS): Likewise.
+
+2021-02-12  Mark Wielaard  <mark@klomp.org>
+
+	* elfutils.spec.in: Escape %%check in comment.
+
 2021-02-05  Mark Wielaard  <mark@klomp.org>
 
 	* elfutils.spec.in: Update for 0.183.
diff --git a/config/Makefile.am b/config/Makefile.am
index a66f549..0d3ba16 100644
--- a/config/Makefile.am
+++ b/config/Makefile.am
@@ -40,9 +40,16 @@
 install-data-local:
 	$(INSTALL_DATA) profile.sh -D $(DESTDIR)$(sysconfdir)/profile.d/debuginfod.sh
 	$(INSTALL_DATA) profile.csh -D $(DESTDIR)$(sysconfdir)/profile.d/debuginfod.csh
+	mkdir -p $(DESTDIR)$(sysconfdir)/debuginfod
+	if [ -n "@DEBUGINFOD_URLS@" ]; then \
+		echo "@DEBUGINFOD_URLS@" > $(DESTDIR)$(sysconfdir)/debuginfod/elfutils.urls; \
+	fi
 
 uninstall-local:
-	rm -f $(DESTDIR)$(sysconfdir)/profile.d/debuginfod.sh $(DESTDIR)$(sysconfdir)/profile.d/debuginfod.csh
+	rm -f $(DESTDIR)$(sysconfdir)/profile.d/debuginfod.sh
+	rm -f $(DESTDIR)$(sysconfdir)/profile.d/debuginfod.csh
+	rm -f $(DESTDIR)$(sysconfdir)/debuginfod/elfutils.urls
+	-rmdir $(DESTDIR)$(sysconfdir)/debuginfod
 endif
 
 if MAINTAINER_MODE
diff --git a/config/debuginfod.sysconfig b/config/debuginfod.sysconfig
index 4460387..890a1a2 100644
--- a/config/debuginfod.sysconfig
+++ b/config/debuginfod.sysconfig
@@ -11,4 +11,5 @@
 # upstream debuginfods
 #DEBUGINFOD_URLS="http://secondhost:8002 http://thirdhost:8002"
 #DEBUGINFOD_TIMEOUT="5"
+#DEBUGINFOD_RETRY_LIMIT="2"
 #DEBUGINFOD_CACHE_DIR=""
diff --git a/config/elfutils.spec.in b/config/elfutils.spec.in
index 46b404f..aac0dff 100644
--- a/config/elfutils.spec.in
+++ b/config/elfutils.spec.in
@@ -35,8 +35,9 @@
 # For tests need to bunzip2 test files.
 BuildRequires: bzip2
 BuildRequires: zstd
-# For the run-debuginfod-find.sh test case in %check for /usr/sbin/ss
+# For the run-debuginfod-find.sh test case in %%check for /usr/sbin/ss etc.
 BuildRequires: iproute
+BuildRequires: procps
 BuildRequires: bsdtar
 BuildRequires: curl
 
@@ -298,12 +299,15 @@
 %{_libdir}/libdebuginfod.so.*
 %{_bindir}/debuginfod-find
 %{_mandir}/man1/debuginfod-find.1*
+%{_mandir}/man7/debuginfod*.7*
 %config(noreplace) %{_sysconfdir}/profile.d/*
+%config(noreplace) %{_sysconfdir}/debuginfod/*
   
 %files debuginfod-client-devel
 %defattr(-,root,root)
 %{_libdir}/pkgconfig/libdebuginfod.pc
 %{_mandir}/man3/debuginfod_*.3*
+%{_mandir}/man7/debuginfod*.7*
 %{_includedir}/elfutils/debuginfod.h
 %{_libdir}/libdebuginfod.so
 
@@ -314,6 +318,7 @@
 %{_unitdir}/debuginfod.service
 %{_sysconfdir}/sysconfig/debuginfod
 %{_mandir}/man8/debuginfod.8*
+%{_mandir}/man7/debuginfod*.7*
 
 %dir %attr(0700,debuginfod,debuginfod) %{_localstatedir}/cache/debuginfod
 %ghost %attr(0600,debuginfod,debuginfod) %{_localstatedir}/cache/debuginfod/debuginfod.sqlite
@@ -332,6 +337,50 @@
 %systemd_postun_with_restart debuginfod.service
 
 %changelog
+* Wed Nov 10 2021 Mark Wielaard <mark@klomp.org> 0.186-1
+- debuginfod-client: Default $DEBUGINFOD_URLS is computed from
+  drop-in files /etc/debuginfod/*.urls rather than
+  hardcoded into the /etc/profile.d/debuginfod*
+  scripts.
+  Add $DEBUGINFOD_MAXSIZE and $DEBUGINFOD_MAXTIME settings
+  for skipping large/slow transfers.
+  Add $DEBUGINFOD_RETRY for retrying aborted lookups.
+- debuginfod: Supply extra HTTP response headers, describing
+  archive/file names that satisfy the requested buildid content.
+  Support -d :memory: option for in-memory databases.
+  Protect against loops in federated server configurations.
+  Add -r option to use -I/-X regexes for grooming stale files.
+  Protect against wasted CPU from duplicate concurrent requests.
+  Limit the duration of groom ops roughly to rescan (-t) times.
+  Add --passive mode for serving from read-only database.
+  Several other performance improvements & prometheus metrics.
+- libdw: Support for the NVIDIA Cuda line map extensions.
+  DW_LNE_NVIDIA_inlined_call and DW_LNE_NVIDIA_set_function_name
+  are defined in dwarf.h. New functions dwarf_linecontext and
+  dwarf_linefunctionname.
+- translations: Update Japanese translation.
+
+* Sat May 22 2021 Mark Wielaard <mark@klomp.org> 0.185-1
+- debuginfod-client: Simplify curl handle reuse so downloads which
+                     return an error are retried.
+- elfcompress: Always exit with code 0 when the operation succeeds
+               (even when nothing was done). On error the exit code is
+               now always 1.
+
+* Mon May 10 2021  Mark Wielaard <mark@klomp.org> 0.184-1
+- debuginfod: Use libarchive's bsdtar as the .deb-family file unpacker.
+- debuginfod-client: Client caches negative results. If a query for a
+		   file failed with 404, an empty 000 permission
+		   file is created in the cache. This will prevent
+		   requesting the same file for the next 10 minutes.
+- 		   Client objects now carry long-lived curl handles
+		   for outgoing connections.  This makes it more
+		   efficient for multiple sequential queries, because
+		   the TCP connections and/or TLS state info are kept
+		   around awhile, avoiding O(100ms) setup latencies.
+- libdw: handle DW_FORM_indirect when reading attributes
+- translations: Update Polish translation.
+
 * Fri Feb  5 2021 Mark Wielaard <mark@klomp.org> 0.183-1
 - debuginfod: New thread-busy metric and more detailed error metrics.
   New --fdcache-mintmp and tracking of filesystem freespace.
diff --git a/config/eu.am b/config/eu.am
index 6c3c444..58cd3c4 100644
--- a/config/eu.am
+++ b/config/eu.am
@@ -39,8 +39,10 @@
 # Warn about stack usage of more than 256K = 262144 bytes.
 if ADD_STACK_USAGE_WARNING
 STACK_USAGE_WARNING=-Wstack-usage=262144
+STACK_USAGE_NO_ERROR=-Wno-error=stack-usage=
 else
 STACK_USAGE_WARNING=
+STACK_USAGE_NO_ERROR=
 endif
 
 if SANE_LOGICAL_OP_WARNING
@@ -64,29 +66,45 @@
 if HAVE_IMPLICIT_FALLTHROUGH_WARNING
 # Use strict fallthrough. Only __attribute__((fallthrough)) will prevent the
 # warning
+if HAVE_IMPLICIT_FALLTHROUGH_5_WARNING
 IMPLICIT_FALLTHROUGH_WARNING=-Wimplicit-fallthrough=5
 else
+IMPLICIT_FALLTHROUGH_WARNING=-Wimplicit-fallthrough
+endif
+else
 IMPLICIT_FALLTHROUGH_WARNING=
 endif
 
+if HAVE_TRAMPOLINES_WARNING
+TRAMPOLINES_WARNING=-Wtrampolines
+else
+TRAMPOLINES_WARNING=
+endif
+
+if HAVE_NO_PACKED_NOT_ALIGNED_WARNING
+NO_PACKED_NOT_ALIGNED_WARNING=-Wno-packed-not-aligned
+else
+NO_PACKED_NOT_ALIGNED_WARNING=
+endif
+
 AM_CFLAGS = -std=gnu99 -Wall -Wshadow -Wformat=2 \
-	    -Wold-style-definition -Wstrict-prototypes -Wtrampolines \
+	    -Wold-style-definition -Wstrict-prototypes $(TRAMPOLINES_WARNING) \
 	    $(LOGICAL_OP_WARNING) $(DUPLICATED_COND_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)) \
-	    $(if $($(*F)_no_Wpacked_not_aligned),-Wno-packed-not-aligned,) \
+	    $(if $($(*F)_no_Wpacked_not_aligned),$(NO_PACKED_NOT_ALIGNED_WARNING),) \
 	    $($(*F)_CFLAGS)
 
 AM_CXXFLAGS = -std=c++11 -Wall -Wshadow \
-	   -Wtrampolines \
+	   $(TRAMPOLINES_WARNING) \
 	   $(LOGICAL_OP_WARNING) $(DUPLICATED_COND_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)) \
-	   $(if $($(*F)_no_Wpacked_not_aligned),-Wno-packed-not-aligned,) \
+	   $(if $($(*F)_no_Wpacked_not_aligned),$(NO_PACKED_NOT_ALIGNED_WARNING),) \
 	   $($(*F)_CXXFLAGS)
 
 COMPILE.os = $(filter-out -fprofile-arcs -ftest-coverage, $(COMPILE))
diff --git a/config/profile.csh.in b/config/profile.csh.in
index 0a2d6d1..01f7c2f 100644
--- a/config/profile.csh.in
+++ b/config/profile.csh.in
@@ -1,11 +1,16 @@
-if ("@DEBUGINFOD_URLS@" != "") then
-	if ($?DEBUGINFOD_URLS) then
-		if ($%DEBUGINFOD_URLS) then
-			setenv DEBUGINFOD_URLS "$DEBUGINFOD_URLS @DEBUGINFOD_URLS@"
-		else
-			setenv DEBUGINFOD_URLS "@DEBUGINFOD_URLS@"
-		endif
-	else
-		setenv DEBUGINFOD_URLS "@DEBUGINFOD_URLS@"
-	endif
+
+# $HOME/.login* or similar files may first set $DEBUGINFOD_URLS.
+# If $DEBUGINFOD_URLS is not set there, we set it from system *.url files.
+# $HOME/.*rc or similar files may then amend $DEBUGINFOD_URLS.
+# See also [man debuginfod-client-config] for other environment variables
+# such as $DEBUGINFOD_MAXSIZE, $DEBUGINFOD_MAXTIME, $DEBUGINFOD_PROGRESS.
+
+if (! $?DEBUGINFOD_URLS) then
+    set prefix="@prefix@"
+    set debuginfod_urls=`sh -c "cat @sysconfdir@/debuginfod/*.urls 2>/dev/null" | tr '\n' ' '`
+    if ( "$debuginfod_urls" != "" ) then
+        setenv DEBUGINFOD_URLS "$debuginfod_urls"
+    endif
+    unset debuginfod_urls
+    unset prefix
 endif
diff --git a/config/profile.sh.in b/config/profile.sh.in
index aa228a0..afce396 100644
--- a/config/profile.sh.in
+++ b/config/profile.sh.in
@@ -1,4 +1,17 @@
-if [ -n "@DEBUGINFOD_URLS@" ]; then
-	DEBUGINFOD_URLS="${DEBUGINFOD_URLS-}${DEBUGINFOD_URLS:+ }@DEBUGINFOD_URLS@"
-	export DEBUGINFOD_URLS
+
+# $HOME/.profile* or similar files may first set $DEBUGINFOD_URLS.
+# If $DEBUGINFOD_URLS is not set there, we set it from system *.url files.
+# $HOME/.*rc or similar files may then amend $DEBUGINFOD_URLS.
+# See also [man debuginfod-client-config] for other environment variables
+# such as $DEBUGINFOD_MAXSIZE, $DEBUGINFOD_MAXTIME, $DEBUGINFOD_PROGRESS.
+
+if [ -z "$DEBUGINFOD_URLS" ]; then
+    prefix="@prefix@"
+    debuginfod_urls=`sh -c "cat @sysconfdir@/debuginfod/*.urls 2>/dev/null" | tr '\n' ' '`
+    if [ -n "$debuginfod_urls" ]; then
+        DEBUGINFOD_URLS="$debuginfod_urls"
+        export DEBUGINFOD_URLS
+    fi
+    unset debuginfod_urls
+    unset prefix
 fi
diff --git a/configure.ac b/configure.ac
index d345495..ff9581d 100644
--- a/configure.ac
+++ b/configure.ac
@@ -17,7 +17,7 @@
 dnl
 dnl  You should have received a copy of the GNU General Public License
 dnl  along with this program.  If not, see <http://www.gnu.org/licenses/>.
-AC_INIT([elfutils],[0.183],[https://sourceware.org/bugzilla],[elfutils],[http://elfutils.org/])
+AC_INIT([elfutils],[0.186],[https://sourceware.org/bugzilla],[elfutils],[http://elfutils.org/])
 
 dnl Workaround for older autoconf < 2.64
 m4_ifndef([AC_PACKAGE_URL],
@@ -87,7 +87,7 @@
 
 AH_TEMPLATE([USE_LOCKS], [Defined if libraries should be thread-safe.])
 
-AC_PROG_CC
+AC_PROG_CC_C99
 AC_PROG_RANLIB
 AC_PROG_YACC
 AM_PROG_LEX
@@ -96,39 +96,6 @@
 AC_CHECK_TOOL([READELF], [readelf])
 AC_CHECK_TOOL([NM], [nm])
 
-# We use -std=gnu99 but have explicit checks for some language constructs
-# and GNU extensions since some compilers claim GNU99 support, but don't
-# really support all language extensions. In particular we need
-# Mixed Declarations and Code
-# https://gcc.gnu.org/onlinedocs/gcc/Mixed-Declarations.html
-# Nested Functions
-# https://gcc.gnu.org/onlinedocs/gcc/Nested-Functions.html
-# Arrays of Variable Length
-# https://gcc.gnu.org/onlinedocs/gcc/Variable-Length.html
-AC_CACHE_CHECK([for gcc with GNU99 support], ac_cv_c99, [dnl
-old_CFLAGS="$CFLAGS"
-CFLAGS="$CFLAGS -std=gnu99"
-AC_COMPILE_IFELSE([AC_LANG_SOURCE([dnl
-int foo (int a)
-{
-  for (int i = 0; i < a; ++i) if (i % 4) break; int s = a; return s;
-}
-
-double bar (double a, double b)
-{
-  double square (double z) { return z * z; }
-  return square (a) + square (b);
-}
-
-void baz (int n)
-{
-  struct S { int x[[n]]; };
-}])],
-		  ac_cv_c99=yes, ac_cv_c99=no)
-CFLAGS="$old_CFLAGS"])
-AS_IF([test "x$ac_cv_c99" != xyes],
-      AC_MSG_ERROR([gcc with GNU99 support required]))
-
 AC_CACHE_CHECK([whether gcc supports __attribute__((visibility()))],
 	ac_cv_visibility, [dnl
 save_CFLAGS="$CFLAGS"
@@ -425,9 +392,15 @@
 AC_CHECK_DECLS([mempcpy],[],[],
                [#define _GNU_SOURCE
                 #include <string.h>])
+AC_CHECK_DECLS([reallocarray],[],[],
+               [#define _GNU_SOURCE
+                #include <stdlib.h>])
 
 AC_CHECK_FUNCS([process_vm_readv])
 
+AC_CHECK_HEADERS([error.h])
+AC_CHECK_HEADERS([err.h])
+
 old_CFLAGS="$CFLAGS"
 CFLAGS="$CFLAGS -D_GNU_SOURCE"
 AC_FUNC_STRERROR_R()
@@ -519,12 +492,42 @@
 AM_CONDITIONAL(HAVE_IMPLICIT_FALLTHROUGH_WARNING,
 	       [test "x$ac_cv_implicit_fallthrough" != "xno"])
 
+# Check whether the compiler additionally accepts -Wimplicit-fallthrough=5
+# GCC accepts this and 5 means "don't parse any fallthrough comments and
+# only accept the fallthrough attribute"
+AC_CACHE_CHECK([whether the compiler accepts -Wimplicit-fallthrough=5], ac_cv_implicit_fallthrough_5, [dnl
+old_CFLAGS="$CFLAGS"
+CFLAGS="$CFLAGS -Wimplicit-fallthrough=5 -Werror"
+AC_COMPILE_IFELSE([AC_LANG_SOURCE([])],
+		  ac_cv_implicit_fallthrough_5=yes, ac_cv_implicit_fallthrough_5=no)
+CFLAGS="$old_CFLAGS"])
+AM_CONDITIONAL(HAVE_IMPLICIT_FALLTHROUGH_5_WARNING,
+	       [test "x$ac_cv_implicit_fallthrough_5" != "xno"])
+
 # Assume the fallthrough attribute is supported if -Wimplict-fallthrough is supported
 if test "$ac_cv_implicit_fallthrough" = "yes"; then
 	AC_DEFINE([HAVE_FALLTHROUGH], [1],
 		  [Defined if __attribute__((fallthrough)) is supported])
 fi
 
+AC_CACHE_CHECK([whether the compiler accepts -Wtrampolines], ac_cv_trampolines, [dnl
+old_CFLAGS="$CFLAGS"
+CFLAGS="$CFLAGS -Wtrampolines -Werror"
+AC_COMPILE_IFELSE([AC_LANG_SOURCE([])],
+		  ac_cv_trampolines=yes, ac_cv_trampolines=no)
+CFLAGS="$old_CFLAGS"])
+AM_CONDITIONAL(HAVE_TRAMPOLINES_WARNING,
+	       [test "x$ac_cv_trampolines" != "xno"])
+
+AC_CACHE_CHECK([whether the compiler accepts -Wno-packed-not-aligned], ac_cv_no_packed_not_aligned, [dnl
+old_CFLAGS="$CFLAGS"
+CFLAGS="$CFLAGS -Wno-packed-not-aligned -Werror"
+AC_COMPILE_IFELSE([AC_LANG_SOURCE([])],
+		  ac_cv_no_packed_not_aligned=yes, ac_cv_no_packed_not_aligned=no)
+CFLAGS="$old_CFLAGS"])
+AM_CONDITIONAL(HAVE_NO_PACKED_NOT_ALIGNED_WARNING,
+	       [test "x$ac_cv_no_packed_not_aligned" != "xno"])
+
 saved_LIBS="$LIBS"
 AC_SEARCH_LIBS([argp_parse], [argp])
 LIBS="$saved_LIBS"
@@ -717,6 +720,9 @@
     fi
 ])
 
+AC_CHECK_LIB(pthread, pthread_setname_np, [
+                      AC_DEFINE([HAVE_PTHREAD_SETNAME_NP],[1],[Enable pthread_setname_np])])
+
 AS_IF([test "x$enable_libdebuginfod" = "xyes" || test "x$enable_libdebuginfod" = "xdummy"],
       [AC_DEFINE([ENABLE_LIBDEBUGINFOD], [1], [Enable libdebuginfod])])
 AS_IF([test "x$enable_libdebuginfod" = "xdummy"],
diff --git a/debuginfod/ChangeLog b/debuginfod/ChangeLog
index 8de8852..f06d3ee 100644
--- a/debuginfod/ChangeLog
+++ b/debuginfod/ChangeLog
@@ -1,3 +1,255 @@
+2021-11-05  Frank Ch. Eigler  <fche@redhat.com>
+
+	PR28430
+	* debuginfod.cxx (parse_opt): Add "--passive" flag.  Complain
+	about inconsistent flags.
+	(main): In passive mode, suppress scan/groom/traverse threads and
+	other read-write database ops.
+
+2021-11-04  Frank Ch. Eigler  <fche@redhat.com>
+
+	PR28514
+	* debuginfod.cxx (groom): Rework into separate decision/action
+	phases.  Add new metrics to monitor progress.  Limit indefinite
+	operation times to avoid starving rescan.
+
+2021-10-23  Frank Ch. Eigler  <fche@redhat.com>
+
+	PR28240
+	* debuginfod-client.c (debuginfod_query_server): Correct
+	negative-hit cache check sequence for root user.
+
+2021-10-15  Mark Wielaard  <mark@klomp.org>
+
+	* debuginfod-client.c (debuginfod_query_server): Set
+	CURLOPT_PROTOCOLS.
+
+2021-10-06  Di Chen <dichen@redhat.com>
+
+	PR28242
+	* debuginfod.cxx (inc_metrics, add_metrics): Add two-tag variants.
+	(handler_cb): Call it with artifacttype for http_responses_* metrics.
+	(handle_buildid): Sanitize artifacttype if necessary.
+	(dwarf_extract_source_path): Pass sanitizable string param.
+
+2021-09-17  Noah Sanci  <nsanci@redhat.com>
+
+	* debuginfod-client.c (debuginfod_query_server): curl_multi_perform
+	now occurs before checking if response headers have arrived.
+
+2021-09-14  Frank Ch. Eigler <fche@redhat.com>
+
+	PRPR28339
+	* debuginfod.cxx (waitq::fronters): New field.
+	(waitq::wait_idle): Respect it.
+	(waitq::done_front): New function.
+	(thread_main_scanner): Call it to match wait_front().
+
+2021-09-12  Mark Wielaard  <mark@klomp.org>
+
+	* debuginfod.cxx (libarchive_fdcache::lookup): Add endl after
+	obatched(clog) line.
+2021-09-13  Noah Sanci  <nsanci@redhat.com>
+
+	* debuginfod-client.c (debuginfod_query_server): Removed constant
+	operations from a loop. curl_free memory.
+
+2021-09-06  Dmitry V. Levin  <ldv@altlinux.org>
+
+	* debuginfod-client.c (debuginfod_begin): Remove cast of calloc return
+	value.
+
+2021-08-28  Mark Wielaard  <mjw@redhat.com>
+
+	* debuginfod.cxx (parse_opt): Turn the -d arg ":memory:" into
+	"file::memory:?cache=shared" for the db_path.
+
+2021-08-20  Di Chen  <dichen@redhat.com>
+
+	* debuginfod.cxx (options): Add ARGP_KEY_FORWARDED_TTL_LIMIT.
+	(forwarded_ttl_limit): New static unsigned.
+	(parse_opt): Handle ARGP_KEY_FORWARDED_TTL_LIMIT.
+	(handle_buildid): Check forwarded_ttl_limit.
+	(main): Log forwarded ttl limit.
+
+2021-08-20  Saleem Abdulrasool  <abdulras@google.com>
+
+	* debuginfod.cxx: Remove error.h include.
+
+2021-08-19  Frank Ch. Eigler  <fche@redhat.com>
+
+	PR28249
+	* debuginfod.cxx (handler_cb): Fix after_you unique_set key
+	to the entire incoming URL.
+
+2021-08-02  Noah Sanci  <nsanci@redhat.com>
+
+	PR27277
+	* debuginfod-client.c (struct debuginfod_client): New field
+	winning_headers.
+	(struct handle_data): New field response_data, response_data_size.
+	(header_callback): Store received headers in response_data.
+	(debuginfod_query_server): Activate CURLOPT_HEADERFUNCTION.
+	Save winning response_data.
+	(debuginfod_end): free client winning headers.
+	* debuginfod.cxx (handle_buildid_f_match): remove X-DEBUGINFOD-FILE
+	path. Add X-DEBUGINFOD-FILE and X-DEBUGINFOD-SIZE headers.
+	(handle_buildid_r_match): remove X-DEBUGINFOD-FILE path. Add
+	X-DEBUGINFOD-FILE, X-DEBUGINFOD-SIZE
+	headers, and X-ARCHIVE headers.
+
+2021-07-26  Noah Sanci  <nsanci@redhat.com>
+
+	PR27982
+	* debuginfod-client.c (globals): added default_maxsize and
+	default_maxtime.
+	(debuginfod_query_server): Added DEBUGINFOD_MAXSIZE and
+	DEBUGINFOD_MAXTIME envvar processing.
+	* debuginfod.cxx (handler_cb): If the requested file exceeds
+	maxsize return code 406.
+	* debuginfod.h.in: Added DEBUGINFOD_MAXSIZE_ENV_VAR and
+	DEBUGINFOD_MAXTIME_ENV_VAR.
+
+2021-07-16  Noah Sanci  <nsanci@redhat.com>
+
+	PR28034
+	* debuginfod-client.c (debuginfod_query_server): % escape filename
+	so the completed url is processed properly.
+
+2021-06-28 Noah Sanci <nsanci@redhat.com>
+
+	PR25978
+	* debuginfod.cxx (options): Added --fdcache-prefetch-fds/mbs options.
+	(set_metric): Added a condition for fdcache_mintmp to ensure no
+	negative percentages or percentages larger than 100% are given.
+	(globals): Added fdcache_prefetch_mbs/fdcache_prefetch_fds.
+	(set_metrics): Differentiate between lru and prefetch metrics.
+	(intern): Added prefetch functionality for nuking preexisting copies
+	and incrementing prefetch metrics.
+	(lookup): Search prefetch cache and increment associated metrics. Upon
+	finding in the prefetch cache move the element to the lru cache.
+	(limit): Arguments updated. Update size of prefetch cache.
+	(main): Log prefetch and cache fds/mbs
+
+2021-07-06  Alice Zhang  <alizhang@redhat.com>
+
+	PR27531
+	* debuginfod-client.c (debuginfod_query_server): Retry failed queries
+	if error code is not ENOENT.
+	* debuginfod.h.in: Introduce DEBUGINFOD_RETRY_LIMIT_ENV_VAR.
+
+2021-07-01  Noah Sanci <nsanci@redhat.com>
+
+	PR27711
+	* debuginfod.cxx (options): Add --regex-groom, -r option.
+	(regex_groom): New static bool defaults to false.
+	(parse_opt): Handle 'r' option by setting regex_groom to true.
+	(groom): Introduce and use reg_include and reg_exclude.
+
+2021-07-09  Noah Sanci  <nsanci@redhat.com>
+
+	PR27983
+	* debuginfod-client.c (debuginfod_query_server): As full-length
+	urls are generated with standardized formats, ignore duplicates.
+	Created out1 and changed out2 error gotos. Updated url creation print
+	statements.
+	(globals): Removed url_delim_char, as it was no longer used.
+
+2021-06-18  Mark Wielaard  <mark@klomp.org>
+
+	* debuginfod-client.c (debuginfod_begin): Don't use client if
+	calloc call failed.
+
+2021-06-03  Frank Ch. Eigler <fche@redhat.com>
+
+	PR27863
+	* debuginfod.cxx (unique_set, unique_set_reserver): New classes.
+	(handler_cb): Use them to implement "after-you" queueing.
+
+2021-05-14  Frank Ch. Eigler <fche@redhat.com>
+
+	PR27859
+	* debuginfod-client.c (debuginfod_client): Retain only
+	long-lived multi handle from PR27701 work.
+	(debuginfo_begin,debuginfod_end): ctor/dtor for surviving field only.
+	(debuginfod_query_server): Rework to reuse multi handle only.
+
+2021-04-19  Martin Liska  <mliska@suse.cz>
+
+	* debuginfod-client.c (debuginfod_query_server): Use startswith.
+	(debuginfod_add_http_header): Likewise.
+	* debuginfod.cxx: Likewise.
+
+2021-05-04  Alice Zhang <alizhang@redhat.com>
+
+	* debuginfod-client.c (cache_miss_default_s): New static time_t,
+	defaults to 600 (10 minutes).
+	(cache_miss_filename): New static char pointer.
+	(debuginfod_config_cache): New static function.
+	(debuginfod_clean_cache): Use debuginfod_config_cache for
+	interval_path and max_unused_path.
+	(debuginfod_query_server): Check whether target_cache_path exists
+	as negative cache file and create target_cache_path when the server
+	returns ENOENT. Check cache_miss_path fir cache miss time.
+
+2021-04-26  Frank Ch. Eigler <fche@redhat.com>
+
+	PR27571
+	* debuginfod-client.c (debuginfod_query_server): Chmod 0400 files
+	delivered into the cache to prevent accidental modification.
+
+2021-04-26  Frank Ch. Eigler <fche@redhat.com>
+
+	PR26125
+	* debuginfod-client.c (debuginfod_clean_cache): For directory
+	rmdir, check mtime first.
+	(debuginfod_query_server): Try mkdir / mkstemp up to twice,
+	in case of race.
+
+2021-04-23  Frank Ch. Eigler <fche@redhat.com>
+
+	PR27701
+	* debuginfod-client.c (struct debuginfod_client): Add long-lived
+	CURL easy and multi handles.
+	(debuginfo_begin,debuginfod_end): ctor/dtor for these.
+	(debuginfod_query_server): Rework to reuse easy & multi handles.
+	(*_envvar): Just use the DEBUGINFOD_*_ENV_VAR directly instead.
+
+	* debuginfod.cxx (dc_pool): New pile of reusable debuginfod_client
+	objects for upstream federation connections.
+	(debuginfod_pool_{begin,end,groom}): New functions.
+	(handle_buildid): Use them.
+	(handler_cb): Fix keep-alive given libmicrohttpd convention of multiple
+	callbacks.
+
+2021-04-15  Frank Ch. Eigler <fche@redhat.com>
+
+	* debuginfod.cxx (groom): Only update database stats once.
+
+2021-04-15  Frank Ch. Eigler <fche@redhat.com>
+
+	* debuginfod.cxx (elf_classify): Recognize symtab-only stripped files
+	like fedora's libicudata as debuginfo files.
+
+2021-03-30  Frank Ch. Eigler <fche@redhat.com>
+
+	* debuginfod.cxx (main): Set child thread names.
+
+2021-03-07  Timm Bäder <tbaeder@redhat.com>
+
+	* debuginfod-client.c (debuginfod_query_server): Tweak
+	double/long clamping arithmetic to avoid UB and warnings.
+
+2021-02-25  Frank Ch. Eigler <fche@redhat.com>
+
+	* debuginfod.cxx (handler_cb): Filter webapi for bad
+	artifacttype keywords early for metric hygiene.
+
+2021-02-14  Frank Ch. Eigler <fche@redhat.com>
+
+	* debuginfod.cxx (main -U): Use bsdtar unconditionally.  Also map
+	the debian-compatible .ipk (openembedded distro family) to same.
+
 2021-02-04  Frank Ch. Eigler <fche@redhat.com>
 
 	PR27092 low-memory handling
diff --git a/debuginfod/debuginfod-client.c b/debuginfod/debuginfod-client.c
index de26af5..c875ee6 100644
--- a/debuginfod/debuginfod-client.c
+++ b/debuginfod/debuginfod-client.c
@@ -1,5 +1,5 @@
 /* Retrieve ELF / DWARF / source files from the debuginfod.
-   Copyright (C) 2019-2020 Red Hat, Inc.
+   Copyright (C) 2019-2021 Red Hat, Inc.
    This file is part of elfutils.
 
    This file is free software; you can redistribute it and/or modify
@@ -119,10 +119,15 @@
   /* File descriptor to output any verbose messages if > 0.  */
   int verbose_fd;
 
+  /* Maintain a long-lived curl multi-handle, which keeps a
+     connection/tls/dns cache to recently seen servers. */
+  CURLM *server_mhandle;
+  
   /* Can contain all other context, like cache_path, server_urls,
      timeout or other info gotten from environment variables, the
      handle data, etc. So those don't have to be reparsed and
      recreated on each request.  */
+  char * winning_headers;
 };
 
 /* The cache_clean_interval_s file within the debuginfod cache specifies
@@ -131,6 +136,11 @@
 static const char *cache_clean_interval_filename = "cache_clean_interval_s";
 static const time_t cache_clean_default_interval_s = 86400; /* 1 day */
 
+/* The cache_miss_default_s within the debuginfod cache specifies how
+   frequently the 000-permision file should be released.*/
+static const time_t cache_miss_default_s = 600; /* 10 min */
+static const char *cache_miss_filename = "cache_miss_s";
+
 /* The cache_max_unused_age_s file within the debuginfod cache specifies the
    the maximum time since last access that a file will remain in the cache.  */
 static const char *cache_max_unused_age_filename = "max_unused_age_s";
@@ -140,17 +150,15 @@
    The default parent directory is $HOME, or '/' if $HOME doesn't exist.  */
 static const char *cache_default_name = ".debuginfod_client_cache";
 static const char *cache_xdg_name = "debuginfod_client";
-static const char *cache_path_envvar = DEBUGINFOD_CACHE_PATH_ENV_VAR;
 
 /* URLs of debuginfods, separated by url_delim. */
-static const char *server_urls_envvar = DEBUGINFOD_URLS_ENV_VAR;
 static const char *url_delim =  " ";
-static const char url_delim_char = ' ';
 
 /* Timeout for debuginfods, in seconds (to get at least 100K). */
-static const char *server_timeout_envvar = DEBUGINFOD_TIMEOUT_ENV_VAR;
 static const long default_timeout = 90;
 
+/* Default retry count for download error. */
+static const long default_retry_limit = 2;
 
 /* Data associated with a particular CURL easy handle. Passed to
    the write callback.  */
@@ -176,6 +184,9 @@
      to the cache. Used to ensure that a file is not downloaded from
      multiple servers unnecessarily.  */
   CURL **target_handle;
+  /* Response http headers for this client handle, sent from the server */
+  char *response_data;
+  size_t response_data_size;
 };
 
 static size_t
@@ -206,6 +217,38 @@
   return (size_t) write(d->fd, (void*)ptr, count);
 }
 
+/* handle config file read and write */
+static int
+debuginfod_config_cache(char *config_path,
+			long cache_config_default_s,
+			struct stat *st)
+{
+  int fd;
+  /* if the config file doesn't exist, create one with DEFFILEMODE*/
+  if(stat(config_path, st) == -1)
+    {
+      fd = open(config_path, O_CREAT | O_RDWR, DEFFILEMODE);
+      if (fd < 0)
+        return -errno;
+
+      if (dprintf(fd, "%ld", cache_config_default_s) < 0)
+        return -errno;
+    }
+
+  long cache_config;
+  FILE *config_file = fopen(config_path, "r");
+  if (config_file)
+    {
+      if (fscanf(config_file, "%ld", &cache_config) != 1)
+        cache_config = cache_config_default_s;
+      fclose(config_file);
+    }
+  else
+    cache_config = cache_config_default_s;
+
+  return cache_config;
+}
+
 /* Create the cache and interval file if they do not already exist.
    Return 0 if cache and config file are initialized, otherwise return
    the appropriate error code.  */
@@ -251,52 +294,28 @@
 		       char *cache_path, char *interval_path,
 		       char *max_unused_path)
 {
+  time_t clean_interval, max_unused_age;
+  int rc = -1;
   struct stat st;
-  FILE *interval_file;
-  FILE *max_unused_file;
 
-  if (stat(interval_path, &st) == -1)
-    {
-      /* Create new interval file.  */
-      interval_file = fopen(interval_path, "w");
-
-      if (interval_file == NULL)
-        return -errno;
-
-      int rc = fprintf(interval_file, "%ld", cache_clean_default_interval_s);
-      fclose(interval_file);
-
-      if (rc < 0)
-        return -errno;
-    }
+  /* Create new interval file.  */
+  rc = debuginfod_config_cache(interval_path,
+			       cache_clean_default_interval_s, &st);
+  if (rc < 0)
+    return rc;
+  clean_interval = (time_t)rc;
 
   /* Check timestamp of interval file to see whether cleaning is necessary.  */
-  time_t clean_interval;
-  interval_file = fopen(interval_path, "r");
-  if (interval_file)
-    {
-      if (fscanf(interval_file, "%ld", &clean_interval) != 1)
-        clean_interval = cache_clean_default_interval_s;
-      fclose(interval_file);
-    }
-  else
-    clean_interval = cache_clean_default_interval_s;
-
   if (time(NULL) - st.st_mtime < clean_interval)
     /* Interval has not passed, skip cleaning.  */
     return 0;
 
   /* Read max unused age value from config file.  */
-  time_t max_unused_age;
-  max_unused_file = fopen(max_unused_path, "r");
-  if (max_unused_file)
-    {
-      if (fscanf(max_unused_file, "%ld", &max_unused_age) != 1)
-        max_unused_age = cache_default_max_unused_age_s;
-      fclose(max_unused_file);
-    }
-  else
-    max_unused_age = cache_default_max_unused_age_s;
+  rc = debuginfod_config_cache(max_unused_path,
+			       cache_default_max_unused_age_s, &st);
+  if (rc < 0)
+    return rc;
+  max_unused_age = (time_t)rc;
 
   char * const dirs[] = { cache_path, NULL, };
 
@@ -305,12 +324,13 @@
     return -errno;
 
   regex_t re;
-  const char * pattern = ".*/[a-f0-9]+/(debuginfo|executable|source.*)$";
+  const char * pattern = ".*/[a-f0-9]+(/debuginfo|/executable|/source.*|)$"; /* include dirs */
   if (regcomp (&re, pattern, REG_EXTENDED | REG_NOSUB) != 0)
     return -ENOMEM;
 
   FTSENT *f;
   long files = 0;
+  time_t now = time(NULL);
   while ((f = fts_read(fts)) != NULL)
     {
       /* ignore any files that do not match the pattern.  */
@@ -325,15 +345,16 @@
       switch (f->fts_info)
         {
         case FTS_F:
-          /* delete file if max_unused_age has been met or exceeded.  */
-          /* XXX consider extra effort to clean up old tmp files */
-          if (time(NULL) - f->fts_statp->st_atime >= max_unused_age)
-            unlink (f->fts_path);
+          /* delete file if max_unused_age has been met or exceeded w.r.t. atime.  */
+          if (now - f->fts_statp->st_atime >= max_unused_age)
+            (void) unlink (f->fts_path);
           break;
 
         case FTS_DP:
-          /* Remove if empty. */
-          (void) rmdir (f->fts_path);
+          /* Remove if old & empty.  Weaken race against concurrent creation by 
+             checking mtime. */
+          if (now - f->fts_statp->st_mtime >= max_unused_age)
+            (void) rmdir (f->fts_path);
           break;
 
         default:
@@ -481,6 +502,37 @@
   return 0;
 }
 
+/* This is a callback function that receives http response headers in buffer for use
+ * in this program. https://curl.se/libcurl/c/CURLOPT_HEADERFUNCTION.html is the
+ * online documentation.
+ */
+static size_t
+header_callback (char * buffer, size_t size, size_t numitems, void * userdata)
+{
+  if (size != 1)
+    return 0;
+  /* Temporary buffer for realloc */
+  char *temp = NULL;
+  struct handle_data *data = (struct handle_data *) userdata;
+  if (data->response_data == NULL)
+    {
+      temp = malloc(numitems+1);
+      if (temp == NULL)
+        return 0;
+    }
+  else
+    {
+      temp = realloc(data->response_data, data->response_data_size + numitems + 1);
+      if (temp == NULL)
+        return 0;
+    }
+
+  memcpy(temp + data->response_data_size, buffer, numitems);
+  data->response_data = temp;
+  data->response_data_size += numitems;
+  data->response_data[data->response_data_size] = '\0';
+  return numitems;
+}
 
 /* Query each of the server URLs found in $DEBUGINFOD_URLS for the file
    with the specified build-id, type (debuginfo, executable or source)
@@ -500,6 +552,7 @@
   char *cache_path = NULL;
   char *maxage_path = NULL;
   char *interval_path = NULL;
+  char *cache_miss_path = NULL;
   char *target_cache_dir = NULL;
   char *target_cache_path = NULL;
   char *target_cache_tmppath = NULL;
@@ -523,7 +576,7 @@
 
   /* Is there any server we can query?  If not, don't do any work,
      just return with ENOSYS.  Don't even access the cache.  */
-  urls_envvar = getenv(server_urls_envvar);
+  urls_envvar = getenv(DEBUGINFOD_URLS_ENV_VAR);
   if (vfd >= 0)
     dprintf (vfd, "server urls \"%s\"\n",
 	     urls_envvar != NULL ? urls_envvar : "");
@@ -537,6 +590,39 @@
   free (c->url);
   c->url = NULL;
 
+  /* PR 27982: Add max size if DEBUGINFOD_MAXSIZE is set. */
+  long maxsize = 0;
+  const char *maxsize_envvar;
+  maxsize_envvar = getenv(DEBUGINFOD_MAXSIZE_ENV_VAR);
+  if (maxsize_envvar != NULL)
+    maxsize = atol (maxsize_envvar);
+
+  /* PR 27982: Add max time if DEBUGINFOD_MAXTIME is set. */
+  long maxtime = 0;
+  const char *maxtime_envvar;
+  maxtime_envvar = getenv(DEBUGINFOD_MAXTIME_ENV_VAR);
+  if (maxtime_envvar != NULL)
+    maxtime = atol (maxtime_envvar);
+  if (maxtime && vfd >= 0)
+    dprintf(vfd, "using max time %lds\n", maxtime);
+
+  /* Maxsize is valid*/
+  if (maxsize > 0)
+    {
+      if (vfd)
+        dprintf (vfd, "using max size %ldB\n", maxsize);
+      char *size_header = NULL;
+      rc = asprintf (&size_header, "X-DEBUGINFOD-MAXSIZE: %ld", maxsize);
+      if (rc < 0)
+        {
+          rc = -ENOMEM;
+          goto out;
+        }
+      rc = debuginfod_add_http_header(c, size_header);
+      free(size_header);
+      if (rc < 0)
+        goto out;
+    }
   add_default_headers(c);
 
   /* Copy lowercase hex representation of build_id into buf.  */
@@ -611,7 +697,7 @@
 
   /* Determine location of the cache. The path specified by the debuginfod
      cache environment variable takes priority.  */
-  char *cache_var = getenv(cache_path_envvar);
+  char *cache_var = getenv(DEBUGINFOD_CACHE_PATH_ENV_VAR);
   if (cache_var != NULL && strlen (cache_var) > 0)
     xalloc_str (cache_path, "%s", cache_var);
   else
@@ -667,6 +753,7 @@
 
   /* XXX combine these */
   xalloc_str (interval_path, "%s/%s", cache_path, cache_clean_interval_filename);
+  xalloc_str (cache_miss_path, "%s/%s", cache_path, cache_miss_filename);
   xalloc_str (maxage_path, "%s/%s", cache_path, cache_max_unused_age_filename);
 
   if (vfd >= 0)
@@ -679,7 +766,33 @@
   if (rc != 0)
     goto out;
 
-  /* If the target is already in the cache then we are done.  */
+  struct stat st;
+  /* Check if the file exists and it's of permission 000; must check
+     explicitly rather than trying to open it first (PR28240). */
+  if (stat(target_cache_path, &st) == 0
+      && (st.st_mode & 0777) == 0)
+    {
+      time_t cache_miss;
+
+      rc = debuginfod_config_cache(cache_miss_path, cache_miss_default_s, &st);
+      if (rc < 0)
+        goto out;
+
+      cache_miss = (time_t)rc;
+      if (time(NULL) - st.st_mtime <= cache_miss)
+        {
+         rc = -ENOENT;
+         goto out;
+       }
+      else
+        /* TOCTOU non-problem: if another task races, puts a working
+           download or a 000 file in its place, unlinking here just
+           means WE will try to download again as uncached. */
+        unlink(target_cache_path);
+    }
+  
+  /* If the target is already in the cache (known not-000 - PR28240), 
+     then we are done. */
   int fd = open (target_cache_path, O_RDONLY);
   if (fd >= 0)
     {
@@ -691,7 +804,7 @@
     }
 
   long timeout = default_timeout;
-  const char* timeout_envvar = getenv(server_timeout_envvar);
+  const char* timeout_envvar = getenv(DEBUGINFOD_TIMEOUT_ENV_VAR);
   if (timeout_envvar != NULL)
     timeout = atoi (timeout_envvar);
 
@@ -707,38 +820,85 @@
     }
   /* thereafter, goto out0 on error*/
 
-  /* create target directory in cache if not found.  */
-  struct stat st;
-  if (stat(target_cache_dir, &st) == -1 && mkdir(target_cache_dir, 0700) < 0)
+  /* Because of a race with cache cleanup / rmdir, try to mkdir/mkstemp up to twice. */
+  for(int i=0; i<2; i++) {
+    /* (re)create target directory in cache */
+    (void) mkdir(target_cache_dir, 0700); /* files will be 0400 later */
+
+    /* NB: write to a temporary file first, to avoid race condition of
+       multiple clients checking the cache, while a partially-written or empty
+       file is in there, being written from libcurl. */
+    fd = mkstemp (target_cache_tmppath);
+    if (fd >= 0) break;
+  }
+  if (fd < 0) /* Still failed after two iterations. */
     {
       rc = -errno;
       goto out0;
     }
 
-  /* NB: write to a temporary file first, to avoid race condition of
-     multiple clients checking the cache, while a partially-written or empty
-     file is in there, being written from libcurl. */
-  fd = mkstemp (target_cache_tmppath);
-  if (fd < 0)
-    {
-      rc = -errno;
-      goto out0;
-    }
-
+  /* Initialize the memory to zero */
+  char *strtok_saveptr;
+  char **server_url_list = NULL;
+  char *server_url = strtok_r(server_urls, url_delim, &strtok_saveptr);
   /* Count number of URLs.  */
   int num_urls = 0;
-  for (int i = 0; server_urls[i] != '\0'; i++)
-    if (server_urls[i] != url_delim_char
-        && (i == 0 || server_urls[i - 1] == url_delim_char))
-      num_urls++;
 
-  CURLM *curlm = curl_multi_init();
-  if (curlm == NULL)
+  while (server_url != NULL)
     {
-      rc = -ENETUNREACH;
-      goto out0;
+      /* PR 27983: If the url is already set to be used use, skip it */
+      char *slashbuildid;
+      if (strlen(server_url) > 1 && server_url[strlen(server_url)-1] == '/')
+        slashbuildid = "buildid";
+      else
+        slashbuildid = "/buildid";
+
+      char *tmp_url;
+      if (asprintf(&tmp_url, "%s%s", server_url, slashbuildid) == -1)
+        {
+          rc = -ENOMEM;
+          goto out1;
+        }
+      int url_index;
+      for (url_index = 0; url_index < num_urls; ++url_index)
+        {
+          if(strcmp(tmp_url, server_url_list[url_index]) == 0)
+            {
+              url_index = -1;
+              break;
+            }
+        }
+      if (url_index == -1)
+        {
+          if (vfd >= 0)
+            dprintf(vfd, "duplicate url: %s, skipping\n", tmp_url);
+          free(tmp_url);
+        }
+      else
+        {
+          num_urls++;
+          char ** realloc_ptr;
+          realloc_ptr = reallocarray(server_url_list, num_urls,
+                                         sizeof(char*));
+          if (realloc_ptr == NULL)
+            {
+              rc = -ENOMEM;
+              goto out1;
+            }
+          server_url_list = realloc_ptr;
+          server_url_list[num_urls-1] = tmp_url;
+        }
+      server_url = strtok_r(NULL, url_delim, &strtok_saveptr);
     }
 
+  int retry_limit = default_retry_limit;
+  const char* retry_limit_envvar = getenv(DEBUGINFOD_RETRY_LIMIT_ENV_VAR);
+  if (retry_limit_envvar != NULL)
+    retry_limit = atoi (retry_limit_envvar);
+
+  CURLM *curlm = c->server_mhandle;
+  assert (curlm != NULL);
+
   /* Tracks which handle should write to fd. Set to the first
      handle that is ready to write the target file to the cache.  */
   CURL *target_handle = NULL;
@@ -746,11 +906,15 @@
   if (data == NULL)
     {
       rc = -ENOMEM;
-      goto out0;
+      goto out1;
     }
 
   /* thereafter, goto out1 on error.  */
 
+ /*The beginning of goto block query_in_parallel.*/
+ query_in_parallel:
+  rc = -ENOENT; /* Reset rc to default.*/
+
   /* Initialize handle_data with default values. */
   for (int i = 0; i < num_urls; i++)
     {
@@ -759,44 +923,65 @@
       data[i].errbuf[0] = '\0';
     }
 
-  char *strtok_saveptr;
-  char *server_url = strtok_r(server_urls, url_delim, &strtok_saveptr);
-
-  /* Initialize each handle.  */
-  for (int i = 0; i < num_urls && server_url != NULL; i++)
+  char *escaped_string = NULL;
+  size_t escaped_strlen = 0;
+  if (filename)
     {
+      escaped_string = curl_easy_escape(&target_handle, filename+1, 0);
+      if (!escaped_string)
+        {
+          rc = -ENOMEM;
+          goto out2;
+        }
+      char *loc = escaped_string;
+      escaped_strlen = strlen(escaped_string);
+      while ((loc = strstr(loc, "%2F")))
+        {
+          loc[0] = '/';
+          //pull the string back after replacement
+          // loc-escaped_string finds the distance from the origin to the new location
+          // - 2 accounts for the 2F which remain and don't need to be measured.
+          // The two above subtracted from escaped_strlen yields the remaining characters
+          // in the string which we want to pull back
+          memmove(loc+1, loc+3,escaped_strlen - (loc-escaped_string) - 2);
+          //Because the 2F was overwritten in the memmove (as desired) escaped_strlen is
+          // now two shorter.
+          escaped_strlen -= 2;
+        }
+    }
+  /* Initialize each handle.  */
+  for (int i = 0; i < num_urls; i++)
+    {
+      if ((server_url = server_url_list[i]) == NULL)
+        break;
       if (vfd >= 0)
 	dprintf (vfd, "init server %d %s\n", i, server_url);
 
       data[i].fd = fd;
       data[i].target_handle = &target_handle;
       data[i].handle = curl_easy_init();
-      data[i].client = c;
-
       if (data[i].handle == NULL)
         {
           rc = -ENETUNREACH;
           goto out1;
         }
-
-      /* Build handle url. Tolerate both  http://foo:999  and
-         http://foo:999/  forms */
-      char *slashbuildid;
-      if (strlen(server_url) > 1 && server_url[strlen(server_url)-1] == '/')
-        slashbuildid = "buildid";
-      else
-        slashbuildid = "/buildid";
+      data[i].client = c;
 
       if (filename) /* must start with / */
-        snprintf(data[i].url, PATH_MAX, "%s%s/%s/%s%s", server_url,
-                 slashbuildid, build_id_bytes, type, filename);
+        {
+          /* PR28034 escape characters in completed url to %hh format. */
+          snprintf(data[i].url, PATH_MAX, "%s/%s/%s/%s", server_url,
+                   build_id_bytes, type, escaped_string);
+        }
       else
-        snprintf(data[i].url, PATH_MAX, "%s%s/%s/%s", server_url,
-                 slashbuildid, build_id_bytes, type);
-
+        snprintf(data[i].url, PATH_MAX, "%s/%s/%s", server_url, build_id_bytes, type);
       if (vfd >= 0)
 	dprintf (vfd, "url %d %s\n", i, data[i].url);
 
+      /* Only allow http:// + https:// + file:// so we aren't being
+	 redirected to some unsupported protocol.  */
+      curl_easy_setopt(data[i].handle, CURLOPT_PROTOCOLS,
+		       CURLPROTO_HTTP | CURLPROTO_HTTPS | CURLPROTO_FILE);
       curl_easy_setopt(data[i].handle, CURLOPT_URL, data[i].url);
       if (vfd >= 0)
 	curl_easy_setopt(data[i].handle, CURLOPT_ERRORBUFFER, data[i].errbuf);
@@ -813,10 +998,14 @@
 	  curl_easy_setopt (data[i].handle, CURLOPT_LOW_SPEED_LIMIT,
 			    100 * 1024L);
 	}
+      data[i].response_data = NULL;
+      data[i].response_data_size = 0;
       curl_easy_setopt(data[i].handle, CURLOPT_FILETIME, (long) 1);
       curl_easy_setopt(data[i].handle, CURLOPT_FOLLOWLOCATION, (long) 1);
       curl_easy_setopt(data[i].handle, CURLOPT_FAILONERROR, (long) 1);
       curl_easy_setopt(data[i].handle, CURLOPT_NOSIGNAL, (long) 1);
+      curl_easy_setopt(data[i].handle, CURLOPT_HEADERFUNCTION, header_callback);
+      curl_easy_setopt(data[i].handle, CURLOPT_HEADERDATA, (void *) &(data[i]));
 #if LIBCURL_VERSION_NUM >= 0x072a00 /* 7.42.0 */
       curl_easy_setopt(data[i].handle, CURLOPT_PATH_AS_IS, (long) 1);
 #else
@@ -828,9 +1017,9 @@
       curl_easy_setopt(data[i].handle, CURLOPT_HTTPHEADER, c->headers);
 
       curl_multi_add_handle(curlm, data[i].handle);
-      server_url = strtok_r(NULL, url_delim, &strtok_saveptr);
     }
 
+  if (filename) curl_free(escaped_string);
   /* Query servers in parallel.  */
   if (vfd >= 0)
     dprintf (vfd, "query %d urls in parallel\n", num_urls);
@@ -838,10 +1027,35 @@
   long loops = 0;
   int committed_to = -1;
   bool verbose_reported = false;
+  struct timespec start_time, cur_time;
+  c->winning_headers = NULL;
+  if ( maxtime > 0 && clock_gettime(CLOCK_MONOTONIC_RAW, &start_time) == -1)
+    {
+      rc = errno;
+      goto out2;
+    }
+  long delta = 0;
   do
     {
+      /* Check to see how long querying is taking. */
+      if (maxtime > 0)
+        {
+          if (clock_gettime(CLOCK_MONOTONIC_RAW, &cur_time) == -1)
+            {
+              rc = errno;
+              goto out2;
+            }
+          delta = cur_time.tv_sec - start_time.tv_sec;
+          if ( delta >  maxtime)
+            {
+              dprintf(vfd, "Timeout with max time=%lds and transfer time=%lds\n", maxtime, delta );
+              rc = -ETIME;
+              goto out2;
+            }
+        }
       /* Wait 1 second, the minimum DEBUGINFOD_TIMEOUT.  */
       curl_multi_wait(curlm, NULL, 0, 1000, NULL);
+      CURLMcode curlm_res = curl_multi_perform(curlm, &still_running);
 
       /* If the target file has been found, abort the other queries.  */
       if (target_handle != NULL)
@@ -850,7 +1064,17 @@
 	    if (data[i].handle != target_handle)
 	      curl_multi_remove_handle(curlm, data[i].handle);
 	    else
-	      committed_to = i;
+              {
+	        committed_to = i;
+                if (c->winning_headers == NULL)
+                  {
+                    c->winning_headers = data[committed_to].response_data;
+                    if (vfd >= 0 && c->winning_headers != NULL)
+                      dprintf(vfd, "\n%s", c->winning_headers);
+                    data[committed_to].response_data = NULL;
+                  }
+
+              }
 	}
 
       if (vfd >= 0 && !verbose_reported && committed_to >= 0)
@@ -863,7 +1087,6 @@
 	  verbose_reported = true;
 	}
 
-      CURLMcode curlm_res = curl_multi_perform(curlm, &still_running);
       if (curlm_res != CURLM_OK)
         {
           switch (curlm_res)
@@ -872,7 +1095,7 @@
             case CURLM_OUT_OF_MEMORY: rc = -ENOMEM; break;
             default: rc = -ENETUNREACH; break;
             }
-          goto out1;
+          goto out2;
         }
 
       if (c->progressfn) /* inform/check progress callback */
@@ -896,12 +1119,12 @@
                                            CURLINFO_SIZE_DOWNLOAD,
                                            &dl);
               if (curl_res == 0)
-                pa = (dl > LONG_MAX ? LONG_MAX : (long)dl);
+                pa = (dl >= (double)(LONG_MAX+1UL) ? LONG_MAX : (long)dl);
 #endif
 
               /* NB: If going through deflate-compressing proxies, this
                  number is likely to be unavailable, so -1 may show. */
-#ifdef CURLINFO_CURLINFO_CONTENT_LENGTH_DOWNLOAD_T
+#ifdef CURLINFO_CONTENT_LENGTH_DOWNLOAD_T
               curl_off_t cl;
               curl_res = curl_easy_getinfo(target_handle,
                                            CURLINFO_CONTENT_LENGTH_DOWNLOAD_T,
@@ -914,13 +1137,36 @@
                                            CURLINFO_CONTENT_LENGTH_DOWNLOAD,
                                            &cl);
               if (curl_res == 0)
-                pb = (cl > LONG_MAX ? LONG_MAX : (long)cl);
+                pb = (cl >= (double)(LONG_MAX+1UL) ? LONG_MAX : (long)cl);
 #endif
             }
 
           if ((*c->progressfn) (c, pa, pb))
             break;
         }
+      /* Check to see if we are downloading something which exceeds maxsize, if set.*/
+      if (maxsize > 0 && target_handle)
+        {
+          long dl_size = 0;
+#ifdef CURLINFO_SIZE_DOWNLOAD_T
+          curl_off_t download_size_t;
+          if (curl_easy_getinfo(target_handle, CURLINFO_CONTENT_LENGTH_DOWNLOAD_T,
+                                                    &download_size_t) == CURLE_OK)
+            dl_size = download_size_t >= (double)(LONG_MAX+1UL) ? LONG_MAX : (long)download_size_t;
+#else
+          double download_size;
+          if (curl_easy_getinfo(target_handle, CURLINFO_CONTENT_LENGTH_DOWNLOAD,
+                                                    &download_size) == CURLE_OK)
+            dl_size = download_size >= (double)(LONG_MAX+1UL) ? LONG_MAX : (long)download_size;
+#endif
+            if (dl_size > maxsize)
+              {
+                if (vfd >=0)
+                  dprintf(vfd, "Content-Length too large.\n");
+                rc = -EFBIG;
+                goto out2;
+              }
+        }
     } while (still_running);
 
   /* Check whether a query was successful. If so, assign its handle
@@ -954,6 +1200,8 @@
 
           if (msg->data.result != CURLE_OK)
             {
+              long resp_code;
+              CURLcode ok0;
               /* Unsuccessful query, determine error code.  */
               switch (msg->data.result)
                 {
@@ -968,6 +1216,16 @@
                 case CURLE_SEND_ERROR: rc = -ECONNRESET; break;
                 case CURLE_RECV_ERROR: rc = -ECONNRESET; break;
                 case CURLE_OPERATION_TIMEDOUT: rc = -ETIME; break;
+                case CURLE_HTTP_RETURNED_ERROR:
+                  ok0 = curl_easy_getinfo (msg->easy_handle,
+                                          CURLINFO_RESPONSE_CODE,
+				          &resp_code);
+                  /* 406 signals that the requested file was too large */
+                  if ( ok0 == CURLE_OK && resp_code == 406)
+                    rc = -EFBIG;
+                  else
+                    rc = -ENOENT;
+                  break;
                 default: rc = -ENOENT; break;
                 }
             }
@@ -1018,7 +1276,7 @@
                                                     &scheme);
                   if(ok3 == CURLE_OK && scheme)
                     {
-                      if (strncmp (scheme, "HTTP", 4) == 0)
+                      if (startswith (scheme, "HTTP"))
                         if (resp_code == 200)
                           {
                             verified_handle = msg->easy_handle;
@@ -1032,8 +1290,41 @@
         }
     } while (num_msg > 0);
 
+  /* Create a 000-permission file named as $HOME/.cache if the query
+     fails with ENOENT.*/
+  if (rc == -ENOENT)
+    {
+      int efd = open (target_cache_path, O_CREAT|O_EXCL, 0000);
+      if (efd >= 0)
+        close(efd);
+    }
+  else if (rc == -EFBIG)
+    goto out2;
+
+  /* If the verified_handle is NULL and rc != -ENOENT, the query fails with
+   * an error code other than 404, then do several retry within the retry_limit.
+   * Clean up all old handles and jump back to the beginning of query_in_parallel,
+   * reinitialize handles and query again.*/
   if (verified_handle == NULL)
-    goto out1;
+    {
+      if (rc != -ENOENT && retry_limit-- > 0)
+        {
+	  if (vfd >= 0)
+            dprintf (vfd, "Retry failed query, %d attempt(s) remaining\n", retry_limit);
+	  /* remove all handles from multi */
+          for (int i = 0; i < num_urls; i++)
+            {
+              curl_multi_remove_handle(curlm, data[i].handle); /* ok to repeat */
+              curl_easy_cleanup (data[i].handle);
+              free(data[i].response_data);
+            }
+            free(c->winning_headers);
+            c->winning_headers = NULL;
+	    goto query_in_parallel;
+	}
+      else
+	goto out2;
+    }
 
   if (vfd >= 0)
     {
@@ -1054,20 +1345,29 @@
   tvs[0].tv_usec = tvs[1].tv_usec = 0;
   (void) futimes (fd, tvs);  /* best effort */
 
+  /* PR27571: make cache files casually unwriteable; dirs are already 0700 */
+  (void) fchmod(fd, 0400);
+                
   /* rename tmp->real */
   rc = rename (target_cache_tmppath, target_cache_path);
   if (rc < 0)
     {
       rc = -errno;
-      goto out1;
+      goto out2;
       /* Perhaps we need not give up right away; could retry or something ... */
     }
 
-  /* Success!!!! */
+  /* remove all handles from multi */
   for (int i = 0; i < num_urls; i++)
-    curl_easy_cleanup(data[i].handle);
+    {
+      curl_multi_remove_handle(curlm, data[i].handle); /* ok to repeat */
+      curl_easy_cleanup (data[i].handle);
+      free (data[i].response_data);
+    }
 
-  curl_multi_cleanup (curlm);
+  for (int i = 0; i < num_urls; ++i)
+    free(server_url_list[i]);
+  free(server_url_list);
   free (data);
   free (server_urls);
 
@@ -1080,21 +1380,35 @@
   goto out;
 
 /* error exits */
- out1:
+ out2:
+  /* remove all handles from multi */
   for (int i = 0; i < num_urls; i++)
-    curl_easy_cleanup(data[i].handle);
+    {
+      curl_multi_remove_handle(curlm, data[i].handle); /* ok to repeat */
+      curl_easy_cleanup (data[i].handle);
+      free (data[i].response_data);
+    }
 
-  curl_multi_cleanup(curlm);
   unlink (target_cache_tmppath);
   close (fd); /* before the rmdir, otherwise it'll fail */
   (void) rmdir (target_cache_dir); /* nop if not empty */
   free(data);
 
+ out1:
+  for (int i = 0; i < num_urls; ++i)
+    free(server_url_list[i]);
+  free(server_url_list);
+
  out0:
   free (server_urls);
 
 /* general purpose exit */
  out:
+  /* Reset sent headers */
+  curl_slist_free_all (c->headers);
+  c->headers = NULL;
+  c->user_agent_set_p = 0;
+  
   /* Conclude the last \r status line */
   /* Another possibility is to use the ANSI CSI n K EL "Erase in Line"
      code.  That way, the previously printed messages would be erased,
@@ -1113,6 +1427,7 @@
   free (cache_path);
   free (maxage_path);
   free (interval_path);
+  free (cache_miss_path);
   free (target_cache_dir);
   free (target_cache_path);
   free (target_cache_tmppath);
@@ -1127,7 +1442,8 @@
 {
   debuginfod_client *client;
   size_t size = sizeof (struct debuginfod_client);
-  client = (debuginfod_client *) calloc (1, size);
+  client = calloc (1, size);
+
   if (client != NULL)
     {
       if (getenv(DEBUGINFOD_PROGRESS_ENV_VAR))
@@ -1136,7 +1452,22 @@
 	client->verbose_fd = STDERR_FILENO;
       else
 	client->verbose_fd = -1;
+
+      // allocate 1 curl multi handle
+      client->server_mhandle = curl_multi_init ();
+      if (client->server_mhandle == NULL)
+	goto out1;
     }
+
+  // extra future initialization
+  
+  goto out;
+
+ out1:
+  free (client);
+  client = NULL;
+
+ out:  
   return client;
 }
 
@@ -1165,7 +1496,9 @@
   if (client == NULL)
     return;
 
+  curl_multi_cleanup (client->server_mhandle);
   curl_slist_free_all (client->headers);
+  free (client->winning_headers);
   free (client->url);
   free (client);
 }
@@ -1219,7 +1552,7 @@
 
   /* Track if User-Agent: is being set.  If so, signal not to add the
      default one. */
-  if (strncmp (header, "User-Agent:", 11) == 0)
+  if (startswith (header, "User-Agent:"))
     client->user_agent_set_p = 1;
 
   client->headers = temp;
diff --git a/debuginfod/debuginfod.cxx b/debuginfod/debuginfod.cxx
index b34eacc..521cb52 100644
--- a/debuginfod/debuginfod.cxx
+++ b/debuginfod/debuginfod.cxx
@@ -37,6 +37,7 @@
 
 #include "debuginfod.h"
 #include <dwarf.h>
+#include <system.h>
 
 #include <argp.h>
 #ifdef __GNUC__
@@ -45,7 +46,6 @@
 
 #include <unistd.h>
 #include <stdlib.h>
-#include <error.h>
 #include <libintl.h>
 #include <locale.h>
 #include <pthread.h>
@@ -359,6 +359,7 @@
    { "database", 'd', "FILE", 0, "Path to sqlite database.", 0 },
    { "ddl", 'D', "SQL", 0, "Apply extra sqlite ddl/pragma to connection.", 0 },
    { "verbose", 'v', NULL, 0, "Increase verbosity.", 0 },
+   { "regex-groom", 'r', NULL, 0,"Uses regexes from -I and -X arguments to groom the database.",0},
 #define ARGP_KEY_FDCACHE_FDS 0x1001
    { "fdcache-fds", ARGP_KEY_FDCACHE_FDS, "NUM", 0, "Maximum number of archive files to keep in fdcache.", 0 },
 #define ARGP_KEY_FDCACHE_MBS 0x1002
@@ -367,7 +368,17 @@
    { "fdcache-prefetch", ARGP_KEY_FDCACHE_PREFETCH, "NUM", 0, "Number of archive files to prefetch into fdcache.", 0 },
 #define ARGP_KEY_FDCACHE_MINTMP 0x1004
    { "fdcache-mintmp", ARGP_KEY_FDCACHE_MINTMP, "NUM", 0, "Minimum free space% on tmpdir.", 0 },
-   { NULL, 0, NULL, 0, NULL, 0 }
+#define ARGP_KEY_FDCACHE_PREFETCH_MBS 0x1005
+   { "fdcache-prefetch-mbs", ARGP_KEY_FDCACHE_PREFETCH_MBS, "MB", 0,"Megabytes allocated to the \
+      prefetch cache.", 0},
+#define ARGP_KEY_FDCACHE_PREFETCH_FDS 0x1006
+   { "fdcache-prefetch-fds", ARGP_KEY_FDCACHE_PREFETCH_FDS, "NUM", 0,"Number of files allocated to the \
+      prefetch cache.", 0},
+#define ARGP_KEY_FORWARDED_TTL_LIMIT 0x1007
+   {"forwarded-ttl-limit", ARGP_KEY_FORWARDED_TTL_LIMIT, "NUM", 0, "Limit of X-Forwarded-For hops, default 8.", 0},
+#define ARGP_KEY_PASSIVE 0x1008
+   { "passive", ARGP_KEY_PASSIVE, NULL, 0, "Do not scan or groom, read-only database.", 0 },
+   { NULL, 0, NULL, 0, NULL, 0 },
   };
 
 /* Short description of program.  */
@@ -406,12 +417,17 @@
 static vector<string> extra_ddl;
 static regex_t file_include_regex;
 static regex_t file_exclude_regex;
+static bool regex_groom = false;
 static bool traverse_logical;
 static long fdcache_fds;
 static long fdcache_mbs;
 static long fdcache_prefetch;
 static long fdcache_mintmp;
+static long fdcache_prefetch_mbs;
+static long fdcache_prefetch_fds;
+static unsigned forwarded_ttl_limit = 8;
 static string tmpdir;
+static bool passive_p = false;
 
 static void set_metric(const string& key, double value);
 // static void inc_metric(const string& key);
@@ -423,7 +439,14 @@
 static void add_metric(const string& metric,
                        const string& lname, const string& lvalue,
                        double value);
-// static void add_metric(const string& metric, double value);
+static void inc_metric(const string& metric,
+                       const string& lname, const string& lvalue,
+                       const string& rname, const string& rvalue);
+static void add_metric(const string& metric,
+                       const string& lname, const string& lvalue,
+                       const string& rname, const string& rvalue,                       
+                       double value);
+
 
 class tmp_inc_metric { // a RAII style wrapper for exception-safe scoped increment & decrement
   string m, n, v;
@@ -470,7 +493,14 @@
   switch (key)
     {
     case 'v': verbose ++; break;
-    case 'd': db_path = string(arg); break;
+    case 'd':
+      /* When using the in-memory database make sure it is shareable,
+	 so we can open it twice as read/write and read-only.  */
+      if (strcmp (arg, ":memory:") == 0)
+	db_path = "file::memory:?cache=shared";
+      else
+	db_path = string(arg);
+      break;
     case 'p': http_port = (unsigned) atoi(arg);
       if (http_port == 0 || http_port > 65535)
         argp_failure(state, 1, EINVAL, "port number");
@@ -480,16 +510,9 @@
       scan_archives[".rpm"]="cat"; // libarchive groks rpm natively
       break;
     case 'U':
-      if (access("/usr/bin/dpkg-deb", X_OK) == 0)
-        {
-          scan_archives[".deb"]="dpkg-deb --fsys-tarfile";
-          scan_archives[".ddeb"]="dpkg-deb --fsys-tarfile";
-        }
-      else
-        {
-          scan_archives[".deb"]="(bsdtar -O -x -f - data.tar.xz)<";
-          scan_archives[".ddeb"]="(bsdtar -O -x -f - data.tar.xz)<";
-        }
+      scan_archives[".deb"]="(bsdtar -O -x -f - data.tar\\*)<";
+      scan_archives[".ddeb"]="(bsdtar -O -x -f - data.tar\\*)<";
+      scan_archives[".ipk"]="(bsdtar -O -x -f - data.tar\\*)<";
       // .udeb too?
       break;
     case 'Z':
@@ -504,35 +527,58 @@
       }
       break;
     case 'L':
+      if (passive_p)
+        argp_failure(state, 1, EINVAL, "-L option inconsistent with passive mode");
       traverse_logical = true;
       break;
-    case 'D': extra_ddl.push_back(string(arg)); break;
+    case 'D':
+      if (passive_p)
+        argp_failure(state, 1, EINVAL, "-D option inconsistent with passive mode");
+      extra_ddl.push_back(string(arg));
+      break;
     case 't':
+      if (passive_p)
+        argp_failure(state, 1, EINVAL, "-t option inconsistent with passive mode");
       rescan_s = (unsigned) atoi(arg);
       break;
     case 'g':
+      if (passive_p)
+        argp_failure(state, 1, EINVAL, "-g option inconsistent with passive mode");
       groom_s = (unsigned) atoi(arg);
       break;
     case 'G':
+      if (passive_p)
+        argp_failure(state, 1, EINVAL, "-G option inconsistent with passive mode");
       maxigroom = true;
       break;
     case 'c':
+      if (passive_p)
+        argp_failure(state, 1, EINVAL, "-c option inconsistent with passive mode");
       concurrency = (unsigned) atoi(arg);
       if (concurrency < 1) concurrency = 1;
       break;
     case 'I':
       // NB: no problem with unconditional free here - an earlier failed regcomp would exit program
+      if (passive_p)
+        argp_failure(state, 1, EINVAL, "-I option inconsistent with passive mode");
       regfree (&file_include_regex);
       rc = regcomp (&file_include_regex, arg, REG_EXTENDED|REG_NOSUB);
       if (rc != 0)
         argp_failure(state, 1, EINVAL, "regular expression");
       break;
     case 'X':
+      if (passive_p)
+        argp_failure(state, 1, EINVAL, "-X option inconsistent with passive mode");
       regfree (&file_exclude_regex);
       rc = regcomp (&file_exclude_regex, arg, REG_EXTENDED|REG_NOSUB);
       if (rc != 0)
         argp_failure(state, 1, EINVAL, "regular expression");
       break;
+    case 'r':
+      if (passive_p)
+        argp_failure(state, 1, EINVAL, "-r option inconsistent with passive mode");
+      regex_groom = true;
+      break;
     case ARGP_KEY_FDCACHE_FDS:
       fdcache_fds = atol (arg);
       break;
@@ -544,10 +590,34 @@
       break;
     case ARGP_KEY_FDCACHE_MINTMP:
       fdcache_mintmp = atol (arg);
+      if( fdcache_mintmp > 100 || fdcache_mintmp < 0 )
+        argp_failure(state, 1, EINVAL, "fdcache mintmp percent");
+      break;
+    case ARGP_KEY_FORWARDED_TTL_LIMIT:
+      forwarded_ttl_limit = (unsigned) atoi(arg);
       break;
     case ARGP_KEY_ARG:
       source_paths.insert(string(arg));
       break;
+    case ARGP_KEY_FDCACHE_PREFETCH_FDS:
+      fdcache_prefetch_fds = atol(arg);
+      if ( fdcache_prefetch_fds < 0)
+        argp_failure(state, 1, EINVAL, "fdcache prefetch fds");
+      break;
+    case ARGP_KEY_FDCACHE_PREFETCH_MBS:
+      fdcache_prefetch_mbs = atol(arg);
+      if ( fdcache_prefetch_mbs < 0)
+        argp_failure(state, 1, EINVAL, "fdcache prefetch mbs");
+      break;
+    case ARGP_KEY_PASSIVE:
+      passive_p = true;
+      if (source_paths.size() > 0
+          || maxigroom
+          || extra_ddl.size() > 0
+          || traverse_logical)
+        // other conflicting options tricky to check
+        argp_failure(state, 1, EINVAL, "inconsistent options with passive mode");
+      break;
       // case 'h': argp_state_help (state, stderr, ARGP_HELP_LONG|ARGP_HELP_EXIT_OK);
     default: return ARGP_ERR_UNKNOWN;
     }
@@ -632,10 +702,11 @@
   mutex mtx;
   condition_variable cv;
   bool dead;
-  unsigned idlers;
+  unsigned idlers;   // number of threads busy with wait_idle / done_idle
+  unsigned fronters; // number of threads busy with wait_front / done_front
 
 public:
-  workq() { dead = false; idlers = 0; }
+  workq() { dead = false; idlers = 0; fronters = 0; }
   ~workq() {}
 
   void push_back(const Payload& p)
@@ -659,10 +730,11 @@
     unique_lock<mutex> lock(mtx);
     q.clear();
     set_metric("thread_work_pending","role","scan", q.size());
+    // NB: there may still be some live fronters
     cv.notify_all(); // maybe wake up waiting idlers
   }
 
-  // block this scanner thread until there is work to do and no active
+  // block this scanner thread until there is work to do and no active idler
   bool wait_front (Payload& p)
   {
     unique_lock<mutex> lock(mtx);
@@ -674,19 +746,29 @@
       {
         p = * q.begin();
         q.erase (q.begin());
+        fronters ++; // prevent idlers from starting awhile, even if empty q
         set_metric("thread_work_pending","role","scan", q.size());
-        if (q.size() == 0)
-          cv.notify_all(); // maybe wake up waiting idlers
+        // NB: don't wake up idlers yet!  The consumer is busy
+        // processing this element until it calls done_front().
         return true;
       }
   }
 
+  // notify waitq that scanner thread is done with that last item
+  void done_front ()
+  {
+    unique_lock<mutex> lock(mtx);
+    fronters --;
+    if (q.size() == 0 && fronters == 0)
+      cv.notify_all(); // maybe wake up waiting idlers
+  }
+  
   // block this idler thread until there is no work to do
   void wait_idle ()
   {
     unique_lock<mutex> lock(mtx);
     cv.notify_all(); // maybe wake up waiting scanners
-    while (!dead && (q.size() != 0))
+    while (!dead && ((q.size() != 0) || fronters > 0))
       cv.wait(lock);
     idlers ++;
   }
@@ -711,6 +793,54 @@
 // idler: thread_main_groom()
 
 
+////////////////////////////////////////////////////////////////////////
+
+// Unique set is a thread-safe structure that lends 'ownership' of a value
+// to a thread.  Other threads requesting the same thing are made to wait.
+// It's like a semaphore-on-demand.
+template <typename T>
+class unique_set
+{
+private:
+  set<T> values;
+  mutex mtx;
+  condition_variable cv;
+public:
+  unique_set() {}
+  ~unique_set() {}
+
+  void acquire(const T& value)
+  {
+    unique_lock<mutex> lock(mtx);
+    while (values.find(value) != values.end())
+      cv.wait(lock);
+    values.insert(value);
+  }
+
+  void release(const T& value)
+  {
+    unique_lock<mutex> lock(mtx);
+    // assert (values.find(value) != values.end());
+    values.erase(value);
+    cv.notify_all();
+  }
+};
+
+
+// This is the object that's instantiate to uniquely hold a value in a
+// RAII-pattern way.
+template <typename T>
+class unique_set_reserver
+{
+private:
+  unique_set<T>& please_hold;
+  T mine;
+public:
+  unique_set_reserver(unique_set<T>& t, const T& value):
+    please_hold(t), mine(value)  { please_hold.acquire(mine); }
+  ~unique_set_reserver() { please_hold.release(mine); }
+};
+
 
 ////////////////////////////////////////////////////////////////////////
 
@@ -996,6 +1126,9 @@
   else
     {
       MHD_add_response_header (r, "Content-Type", "application/octet-stream");
+      std::string file = b_source0.substr(b_source0.find_last_of("/")+1, b_source0.length());
+      MHD_add_response_header (r, "X-DEBUGINFOD-SIZE", to_string(s.st_size).c_str() );
+      MHD_add_response_header (r, "X-DEBUGINFOD-FILE", file.c_str() );
       add_mhd_last_modified (r, s.st_mtime);
       if (verbose > 1)
         obatched(clog) << "serving file " << b_source0 << endl;
@@ -1157,23 +1290,32 @@
   };
   deque<fdcache_entry> lru; // @head: most recently used
   long max_fds;
+  deque<fdcache_entry> prefetch; // prefetched
   long max_mbs;
+  long max_prefetch_mbs;
+  long max_prefetch_fds;
 
 public:
   void set_metrics()
   {
-    double total_mb = 0.0;
+    double fdcache_mb = 0.0;
+    double prefetch_mb = 0.0;
     for (auto i = lru.begin(); i < lru.end(); i++)
-      total_mb += i->fd_size_mb;
-    set_metric("fdcache_bytes", (int64_t)(total_mb*1024.0*1024.0));
+      fdcache_mb += i->fd_size_mb;
+    for (auto j = prefetch.begin(); j < prefetch.end(); j++)
+      prefetch_mb += j->fd_size_mb;
+    set_metric("fdcache_bytes", fdcache_mb*1024.0*1024.0);
     set_metric("fdcache_count", lru.size());
+    set_metric("fdcache_prefetch_bytes", prefetch_mb*1024.0*1024.0);
+    set_metric("fdcache_prefetch_count", prefetch.size());
   }
 
   void intern(const string& a, const string& b, string fd, off_t sz, bool front_p)
   {
     {
       unique_lock<mutex> lock(fdcache_lock);
-      for (auto i = lru.begin(); i < lru.end(); i++) // nuke preexisting copy
+      // nuke preexisting copy
+      for (auto i = lru.begin(); i < lru.end(); i++)
         {
           if (i->archive == a && i->entry == b)
             {
@@ -1183,17 +1325,28 @@
               break; // must not continue iterating
             }
         }
+      // nuke preexisting copy in prefetch
+      for (auto i = prefetch.begin(); i < prefetch.end(); i++)
+        {
+          if (i->archive == a && i->entry == b)
+            {
+              unlink (i->fd.c_str());
+              prefetch.erase(i);
+              inc_metric("fdcache_op_count","op","prefetch_dequeue");
+              break; // must not continue iterating
+            }
+        }
       double mb = (sz+65535)/1048576.0; // round up to 64K block
       fdcache_entry n = { a, b, fd, mb };
       if (front_p)
         {
-          inc_metric("fdcache_op_count","op","enqueue_front");
+          inc_metric("fdcache_op_count","op","enqueue");
           lru.push_front(n);
         }
       else
         {
-          inc_metric("fdcache_op_count","op","enqueue_back");
-          lru.push_back(n);
+          inc_metric("fdcache_op_count","op","prefetch_enqueue");
+          prefetch.push_front(n);
         }
       if (verbose > 3)
         obatched(clog) << "fdcache interned a=" << a << " b=" << b
@@ -1206,10 +1359,10 @@
       {
         inc_metric("fdcache_op_count","op","emerg-flush");
         obatched(clog) << "fdcache emergency flush for filling tmpdir" << endl;
-        this->limit(0, 0); // emergency flush
+        this->limit(0, 0, 0, 0); // emergency flush
       }
     else if (front_p)
-      this->limit(max_fds, max_mbs); // age cache if required
+      this->limit(max_fds, max_mbs, max_prefetch_fds, max_prefetch_mbs); // age cache if required
   }
 
   int lookup(const string& a, const string& b)
@@ -1225,7 +1378,21 @@
               lru.erase(i); // invalidates i, so no more iteration!
               lru.push_front(n);
               inc_metric("fdcache_op_count","op","requeue_front");
-              fd = open(n.fd.c_str(), O_RDONLY); // NB: no problem if dup() fails; looks like cache miss
+              fd = open(n.fd.c_str(), O_RDONLY); 
+              break;
+            }
+        }
+      // Iterate through prefetch while fd == -1 to ensure that no duplication between lru and 
+      // prefetch occurs.
+      for ( auto i = prefetch.begin(); fd == -1 && i < prefetch.end(); ++i)
+        {
+          if (i->archive == a && i->entry == b)
+            { // found it; take the entry from the prefetch deque to the lru deque, since it has now been accessed.
+              fdcache_entry n = *i;
+              prefetch.erase(i);
+              lru.push_front(n);
+              inc_metric("fdcache_op_count","op","prefetch_access");
+              fd = open(n.fd.c_str(), O_RDONLY); 
               break;
             }
         }
@@ -1234,11 +1401,11 @@
     if (statfs_free_enough_p(tmpdir, "tmpdir", fdcache_mintmp))
       {
         inc_metric("fdcache_op_count","op","emerg-flush");
-        obatched(clog) << "fdcache emergency flush for filling tmpdir";
-        this->limit(0, 0); // emergency flush
+        obatched(clog) << "fdcache emergency flush for filling tmpdir" << endl;
+        this->limit(0, 0, 0, 0); // emergency flush
       }
     else if (fd >= 0)
-      this->limit(max_fds, max_mbs); // age cache if required
+      this->limit(max_fds, max_mbs, max_prefetch_fds, max_prefetch_mbs); // age cache if required
 
     return fd;
   }
@@ -1254,6 +1421,14 @@
             return true;
           }
       }
+    for (auto i = prefetch.begin(); i < prefetch.end(); i++)
+      {
+        if (i->archive == a && i->entry == b)
+          {
+            inc_metric("fdcache_op_count","op","prefetch_probe_hit");
+            return true;
+          }
+      }
     inc_metric("fdcache_op_count","op","probe_miss");
     return false;
   }
@@ -1264,7 +1439,7 @@
     for (auto i = lru.begin(); i < lru.end(); i++)
       {
         if (i->archive == a && i->entry == b)
-          { // found it; move it to head of lru
+          { // found it; erase it from lru
             fdcache_entry n = *i;
             lru.erase(i); // invalidates i, so no more iteration!
             inc_metric("fdcache_op_count","op","clear");
@@ -1273,10 +1448,21 @@
             return;
           }
       }
+    for (auto i = prefetch.begin(); i < prefetch.end(); i++)
+      {
+        if (i->archive == a && i->entry == b)
+          { // found it; erase it from lru
+            fdcache_entry n = *i;
+            prefetch.erase(i); // invalidates i, so no more iteration!
+            inc_metric("fdcache_op_count","op","prefetch_clear");
+            unlink (n.fd.c_str());
+            set_metrics();
+            return;
+          }
+      }
   }
 
-
-  void limit(long maxfds, long maxmbs, bool metrics_p = true)
+  void limit(long maxfds, long maxmbs, long maxprefetchfds, long maxprefetchmbs , bool metrics_p = true)
   {
     if (verbose > 3 && (this->max_fds != maxfds || this->max_mbs != maxmbs))
       obatched(clog) << "fdcache limited to maxfds=" << maxfds << " maxmbs=" << maxmbs << endl;
@@ -1284,7 +1470,8 @@
     unique_lock<mutex> lock(fdcache_lock);
     this->max_fds = maxfds;
     this->max_mbs = maxmbs;
-
+    this->max_prefetch_fds = maxprefetchfds;
+    this->max_prefetch_mbs = maxprefetchmbs;
     long total_fd = 0;
     double total_mb = 0.0;
     for (auto i = lru.begin(); i < lru.end(); i++)
@@ -1292,7 +1479,7 @@
         // accumulate totals from most recently used one going backward
         total_fd ++;
         total_mb += i->fd_size_mb;
-        if (total_fd > max_fds || total_mb > max_mbs)
+        if (total_fd > this->max_fds || total_mb > this->max_mbs)
           {
             // found the cut here point!
 
@@ -1310,6 +1497,29 @@
             break;
           }
       }
+    total_fd = 0;
+    total_mb = 0.0;
+    for(auto i = prefetch.begin(); i < prefetch.end(); i++){
+      // accumulate totals from most recently used one going backward
+        total_fd ++;
+        total_mb += i->fd_size_mb;
+        if (total_fd > this->max_prefetch_fds || total_mb > this->max_prefetch_mbs)
+          {
+            // found the cut here point!
+            for (auto j = i; j < prefetch.end(); j++) // close all the fds from here on in
+              {
+                if (verbose > 3)
+                  obatched(clog) << "fdcache evicted from prefetch a=" << j->archive << " b=" << j->entry
+                                 << " fd=" << j->fd << " mb=" << j->fd_size_mb << endl;
+                if (metrics_p)
+                  inc_metric("fdcache_op_count","op","prefetch_evict");
+                unlink (j->fd.c_str());
+              }
+
+            prefetch.erase(i, prefetch.end()); // erase the nodes generally
+            break;
+          }
+    }
     if (metrics_p) set_metrics();
   }
 
@@ -1318,7 +1528,7 @@
   {
     // unlink any fdcache entries in $TMPDIR
     // don't update metrics; those globals may be already destroyed
-    limit(0, 0, false);
+    limit(0, 0, 0, 0, false);
   }
 };
 static libarchive_fdcache fdcache;
@@ -1388,6 +1598,9 @@
       inc_metric ("http_responses_total","result","archive fdcache");
 
       MHD_add_response_header (r, "Content-Type", "application/octet-stream");
+      MHD_add_response_header (r, "X-DEBUGINFOD-SIZE", to_string(fs.st_size).c_str());
+      MHD_add_response_header (r, "X-DEBUGINFOD-ARCHIVE", b_source0.c_str());
+      MHD_add_response_header (r, "X-DEBUGINFOD-FILE", b_source1.c_str());
       add_mhd_last_modified (r, fs.st_mtime);
       if (verbose > 1)
         obatched(clog) << "serving fdcache archive " << b_source0 << " file " << b_source1 << endl;
@@ -1505,7 +1718,7 @@
           // responsible for unlinking it later.
           fdcache.intern(b_source0, fn,
                          tmppath, archive_entry_size(e),
-                         false); // prefetched ones go to back of lru
+                         false); // prefetched ones go to the prefetch cache
           prefetch_count --;
           close (fd); // we're not saving this fd to make a mhd-response from!
           continue;
@@ -1529,6 +1742,11 @@
       else
         {
           MHD_add_response_header (r, "Content-Type", "application/octet-stream");
+          std::string file = b_source1.substr(b_source1.find_last_of("/")+1, b_source1.length());
+          MHD_add_response_header (r, "X-DEBUGINFOD-SIZE", to_string(fs.st_size).c_str());
+          MHD_add_response_header (r, "X-DEBUGINFOD-ARCHIVE", b_source0.c_str());
+          MHD_add_response_header (r, "X-DEBUGINFOD-FILE", file.c_str());
+
           add_mhd_last_modified (r, archive_entry_mtime(e));
           if (verbose > 1)
             obatched(clog) << "serving archive " << b_source0 << " file " << b_source1 << endl;
@@ -1580,10 +1798,50 @@
 }
 
 
+// a little lru pool of debuginfod_client*s for reuse between query threads
+
+mutex dc_pool_lock;
+deque<debuginfod_client*> dc_pool;
+
+debuginfod_client* debuginfod_pool_begin()
+{
+  unique_lock<mutex> lock(dc_pool_lock);
+  if (dc_pool.size() > 0)
+    {
+      inc_metric("dc_pool_op_count","op","begin-reuse");
+      debuginfod_client *c = dc_pool.front();
+      dc_pool.pop_front();
+      return c;
+    }
+  inc_metric("dc_pool_op_count","op","begin-new");
+  return debuginfod_begin();
+}
+
+
+void debuginfod_pool_groom()
+{
+  unique_lock<mutex> lock(dc_pool_lock);
+  while (dc_pool.size() > 0)
+    {
+      inc_metric("dc_pool_op_count","op","end");
+      debuginfod_end(dc_pool.front());
+      dc_pool.pop_front();
+    }
+}
+
+
+void debuginfod_pool_end(debuginfod_client* c)
+{
+  unique_lock<mutex> lock(dc_pool_lock);
+  inc_metric("dc_pool_op_count","op","end-save");
+  dc_pool.push_front(c); // accelerate reuse, vs. push_back
+}
+
+
 static struct MHD_Response*
 handle_buildid (MHD_Connection* conn,
                 const string& buildid /* unsafe */,
-                const string& artifacttype /* unsafe */,
+                string& artifacttype /* unsafe, cleanse on exception/return */,
                 const string& suffix /* unsafe */,
                 int *result_fd)
 {
@@ -1592,8 +1850,13 @@
   if (artifacttype == "debuginfo") atype_code = "D";
   else if (artifacttype == "executable") atype_code = "E";
   else if (artifacttype == "source") atype_code = "S";
-  else throw reportable_exception("invalid artifacttype");
+  else {
+    artifacttype = "invalid"; // PR28242 ensure http_resposes metrics don't propagate unclean user data 
+    throw reportable_exception("invalid artifacttype");
+  }
 
+  inc_metric("http_requests_total", "type", artifacttype);
+  
   if (atype_code == "S" && suffix == "")
      throw reportable_exception("invalid source suffix");
 
@@ -1677,7 +1940,7 @@
   // is to defer to other debuginfo servers.
 
   int fd = -1;
-  debuginfod_client *client = debuginfod_begin ();
+  debuginfod_client *client = debuginfod_pool_begin ();
   if (client != NULL)
     {
       debuginfod_set_progressfn (client, & debuginfod_find_progress);
@@ -1695,6 +1958,17 @@
           if (xff != "")
             xff += string(", "); // comma separated list
 
+          unsigned int xff_count = 0;
+          for (auto&& i : xff){
+            if (i == ',') xff_count++;
+          }
+
+          // if X-Forwarded-For: exceeds N hops,
+          // do not delegate a local lookup miss to upstream debuginfods.
+          if (xff_count >= forwarded_ttl_limit)
+            throw reportable_exception(MHD_HTTP_NOT_FOUND, "not found, --forwared-ttl-limit reached \
+and will not query the upstream servers");
+
           // Compute the client's numeric IP address only - so can't merge with conninfo()
           const union MHD_ConnectionInfo *u = MHD_get_connection_info (conn,
                                                                        MHD_CONNECTION_INFO_CLIENT_ADDRESS);
@@ -1726,7 +2000,7 @@
     }
   else
     fd = -errno; /* Set by debuginfod_begin.  */
-  debuginfod_end (client);
+  debuginfod_pool_end (client);
 
   if (fd >= 0)
     {
@@ -1848,6 +2122,29 @@
 
 // and more for higher arity labels if needed
 
+static void
+inc_metric(const string& metric,
+           const string& lname, const string& lvalue,
+           const string& rname, const string& rvalue)
+{
+  string key = (metric + "{"
+                + metric_label(lname, lvalue) + ","
+                + metric_label(rname, rvalue) + "}");
+  unique_lock<mutex> lock(metrics_lock);
+  metrics[key] ++;
+}
+static void
+add_metric(const string& metric,
+           const string& lname, const string& lvalue,
+           const string& rname, const string& rvalue,
+           double value)
+{
+  string key = (metric + "{"
+                + metric_label(lname, lvalue) + ","
+                + metric_label(rname, rvalue) + "}");
+  unique_lock<mutex> lock(metrics_lock);
+  metrics[key] += value;
+}
 
 static struct MHD_Response*
 handle_metrics (off_t* size)
@@ -1897,11 +2194,32 @@
             const char * /*version*/,
             const char * /*upload_data*/,
             size_t * /*upload_data_size*/,
-            void ** /*con_cls*/)
+            void ** ptr)
 {
   struct MHD_Response *r = NULL;
   string url_copy = url;
 
+  /* libmicrohttpd always makes (at least) two callbacks: once just
+     past the headers, and one after the request body is finished
+     being received.  If we process things early (first callback) and
+     queue a response, libmicrohttpd would suppress http keep-alive
+     (via connection->read_closed = true). */
+  static int aptr; /* just some random object to use as a flag */
+  if (&aptr != *ptr)
+    {
+      /* do never respond on first call */
+      *ptr = &aptr;
+      return MHD_YES;
+    }
+  *ptr = NULL;                     /* reset when done */
+  
+  const char *maxsize_string = MHD_lookup_connection_value(connection, MHD_HEADER_KIND, "X-DEBUGINFOD-MAXSIZE");
+  long maxsize = 0;
+  if (maxsize_string != NULL && maxsize_string[0] != '\0')
+    maxsize = atol(maxsize_string);
+  else
+    maxsize = 0;
+
 #if MHD_VERSION >= 0x00097002
   enum MHD_Result rc;
 #else
@@ -1911,6 +2229,8 @@
   off_t http_size = -1;
   struct timespec ts_start, ts_end;
   clock_gettime (CLOCK_MONOTONIC, &ts_start);
+  double afteryou = 0.0;
+  string artifacttype, suffix;
 
   try
     {
@@ -1923,7 +2243,25 @@
 
       if (slash1 != string::npos && url1 == "/buildid")
         {
+          // PR27863: block this thread awhile if another thread is already busy
+          // fetching the exact same thing.  This is better for Everyone.
+          // The latecomer says "... after you!" and waits.
+          add_metric ("thread_busy", "role", "http-buildid-after-you", 1);
+#ifdef HAVE_PTHREAD_SETNAME_NP
+          (void) pthread_setname_np (pthread_self(), "mhd-buildid-after-you");
+#endif
+          struct timespec tsay_start, tsay_end;
+          clock_gettime (CLOCK_MONOTONIC, &tsay_start);
+          static unique_set<string> busy_urls;
+          unique_set_reserver<string> after_you(busy_urls, url_copy);
+          clock_gettime (CLOCK_MONOTONIC, &tsay_end);
+          afteryou = (tsay_end.tv_sec - tsay_start.tv_sec) + (tsay_end.tv_nsec - tsay_start.tv_nsec)/1.e9;
+          add_metric ("thread_busy", "role", "http-buildid-after-you", -1);
+          
           tmp_inc_metric m ("thread_busy", "role", "http-buildid");
+#ifdef HAVE_PTHREAD_SETNAME_NP
+          (void) pthread_setname_np (pthread_self(), "mhd-buildid");
+#endif
           size_t slash2 = url_copy.find('/', slash1+1);
           if (slash2 == string::npos)
             throw reportable_exception("/buildid/ webapi error, need buildid");
@@ -1931,7 +2269,7 @@
           string buildid = url_copy.substr(slash1+1, slash2-slash1-1);
 
           size_t slash3 = url_copy.find('/', slash2+1);
-          string artifacttype, suffix;
+
           if (slash3 == string::npos)
             {
               artifacttype = url_copy.substr(slash2+1);
@@ -1943,7 +2281,6 @@
               suffix = url_copy.substr(slash3); // include the slash in the suffix
             }
 
-          inc_metric("http_requests_total", "type", artifacttype);
           // get the resulting fd so we can report its size
           int fd;
           r = handle_buildid(connection, buildid, artifacttype, suffix, &fd);
@@ -1958,12 +2295,14 @@
       else if (url1 == "/metrics")
         {
           tmp_inc_metric m ("thread_busy", "role", "http-metrics");
-          inc_metric("http_requests_total", "type", "metrics");
+          artifacttype = "metrics";
+          inc_metric("http_requests_total", "type", artifacttype);
           r = handle_metrics(& http_size);
         }
       else if (url1 == "/")
         {
-          inc_metric("http_requests_total", "type", "/");
+          artifacttype = "/";
+          inc_metric("http_requests_total", "type", artifacttype);
           r = handle_root(& http_size);
         }
       else
@@ -1972,6 +2311,12 @@
       if (r == 0)
         throw reportable_exception("internal error, missing response");
 
+      if (maxsize > 0 && http_size > maxsize)
+        {
+          MHD_destroy_response(r);
+          throw reportable_exception(406, "File too large, max size=" + std::to_string(maxsize));
+        }
+
       rc = MHD_queue_response (connection, MHD_HTTP_OK, r);
       http_code = MHD_HTTP_OK;
       MHD_destroy_response (r);
@@ -1987,22 +2332,30 @@
 
   clock_gettime (CLOCK_MONOTONIC, &ts_end);
   double deltas = (ts_end.tv_sec - ts_start.tv_sec) + (ts_end.tv_nsec - ts_start.tv_nsec)/1.e9;
+  // afteryou: delay waiting for other client's identical query to complete
+  // deltas: total latency, including afteryou waiting
   obatched(clog) << conninfo(connection)
                  << ' ' << method << ' ' << url
                  << ' ' << http_code << ' ' << http_size
-                 << ' ' << (int)(deltas*1000) << "ms"
+                 << ' ' << (int)(afteryou*1000) << '+' << (int)((deltas-afteryou)*1000) << "ms"
                  << endl;
 
   // related prometheus metrics
   string http_code_str = to_string(http_code);
-  if (http_size >= 0)
-    add_metric("http_responses_transfer_bytes_sum","code",http_code_str,
-               http_size);
-  inc_metric("http_responses_transfer_bytes_count","code",http_code_str);
+  add_metric("http_responses_transfer_bytes_sum",
+             "code", http_code_str, "type", artifacttype, http_size);
+  inc_metric("http_responses_transfer_bytes_count",
+             "code", http_code_str, "type", artifacttype);
 
-  add_metric("http_responses_duration_milliseconds_sum","code",http_code_str,
-             deltas*1000); // prometheus prefers _seconds and floating point
-  inc_metric("http_responses_duration_milliseconds_count","code",http_code_str);
+  add_metric("http_responses_duration_milliseconds_sum",
+             "code", http_code_str, "type", artifacttype, deltas*1000); // prometheus prefers _seconds and floating point
+  inc_metric("http_responses_duration_milliseconds_count",
+             "code", http_code_str, "type", artifacttype);
+
+  add_metric("http_responses_after_you_milliseconds_sum",
+             "code", http_code_str, "type", artifacttype, afteryou*1000);
+  inc_metric("http_responses_after_you_milliseconds_count",
+             "code", http_code_str, "type", artifacttype);
 
   return rc;
 }
@@ -2051,7 +2404,8 @@
           struct MHD_Response *r = 0;
           try
             {
-              r = handle_buildid (0, buildid, "debuginfo", "", &alt_fd);
+              string artifacttype = "debuginfo";
+              r = handle_buildid (0, buildid, artifacttype, "", &alt_fd);
             }
           catch (const reportable_exception& e)
             {
@@ -2261,6 +2615,8 @@
         throw elfutils_exception(rc, "getshdrstrndx");
 
       Elf_Scn *scn = NULL;
+      bool symtab_p = false;
+      bool bits_alloc_p = false;
       while (true)
         {
           scn = elf_nextscn (elf, scn);
@@ -2273,20 +2629,37 @@
           const char *section_name = elf_strptr (elf, shstrndx, shdr->sh_name);
           if (section_name == NULL)
             break;
-          if (strncmp(section_name, ".debug_line", 11) == 0 ||
-              strncmp(section_name, ".zdebug_line", 12) == 0)
+          if (startswith (section_name, ".debug_line") ||
+              startswith (section_name, ".zdebug_line"))
             {
               debuginfo_p = true;
               dwarf_extract_source_paths (elf, debug_sourcefiles);
               break; // expecting only one .*debug_line, so no need to look for others
             }
-          else if (strncmp(section_name, ".debug_", 7) == 0 ||
-                   strncmp(section_name, ".zdebug_", 8) == 0)
+          else if (startswith (section_name, ".debug_") ||
+                   startswith (section_name, ".zdebug_"))
             {
               debuginfo_p = true;
               // NB: don't break; need to parse .debug_line for sources
             }
+          else if (shdr->sh_type == SHT_SYMTAB)
+            {
+              symtab_p = true;
+            }
+          else if (shdr->sh_type != SHT_NOBITS
+                   && shdr->sh_type != SHT_NOTE
+                   && (shdr->sh_flags & SHF_ALLOC) != 0)
+            {
+              bits_alloc_p = true;
+            }
         }
+
+      // For more expansive elf/split-debuginfo classification, we
+      // want to identify as debuginfo "strip -s"-produced files
+      // without .debug_info* (like libicudata), but we don't want to
+      // identify "strip -g" executables (with .symtab left there).
+      if (symtab_p && !bits_alloc_p)
+        debuginfo_p = true;
     }
   catch (const reportable_exception& e)
     {
@@ -2866,6 +3239,8 @@
           e.report(cerr);
         }
 
+      scanq.done_front(); // let idlers run
+      
       if (fts_cached || fts_executable || fts_debuginfo || fts_sourcefiles || fts_sref || fts_sdef)
         {} // NB: not just if a successful scan - we might have encountered -ENOSPC & failed
       (void) statfs_free_enough_p(db_path, "database"); // report sqlite filesystem size
@@ -3087,19 +3462,31 @@
   struct timespec ts_start, ts_end;
   clock_gettime (CLOCK_MONOTONIC, &ts_start);
 
-  database_stats_report();
-
   // scan for files that have disappeared
-  sqlite_ps files (db, "check old files", "select s.mtime, s.file, f.name from "
-                       BUILDIDS "_file_mtime_scanned s, " BUILDIDS "_files f "
-                       "where f.id = s.file");
-  sqlite_ps files_del_f_de (db, "nuke f_de", "delete from " BUILDIDS "_f_de where file = ? and mtime = ?");
-  sqlite_ps files_del_r_de (db, "nuke r_de", "delete from " BUILDIDS "_r_de where file = ? and mtime = ?");
-  sqlite_ps files_del_scan (db, "nuke f_m_s", "delete from " BUILDIDS "_file_mtime_scanned "
-                            "where file = ? and mtime = ?");
+  sqlite_ps files (db, "check old files",
+                   "select distinct s.mtime, s.file, f.name from "
+                   BUILDIDS "_file_mtime_scanned s, " BUILDIDS "_files f "
+                   "where f.id = s.file");
+  // NB: Because _ftime_mtime_scanned can contain both F and
+  // R records for the same file, this query would return duplicates if the
+  // DISTINCT qualifier were not there.
   files.reset();
+
+  // DECISION TIME - we enumerate stale fileids/mtimes
+  deque<pair<int64_t,int64_t> > stale_fileid_mtime;
+  
+  time_t time_start = time(NULL);
   while(1)
     {
+      // PR28514: limit grooming iteration to O(rescan time), to avoid
+      // slow filesystem tests over many files locking out rescans for
+      // too long.
+      if (rescan_s > 0 && (long)time(NULL) > (long)(time_start + rescan_s))
+        {
+          inc_metric("groomed_total", "decision", "aborted");
+          break;
+        }
+
       if (interrupted) break;
 
       int rc = files.step();
@@ -3110,24 +3497,74 @@
       int64_t fileid = sqlite3_column_int64 (files, 1);
       const char* filename = ((const char*) sqlite3_column_text (files, 2) ?: "");
       struct stat s;
+      bool reg_include = !regexec (&file_include_regex, filename, 0, 0, 0);
+      bool reg_exclude = !regexec (&file_exclude_regex, filename, 0, 0, 0);
+
       rc = stat(filename, &s);
-      if (rc < 0 || (mtime != (int64_t) s.st_mtime))
+      if ( (regex_groom && reg_exclude && !reg_include) ||  rc < 0 || (mtime != (int64_t) s.st_mtime) )
         {
           if (verbose > 2)
-            obatched(clog) << "groom: forgetting file=" << filename << " mtime=" << mtime << endl;
-          files_del_f_de.reset().bind(1,fileid).bind(2,mtime).step_ok_done();
-          files_del_r_de.reset().bind(1,fileid).bind(2,mtime).step_ok_done();
-          files_del_scan.reset().bind(1,fileid).bind(2,mtime).step_ok_done();
+            obatched(clog) << "groom: stale file=" << filename << " mtime=" << mtime << endl;
+          stale_fileid_mtime.push_back(make_pair(fileid,mtime));
           inc_metric("groomed_total", "decision", "stale");
+          set_metric("thread_work_pending","role","groom", stale_fileid_mtime.size());
         }
       else
         inc_metric("groomed_total", "decision", "fresh");
-
+      
       if (sigusr1 != forced_rescan_count) // stop early if scan triggered
         break;
     }
   files.reset();
 
+  // ACTION TIME
+
+  // Now that we know which file/mtime tuples are stale, actually do
+  // the deletion from the database.  Doing this during the SELECT
+  // iteration above results in undefined behaviour in sqlite, as per
+  // https://www.sqlite.org/isolation.html
+
+  // We could shuffle stale_fileid_mtime[] here.  It'd let aborted
+  // sequences of nuke operations resume at random locations, instead
+  // of just starting over.  But it doesn't matter much either way,
+  // as long as we make progress.
+
+  sqlite_ps files_del_f_de (db, "nuke f_de", "delete from " BUILDIDS "_f_de where file = ? and mtime = ?");
+  sqlite_ps files_del_r_de (db, "nuke r_de", "delete from " BUILDIDS "_r_de where file = ? and mtime = ?");
+  sqlite_ps files_del_scan (db, "nuke f_m_s", "delete from " BUILDIDS "_file_mtime_scanned "
+                            "where file = ? and mtime = ?");
+
+  while (! stale_fileid_mtime.empty())
+    {
+      auto stale = stale_fileid_mtime.front();
+      stale_fileid_mtime.pop_front();
+      set_metric("thread_work_pending","role","groom", stale_fileid_mtime.size());
+
+      // PR28514: limit grooming iteration to O(rescan time), to avoid
+      // slow nuke_* queries over many files locking out rescans for too
+      // long.  We iterate over the files in random() sequence to avoid
+      // partial checks going over the same set.
+      if (rescan_s > 0 && (long)time(NULL) > (long)(time_start + rescan_s))
+        {
+          inc_metric("groomed_total", "action", "aborted");
+          break;
+        }
+
+      if (interrupted) break;
+
+      int64_t fileid = stale.first;
+      int64_t mtime = stale.second;
+      files_del_f_de.reset().bind(1,fileid).bind(2,mtime).step_ok_done();
+      files_del_r_de.reset().bind(1,fileid).bind(2,mtime).step_ok_done();
+      files_del_scan.reset().bind(1,fileid).bind(2,mtime).step_ok_done();
+      inc_metric("groomed_total", "action", "cleaned");
+      
+       if (sigusr1 != forced_rescan_count) // stop early if scan triggered
+        break;
+    }
+  stale_fileid_mtime.clear(); // no need for this any longer
+  set_metric("thread_work_pending","role","groom", stale_fileid_mtime.size());
+      
   // delete buildids with no references in _r_de or _f_de tables;
   // cascades to _r_sref & _f_s records
   sqlite_ps buildids_del (db, "nuke orphan buildids",
@@ -3152,9 +3589,10 @@
 
   sqlite3_db_release_memory(db); // shrink the process if possible
   sqlite3_db_release_memory(dbq); // ... for both connections
+  debuginfod_pool_groom(); // and release any debuginfod_client objects we've been holding onto
 
-  fdcache.limit(0,0); // release the fdcache contents
-  fdcache.limit(fdcache_fds,fdcache_mbs); // restore status quo parameters
+  fdcache.limit(0,0,0,0); // release the fdcache contents
+  fdcache.limit(fdcache_fds, fdcache_mbs, fdcache_prefetch_fds, fdcache_prefetch_mbs); // restore status quo parameters
 
   clock_gettime (CLOCK_MONOTONIC, &ts_end);
   double deltas = (ts_end.tv_sec - ts_start.tv_sec) + (ts_end.tv_nsec - ts_start.tv_nsec)/1.e9;
@@ -3316,7 +3754,7 @@
   if (scan_archives.size()==0 && !scan_files && source_paths.size()>0)
     obatched(clog) << "warning: without -F -R -U -Z, ignoring PATHs" << endl;
 
-  fdcache.limit(fdcache_fds, fdcache_mbs);
+  fdcache.limit(fdcache_fds, fdcache_mbs, fdcache_prefetch_fds, fdcache_prefetch_mbs);
 
   (void) signal (SIGPIPE, SIG_IGN); // microhttpd can generate it incidentally, ignore
   (void) signal (SIGINT, signal_handler); // ^C
@@ -3326,22 +3764,25 @@
   (void) signal (SIGUSR2, sigusr2_handler); // end-user
 
   /* Get database ready. */
-  rc = sqlite3_open_v2 (db_path.c_str(), &db, (SQLITE_OPEN_READWRITE
-                                               |SQLITE_OPEN_URI
-                                               |SQLITE_OPEN_PRIVATECACHE
-                                               |SQLITE_OPEN_CREATE
-                                               |SQLITE_OPEN_FULLMUTEX), /* thread-safe */
-                        NULL);
-  if (rc == SQLITE_CORRUPT)
+  if (! passive_p)
     {
-      (void) unlink (db_path.c_str());
-      error (EXIT_FAILURE, 0,
-             "cannot open %s, deleted database: %s", db_path.c_str(), sqlite3_errmsg(db));
-    }
-  else if (rc)
-    {
-      error (EXIT_FAILURE, 0,
-             "cannot open %s, consider deleting database: %s", db_path.c_str(), sqlite3_errmsg(db));
+      rc = sqlite3_open_v2 (db_path.c_str(), &db, (SQLITE_OPEN_READWRITE
+                                                   |SQLITE_OPEN_URI
+                                                   |SQLITE_OPEN_PRIVATECACHE
+                                                   |SQLITE_OPEN_CREATE
+                                                   |SQLITE_OPEN_FULLMUTEX), /* thread-safe */
+                            NULL);
+      if (rc == SQLITE_CORRUPT)
+        {
+          (void) unlink (db_path.c_str());
+          error (EXIT_FAILURE, 0,
+                 "cannot open %s, deleted database: %s", db_path.c_str(), sqlite3_errmsg(db));
+        }
+      else if (rc)
+        {
+          error (EXIT_FAILURE, 0,
+                 "cannot open %s, consider deleting database: %s", db_path.c_str(), sqlite3_errmsg(db));
+        }
     }
 
   // open the readonly query variant
@@ -3359,8 +3800,10 @@
     }
 
 
-  obatched(clog) << "opened database " << db_path << endl;
+  obatched(clog) << "opened database " << db_path
+                 << (db?" rw":"") << (dbq?" ro":"") << endl;
   obatched(clog) << "sqlite version " << sqlite3_version << endl;
+  obatched(clog) << "service mode " << (passive_p ? "passive":"active") << endl;
 
   // add special string-prefix-similarity function used in rpm sref/sdef resolution
   rc = sqlite3_create_function(dbq, "sharedprefix", 2, SQLITE_UTF8, NULL,
@@ -3369,13 +3812,16 @@
     error (EXIT_FAILURE, 0,
            "cannot create sharedprefix function: %s", sqlite3_errmsg(dbq));
 
-  if (verbose > 3)
-    obatched(clog) << "ddl: " << DEBUGINFOD_SQLITE_DDL << endl;
-  rc = sqlite3_exec (db, DEBUGINFOD_SQLITE_DDL, NULL, NULL, NULL);
-  if (rc != SQLITE_OK)
+  if (! passive_p)
     {
-      error (EXIT_FAILURE, 0,
-             "cannot run database schema ddl: %s", sqlite3_errmsg(db));
+      if (verbose > 3)
+        obatched(clog) << "ddl: " << DEBUGINFOD_SQLITE_DDL << endl;
+      rc = sqlite3_exec (db, DEBUGINFOD_SQLITE_DDL, NULL, NULL, NULL);
+      if (rc != SQLITE_OK)
+        {
+          error (EXIT_FAILURE, 0,
+                 "cannot run database schema ddl: %s", sqlite3_errmsg(db));
+        }
     }
 
   // Start httpd server threads.  Separate pool for IPv4 and IPv6, in
@@ -3439,31 +3885,39 @@
     }
 
   // run extra -D sql if given
-  for (auto&& i: extra_ddl)
-    {
-      if (verbose > 1)
-        obatched(clog) << "extra ddl:\n" << i << endl;
-      rc = sqlite3_exec (db, i.c_str(), NULL, NULL, NULL);
-      if (rc != SQLITE_OK && rc != SQLITE_DONE && rc != SQLITE_ROW)
-        error (0, 0,
-               "warning: cannot run database extra ddl %s: %s", i.c_str(), sqlite3_errmsg(db));
-    }
+  if (! passive_p)
+    for (auto&& i: extra_ddl)
+      {
+        if (verbose > 1)
+          obatched(clog) << "extra ddl:\n" << i << endl;
+        rc = sqlite3_exec (db, i.c_str(), NULL, NULL, NULL);
+        if (rc != SQLITE_OK && rc != SQLITE_DONE && rc != SQLITE_ROW)
+          error (0, 0,
+                 "warning: cannot run database extra ddl %s: %s", i.c_str(), sqlite3_errmsg(db));
 
-  if (maxigroom)
-    obatched(clog) << "maxigroomed database" << endl;
+        if (maxigroom)
+          obatched(clog) << "maxigroomed database" << endl;
+      }
 
-  obatched(clog) << "search concurrency " << concurrency << endl;
-  obatched(clog) << "rescan time " << rescan_s << endl;
+  if (! passive_p)
+    obatched(clog) << "search concurrency " << concurrency << endl;
+  if (! passive_p)
+    obatched(clog) << "rescan time " << rescan_s << endl;
   obatched(clog) << "fdcache fds " << fdcache_fds << endl;
   obatched(clog) << "fdcache mbs " << fdcache_mbs << endl;
   obatched(clog) << "fdcache prefetch " << fdcache_prefetch << endl;
   obatched(clog) << "fdcache tmpdir " << tmpdir << endl;
   obatched(clog) << "fdcache tmpdir min% " << fdcache_mintmp << endl;
-  obatched(clog) << "groom time " << groom_s << endl;
+  if (! passive_p)
+    obatched(clog) << "groom time " << groom_s << endl;
+  obatched(clog) << "prefetch fds " << fdcache_prefetch_fds << endl;
+  obatched(clog) << "prefetch mbs " << fdcache_prefetch_mbs << endl;
+  obatched(clog) << "forwarded ttl limit " << forwarded_ttl_limit << endl;
+
   if (scan_archives.size()>0)
     {
       obatched ob(clog);
-      auto& o = ob << "scanning archive types ";
+      auto& o = ob << "accepting archive types ";
       for (auto&& arch : scan_archives)
 	o << arch.first << "(" << arch.second << ") ";
       o << endl;
@@ -3474,28 +3928,43 @@
 
   vector<pthread_t> all_threads;
 
-  pthread_t pt;
-  rc = pthread_create (& pt, NULL, thread_main_groom, NULL);
-  if (rc)
-    error (EXIT_FAILURE, rc, "cannot spawn thread to groom database\n");
-  else
-    all_threads.push_back(pt);
-
-  if (scan_files || scan_archives.size() > 0)
+  if (! passive_p)
     {
-      rc = pthread_create (& pt, NULL, thread_main_fts_source_paths, NULL);
+      pthread_t pt;
+      rc = pthread_create (& pt, NULL, thread_main_groom, NULL);
       if (rc)
-        error (EXIT_FAILURE, rc, "cannot spawn thread to traverse source paths\n");
-      all_threads.push_back(pt);
-      for (unsigned i=0; i<concurrency; i++)
+        error (EXIT_FAILURE, rc, "cannot spawn thread to groom database\n");
+      else
         {
-          rc = pthread_create (& pt, NULL, thread_main_scanner, NULL);
-          if (rc)
-            error (EXIT_FAILURE, rc, "cannot spawn thread to scan source files / archives\n");
+#ifdef HAVE_PTHREAD_SETNAME_NP
+          (void) pthread_setname_np (pt, "groom");
+#endif
           all_threads.push_back(pt);
         }
-    }
 
+      if (scan_files || scan_archives.size() > 0)
+        {
+          rc = pthread_create (& pt, NULL, thread_main_fts_source_paths, NULL);
+          if (rc)
+            error (EXIT_FAILURE, rc, "cannot spawn thread to traverse source paths\n");
+#ifdef HAVE_PTHREAD_SETNAME_NP
+          (void) pthread_setname_np (pt, "traverse");
+#endif
+          all_threads.push_back(pt);
+
+          for (unsigned i=0; i<concurrency; i++)
+            {
+              rc = pthread_create (& pt, NULL, thread_main_scanner, NULL);
+              if (rc)
+                error (EXIT_FAILURE, rc, "cannot spawn thread to scan source files / archives\n");
+#ifdef HAVE_PTHREAD_SETNAME_NP
+              (void) pthread_setname_np (pt, "scan");
+#endif
+              all_threads.push_back(pt);
+            }
+        }
+    }
+  
   /* Trivial main loop! */
   set_metric("ready", 1);
   while (! interrupted)
@@ -3514,12 +3983,15 @@
   if (d4) MHD_stop_daemon (d4);
   if (d6) MHD_stop_daemon (d6);
 
-  /* With all threads known dead, we can clean up the global resources. */
-  rc = sqlite3_exec (db, DEBUGINFOD_SQLITE_CLEANUP_DDL, NULL, NULL, NULL);
-  if (rc != SQLITE_OK)
+  if (! passive_p)
     {
-      error (0, 0,
-             "warning: cannot run database cleanup ddl: %s", sqlite3_errmsg(db));
+      /* With all threads known dead, we can clean up the global resources. */
+      rc = sqlite3_exec (db, DEBUGINFOD_SQLITE_CLEANUP_DDL, NULL, NULL, NULL);
+      if (rc != SQLITE_OK)
+        {
+          error (0, 0,
+                 "warning: cannot run database cleanup ddl: %s", sqlite3_errmsg(db));
+        }
     }
 
   // NB: no problem with unconditional free here - an earlier failed regcomp would exit program
@@ -3530,7 +4002,8 @@
   sqlite3 *databaseq = dbq;
   db = dbq = 0; // for signal_handler not to freak
   (void) sqlite3_close (databaseq);
-  (void) sqlite3_close (database);
+  if (! passive_p)
+    (void) sqlite3_close (database);
 
   return 0;
 }
diff --git a/debuginfod/debuginfod.h.in b/debuginfod/debuginfod.h.in
index 559ea94..c358df4 100644
--- a/debuginfod/debuginfod.h.in
+++ b/debuginfod/debuginfod.h.in
@@ -35,6 +35,9 @@
 #define DEBUGINFOD_TIMEOUT_ENV_VAR "DEBUGINFOD_TIMEOUT"
 #define DEBUGINFOD_PROGRESS_ENV_VAR "DEBUGINFOD_PROGRESS"
 #define DEBUGINFOD_VERBOSE_ENV_VAR "DEBUGINFOD_VERBOSE"
+#define DEBUGINFOD_RETRY_LIMIT_ENV_VAR "DEBUGINFOD_RETRY_LIMIT"
+#define DEBUGINFOD_MAXSIZE_ENV_VAR "DEBUGINFOD_MAXSIZE"
+#define DEBUGINFOD_MAXTIME_ENV_VAR "DEBUGINFOD_MAXTIME"
 
 /* The libdebuginfod soname.  */
 #define DEBUGINFOD_SONAME "@LIBDEBUGINFOD_SONAME@"
diff --git a/doc/ChangeLog b/doc/ChangeLog
index 5cd4fe1..7a73fa1 100644
--- a/doc/ChangeLog
+++ b/doc/ChangeLog
@@ -1,3 +1,48 @@
+2021-11-05  Frank Ch. Eigler  <fche@redhat.com>
+
+	PR28430
+	* debuginfod.8 (--passive): Document new flag & operation mode.
+
+2021-08-28  Di Chen  <dichen@redhat.com>
+
+	* debuginfod.8 (-d): Document ":memory:" as in-memory database.
+
+2021-08-20  Di Chen  <dichen@redhat.com>
+
+	* debuginfod.8: Add --forwarded-ttl-limit=NUM documentation.
+
+2021-07-28  Alice Zhang <alizhang@redhat.com>
+
+	PR27950
+	* debuginfod-client-config.7: New file to store all cache config
+	infos.
+	* debuginfod-find.1: Removed redundant occurrences of environment
+	variables & cache control files.
+	* debuginfod.8: Likewise.
+	* debuginfod_find_debuginfo.3: Likewise.
+	* Makefile.am: Updated to include debuginfod-client-config.7
+	* man3, man7: Symlinks for source tree man page testing.
+
+2021-08-04  Noah Sanci  <nsanci@redhat.com>
+
+	PR27277
+	* debuginfod-find.1: Increasing verbosity describes the downloaded
+	file.
+	* debuginfod.8: Describe X-DEBUGINFOD-FILE, X-DEBUGINFOD-SIZE, and
+	X-DEBUGINFOD-ARCHIVE.
+
+2021-07-26  Noah Sanci <nsanci@redhat.com>
+
+	PR27982
+	* debuginfod-find.1: Document DEBUGINFOD_MAXTIME
+	and DEBUGINFOD_MAXSIZE.
+
+2021-04-23  Frank Ch. Eigler <fche@redhat.com>
+
+	PR27701
+	* debuginfod_find_debuginfo.3: Specify sequential reuse policy of
+	debuginfod_client objects.
+
 2021-02-04  Frank Ch. Eigler <fche@redhat.com>
 
 	* debuginfod.8: Mention new --fdcache-mintmp option.
diff --git a/doc/Makefile.am b/doc/Makefile.am
index ef66fb8..32d1a2b 100644
--- a/doc/Makefile.am
+++ b/doc/Makefile.am
@@ -19,14 +19,19 @@
 EXTRA_DIST = COPYING-GFDL README
 dist_man1_MANS=readelf.1 elfclassify.1
 notrans_dist_man3_MANS=elf_update.3 elf_getdata.3 elf_clone.3 elf_begin.3
+notrans_dist_man7_MANS=
 notrans_dist_man8_MANS=
 notrans_dist_man1_MANS=
 
 if DEBUGINFOD
+if !LIBDEBUGINFOD
+notrans_dist_man7_MANS += debuginfod-client-config.7
+endif
 notrans_dist_man8_MANS += debuginfod.8
 endif
 
 if LIBDEBUGINFOD
+notrans_dist_man7_MANS += debuginfod-client-config.7
 notrans_dist_man3_MANS += debuginfod_add_http_header.3
 notrans_dist_man3_MANS += debuginfod_begin.3
 notrans_dist_man3_MANS += debuginfod_end.3
diff --git a/doc/debuginfod-client-config.7 b/doc/debuginfod-client-config.7
new file mode 100644
index 0000000..1cc1921
--- /dev/null
+++ b/doc/debuginfod-client-config.7
@@ -0,0 +1,129 @@
+'\"! tbl | nroff \-man
+'\" t macro stdmacro
+.if \n(zZ=1 .ig zZ
+
+.TH DEBUGINFOD-CLIENT-CONFIG 7
+.SH NAME
+debuginfod-client-config \- debuginfod client environment variables, cache control files and etc.
+
+.SH SYNOPSIS
+Several environment variables and control files control the behaviour of debuginfod client applications.
+
+.\" The preceding section permits this man page to be viewed as if self-contained.
+.zZ
+.\" The following section (only) gets included into other man pages via .so
+
+
+.SH ENVIRONMENT VARIABLES
+.TP
+.B $TMPDIR
+This environment variable points to a file system to be used for
+temporary files.  The default is /tmp.
+
+.TP
+.B $DEBUGINFOD_URLS
+This environment variable contains a list of URL prefixes for trusted
+debuginfod instances.  Alternate URL prefixes are separated by space.
+Avoid referential loops that cause a server to contact itself, directly
+or indirectly - the results would be hilarious.
+
+.TP
+.B $DEBUGINFOD_CACHE_PATH
+This environment variable governs the location of the cache where
+downloaded files and cache-control files are kept.  The default
+directory is chosen based on other environment variables, see below.
+
+.TP
+.B $DEBUGINFOD_PROGRESS
+This environment variable governs the default progress function.  If
+set, and if a progressfn is not explicitly set, then the library will
+configure a default progressfn.  This function will append a simple
+progress message periodically to stderr.  The default is no progress
+function output.
+
+.TP
+.B $DEBUGINFOD_VERBOSE
+This environment variable governs the default file descriptor for
+verbose output.  If set, and if a verbose fd is not explicitly set,
+then the verbose output will be produced on STDERR_FILENO.
+
+.TP
+.B $DEBUGINFOD_RETRY_LIMIT
+This environment variable governs the default limit of retry attempts. If a
+query failed with errno other than ENOENT, will initiate several attempts
+within the limit.
+
+.TP
+.B $DEBUGINFOD_TIMEOUT
+This environment variable governs the download \fIcommencing\fP
+timeout for each debuginfod HTTP connection.  A server that fails to
+provide at least 100K of data within this many seconds is skipped. The
+default is 90 seconds.  (Zero or negative means "no timeout".)
+
+.TP
+.B $DEBUGINFOD_MAXTIME
+This environment variable dictates how long the client will wait to
+\fIcomplete\fP the download a file found on a server in seconds. It is best
+used to ensure that a file is downloaded quickly or be rejected. The
+default is 0 (infinite time).
+
+.TP
+.B $DEBUGINFOD_MAXSIZE
+This environment variable dictates the maximum size of a file to
+download in bytes. This is best used if the user would like to ensure
+only small files are downloaded. A value of 0 causes no consideration
+for size, and the client may attempt to download a file of any size.
+The default is 0 (infinite size).
+
+.SH CACHE
+
+Before each query, the debuginfod client library checks for a need to
+clean the cache.  If it's time to clean, the library traverses the
+cache directory and removes downloaded debuginfo-related artifacts and
+newly empty directories, if they have not been accessed recently.
+
+Control files are located directly under the cache directory.  They
+contain simple decimal numbers to set cache-related configuration
+parameters.  If the files do not exist, the client library creates the
+files with the default parameter values as content.
+
+After each query, the debuginfod client library deposits newly
+received files into a directory & file that is named based on the
+build-id.  A failed query is also cached by a special file.  The
+naming convention used for these artifacts is deliberately
+\fBundocumented\fP.
+
+.TP
+.B $XDG_CACHE_HOME/debuginfod_client/
+Default cache directory, if $XDG_CACHE_HOME is set.
+.PD
+
+.TP
+.B $HOME/.cache/debuginfod_client/
+Default cache directory, if $XDG_CACHE_HOME is not set.
+.PD
+
+.TP
+.B $HOME/.debuginfod_client_cache/
+Deprecated cache directory, used only if preexisting.
+.PD
+
+.TP
+.B cache_clean_interval_s
+This control file gives the interval between cache cleaning rounds, in
+seconds.  The default is 86400, one day.  0 means "immediately".
+
+.TP
+.B max_unused_age_s
+This control file sets how long unaccessed debuginfo-related files
+are retained, in seconds.  The default is 604800, one week.  0 means
+"immediately".
+
+.TP
+.B cache_miss_s
+This control file sets how long to remember a query failure, in
+seconds.  New queries for the same artifacts within this time window
+are short-circuited (returning an immediate failure instead of sending
+a new query to servers).  This accelerates queries that probably would
+still fail.  The default is 600, 10 minutes.  0 means "forget
+immediately".
diff --git a/doc/debuginfod-find.1 b/doc/debuginfod-find.1
index 12d4ec2..957ec7e 100644
--- a/doc/debuginfod-find.1
+++ b/doc/debuginfod-find.1
@@ -110,7 +110,8 @@
 
 .TP
 .B "\-v"
-Increase verbosity, including printing frequent download-progress messages.
+Increase verbosity, including printing frequent download-progress messages
+and printing the http response headers from the server.
 
 
 .SH "SECURITY"
@@ -125,35 +126,8 @@
 (The debuginfod server does not perform authentication, but a front-end
 proxy server could.)
 
-.SH "ENVIRONMENT VARIABLES"
-
-.TP 21
-.B DEBUGINFOD_URLS
-This environment variable contains a list of URL prefixes for trusted
-debuginfod instances.  Alternate URL prefixes are separated by space.
-
-.TP 21
-.B DEBUGINFOD_TIMEOUT
-This environment variable governs the timeout for each debuginfod HTTP
-connection.  A server that fails to provide at least 100K of data
-within this many seconds is skipped. The default is 90 seconds.  (Zero
-or negative means "no timeout".)
-
-.TP 21
-.B DEBUGINFOD_CACHE_PATH
-This environment variable governs the location of the cache where
-downloaded files are kept.  It is cleaned periodically as this program
-is reexecuted.  Cache management parameters may be set by files under
-this directory: see the \fBdebuginfod_find_debuginfo(3)\fP man page
-for details.  The default is $HOME/.debuginfod_client_cache.
-
-.SH "FILES"
-.LP
-.PD .1v
-.TP 20
-.B $HOME/.debuginfod_client_cache
-Default cache directory.
-.PD
+.nr zZ 1
+.so man7/debuginfod-client-config.7
 
 .SH "SEE ALSO"
 .I "debuginfod(8)"
diff --git a/doc/debuginfod.8 b/doc/debuginfod.8
index c33a4b6..1e56f65 100644
--- a/doc/debuginfod.8
+++ b/doc/debuginfod.8
@@ -12,7 +12,6 @@
 .fi
 .RE
 ..
-
 .TH DEBUGINFOD 8
 .SH NAME
 debuginfod \- debuginfo-related http file-server daemon
@@ -64,7 +63,7 @@
 If any of the \fB\-R\fP, \fB-U\fP, or \fB-Z\fP options is given, each
 file is scanned as an archive file that may contain ELF/DWARF/source
 files.  Archive files are recognized by extension.  If \-R is given,
-".rpm" files are scanned; if \-D is given, ".deb" and ".ddeb" files
+".rpm" files are scanned; if \-U is given, ".deb" and ".ddeb" files
 are scanned; if \-Z is given, the listed extensions are scanned.
 Because of complications such as DWZ-compressed debuginfo, may require
 \fItwo\fP traversal passes to identify all source code.  Source files
@@ -75,9 +74,10 @@
 
 If no PATH is listed, or none of the scanning options is given, then
 \fBdebuginfod\fP will simply serve content that it accumulated into
-its index in all previous runs, and federate to any upstream
-debuginfod servers.
-
+its index in all previous runs, periodically groom the database, and
+federate to any upstream debuginfod servers.  In \fIpassive\fP mode,
+\fBdebuginfod\fP will only serve content from a read-only index and
+federated upstream servers, but will not scan or groom.
 
 .SH OPTIONS
 
@@ -118,8 +118,20 @@
 data.  It will contain absolute file path names, so it may not be
 portable across machines.  It may be frequently read/written, so it
 should be on a fast filesystem.  It should not be shared across
-machines or users, to maximize sqlite locking performance.  The
-default database file is \%$HOME/.debuginfod.sqlite.
+machines or users, to maximize sqlite locking performance.  For quick
+testing the magic string ":memory:" can be used to use an one-time
+memory-only database.  The default database file is
+\%$HOME/.debuginfod.sqlite.
+
+.TP
+.B "\-\-passive"
+Set the server to passive mode, where it only services webapi
+requests, including participating in federation.  It performs no
+scanning, no grooming, and so only opens the sqlite database
+read-only.  This way a database can be safely shared between a active
+scanner/groomer server and multiple passive ones, thereby sharing
+service load.  Archive pattern options must still be given, so
+debuginfod can recognize file name extensions for unpacking.
 
 .TP
 .B "\-D SQL" "\-\-ddl=SQL"
@@ -159,6 +171,9 @@
 interrupting a groom pass (if any).
 
 .TP
+.B "\-r"
+Apply the -I and -X during groom cycles, so that files excluded by the regexes are removed from the index. These parameters are in addition to what normally qualifies a file for grooming, not a replacement.
+
 .B "\-g SECONDS" "\-\-groom\-time=SECONDS"
 Set the groom time for the index database.  This is the amount of time
 the grooming thread will wait after finishing a grooming pass before
@@ -213,6 +228,16 @@
 cache.
 
 .TP
+.B "\-\-fdcache\-\-prefetch\-fds=NUM"  "\-\-fdcache\-\-prefetch\-mbs=MB"
+Configure how many file descriptors (fds) and megabytes (mbs) are
+allocated to the prefetch fdcache. If unspecified, values of
+\fB\-\-prefetch\-fds\fP and \fB\-\-prefetch\-mbs\fP depend
+on concurrency of the system and on the available disk space on
+the $TMPDIR. Allocating more to the prefetch cache will improve
+performance in environments where different parts of several large
+archives are being accessed.
+
+.TP
 .B "\-\-fdcache\-mintmp=NUM"
 Configure a disk space threshold for emergency flushing of the cache.
 The filesystem holding the cache is checked periodically.  If the
@@ -224,6 +249,12 @@
 virtual disk.  The default threshold is 25%.
 
 .TP
+.B "\-\-forwarded\-ttl\-limit=NUM"
+Configure limits of X-Forwarded-For hops. if X-Forwarded-For
+exceeds N hops, it will not delegate a local lookup miss to
+upstream debuginfods. The default limit is 8.
+
+.TP
 .B "\-v"
 Increase verbosity of logging to the standard error file descriptor.
 May be repeated to increase details.  The default verbosity is 0.
@@ -238,6 +269,15 @@
 This file service resemblance is intentional, so that an installation
 can take advantage of standard HTTP management infrastructure.
 
+Upon finding a file in an archive or simply in the database, some
+custom http headers are added to the response. For files in the
+database X-DEBUGINFOD-FILE and X-DEBUGINFOD-SIZE are added.
+X-DEBUGINFOD-FILE is simply the unescaped filename and
+X-DEBUGINFOD-SIZE is the size of the file. For files found in archives,
+in addition to X-DEBUGINFOD-FILE and X-DEBUGINFOD-SIZE,
+X-DEBUGINFOD-ARCHIVE is added.  X-DEBUGINFOD-ARCHIVE is the name of the
+archive the file was found in.
+
 There are three requests.  In each case, the buildid is encoded as a
 lowercase hexadecimal string.  For example, for a program \fI/bin/ls\fP,
 look at the ELF note GNU_BUILD_ID:
@@ -296,6 +336,10 @@
 \../bar/foo.c AT_comp_dir=/zoo/	/buildid/BUILDID/source/zoo//../bar/foo.c
 .TE
 
+Note: the client should %-escape characters in /SOURCE/FILE that are
+not shown as "unreserved" in section 2.3 of RFC3986. Some characters
+that will be escaped include "+", "\\", "$", "!", the 'space' character,
+and ";". RFC3986 includes a more comprehensive list of these characters.
 .SS /metrics
 
 This endpoint returns a Prometheus formatted text/plain dump of a
@@ -332,22 +376,22 @@
 exclude files from scanning that you know have no debuginfo-relevant
 content.
 
-As debuginfod runs, it periodically rescans its target directories,
-and any new content found is added to the database.  Old content, such
-as data for files that have disappeared or that have been replaced
-with newer versions is removed at a periodic \fIgrooming\fP pass.
-This means that the sqlite files grow fast during initial indexing,
-slowly during index rescans, and periodically shrink during grooming.
-There is also an optional one-shot \fImaximal grooming\fP pass is
-available.  It removes information debuginfo-unrelated data from the
-archive content index such as file names found in archives ("archive
-sdef" records) that are not referred to as source files from any
-binaries find in archives ("archive sref" records).  This can save
-considerable disk space.  However, it is slow and temporarily requires
-up to twice the database size as free space.  Worse: it may result in
-missing source-code info if the archive traversals were interrupted,
-so that not all source file references were known.  Use it rarely to
-polish a complete index.
+As debuginfod runs in normal \fIactive\fP mode, it periodically
+rescans its target directories, and any new content found is added to
+the database.  Old content, such as data for files that have
+disappeared or that have been replaced with newer versions is removed
+at a periodic \fIgrooming\fP pass.  This means that the sqlite files
+grow fast during initial indexing, slowly during index rescans, and
+periodically shrink during grooming.  There is also an optional
+one-shot \fImaximal grooming\fP pass is available.  It removes
+information debuginfo-unrelated data from the archive content index
+such as file names found in archives ("archive sdef" records) that are
+not referred to as source files from any binaries find in archives
+("archive sref" records).  This can save considerable disk space.
+However, it is slow and temporarily requires up to twice the database
+size as free space.  Worse: it may result in missing source-code info
+if the archive traversals were interrupted, so that not all source
+file references were known.  Use it rarely to polish a complete index.
 
 You should ensure that ample disk space remains available.  (The flood
 of error messages on -ENOSPC is ugly and nagging.  But, like for most
@@ -380,6 +424,11 @@
 or you want to force debuginfod to reset and start over, simply
 erase the sqlite file before restarting debuginfod.
 
+In contrast, in \fIpassive\fP mode, all scanning and grooming is
+disabled, and the index database remains read-only.  This makes the
+database more suitable for sharing between servers or sites with
+simple one-way replication, and data management considerations are
+generally moot.
 
 .SH SECURITY
 
@@ -401,53 +450,15 @@
 information through the internal \fIlibcurl\fP library is not currently
 enabled.
 
+.nr zZ 1
+.so man7/debuginfod-client-config.7
 
-.SH "ENVIRONMENT VARIABLES"
-
+.SH ADDITIONAL FILES
 .TP
-.B TMPDIR
-This environment variable points to a file system to be used for
-temporary files.  The default is /tmp.
-
-.TP
-.B DEBUGINFOD_URLS
-This environment variable contains a list of URL prefixes for trusted
-debuginfod instances.  Alternate URL prefixes are separated by space.
-Avoid referential loops that cause a server to contact itself, directly
-or indirectly - the results would be hilarious.
-
-.TP
-.B DEBUGINFOD_TIMEOUT
-This environment variable governs the timeout for each debuginfod HTTP
-connection.  A server that fails to provide at least 100K of data
-within this many seconds is skipped. The default is 90 seconds.  (Zero
-or negative means "no timeout".)
-
-
-.TP
-.B DEBUGINFOD_CACHE_PATH
-This environment variable governs the location of the cache where
-downloaded files are kept.  It is cleaned periodically as this
-program is reexecuted. If XDG_CACHE_HOME is set then
-$XDG_CACHE_HOME/debuginfod_client is the default location, otherwise
-$HOME/.cache/debuginfod_client is used. For more information regarding
-the client cache see \fIdebuginfod_find_debuginfo(3)\fP.
-
-.SH FILES
-.LP
-.PD .1v
-.TP 20
 .B $HOME/.debuginfod.sqlite
 Default database file.
 .PD
 
-.TP 20
-.B $XDG_CACHE_HOME/debuginfod_client
-Default cache directory for content from upstream debuginfods.
-If XDG_CACHE_HOME is not set then \fB$HOME/.cache/debuginfod_client\fP
-is used.
-.PD
-
 
 .SH "SEE ALSO"
 .I "debuginfod-find(1)"
diff --git a/doc/debuginfod_find_debuginfo.3 b/doc/debuginfod_find_debuginfo.3
index cfddb54..30cef3c 100644
--- a/doc/debuginfod_find_debuginfo.3
+++ b/doc/debuginfod_find_debuginfo.3
@@ -105,6 +105,8 @@
 connections to the other servers are closed.
 
 A \fBclient\fP handle should be used from only one thread at a time.
+A handle may be reused for a series of lookups, which can improve
+performance due to retention of connections and caches.
 
 .SH "RETURN VALUE"
 
@@ -175,8 +177,8 @@
 
 .SS "HTTP HEADER"
 
-Before a lookup function is initiated, a client application may
-add HTTP request headers to future downloads.
+Before each lookup function is initiated, a client application may
+add HTTP request headers.  These are reset after each lookup function.
 .BR \%debuginfod_add_http_header ()
 may be called with strings of the form
 .BR \%"Header:\~value" .
@@ -196,19 +198,6 @@
 header to outgoing requests.  If the client application adds
 a header with the same name, this default is suppressed.
 
-.SH "CACHE"
-If the query is successful, the \fBdebuginfod_find_*\fP() functions save
-the target file to a local cache. The location of the cache is controlled
-by the \fB$DEBUGINFOD_CACHE_PATH\fP environment variable (see below).
-Cleaning of the cache is controlled by the \fIcache_clean_interval_s\fP
-and \fImax_unused_age_s\fP files, which are found in the
-\fB$DEBUGINFOD_CACHE_PATH\fP directory. \fIcache_clean_interval_s\fP controls
-how frequently the cache is traversed for cleaning and \fImax_unused_age_s\fP
-controls how long a file can go unused (fstat(2) atime) before it's
-removed from the cache during cleaning. These files should contain only an
-ASCII decimal integer representing the interval or max unused age in seconds.
-The default is one day and one week, respectively.  Values of zero mean "immediately".
-
 .SH "MACROS"
 
 .SS "DEBUGINFOD_SONAME"
@@ -239,43 +228,6 @@
 (The debuginfod server does not perform authentication, but a front-end
 proxy server could.)
 
-.SH "ENVIRONMENT VARIABLES"
-
-.TP 21
-.B DEBUGINFOD_URLS
-This environment variable contains a list of URL prefixes for trusted
-debuginfod instances.  Alternate URL prefixes are separated by space.
-
-.TP 21
-.B DEBUGINFOD_TIMEOUT
-This environment variable governs the timeout for each debuginfod HTTP
-connection.  A server that fails to provide at least 100K of data
-within this many seconds is skipped. The default is 90 seconds.  (Zero
-or negative means "no timeout".)
-
-.TP 21
-.B DEBUGINFOD_PROGRESS
-This environment variable governs the default progress function.  If
-set, and if a progressfn is not explicitly set, then the library will
-configure a default progressfn.  This function will append a simple
-progress message periodically to stderr.  The default is no progress
-function output.
-
-.TP 21
-.B DEBUGINFOD_VERBOSE
-This environment variable governs the default file descriptor for
-verbose output.  If set, and if a verbose fd is not explicitly set,
-then the verbose output will be produced on STDERR_FILENO.
-
-.TP 21
-.B DEBUGINFOD_CACHE_PATH
-This environment variable governs the location of the cache where
-downloaded files are kept.  It is cleaned periodically as this
-program is reexecuted. If XDG_CACHE_HOME is set then
-$XDG_CACHE_HOME/debuginfod_client is the default location, otherwise
-$HOME/.cache/debuginfod_client is used.
-
-
 .SH "ERRORS"
 The following list is not comprehensive. Error codes may also
 originate from calls to various C Library functions.
@@ -331,17 +283,16 @@
 
 .TP
 .BR ETIME
-Query failed due to timeout. \fB$DEBUGINFOD_TIMEOUT\fP controls
-the timeout duration. See debuginfod(8) for more information.
+Query failed due to timeout. \fB$DEBUGINFOD_TIMEOUT\fP and
+\fB$DEBUGINFOD_MAXTIME\fP control this.
 
-.SH "FILES"
-.LP
-.PD .1v
-.TP 20
-.B $HOME/.debuginfod_client_cache
-Default cache directory. If XDG_CACHE_HOME is not set then
-\fB$HOME/.cache/debuginfod_client\fP is used.
-.PD
+.TP
+.BR EF2BIG
+Query aborted due to the file requested being too big.  The
+\fB$DEBUGINFOD_MAXSIZE\fP controls this.
+
+.nr zZ 1
+.so man7/debuginfod-client-config.7
 
 .SH "SEE ALSO"
 .I "debuginfod(8)"
diff --git a/lib/Android.bp b/lib/Android.bp
index 86ad65e..9016e29 100644
--- a/lib/Android.bp
+++ b/lib/Android.bp
@@ -6,5 +6,9 @@
     name: "libeu",
     defaults: ["elfutils_defaults"],
     srcs: ["*.c"],
-    exclude_srcs: ["dynamicsizehash*.c"],
+    exclude_srcs: [
+        "color.c", // uses argp
+        "dynamicsizehash*.c",
+        "printversion.c", // uses argp
+    ],
 }
diff --git a/lib/ChangeLog b/lib/ChangeLog
index 371e213..8f4d4d9 100644
--- a/lib/ChangeLog
+++ b/lib/ChangeLog
@@ -1,3 +1,68 @@
+2021-02-14  Alexander Miller  <alex.miller@gmx.de>
+
+	* eu-config.h (used_in_asm): New macro.
+	(NEW_INTDEF): New macro.
+	(NEW_VERSION): Mark symbol as used_in_asm.  Use @@ symver and change
+	asm name instead.  New variant using symver attribute if available.
+	(OLD_VERSION): Update new symbol name. Indent asm directives.  New
+	variant using symver attribute.
+	(COMPAT_VERSION_NEWPROTO): Mark symbol as used_in_asm.  Reorder
+	lines.  Replace asm with __asm__ in declaration.  New variant using
+	symver attribute.
+	(COMPAT_VERSION): Likewise.
+
+2021-09-10  Colin Cross <ccross@google.com>
+
+	* error.c (error): Call fflush on stdout and stderr. Setup errno and
+	call verr, verrx, vwarn or vwarnx based on status and errnum.
+
+2021-09-06  Dmitry V. Levin  <ldv@altlinux.org>
+
+	* color.c (parse_opt): Replace asprintf followed by error(EXIT_FAILURE)
+	with xasprintf.
+
+	* xasprintf.c: New file.
+	* Makefile.am (libeu_a_SOURCES): Add it.
+	* libeu.h (xasprintf): New prototype.
+
+	* dynamicsizehash.c (INIT(NAME)): Remove cast of calloc return value.
+	* dynamicsizehash_concurrent.c (INIT(NAME)): Remove cast of malloc
+	return value.
+
+2021-08-23  Saleem Abdulrasool  <abdulras@google.com>
+
+	* system.h: Remove inline definition for error and error_message_count
+	in the fallback path.
+	* Makefile.am (libeu_a_SOURCES): Add error.c.
+	* error.c: New file, moves the previous inline definitions to avoid
+	multiple definitions properly rather than relying on -fcommon and vague
+	linkage.
+
+2021-08-21  Saleem Abdulrasool  <abdulras@google.com>
+
+	* fixedsizehash.h: Remove unused STROF macro.
+
+2021-08-20  Saleem Abdulrasool  <abdulras@google.com>
+
+	* system.h: Check for HAVE_ERROR_H and HAVE_ERR_H and define
+	error_message_cont and error if necessary.
+
+2021-08-20  Saleem Abdulrasool  <abdulras@google.com>
+
+	* fixedsizehash.h: Remove sys/cdefs.h include. Unconditionally
+	define STROF and CONCAT macros.
+
+2021-07-28  Mark Wielaard  <mark@klomp.org>
+
+	* system.h (reallocarray): New static inline fallback function.
+
+2021-04-19  Martin Liska  <mliska@suse.cz>
+
+	* system.h (startswith): New function.
+	(pwrite_retry): Cast to char *.
+	(write_retry): Likewise.
+	(pread_retry): Likewise.
+
 2021-02-05  Mark Wielaard  <mark@klomp.org>
 
 	* printversion.c (print_version): Update copyright year.
diff --git a/lib/Makefile.am b/lib/Makefile.am
index 97bf732..42ddf5a 100644
--- a/lib/Makefile.am
+++ b/lib/Makefile.am
@@ -33,9 +33,9 @@
 
 noinst_LIBRARIES = libeu.a
 
-libeu_a_SOURCES = xstrdup.c xstrndup.c xmalloc.c next_prime.c \
+libeu_a_SOURCES = xasprintf.c xstrdup.c xstrndup.c xmalloc.c next_prime.c \
 		  crc32.c crc32_file.c \
-		  color.c printversion.c
+		  color.c error.c printversion.c
 
 noinst_HEADERS = fixedsizehash.h libeu.h system.h dynamicsizehash.h list.h \
 		 eu-config.h color.h printversion.h bpf.h \
diff --git a/lib/color.c b/lib/color.c
index 454cb7c..e43b614 100644
--- a/lib/color.c
+++ b/lib/color.c
@@ -188,10 +188,8 @@
 			    if (name_len == known[i].len
 				&& memcmp (start, known[i].name, name_len) == 0)
 			      {
-				if (asprintf (known[i].varp, "\e[%.*sm",
-					      (int) (env - val), val) < 0)
-				  error (EXIT_FAILURE, errno,
-					 _("cannot allocate memory"));
+				*known[i].varp =
+				  xasprintf ("\e[%.*sm", (int) (env - val), val);
 				break;
 			      }
 			}
diff --git a/lib/dynamicsizehash.c b/lib/dynamicsizehash.c
index f9406eb..76c86da 100644
--- a/lib/dynamicsizehash.c
+++ b/lib/dynamicsizehash.c
@@ -184,7 +184,7 @@
 #ifdef ITERATE
   htab->first = NULL;
 #endif
-  htab->table = (void *) calloc ((init_size + 1), sizeof (htab->table[0]));
+  htab->table = calloc ((init_size + 1), sizeof (htab->table[0]));
   if (htab->table == NULL)
     return -1;
 
diff --git a/lib/dynamicsizehash_concurrent.c b/lib/dynamicsizehash_concurrent.c
index 2d53bec..4e2e247 100644
--- a/lib/dynamicsizehash_concurrent.c
+++ b/lib/dynamicsizehash_concurrent.c
@@ -355,7 +355,7 @@
 
   pthread_rwlock_init(&htab->resize_rwl, NULL);
 
-  htab->table = (void *) malloc ((init_size + 1) * sizeof (htab->table[0]));
+  htab->table = malloc ((init_size + 1) * sizeof (htab->table[0]));
   if (htab->table == NULL)
       return -1;
 
diff --git a/lib/error.c b/lib/error.c
new file mode 100644
index 0000000..5186fc1
--- /dev/null
+++ b/lib/error.c
@@ -0,0 +1,75 @@
+/* Definitions for error fallback functions.
+   Copyright (C) 2021 Google, 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/>.  */
+
+#include <config.h>
+
+#if !defined(HAVE_ERROR_H) && defined(HAVE_ERR_H)
+#include <errno.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <err.h>
+
+unsigned int error_message_count = 0;
+
+void error(int status, int errnum, const char *format, ...) {
+  va_list argp;
+  int saved_errno = errno;
+
+  fflush (stdout);
+
+  va_start(argp, format);
+  if (status)
+    {
+      if (errnum)
+        {
+          errno = errnum;
+          verr (status, format, argp);
+        }
+      else
+        verrx (status, format, argp);
+    }
+  else
+    {
+      if (errnum)
+        {
+          errno = errnum;
+          vwarn (format, argp);
+        }
+      else
+        vwarnx (format, argp);
+    }
+  va_end(argp);
+
+  fflush (stderr);
+
+  ++error_message_count;
+
+  errno = saved_errno;
+}
+#endif
diff --git a/lib/eu-config.h b/lib/eu-config.h
index f0e3d07..c7d7cbb 100644
--- a/lib/eu-config.h
+++ b/lib/eu-config.h
@@ -176,27 +176,68 @@
 /* This macro is used by the tests conditionalize for standalone building.  */
 #define ELFUTILS_HEADER(name) <lib##name.h>
 
+/* Don't reorder with global asm blocks or optimize away. (Doesn't reliably
+   keep it in the same LTO partition, though; -flto-partition=none may be
+   still needed for some gcc versions < 10.) */
+#ifdef __has_attribute
+# if __has_attribute(no_reorder)
+#  define used_in_asm __attribute__ ((externally_visible, no_reorder))
+# endif
+#endif
+#ifndef used_in_asm
+# define used_in_asm /* empty */
+#endif
 
 #ifdef SYMBOL_VERSIONING
-# define OLD_VERSION(name, version) \
-  asm (".globl _compat." #version "." #name "\n" \
-       "_compat." #version "." #name " = " #name "\n" \
-       ".symver _compat." #version "." #name "," #name "@" #version);
-# define NEW_VERSION(name, version) \
-  asm (".symver " #name "," #name "@@@" #version);
-# define COMPAT_VERSION_NEWPROTO(name, version, prefix) \
-  asm (".symver _compat." #version "." #name "," #name "@" #version); \
+# define NEW_INTDEF(name) __typeof (name) INTUSE(name) \
+  __attribute__ ((alias ("_new." #name))) attribute_hidden;
+# ifdef __has_attribute
+#  if __has_attribute(symver)
+#   define NEW_VERSION(name, version) \
+  __typeof (name) name __asm__ ("_new." #name) \
+    __attribute__ ((symver (#name "@@" #version)));
+#   define OLD_VERSION(name, version) _OLD_VERSION1(name, __COUNTER__, version)
+#   define _OLD_VERSION1(name, num, version) _OLD_VERSION2(name, num, version)
+#   define _OLD_VERSION2(name, num, version) \
+  __typeof (name) _compat_old##num##_##name \
+    __asm__ ("_compat." #version "." #name) \
+    __attribute__ ((alias ("_new." #name), symver (#name "@" #version)));
+#   define COMPAT_VERSION_NEWPROTO(name, version, prefix) \
   __typeof (_compat_##prefix##_##name) _compat_##prefix##_##name \
-    asm ("_compat." #version "." #name);
-# define COMPAT_VERSION(name, version, prefix) \
+    __asm__ ("_compat." #version "." #name) \
+    __attribute__ ((symver (#name "@" #version)));
+#   define COMPAT_VERSION(name, version, prefix) \
   asm (".symver _compat." #version "." #name "," #name "@" #version); \
-  __typeof (name) _compat_##prefix##_##name asm ("_compat." #version "." #name);
+  __typeof (name) _compat_##prefix##_##name \
+    __asm__ ("_compat." #version "." #name) \
+    __attribute__ ((symver (#name "@" #version)));
+#  endif
+# endif
+# ifndef NEW_VERSION
+#  define OLD_VERSION(name, version) \
+  asm (".globl _compat." #version "." #name "\n\t" \
+       "_compat." #version "." #name " = _new." #name "\n\t" \
+       ".symver _compat." #version "." #name "," #name "@" #version);
+#  define NEW_VERSION(name, version) \
+  __typeof (name) name __asm__ ("_new." #name) used_in_asm; \
+  asm (".symver _new." #name ", " #name "@@" #version);
+#  define COMPAT_VERSION_NEWPROTO(name, version, prefix) \
+  __typeof (_compat_##prefix##_##name) _compat_##prefix##_##name \
+    __asm__ ("_compat." #version "." #name) used_in_asm; \
+  asm (".symver _compat." #version "." #name ", " #name "@" #version);
+#  define COMPAT_VERSION(name, version, prefix) \
+  __typeof (name) _compat_##prefix##_##name \
+    __asm__ ("_compat." #version "." #name) used_in_asm; \
+  asm (".symver _compat." #version "." #name ", " #name "@" #version);
+# endif
 #else
+# define NEW_INTDEF(name) INTDEF(name)
 # define OLD_VERSION(name, version) /* Nothing for static linking.  */
 # define NEW_VERSION(name, version) /* Nothing for static linking.  */
 # define COMPAT_VERSION_NEWPROTO(name, version, prefix) \
   error "should use #ifdef SYMBOL_VERSIONING"
-# define COMPAT_VERSION(name, version, prefix) error "should use #ifdef SYMBOL_VERSIONING"
+# define COMPAT_VERSION(name, version, prefix) \
+  error "should use #ifdef SYMBOL_VERSIONING"
 #endif
 
 #ifndef FALLTHROUGH
diff --git a/lib/fixedsizehash.h b/lib/fixedsizehash.h
index dac2a5f..14f0fb8 100644
--- a/lib/fixedsizehash.h
+++ b/lib/fixedsizehash.h
@@ -30,17 +30,11 @@
 #include <errno.h>
 #include <stdlib.h>
 #include <string.h>
-#include <sys/cdefs.h>
 
 #include <system.h>
 
-#ifdef __CONCAT
-#define CONCAT(t1,t2) __CONCAT (t1,t2)
-#else
-#define STROF(t2) t2
 #define CONCAT_EXPANDED(t1,t2) t1 ## t2
 #define CONCAT(t1,t2) CONCAT_EXPANDED(t1,t2)
-#endif
 
 /* Before including this file the following macros must be defined:
 
diff --git a/lib/libeu.h b/lib/libeu.h
index ecb4d01..e849a79 100644
--- a/lib/libeu.h
+++ b/lib/libeu.h
@@ -39,6 +39,8 @@
 extern char *xstrdup (const char *) __attribute__ ((__malloc__));
 extern char *xstrndup (const char *, size_t) __attribute__ ((__malloc__));
 
+extern char *xasprintf(const char *fmt, ...)
+	__attribute__ ((format (printf, 1, 2))) __attribute__ ((__malloc__));
 
 extern uint32_t crc32 (uint32_t crc, unsigned char *buf, size_t len);
 extern int crc32_file (int fd, uint32_t *resp);
diff --git a/lib/system.h b/lib/system.h
index 1c478e1..edbc848 100644
--- a/lib/system.h
+++ b/lib/system.h
@@ -29,14 +29,27 @@
 #ifndef LIB_SYSTEM_H
 #define LIB_SYSTEM_H	1
 
+#include <config.h>
+
 #include <errno.h>
-#include <error.h>
 #include <stddef.h>
 #include <stdint.h>
 #include <sys/param.h>
 #include <endian.h>
 #include <byteswap.h>
 #include <unistd.h>
+#include <string.h>
+#include <stdarg.h>
+#include <stdlib.h>
+
+#if defined(HAVE_ERROR_H)
+#include <error.h>
+#elif defined(HAVE_ERR_H)
+extern int error_message_count;
+void error(int status, int errnum, const char *format, ...);
+#else
+#error "err.h or error.h must be available"
+#endif
 
 #if __BYTE_ORDER == __LITTLE_ENDIAN
 # define LE32(n)	(n)
@@ -69,6 +82,27 @@
     ((void *) ((char *) memcpy (dest, src, n) + (size_t) n))
 #endif
 
+#if !HAVE_DECL_REALLOCARRAY
+static inline void *
+reallocarray (void *ptr, size_t nmemb, size_t size)
+{
+  if (size > 0 && nmemb > SIZE_MAX / size)
+    {
+      errno = ENOMEM;
+      return NULL;
+    }
+  return realloc (ptr, nmemb * size);
+}
+#endif
+
+/* Return TRUE if the start of STR matches PREFIX, FALSE otherwise.  */
+
+static inline int
+startswith (const char *str, const char *prefix)
+{
+  return strncmp (str, prefix, strlen (prefix)) == 0;
+}
+
 /* A special gettext function we use if the strings are too short.  */
 #define sgettext(Str) \
   ({ const char *__res = strrchr (_(Str), '|');			      \
@@ -104,7 +138,7 @@
 
   do
     {
-      ssize_t ret = TEMP_FAILURE_RETRY (pwrite (fd, buf + recvd, len - recvd,
+      ssize_t ret = TEMP_FAILURE_RETRY (pwrite (fd, ((char *)buf) + recvd, len - recvd,
 						off + recvd));
       if (ret <= 0)
 	return ret < 0 ? ret : recvd;
@@ -123,7 +157,7 @@
 
   do
     {
-      ssize_t ret = TEMP_FAILURE_RETRY (write (fd, buf + recvd, len - recvd));
+      ssize_t ret = TEMP_FAILURE_RETRY (write (fd, ((char *)buf) + recvd, len - recvd));
       if (ret <= 0)
 	return ret < 0 ? ret : recvd;
 
@@ -141,7 +175,7 @@
 
   do
     {
-      ssize_t ret = TEMP_FAILURE_RETRY (pread (fd, buf + recvd, len - recvd,
+      ssize_t ret = TEMP_FAILURE_RETRY (pread (fd, ((char *)buf) + recvd, len - recvd,
 					       off + recvd));
       if (ret <= 0)
 	return ret < 0 ? ret : recvd;
diff --git a/lib/xasprintf.c b/lib/xasprintf.c
new file mode 100644
index 0000000..179ea2e
--- /dev/null
+++ b/lib/xasprintf.c
@@ -0,0 +1,52 @@
+/* A wrapper around vasprintf that dies in case of an error.
+   Copyright (c) 2021 Dmitry V. Levin <ldv@altlinux.org>
+   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/>.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <libintl.h>
+#include "libeu.h"
+#include "system.h"
+
+char *
+xasprintf (const char *fmt, ...)
+{
+  char *res;
+  va_list ap;
+
+  va_start (ap, fmt);
+  if (unlikely (vasprintf (&res, fmt, ap) < 0))
+    error (EXIT_FAILURE, 0, _("memory exhausted"));
+  va_end(ap);
+
+  return res;
+}
diff --git a/libasm/ChangeLog b/libasm/ChangeLog
index 98ac331..c65fd21 100644
--- a/libasm/ChangeLog
+++ b/libasm/ChangeLog
@@ -1,3 +1,21 @@
+2021-09-06  Dmitry V. Levin  <ldv@altlinux.org>
+
+	* asm_align.c (__libasm_ensure_section_space): Remove casts of calloc
+	return values.
+	* asm_begin.c (asm_begin): Remove cast of malloc return value.
+	* asm_fill.c (asm_fill): Likewise.
+	* asm_newabssym.c (asm_newabssym): Likewise.
+	* asm_newcomsym.c (asm_newcomsym): Likewise.
+	* asm_newscn.c (asm_newscn): Likewise.
+	* asm_newscngrp.c (asm_newscngrp): Likewise.
+	* asm_newsubscn.c (asm_newsubscn): Likewise.
+	* asm_newsym.c (asm_newsym): Likewise.
+	* disasm_begin.c (disasm_begin): Likewise.
+
+2021-04-19  Martin Liska  <mliska@suse.cz>
+
+	* libasmP.h (asm_emit_symbol_p): Use startswith.
+
 2020-12-16  Dmitry V. Levin  <ldv@altlinux.org>
 
 	* libasmP.h (_): Remove.
diff --git a/libasm/asm_align.c b/libasm/asm_align.c
index c8c671b..3a97675 100644
--- a/libasm/asm_align.c
+++ b/libasm/asm_align.c
@@ -143,8 +143,7 @@
       /* This is the first block.  */
       size = MAX (2 * len, 960);
 
-      asmscn->content = (struct AsmData *) calloc (1, sizeof (struct AsmData)
-						   + size);
+      asmscn->content = calloc (1, sizeof (struct AsmData) + size);
       if (asmscn->content == NULL)
 	return -1;
 
@@ -160,7 +159,7 @@
 
       size = MAX (2 *len, MIN (32768, 2 * asmscn->offset));
 
-      newp = (struct AsmData *) calloc (1, sizeof (struct AsmData) + size);
+      newp = calloc (1, sizeof (struct AsmData) + size);
       if (newp == NULL)
 	return -1;
 
diff --git a/libasm/asm_begin.c b/libasm/asm_begin.c
index 1df2d4e..a190202 100644
--- a/libasm/asm_begin.c
+++ b/libasm/asm_begin.c
@@ -138,8 +138,7 @@
      right away.  Instead we create a temporary file in the same
      directory which, if everything goes alright, will replace a
      possibly existing file with the given name.  */
-  AsmCtx_t *result
-    = (AsmCtx_t *) malloc (sizeof (AsmCtx_t) + 2 * fname_len + 9);
+  AsmCtx_t *result = malloc (sizeof (AsmCtx_t) + 2 * fname_len + 9);
   if (result == NULL)
     return NULL;
 
diff --git a/libasm/asm_fill.c b/libasm/asm_fill.c
index 62d9d73..783555e 100644
--- a/libasm/asm_fill.c
+++ b/libasm/asm_fill.c
@@ -54,8 +54,7 @@
   else
     {
       /* Allocate appropriate memory.  */
-      pattern = (struct FillPattern *) malloc (sizeof (struct FillPattern)
-					       + len);
+      pattern = malloc (sizeof (struct FillPattern) + len);
       if (pattern == NULL)
 	return -1;
 
diff --git a/libasm/asm_newabssym.c b/libasm/asm_newabssym.c
index 34fef3e..728d604 100644
--- a/libasm/asm_newabssym.c
+++ b/libasm/asm_newabssym.c
@@ -71,7 +71,7 @@
 
   rwlock_wrlock (ctx->lock);
 
-  result = (AsmSym_t *) malloc (sizeof (AsmSym_t));
+  result = malloc (sizeof (AsmSym_t));
   if (result == NULL)
     return NULL;
 
diff --git a/libasm/asm_newcomsym.c b/libasm/asm_newcomsym.c
index ee3b696..750a138 100644
--- a/libasm/asm_newcomsym.c
+++ b/libasm/asm_newcomsym.c
@@ -71,7 +71,7 @@
 
   rwlock_wrlock (ctx->lock);
 
-  result = (AsmSym_t *) malloc (sizeof (AsmSym_t));
+  result = malloc (sizeof (AsmSym_t));
   if (result == NULL)
     return NULL;
 
diff --git a/libasm/asm_newscn.c b/libasm/asm_newscn.c
index 7cdf484..1150015 100644
--- a/libasm/asm_newscn.c
+++ b/libasm/asm_newscn.c
@@ -181,7 +181,7 @@
   rwlock_wrlock (ctx->lock);
 
   /* This is a new section.  */
-  result = (AsmScn_t *) malloc (sizeof (AsmScn_t) + scnname_len);
+  result = malloc (sizeof (AsmScn_t) + scnname_len);
   if (result != NULL)
     {
       /* Add the name.  */
diff --git a/libasm/asm_newscngrp.c b/libasm/asm_newscngrp.c
index 80757a9..0ca87fb 100644
--- a/libasm/asm_newscngrp.c
+++ b/libasm/asm_newscngrp.c
@@ -57,7 +57,7 @@
       return NULL;
     }
 
-  result = (AsmScnGrp_t *) malloc (sizeof (AsmScnGrp_t) + grpname_len);
+  result = malloc (sizeof (AsmScnGrp_t) + grpname_len);
   if (result == NULL)
     return NULL;
 
diff --git a/libasm/asm_newsubscn.c b/libasm/asm_newsubscn.c
index 906240a..2f2ba78 100644
--- a/libasm/asm_newsubscn.c
+++ b/libasm/asm_newsubscn.c
@@ -62,7 +62,7 @@
       runp = runp->subnext;
     }
 
-  newp = (AsmScn_t *) malloc (sizeof (AsmScn_t));
+  newp = malloc (sizeof (AsmScn_t));
   if (newp == NULL)
     return NULL;
 
diff --git a/libasm/asm_newsym.c b/libasm/asm_newsym.c
index 5389166..a89ee12 100644
--- a/libasm/asm_newsym.c
+++ b/libasm/asm_newsym.c
@@ -73,7 +73,7 @@
 
   size_t name_len = strlen (name) + 1;
 
-  result = (AsmSym_t *) malloc (sizeof (AsmSym_t) + name_len);
+  result = malloc (sizeof (AsmSym_t) + name_len);
   if (result == NULL)
     return NULL;
 
diff --git a/libasm/disasm_begin.c b/libasm/disasm_begin.c
index d00852b..cb10f66 100644
--- a/libasm/disasm_begin.c
+++ b/libasm/disasm_begin.c
@@ -49,7 +49,7 @@
       return NULL;
     }
 
-  DisasmCtx_t *ctx = (DisasmCtx_t *) malloc (sizeof (DisasmCtx_t));
+  DisasmCtx_t *ctx = malloc (sizeof (DisasmCtx_t));
   if (ctx == NULL)
     {
       __libasm_seterrno (ASM_E_NOMEM);
diff --git a/libasm/libasmP.h b/libasm/libasmP.h
index 8b72f32..5b5fb77 100644
--- a/libasm/libasmP.h
+++ b/libasm/libasmP.h
@@ -302,6 +302,6 @@
 // XXX The second part should probably be controlled by an option which
 // isn't implemented yet
 // XXX Also, the format will change with the backend.
-#define asm_emit_symbol_p(name) (strncmp (name, ".L", 2) != 0)
+#define asm_emit_symbol_p(name) (!startswith (name, ".L"))
 
 #endif	/* libasmP.h */
diff --git a/libcpu/Android.bp b/libcpu/Android.bp
index 4b26cdf..b36ac5f 100644
--- a/libcpu/Android.bp
+++ b/libcpu/Android.bp
@@ -49,6 +49,11 @@
     static_libs: [
         "libeu",
     ],
+    target: {
+        musl: {
+            static_libs: ["libobstack"],
+        },
+    },
 }
 
 genrule {
@@ -57,7 +62,7 @@
         "defs/i386",
     ],
     out: ["i386_dis.h"],
-    cmd: "$(location m4) -Di386 -DDISASSEMBLER $(in) > i386_defs && $(location i386_gendis) i386_defs > $(out)",
+    cmd: "$(location m4) -Di386 -DDISASSEMBLER $(in) > $(genDir)/i386_defs && $(location i386_gendis) $(genDir)/i386_defs > $(out)",
     tools: [
         "i386_gendis",
         "m4",
@@ -70,7 +75,7 @@
         "defs/i386",
     ],
     out: ["x86_64_dis.h"],
-    cmd: "$(location m4) -Dx86_64 -DDISASSEMBLER $(in) > x86_64_defs && $(location i386_gendis) x86_64_defs > $(out)",
+    cmd: "$(location m4) -Dx86_64 -DDISASSEMBLER $(in) > $(genDir)/x86_64_defs && $(location i386_gendis) $(genDir)/x86_64_defs > $(out)",
     tools: [
         "i386_gendis",
         "m4",
diff --git a/libdw/ChangeLog b/libdw/ChangeLog
index b8038f0..ca742e6 100644
--- a/libdw/ChangeLog
+++ b/libdw/ChangeLog
@@ -1,3 +1,87 @@
+2021-10-20  John M Mellor-Crummey  <johnmc@rice.edu>
+
+	* dwarf_linecontext.c: New file.
+	* dwarf_linefunctionname.c: Likewise.
+	* Makefile.am (libdw_a_SOURCES): Add dwarf_linecontext.c and
+	dwarf_linefunctionname.c
+	* dwarf.h: Add DW_LNE_NVIDIA_inlined_call and
+	DW_LNE_NVIDIA_set_function_name.
+	* dwarf_getsrclines.c (struct line_state): Add context and
+	function_name fields.
+	(add_new_line): Set context and function_name.
+	(MAX_STACK_LINES): Reduce to MAX_STACK_ALLOC / 2.
+	(read_srclines): Initialize context and function_name.  Try to
+	read debug_str_offset if available.  Handle
+	DW_LNE_NVIDIA_inlined_call and DW_LNE_NVIDIA_set_function_name.
+	* libdw.h (dwarf_linecontext): New declaration.
+	(dwarf_linefunctionname): Likewise.
+	* libdw.map (ELFUTILS_0.186): New section.
+
+2021-11-08  Mark Wielaard  <mark@klomp.org>
+
+	* dwarf_begin_elf.c (scn_dwarf_type): New function.
+	(check_section): Check result->type.
+	(global_read): First check type.
+	(scngrp_read): Likewise.
+	* libdw/libdwP.h (enum dwarf_type): New enumeration.
+	(struct Dwarf): New field type.
+
+2021-02-14  Alexander Miller  <alex.miller@gmx.de>
+
+	* dwarf_aggregate_size.c (dwarf_aggregate_size): Move NEW_VERSION
+	before definition.  Replace INTDEF with NEW_INTDEF.
+	* dwarf_srclang.c (dwarf_srclang): Likewise.
+	* dwarf_arrayorder.c (dwarf_arrayorder): Move NEW_VERSION.
+	* dwarf_bitoffset.c (dwarf_bitoffset): Likewise.
+	* dwarf_bitsize.c (dwarf_bitsize): Likewise.
+	* dwarf_bytesize.c (dwarf_bytesize): Likewise.
+	* dwarf_decl_column.c (dwarf_decl_column): Likewise.
+
+2021-10-18  Mark Wielaard  <mark@klomp.org>
+
+	* dwarf_aggregate_size.c (get_type): Don't pass NULL to
+	dwarf_peel_type.
+
+2021-10-06  Mark Wielaard  <mark@klomp.org>
+
+	* dwarf_aggregate_size.c (array_size): Check signedness of child DIE
+	type. Use dwarf_formsdata or dwarf_formudata to get the lower and
+	upper bounds.
+
+2021-09-08  Mark Wielaard  <mark@klomp.org>
+
+	* dwarf_begin_elf.c (valid_p): Identify ELF class and use this to set
+	address_size of the fake CUs. Also set offset_size and DWARF version.
+
+2021-09-06  Dmitry V. Levin  <ldv@altlinux.org>
+
+	* dwarf_begin_elf.c (valid_p): Remove casts of malloc return values.
+	(dwarf_begin_elf): Remove cast of calloc return value.
+	* dwarf_getpubnames.c (get_offsets): Remove casts of realloc return
+	values.
+	* dwarf_getsrclines.c (read_srclines): Remove cast of malloc return
+	value.
+
+2021-04-19  Martin Liska  <mliska@suse.cz>
+
+	* dwarf_begin_elf.c (check_section): Use startswith.
+
+2021-05-01  Mark Wielaard  <mark@klomp.org>
+
+	* libdw_form.c (__libdw_form_val_compute_len): Check indirect
+	form is not DW_FORM_indirect or DW_FORM_implicit_const.
+
+2021-04-23  Omar Sandoval  <osandov@fb.com>
+
+	* dwarf_child.c (__libdw_find_attr): Handle DW_FORM_indirect.
+	* dwarf_getattrs.c (dwarf_getattrs): Handle DW_FORM_indirect.
+
+2021-02-12  Mark Wielaard  <mark@klomp.org>
+
+	* dwarf_getlocation.c (attr_ok): For DWARF version 4 or higher
+	block forms are not expression locations.
+	(is_constant_offset): DW_FORM_implicit_const is also a constant.
+
 2020-12-20  Dmitry V. Levin  <ldv@altlinux.org>
 
 	* .gitignore: New file.
diff --git a/libdw/Makefile.am b/libdw/Makefile.am
index 6b7834a..4fda33b 100644
--- a/libdw/Makefile.am
+++ b/libdw/Makefile.am
@@ -63,6 +63,7 @@
 		  dwarf_linesrc.c dwarf_lineno.c dwarf_lineaddr.c \
 		  dwarf_linecol.c dwarf_linebeginstatement.c \
 		  dwarf_lineendsequence.c dwarf_lineblock.c \
+		  dwarf_linecontext.c dwarf_linefunctionname.c \
 		  dwarf_lineprologueend.c dwarf_lineepiloguebegin.c \
 		  dwarf_lineisa.c dwarf_linediscriminator.c \
 		  dwarf_lineop_index.c dwarf_line_file.c \
diff --git a/libdw/dwarf.h b/libdw/dwarf.h
index 19a4be9..3ce7f23 100644
--- a/libdw/dwarf.h
+++ b/libdw/dwarf.h
@@ -844,6 +844,10 @@
     DW_LNE_set_discriminator = 4,
 
     DW_LNE_lo_user = 128,
+
+    DW_LNE_NVIDIA_inlined_call = 144,
+    DW_LNE_NVIDIA_set_function_name = 145,
+
     DW_LNE_hi_user = 255
   };
 
diff --git a/libdw/dwarf_aggregate_size.c b/libdw/dwarf_aggregate_size.c
index 75105e4..8216ae4 100644
--- a/libdw/dwarf_aggregate_size.c
+++ b/libdw/dwarf_aggregate_size.c
@@ -40,7 +40,7 @@
   Dwarf_Die *type = INTUSE(dwarf_formref_die)
     (INTUSE(dwarf_attr_integrate) (die, DW_AT_type, attr_mem), type_mem);
 
-  if (INTUSE(dwarf_peel_type) (type, type) != 0)
+  if (type == NULL || INTUSE(dwarf_peel_type) (type, type) != 0)
     return NULL;
 
   return type;
@@ -83,19 +83,51 @@
 	    }
 	  else
 	    {
+	      bool is_signed = true;
+	      if (INTUSE(dwarf_attr) (get_type (&child, attr_mem, &type_mem),
+				      DW_AT_encoding, attr_mem) != NULL)
+		{
+		  Dwarf_Word encoding;
+		  if (INTUSE(dwarf_formudata) (attr_mem, &encoding) == 0)
+		    is_signed = (encoding == DW_ATE_signed
+				 || encoding == DW_ATE_signed_char);
+		}
+
 	      Dwarf_Sword upper;
 	      Dwarf_Sword lower;
-	      if (INTUSE(dwarf_formsdata) (INTUSE(dwarf_attr_integrate)
-					   (&child, DW_AT_upper_bound,
-					    attr_mem), &upper) != 0)
-		return -1;
+	      if (is_signed)
+		{
+		  if (INTUSE(dwarf_formsdata) (INTUSE(dwarf_attr_integrate)
+					       (&child, DW_AT_upper_bound,
+						attr_mem), &upper) != 0)
+		    return -1;
+		}
+	      else
+		{
+		  Dwarf_Word unsigned_upper;
+		  if (INTUSE(dwarf_formudata) (INTUSE(dwarf_attr_integrate)
+					       (&child, DW_AT_upper_bound,
+						attr_mem), &unsigned_upper) != 0)
+		    return -1;
+		  upper = unsigned_upper;
+		}
 
 	      /* Having DW_AT_lower_bound is optional.  */
 	      if (INTUSE(dwarf_attr_integrate) (&child, DW_AT_lower_bound,
 						attr_mem) != NULL)
 		{
-		  if (INTUSE(dwarf_formsdata) (attr_mem, &lower) != 0)
-		    return -1;
+		  if (is_signed)
+		    {
+		      if (INTUSE(dwarf_formsdata) (attr_mem, &lower) != 0)
+			return -1;
+		    }
+		  else
+		    {
+		      Dwarf_Word unsigned_lower;
+		      if (INTUSE(dwarf_formudata) (attr_mem, &unsigned_lower) != 0)
+			return -1;
+		      lower = unsigned_lower;
+		    }
 		}
 	      else
 		{
@@ -209,6 +241,7 @@
   return -1;
 }
 
+NEW_VERSION (dwarf_aggregate_size, ELFUTILS_0.161)
 int
 dwarf_aggregate_size (Dwarf_Die *die, Dwarf_Word *size)
 {
@@ -219,6 +252,5 @@
 
   return aggregate_size (&die_mem, size, &type_mem, 0);
 }
-INTDEF (dwarf_aggregate_size)
+NEW_INTDEF (dwarf_aggregate_size)
 OLD_VERSION (dwarf_aggregate_size, ELFUTILS_0.144)
-NEW_VERSION (dwarf_aggregate_size, ELFUTILS_0.161)
diff --git a/libdw/dwarf_arrayorder.c b/libdw/dwarf_arrayorder.c
index da64f99..782e075 100644
--- a/libdw/dwarf_arrayorder.c
+++ b/libdw/dwarf_arrayorder.c
@@ -35,6 +35,7 @@
 #include "libdwP.h"
 
 
+NEW_VERSION (dwarf_arrayorder, ELFUTILS_0.143)
 int
 dwarf_arrayorder (Dwarf_Die *die)
 {
@@ -46,4 +47,3 @@
 				  &value) == 0 ? (int) value : -1;
 }
 OLD_VERSION (dwarf_arrayorder, ELFUTILS_0.122)
-NEW_VERSION (dwarf_arrayorder, ELFUTILS_0.143)
diff --git a/libdw/dwarf_begin_elf.c b/libdw/dwarf_begin_elf.c
index 757ac4f..a48dada 100644
--- a/libdw/dwarf_begin_elf.c
+++ b/libdw/dwarf_begin_elf.c
@@ -30,6 +30,8 @@
 # include <config.h>
 #endif
 
+#include <system.h>
+
 #include <assert.h>
 #include <stdbool.h>
 #include <stddef.h>
@@ -70,6 +72,31 @@
 };
 #define ndwarf_scnnames (sizeof (dwarf_scnnames) / sizeof (dwarf_scnnames[0]))
 
+static enum dwarf_type
+scn_dwarf_type (Dwarf *result, size_t shstrndx, Elf_Scn *scn)
+{
+  GElf_Shdr shdr_mem;
+  GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem);
+  if (shdr == NULL)
+    return TYPE_UNKNOWN;
+
+  const char *scnname = elf_strptr (result->elf, shstrndx,
+				    shdr->sh_name);
+  if (scnname != NULL)
+    {
+      if (startswith (scnname, ".gnu.debuglto_.debug"))
+	return TYPE_GNU_LTO;
+      else if (startswith (scnname, ".debug_") || startswith (scnname, ".zdebug_"))
+	{
+	  size_t len = strlen (scnname);
+	  if (strcmp (scnname + len - 4, ".dwo") == 0)
+	    return TYPE_DWO;
+	  else
+	    return TYPE_PLAIN;
+	}
+    }
+  return TYPE_UNKNOWN;
+}
 static Dwarf *
 check_section (Dwarf *result, size_t shstrndx, Elf_Scn *scn, bool inscngrp)
 {
@@ -114,7 +141,11 @@
       return NULL;
     }
 
-  /* Recognize the various sections.  Most names start with .debug_.  */
+  /* Recognize the various sections.  Most names start with .debug_.
+     They might be compressed (and start with .z).  Or end with .dwo
+     for split dwarf sections.  Or start with .gnu.debuglto_ for
+     LTO debug sections.  We should only use one consistent set at
+     a time.  We prefer PLAIN over DWO over LTO.  */
   size_t cnt;
   bool gnu_compressed = false;
   for (cnt = 0; cnt < ndwarf_scnnames; ++cnt)
@@ -125,7 +156,15 @@
 	  && (dbglen == scnlen
 	      || (scnlen == dbglen + 4
 		  && strstr (scnname, ".dwo") == scnname + dbglen)))
-	break;
+	{
+	  if (dbglen == scnlen)
+	    {
+	      if (result->type == TYPE_PLAIN)
+		break;
+	    }
+	  else if (result->type == TYPE_DWO)
+	    break;
+	}
       else if (scnname[0] == '.' && scnname[1] == 'z'
 	       && (strncmp (&scnname[2], &dwarf_scnnames[cnt][1],
 			    dbglen - 1) == 0
@@ -134,13 +173,27 @@
 			   && strstr (scnname,
 				      ".dwo") == scnname + dbglen + 1))))
 	{
-	  gnu_compressed = true;
-	  break;
+	  if (scnlen == dbglen + 1)
+	    {
+	      if (result->type == TYPE_PLAIN)
+		{
+		  gnu_compressed = true;
+		  break;
+		}
+	    }
+	  else if (result->type <= TYPE_DWO)
+	    {
+	      gnu_compressed = true;
+	      break;
+	    }
 	}
       else if (scnlen > 14 /* .gnu.debuglto_ prefix. */
-	       && strncmp (scnname, ".gnu.debuglto_", 14) == 0
+	       && startswith (scnname, ".gnu.debuglto_")
 	       && strcmp (&scnname[14], dwarf_scnnames[cnt]) == 0)
-	break;
+	{
+	  if (result->type == TYPE_GNU_LTO)
+	    break;
+	}
     }
 
   if (cnt >= ndwarf_scnnames)
@@ -222,12 +275,29 @@
       result = NULL;
     }
 
+  /* We are setting up some "fake" CUs, which need an address size.
+     Check the ELF class to come up with something reasonable.  */
+  int elf_addr_size = 8;
+  if (result != NULL)
+    {
+      GElf_Ehdr ehdr;
+      if (gelf_getehdr (result->elf, &ehdr) == NULL)
+	{
+	  Dwarf_Sig8_Hash_free (&result->sig8_hash);
+	  __libdw_seterrno (DWARF_E_INVALID_ELF);
+	  free (result);
+	  result = NULL;
+	}
+      else if (ehdr.e_ident[EI_CLASS] == ELFCLASS32)
+	elf_addr_size = 4;
+    }
+
   /* For dwarf_location_attr () we need a "fake" CU to indicate
      where the "fake" attribute data comes from.  This is a block
      inside the .debug_loc or .debug_loclists section.  */
   if (result != NULL && result->sectiondata[IDX_debug_loc] != NULL)
     {
-      result->fake_loc_cu = (Dwarf_CU *) malloc (sizeof (Dwarf_CU));
+      result->fake_loc_cu = malloc (sizeof (Dwarf_CU));
       if (unlikely (result->fake_loc_cu == NULL))
 	{
 	  Dwarf_Sig8_Hash_free (&result->sig8_hash);
@@ -245,15 +315,16 @@
 	    = (result->sectiondata[IDX_debug_loc]->d_buf
 	       + result->sectiondata[IDX_debug_loc]->d_size);
 	  result->fake_loc_cu->locs = NULL;
-	  result->fake_loc_cu->address_size = 0;
-	  result->fake_loc_cu->version = 0;
+	  result->fake_loc_cu->address_size = elf_addr_size;
+	  result->fake_loc_cu->offset_size = 4;
+	  result->fake_loc_cu->version = 4;
 	  result->fake_loc_cu->split = NULL;
 	}
     }
 
   if (result != NULL && result->sectiondata[IDX_debug_loclists] != NULL)
     {
-      result->fake_loclists_cu = (Dwarf_CU *) malloc (sizeof (Dwarf_CU));
+      result->fake_loclists_cu = malloc (sizeof (Dwarf_CU));
       if (unlikely (result->fake_loclists_cu == NULL))
 	{
 	  Dwarf_Sig8_Hash_free (&result->sig8_hash);
@@ -272,8 +343,9 @@
 	    = (result->sectiondata[IDX_debug_loclists]->d_buf
 	       + result->sectiondata[IDX_debug_loclists]->d_size);
 	  result->fake_loclists_cu->locs = NULL;
-	  result->fake_loclists_cu->address_size = 0;
-	  result->fake_loclists_cu->version = 0;
+	  result->fake_loclists_cu->address_size = elf_addr_size;
+	  result->fake_loclists_cu->offset_size = 4;
+	  result->fake_loclists_cu->version = 5;
 	  result->fake_loclists_cu->split = NULL;
 	}
     }
@@ -284,7 +356,7 @@
      inside the .debug_addr section, if it exists.  */
   if (result != NULL && result->sectiondata[IDX_debug_addr] != NULL)
     {
-      result->fake_addr_cu = (Dwarf_CU *) malloc (sizeof (Dwarf_CU));
+      result->fake_addr_cu = malloc (sizeof (Dwarf_CU));
       if (unlikely (result->fake_addr_cu == NULL))
 	{
 	  Dwarf_Sig8_Hash_free (&result->sig8_hash);
@@ -304,8 +376,9 @@
 	    = (result->sectiondata[IDX_debug_addr]->d_buf
 	       + result->sectiondata[IDX_debug_addr]->d_size);
 	  result->fake_addr_cu->locs = NULL;
-	  result->fake_addr_cu->address_size = 0;
-	  result->fake_addr_cu->version = 0;
+	  result->fake_addr_cu->address_size = elf_addr_size;
+	  result->fake_addr_cu->offset_size = 4;
+	  result->fake_addr_cu->version = 5;
 	  result->fake_addr_cu->split = NULL;
 	}
     }
@@ -322,6 +395,16 @@
 {
   Elf_Scn *scn = NULL;
 
+  /* First check the type (PLAIN, DWO, LTO) we are looking for.  We
+     prefer PLAIN if available over DWO, over LTO.  */
+  while ((scn = elf_nextscn (elf, scn)) != NULL && result->type != TYPE_PLAIN)
+    {
+      enum dwarf_type type = scn_dwarf_type (result, shstrndx, scn);
+      if (type > result->type)
+	result->type = type;
+    }
+
+  scn = NULL;
   while (result != NULL && (scn = elf_nextscn (elf, scn)) != NULL)
     result = check_section (result, shstrndx, scn, false);
 
@@ -366,6 +449,9 @@
      represent section indices.  The first word is a flag word.  */
   Elf32_Word *scnidx = (Elf32_Word *) data->d_buf;
   size_t cnt;
+
+  /* First check the type (PLAIN, DWO, LTO) we are looking for.  We
+     prefer PLAIN if available over DWO, over LTO.  */
   for (cnt = 1; cnt * sizeof (Elf32_Word) <= data->d_size; ++cnt)
     {
       Elf_Scn *scn = elf_getscn (elf, scnidx[cnt]);
@@ -379,6 +465,15 @@
 	  return NULL;
 	}
 
+      enum dwarf_type type = scn_dwarf_type (result, shstrndx, scn);
+      if (type > result->type)
+	result->type = type;
+    }
+
+  for (cnt = 1; cnt * sizeof (Elf32_Word) <= data->d_size && result != NULL; ++cnt)
+    {
+      Elf_Scn *scn = elf_getscn (elf, scnidx[cnt]);
+      assert (scn != NULL); // checked above
       result = check_section (result, shstrndx, scn, true);
       if (result == NULL)
 	break;
@@ -413,7 +508,7 @@
   assert (sizeof (struct Dwarf) < mem_default_size);
 
   /* Allocate the data structure.  */
-  Dwarf *result = (Dwarf *) calloc (1, sizeof (Dwarf));
+  Dwarf *result = calloc (1, sizeof (Dwarf));
   if (unlikely (result == NULL)
       || unlikely (Dwarf_Sig8_Hash_init (&result->sig8_hash, 11) < 0))
     {
diff --git a/libdw/dwarf_bitoffset.c b/libdw/dwarf_bitoffset.c
index c1a3a34..61a0d59 100644
--- a/libdw/dwarf_bitoffset.c
+++ b/libdw/dwarf_bitoffset.c
@@ -35,6 +35,7 @@
 #include "libdwP.h"
 
 
+NEW_VERSION (dwarf_bitoffset, ELFUTILS_0.143)
 int
 dwarf_bitoffset (Dwarf_Die *die)
 {
@@ -46,4 +47,3 @@
 				  &value) == 0 ? (int) value : -1;
 }
 OLD_VERSION (dwarf_bitoffset, ELFUTILS_0.122)
-NEW_VERSION (dwarf_bitoffset, ELFUTILS_0.143)
diff --git a/libdw/dwarf_bitsize.c b/libdw/dwarf_bitsize.c
index 0ed9b71..35e8744 100644
--- a/libdw/dwarf_bitsize.c
+++ b/libdw/dwarf_bitsize.c
@@ -35,6 +35,7 @@
 #include "libdwP.h"
 
 
+NEW_VERSION (dwarf_bitsize, ELFUTILS_0.143)
 int
 dwarf_bitsize (Dwarf_Die *die)
 {
@@ -46,4 +47,3 @@
 				  &value) == 0 ? (int) value : -1;
 }
 OLD_VERSION (dwarf_bitsize, ELFUTILS_0.122)
-NEW_VERSION (dwarf_bitsize, ELFUTILS_0.143)
diff --git a/libdw/dwarf_bytesize.c b/libdw/dwarf_bytesize.c
index 116cd32..6d1ff9a 100644
--- a/libdw/dwarf_bytesize.c
+++ b/libdw/dwarf_bytesize.c
@@ -35,6 +35,7 @@
 #include "libdwP.h"
 
 
+NEW_VERSION (dwarf_bytesize, ELFUTILS_0.143)
 int
 dwarf_bytesize (Dwarf_Die *die)
 {
@@ -46,4 +47,3 @@
 				  &value) == 0 ? (int) value : -1;
 }
 OLD_VERSION (dwarf_bytesize, ELFUTILS_0.122)
-NEW_VERSION (dwarf_bytesize, ELFUTILS_0.143)
diff --git a/libdw/dwarf_child.c b/libdw/dwarf_child.c
index 2e39d83..c8c8bb6 100644
--- a/libdw/dwarf_child.c
+++ b/libdw/dwarf_child.c
@@ -53,6 +53,8 @@
       return NULL;
     }
 
+  const unsigned char *endp = die->cu->endp;
+
   /* Search the name attribute.  Attribute has been checked when
      Dwarf_Abbrev was created, we can read unchecked.  */
   const unsigned char *attrp = abbrevp->attrp;
@@ -69,6 +71,17 @@
       if (attr_name == 0 && attr_form == 0)
 	break;
 
+      if (attr_form == DW_FORM_indirect)
+	{
+	  get_uleb128 (attr_form, readp, endp);
+	  if (attr_form == DW_FORM_indirect ||
+	      attr_form == DW_FORM_implicit_const)
+	    {
+	      __libdw_seterrno (DWARF_E_INVALID_DWARF);
+	      return NULL;
+	    }
+	}
+
       /* Is this the name attribute?  */
       if (attr_name == search_name && search_name != INVALID)
 	{
diff --git a/libdw/dwarf_decl_column.c b/libdw/dwarf_decl_column.c
index 08d36b8..3225fd1 100644
--- a/libdw/dwarf_decl_column.c
+++ b/libdw/dwarf_decl_column.c
@@ -35,10 +35,10 @@
 #include "libdwP.h"
 
 
+NEW_VERSION (dwarf_decl_column, ELFUTILS_0.143)
 int
 dwarf_decl_column (Dwarf_Die *decl, int *colp)
 {
   return __libdw_attr_intval (decl, colp, DW_AT_decl_column);
 }
 OLD_VERSION (dwarf_decl_column, ELFUTILS_0.122)
-NEW_VERSION (dwarf_decl_column, ELFUTILS_0.143)
diff --git a/libdw/dwarf_decl_file.c b/libdw/dwarf_decl_file.c
index d4aa0a1..75662a3 100644
--- a/libdw/dwarf_decl_file.c
+++ b/libdw/dwarf_decl_file.c
@@ -36,6 +36,7 @@
 #include "libdwP.h"
 
 
+NEW_VERSION (dwarf_decl_file, ELFUTILS_0.143)
 const char *
 dwarf_decl_file (Dwarf_Die *die)
 {
@@ -86,4 +87,3 @@
   return cu->files->info[idx].name;
 }
 OLD_VERSION (dwarf_decl_file, ELFUTILS_0.122)
-NEW_VERSION (dwarf_decl_file, ELFUTILS_0.143)
diff --git a/libdw/dwarf_decl_line.c b/libdw/dwarf_decl_line.c
index 80fae6c..6b31eeb 100644
--- a/libdw/dwarf_decl_line.c
+++ b/libdw/dwarf_decl_line.c
@@ -37,13 +37,13 @@
 #include "libdwP.h"
 
 
+NEW_VERSION (dwarf_decl_line, ELFUTILS_0.143)
 int
 dwarf_decl_line (Dwarf_Die *func, int *linep)
 {
   return __libdw_attr_intval (func, linep, DW_AT_decl_line);
 }
 OLD_VERSION (dwarf_decl_line, ELFUTILS_0.122)
-NEW_VERSION (dwarf_decl_line, ELFUTILS_0.143)
 
 
 int internal_function
diff --git a/libdw/dwarf_getattrs.c b/libdw/dwarf_getattrs.c
index 4ac16b1..770c32c 100644
--- a/libdw/dwarf_getattrs.c
+++ b/libdw/dwarf_getattrs.c
@@ -55,6 +55,8 @@
       return -1l;
     }
 
+  const unsigned char *endp = die->cu->endp;
+
   /* This is where the attributes start.  */
   const unsigned char *attrp = abbrevp->attrp;
   const unsigned char *const offset_attrp = abbrevp->attrp + offset;
@@ -78,6 +80,17 @@
 	   offset of an attribute.  */
         return 1l;
 
+      if (attr.form == DW_FORM_indirect)
+	{
+	  get_uleb128 (attr.form, die_addr, endp);
+	  if (attr.form == DW_FORM_indirect ||
+	      attr.form == DW_FORM_implicit_const)
+	    {
+	      __libdw_seterrno (DWARF_E_INVALID_DWARF);
+	      return -1l;
+	    }
+	}
+
       /* If we are not to OFFSET_ATTRP yet, we just have to skip
 	 the values of the intervening attributes.  */
       if (remembered_attrp >= offset_attrp)
diff --git a/libdw/dwarf_getlocation.c b/libdw/dwarf_getlocation.c
index 4e582db..5db3cf9 100644
--- a/libdw/dwarf_getlocation.c
+++ b/libdw/dwarf_getlocation.c
@@ -48,6 +48,22 @@
   if (dwarf_whatform (attr) == DW_FORM_exprloc)
     return true;
 
+  if (attr->cu->version >= 4)
+    {
+      /* Must be an exprloc (or constant), just not any block form.  */
+      switch (dwarf_whatform (attr))
+	{
+	case DW_FORM_block:
+	case DW_FORM_block1:
+	case DW_FORM_block2:
+	case DW_FORM_block4:
+	  __libdw_seterrno (DWARF_E_NO_LOC_VALUE);
+	  return false;
+	default:
+	  break;
+	}
+    }
+
   /* Otherwise must be one of the attributes listed below.  Older
      DWARF versions might have encoded the exprloc as block, and we
      cannot easily distinguish attributes in the loclist class because
@@ -186,6 +202,7 @@
     case DW_FORM_data8:
     case DW_FORM_sdata:
     case DW_FORM_udata:
+    case DW_FORM_implicit_const:
       break;
     }
 
diff --git a/libdw/dwarf_getpubnames.c b/libdw/dwarf_getpubnames.c
index 25600f3..de72640 100644
--- a/libdw/dwarf_getpubnames.c
+++ b/libdw/dwarf_getpubnames.c
@@ -57,8 +57,7 @@
       if (cnt >= allocated)
 	{
 	  allocated = MAX (10, 2 * allocated);
-	  struct pubnames_s *newmem
-	    = (struct pubnames_s *) realloc (mem, allocated * entsize);
+	  struct pubnames_s *newmem = realloc (mem, allocated * entsize);
 	  if (newmem == NULL)
 	    {
 	      __libdw_seterrno (DWARF_E_NOMEM);
@@ -132,7 +131,7 @@
       return -1;
     }
 
-  dbg->pubnames_sets = (struct pubnames_s *) realloc (mem, cnt * entsize);
+  dbg->pubnames_sets = realloc (mem, cnt * entsize);
   dbg->pubnames_nsets = cnt;
 
   return 0;
diff --git a/libdw/dwarf_getsrclines.c b/libdw/dwarf_getsrclines.c
index d6a581a..2c1d7a4 100644
--- a/libdw/dwarf_getsrclines.c
+++ b/libdw/dwarf_getsrclines.c
@@ -93,6 +93,8 @@
   struct linelist *linelist;
   size_t nlinelist;
   unsigned int end_sequence;
+  unsigned int context;
+  unsigned int function_name;
 };
 
 static inline void
@@ -139,6 +141,8 @@
   SET (epilogue_begin);
   SET (isa);
   SET (discriminator);
+  SET (context);
+  SET (function_name);
 
 #undef SET
 
@@ -161,7 +165,7 @@
      the stack.  Stack allocate some entries, only dynamically malloc
      when more than MAX.  */
 #define MAX_STACK_ALLOC 4096
-#define MAX_STACK_LINES MAX_STACK_ALLOC
+#define MAX_STACK_LINES (MAX_STACK_ALLOC / 2)
 #define MAX_STACK_FILES (MAX_STACK_ALLOC / 4)
 #define MAX_STACK_DIRS  (MAX_STACK_ALLOC / 16)
 
@@ -180,7 +184,9 @@
       .prologue_end = false,
       .epilogue_begin = false,
       .isa = 0,
-      .discriminator = 0
+      .discriminator = 0,
+      .context = 0,
+      .function_name = 0
     };
 
   /* The dirs normally go on the stack, but if there are too many
@@ -372,7 +378,7 @@
     {
       if (ndirlist > SIZE_MAX / sizeof (*dirarray))
 	goto no_mem;
-      dirarray = (struct dirlist *) malloc (ndirlist * sizeof (*dirarray));
+      dirarray = malloc (ndirlist * sizeof (*dirarray));
       if (unlikely (dirarray == NULL))
 	{
 	no_mem:
@@ -648,6 +654,13 @@
 	}
     }
 
+  unsigned int debug_str_offset = 0;
+  if (unlikely (linep == header_start + header_length - 4))
+    {
+      /* CUBINs contain an unsigned 4-byte offset */
+      debug_str_offset = read_4ubyte_unaligned_inc (dbg, linep);
+    }
+
   /* Consistency check.  */
   if (unlikely (linep != header_start + header_length))
     {
@@ -753,6 +766,8 @@
 	      state.epilogue_begin = false;
 	      state.isa = 0;
 	      state.discriminator = 0;
+	      state.context = 0;
+	      state.function_name = 0;
 	      break;
 
 	    case DW_LNE_set_address:
@@ -831,6 +846,23 @@
 	      get_uleb128 (state.discriminator, linep, lineendp);
 	      break;
 
+	    case DW_LNE_NVIDIA_inlined_call:
+	      if (unlikely (linep >= lineendp))
+		goto invalid_data;
+	      get_uleb128 (state.context, linep, lineendp);
+	      if (unlikely (linep >= lineendp))
+		goto invalid_data;
+	      get_uleb128 (state.function_name, linep, lineendp);
+	      state.function_name += debug_str_offset;
+	      break;
+
+	    case DW_LNE_NVIDIA_set_function_name:
+	      if (unlikely (linep >= lineendp))
+		goto invalid_data;
+	      get_uleb128 (state.function_name, linep, lineendp);
+	      state.function_name += debug_str_offset;
+	      break;
+
 	    default:
 	      /* Unknown, ignore it.  */
 	      if (unlikely ((size_t) (lineendp - (linep - 1)) < len))
diff --git a/libdw/dwarf_linecontext.c b/libdw/dwarf_linecontext.c
new file mode 100644
index 0000000..84572e2
--- /dev/null
+++ b/libdw/dwarf_linecontext.c
@@ -0,0 +1,45 @@
+/* Return context in line.
+   This file is part of elfutils.
+   Written by John Mellor-Crummey <johnmc@rice.edu>, 2021.
+
+   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/>.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include "libdwP.h"
+
+
+Dwarf_Line*
+dwarf_linecontext (Dwarf_Lines* lines, Dwarf_Line *line)
+{
+  if (lines == NULL || line == NULL)
+    return NULL;
+  if (line->context == 0 || line->context >= lines->nlines)
+    return NULL;
+
+  return lines->info + (line->context - 1);
+}
diff --git a/libdw/dwarf_linefunctionname.c b/libdw/dwarf_linefunctionname.c
new file mode 100644
index 0000000..e194d21
--- /dev/null
+++ b/libdw/dwarf_linefunctionname.c
@@ -0,0 +1,52 @@
+/* Return function name in line.
+   This file is part of elfutils.
+   Written by John Mellor-Crummey <johnmc@rice.edu>, 2021.
+
+   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/>.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <string.h>
+#include "libdwP.h"
+
+
+const char *
+dwarf_linefunctionname (Dwarf *dbg, Dwarf_Line *line)
+{
+  if (dbg == NULL || line == NULL)
+    return NULL;
+  if (line->context == 0)
+    return NULL;
+
+  Elf_Data *str_data = dbg->sectiondata[IDX_debug_str];
+  if (str_data == NULL || line->function_name >= str_data->d_size
+      || memchr (str_data->d_buf + line->function_name, '\0',
+		 str_data->d_size - line->function_name) == NULL)
+    return NULL;
+
+  return (char *) str_data->d_buf + line->function_name;
+}
diff --git a/libdw/dwarf_srclang.c b/libdw/dwarf_srclang.c
index f10e764..77bd58c 100644
--- a/libdw/dwarf_srclang.c
+++ b/libdw/dwarf_srclang.c
@@ -35,6 +35,7 @@
 #include "libdwP.h"
 
 
+NEW_VERSION (dwarf_srclang, ELFUTILS_0.143)
 int
 dwarf_srclang (Dwarf_Die *die)
 {
@@ -45,6 +46,5 @@
 				  (die, DW_AT_language, &attr_mem),
 				  &value) == 0 ? (int) value : -1;
 }
-INTDEF (dwarf_srclang)
+NEW_INTDEF (dwarf_srclang)
 OLD_VERSION (dwarf_srclang, ELFUTILS_0.122)
-NEW_VERSION (dwarf_srclang, ELFUTILS_0.143)
diff --git a/libdw/libdw.h b/libdw/libdw.h
index 77174d2..64d1689 100644
--- a/libdw/libdw.h
+++ b/libdw/libdw.h
@@ -701,6 +701,15 @@
 extern const char *dwarf_linesrc (Dwarf_Line *line,
 				  Dwarf_Word *mtime, Dwarf_Word *length);
 
+/* Return the caller of this line if inlined.  If not inlined,
+   return NULL.  */
+extern Dwarf_Line *dwarf_linecontext (Dwarf_Lines *lines, Dwarf_Line *line);
+
+/* Return the function name in this line record. If this line is
+   inlined, this is the name of the function that was inlined. If this line
+   is not inlined, return NULL.  */
+extern const char *dwarf_linefunctionname (Dwarf *dbg, Dwarf_Line *line);
+
 /* Return file information.  The returned string is NULL when
    an error occurred, or the file path.  The file path is either absolute
    or relative to the compilation directory.  See dwarf_decl_file.  */
diff --git a/libdw/libdw.map b/libdw/libdw.map
index 8ab0a2a..4f53037 100644
--- a/libdw/libdw.map
+++ b/libdw/libdw.map
@@ -360,3 +360,9 @@
     # presume that NULL is only returned on error (otherwise ELF_K_NONE).
     dwelf_elf_begin;
 } ELFUTILS_0.175;
+
+ELFUTILS_0.186 {
+  global:
+    dwarf_linecontext;
+    dwarf_linefunctionname;
+} ELFUTILS_0.177;
diff --git a/libdw/libdwP.h b/libdw/libdwP.h
index 7174ea9..360ad01 100644
--- a/libdw/libdwP.h
+++ b/libdw/libdwP.h
@@ -145,6 +145,16 @@
 
 #include "dwarf_sig8_hash.h"
 
+/* The type of Dwarf object, sorted by preference
+   (if there is a higher order type, we pick that one over the others).  */
+enum dwarf_type
+  {
+    TYPE_UNKNOWN = 0,
+    TYPE_GNU_LTO = 16,
+    TYPE_DWO = 32,
+    TYPE_PLAIN = 64,
+  };
+
 /* This is the structure representing the debugging state.  */
 struct Dwarf
 {
@@ -216,6 +226,8 @@
   /* Similar for addrx/constx, which will come from .debug_addr section.  */
   struct Dwarf_CU *fake_addr_cu;
 
+  enum dwarf_type type;
+
   /* Supporting lock for internal memory handling.  Ensures threads that have
      an entry in the mem_tails array are not disturbed by new threads doing
      allocations for this Dwarf.  */
@@ -291,6 +303,9 @@
   unsigned int op_index:8;
   unsigned int isa:8;
   unsigned int discriminator:24;
+  /* These are currently only used for the NVIDIA extensions.  */
+  unsigned int context;
+  unsigned int function_name;
 };
 
 struct Dwarf_Lines_s
diff --git a/libdw/libdw_form.c b/libdw/libdw_form.c
index 584c846..c83dfb3 100644
--- a/libdw/libdw_form.c
+++ b/libdw/libdw_form.c
@@ -116,8 +116,12 @@
       break;
 
     case DW_FORM_indirect:
+      /* The amount of data to skip in the DIE is the size of the actual
+	 FORM data (which is __libdw_form_val_len) plus the size of the
+	 uleb128 encoding that FORM (which is valp - startp).  */
       get_uleb128 (u128, valp, endp);
-      // XXX Is this really correct?
+      if (*valp == DW_FORM_indirect || *valp == DW_FORM_implicit_const)
+	return (size_t) -1;
       result = __libdw_form_val_len (cu, u128, valp);
       if (result != (size_t) -1)
 	result += valp - startp;
diff --git a/libdwelf/ChangeLog b/libdwelf/ChangeLog
index a0ff9f4..5f7fb4e 100644
--- a/libdwelf/ChangeLog
+++ b/libdwelf/ChangeLog
@@ -1,3 +1,14 @@
+2021-02-14  Alexander Miller  <alex.miller@gmx.de>
+
+	* dwelf_elf_begin.c (dwelf_elf_begin): Move NEW_VERSION before
+	definition.
+
+2021-09-06  Dmitry V. Levin  <ldv@altlinux.org>
+
+	* dwelf_strtab.c (dwelf_strtab_init): Remove cast of calloc return
+	value.
+	(morememory): Remove cast of malloc return value.
+
 2020-12-12  Dmitry V. Levin  <ldv@altlinux.org>
 
 	* libdwelf.h: Fix spelling typos in comments.
diff --git a/libdwelf/dwelf_elf_begin.c b/libdwelf/dwelf_elf_begin.c
index c7d63a1..c3cfe63 100644
--- a/libdwelf/dwelf_elf_begin.c
+++ b/libdwelf/dwelf_elf_begin.c
@@ -36,6 +36,7 @@
 
 #include <unistd.h>
 
+NEW_VERSION (dwelf_elf_begin, ELFUTILS_0.177)
 Elf *
 dwelf_elf_begin (int fd)
 {
@@ -61,4 +62,3 @@
   return NULL;
 }
 OLD_VERSION (dwelf_elf_begin, ELFUTILS_0.175)
-NEW_VERSION (dwelf_elf_begin, ELFUTILS_0.177)
diff --git a/libdwelf/dwelf_strtab.c b/libdwelf/dwelf_strtab.c
index c6ae7cd..5ec8c29 100644
--- a/libdwelf/dwelf_strtab.c
+++ b/libdwelf/dwelf_strtab.c
@@ -91,8 +91,7 @@
       assert (sizeof (struct memoryblock) < ps - MALLOC_OVERHEAD);
     }
 
-  Dwelf_Strtab *ret
-    = (Dwelf_Strtab *) calloc (1, sizeof (struct Dwelf_Strtab));
+  Dwelf_Strtab *ret = calloc (1, sizeof (struct Dwelf_Strtab));
   if (ret != NULL)
     {
       ret->nullstr = nullstr;
@@ -117,7 +116,7 @@
   /* Allocate nearest multiple of pagesize >= len.  */
   len = ((len / ps) + (len % ps != 0)) * ps - MALLOC_OVERHEAD;
 
-  struct memoryblock *newmem = (struct memoryblock *) malloc (len);
+  struct memoryblock *newmem = malloc (len);
   if (newmem == NULL)
     return 1;
 
diff --git a/libdwfl/ChangeLog b/libdwfl/ChangeLog
index d107e78..57b2c49 100644
--- a/libdwfl/ChangeLog
+++ b/libdwfl/ChangeLog
@@ -1,3 +1,34 @@
+2021-11-18  Matthias Maennich  <maennich@google.com>
+
+	* linux-kernel-modules.c (dwfl_linux_kernel_report_modules):
+	Add one to modname array size.
+
+2021-02-14  Alexander Miller  <alex.miller@gmx.de>
+
+	* core-file.c (dwfl_core_file_report): Move NEW_VERSION before
+	definition.  Replace INTDEF with NEW_INTDEF.
+	* dwfl_module_build_id.c (dwfl_module_build_id): Likewise.
+	* dwfl_report_elf.c (dwfl_report_elf): Likewise.
+
+2021-09-06  Dmitry V. Levin  <ldv@altlinux.org>
+
+	* linux-pid-attach.c (read_cached_memory): Remove cast of malloc
+	return value.
+
+2021-06-09  Omar Sandoval  <osandov@fb.com>
+
+	* link_map.c (read_addrs): Fix potential NULL pointer dereference.
+
+2021-04-19  Martin Liska  <mliska@suse.cz>
+
+	* dwfl_frame.c (dwfl_attach_state): Use startswith.
+	* dwfl_module_getdwarf.c (find_symtab): Likewise.
+	* linux-kernel-modules.c: Likewise.
+	* linux-pid-attach.c (linux_proc_pid_is_stopped): Likewise.
+	(dwfl_linux_proc_attach): Likewise.
+	* relocate.c (resolve_symbol): Likewise.
+	(relocate_section): Likewise.
+
 2021-02-01  Érico Nogueira  <ericonr@disroot.org>
 
 	* dwfl_error.c (strerror_r): Only use the GNU version when available.
diff --git a/libdwfl/core-file.c b/libdwfl/core-file.c
index a0ccc9b..4e4c9b3 100644
--- a/libdwfl/core-file.c
+++ b/libdwfl/core-file.c
@@ -440,6 +440,7 @@
   return false;
 }
 
+NEW_VERSION (dwfl_core_file_report, ELFUTILS_0.158)
 int
 dwfl_core_file_report (Dwfl *dwfl, Elf *elf, const char *executable)
 {
@@ -625,8 +626,7 @@
      error rather than just nothing found.  */
   return listed > 0 ? listed : retval;
 }
-INTDEF (dwfl_core_file_report)
-NEW_VERSION (dwfl_core_file_report, ELFUTILS_0.158)
+NEW_INTDEF (dwfl_core_file_report)
 
 #ifdef SYMBOL_VERSIONING
 int _compat_without_executable_dwfl_core_file_report (Dwfl *dwfl, Elf *elf);
diff --git a/libdwfl/dwfl_frame.c b/libdwfl/dwfl_frame.c
index 5bbf850..77e0c5c 100644
--- a/libdwfl/dwfl_frame.c
+++ b/libdwfl/dwfl_frame.c
@@ -30,6 +30,8 @@
 # include <config.h>
 #endif
 
+#include <system.h>
+
 #include "libdwflP.h"
 #include <unistd.h>
 
@@ -172,7 +174,7 @@
 	     is called from dwfl_linux_proc_attach with elf == NULL.
 	     __libdwfl_module_getebl will call __libdwfl_getelf which
 	     will call the find_elf callback.  */
-	  if (strncmp (mod->name, "[vdso: ", 7) == 0
+	  if (startswith (mod->name, "[vdso: ")
 	      || strcmp (strrchr (mod->name, ' ') ?: "",
 			 " (deleted)") == 0)
 	    continue;
diff --git a/libdwfl/dwfl_module_build_id.c b/libdwfl/dwfl_module_build_id.c
index 6ca9376..0c198f2 100644
--- a/libdwfl/dwfl_module_build_id.c
+++ b/libdwfl/dwfl_module_build_id.c
@@ -77,6 +77,7 @@
   return found_build_id (mod, set, build_id_bits, build_id_len, build_id_vaddr);
 }
 
+NEW_VERSION (dwfl_module_build_id, ELFUTILS_0.138)
 int
 dwfl_module_build_id (Dwfl_Module *mod,
 		      const unsigned char **bits, GElf_Addr *vaddr)
@@ -102,8 +103,7 @@
   *vaddr = mod->build_id_vaddr;
   return mod->build_id_len;
 }
-INTDEF (dwfl_module_build_id)
-NEW_VERSION (dwfl_module_build_id, ELFUTILS_0.138)
+NEW_INTDEF (dwfl_module_build_id)
 
 #ifdef SYMBOL_VERSIONING
 COMPAT_VERSION (dwfl_module_build_id, ELFUTILS_0.130, vaddr_at_end)
diff --git a/libdwfl/dwfl_module_getdwarf.c b/libdwfl/dwfl_module_getdwarf.c
index 2f3dd0d..6f07605 100644
--- a/libdwfl/dwfl_module_getdwarf.c
+++ b/libdwfl/dwfl_module_getdwarf.c
@@ -1162,7 +1162,7 @@
   if (sname == NULL)
     goto elferr;
 
-  if (strncmp (sname, ".zdebug", strlen (".zdebug")) == 0)
+  if (startswith (sname, ".zdebug"))
     /* Try to uncompress, but it might already have been, an error
        might just indicate, already uncompressed.  */
     elf_compress_gnu (symstrscn, 0, 0);
@@ -1245,7 +1245,7 @@
       if (sname == NULL)
 	goto elferr;
 
-      if (strncmp (sname, ".zdebug", strlen (".zdebug")) == 0)
+      if (startswith (sname, ".zdebug"))
 	/* Try to uncompress, but it might already have been, an error
 	   might just indicate, already uncompressed.  */
 	elf_compress_gnu (aux_strscn, 0, 0);
diff --git a/libdwfl/dwfl_report_elf.c b/libdwfl/dwfl_report_elf.c
index 9da8669..a5f0e5e 100644
--- a/libdwfl/dwfl_report_elf.c
+++ b/libdwfl/dwfl_report_elf.c
@@ -287,6 +287,7 @@
   return m;
 }
 
+NEW_VERSION (dwfl_report_elf, ELFUTILS_0.156)
 Dwfl_Module *
 dwfl_report_elf (Dwfl *dwfl, const char *name, const char *file_name, int fd,
 		 GElf_Addr base, bool add_p_vaddr)
@@ -322,8 +323,7 @@
 
   return mod;
 }
-INTDEF (dwfl_report_elf)
-NEW_VERSION (dwfl_report_elf, ELFUTILS_0.156)
+NEW_INTDEF (dwfl_report_elf)
 
 #ifdef SYMBOL_VERSIONING
 Dwfl_Module *
diff --git a/libdwfl/link_map.c b/libdwfl/link_map.c
index 0d8d1c1..1e7d450 100644
--- a/libdwfl/link_map.c
+++ b/libdwfl/link_map.c
@@ -254,7 +254,7 @@
   Dwfl *dwfl = closure->dwfl;
 
   /* Read a new buffer if the old one doesn't cover these words.  */
-  if (buffer == NULL
+  if (*buffer == NULL
       || vaddr < *read_vaddr
       || vaddr - (*read_vaddr) + nb > *buffer_available)
     {
diff --git a/libdwfl/linux-kernel-modules.c b/libdwfl/linux-kernel-modules.c
index 6edb27f..58c0c41 100644
--- a/libdwfl/linux-kernel-modules.c
+++ b/libdwfl/linux-kernel-modules.c
@@ -924,7 +924,7 @@
 
 	  if (!strcmp (secname, ".modinfo")
 	      || !strcmp (secname, ".data.percpu")
-	      || !strncmp (secname, ".exit", 5))
+	      || startswith (secname, ".exit"))
 	    {
 	      *addr = (Dwarf_Addr) -1l;
 	      return DWARF_CB_OK;
@@ -935,7 +935,7 @@
 	     behavior, and this cruft leaks out into the /sys information.
 	     The file name for ".init*" may actually look like "_init*".  */
 
-	  const bool is_init = !strncmp (secname, ".init", 5);
+	  const bool is_init = startswith (secname, ".init");
 	  if (is_init)
 	    {
 	      if (asprintf (&sysfile, SECADDRDIRFMT "_%s",
@@ -1008,7 +1008,7 @@
   int result = 0;
   Dwarf_Addr modaddr;
   unsigned long int modsz;
-  char modname[128];
+  char modname[128+1];
   char *line = NULL;
   size_t linesz = 0;
   /* We can't just use fscanf here because it's not easy to distinguish \n
diff --git a/libdwfl/linux-pid-attach.c b/libdwfl/linux-pid-attach.c
index fdf5c9b..09cba07 100644
--- a/libdwfl/linux-pid-attach.c
+++ b/libdwfl/linux-pid-attach.c
@@ -30,6 +30,8 @@
 # include <config.h>
 #endif
 
+#include <system.h>
+
 #include "libelfP.h"
 #include "libdwflP.h"
 #include <sys/types.h>
@@ -59,7 +61,7 @@
 
   have_state = false;
   while (fgets (buffer, sizeof (buffer), procfile) != NULL)
-    if (strncmp (buffer, "State:", 6) == 0)
+    if (startswith (buffer, "State:"))
       {
 	have_state = true;
 	break;
@@ -133,7 +135,7 @@
   if (mem_cache == NULL)
     {
       size_t mem_cache_size = sizeof (struct __libdwfl_remote_mem_cache);
-      mem_cache = (struct __libdwfl_remote_mem_cache *) malloc (mem_cache_size);
+      mem_cache = malloc (mem_cache_size);
       if (mem_cache == NULL)
 	return false;
 
@@ -407,7 +409,7 @@
   char *line = NULL;
   size_t linelen = 0;
   while (getline (&line, &linelen, procfile) >= 0)
-    if (strncmp (line, "Tgid:", 5) == 0)
+    if (startswith (line, "Tgid:"))
       {
 	errno = 0;
 	char *endptr;
diff --git a/libdwfl/relocate.c b/libdwfl/relocate.c
index 88b5211..0497bd4 100644
--- a/libdwfl/relocate.c
+++ b/libdwfl/relocate.c
@@ -30,6 +30,8 @@
 # include <config.h>
 #endif
 
+#include <system.h>
+
 #include "libelfP.h"
 #include "libdwflP.h"
 
@@ -237,7 +239,7 @@
 	    return DWFL_E_LIBELF;
 
 	  /* If the section is already decompressed, that isn't an error.  */
-	  if (strncmp (sname, ".zdebug", strlen (".zdebug")) == 0)
+	  if (startswith (sname, ".zdebug"))
 	    elf_compress_gnu (scn, 0, 0);
 
 	  if ((shdr->sh_flags & SHF_COMPRESSED) != 0)
@@ -518,7 +520,7 @@
        Nothing to do here.  */
     return DWFL_E_NOERROR;
 
-  if (strncmp (tname, ".zdebug", strlen ("zdebug")) == 0)
+  if (startswith (tname, ".zdebug"))
     elf_compress_gnu (tscn, 0, 0);
 
   if ((tshdr->sh_flags & SHF_COMPRESSED) != 0)
@@ -539,7 +541,7 @@
   if (sname == NULL)
     return DWFL_E_LIBELF;
 
-  if (strncmp (sname, ".zdebug", strlen ("zdebug")) == 0)
+  if (startswith (sname, ".zdebug"))
     elf_compress_gnu (scn, 0, 0);
 
   if ((shdr->sh_flags & SHF_COMPRESSED) != 0)
diff --git a/libebl/ChangeLog b/libebl/ChangeLog
index 33208f0..da690a4 100644
--- a/libebl/ChangeLog
+++ b/libebl/ChangeLog
@@ -1,3 +1,12 @@
+2021-09-06  Dmitry V. Levin  <ldv@altlinux.org>
+
+	* eblopenbackend.c (openbackend): Remove cast of calloc return value.
+
+2021-04-19  Martin Liska  <mliska@suse.cz>
+
+	* eblobjnotetypename.c (ebl_object_note_type_name): Use startswith.
+	* eblopenbackend.c (default_debugscn_p): Likewise.
+
 2020-12-16  Dmitry V. Levin  <ldv@altlinux.org>
 
 	* libeblP.h (_): Remove.
diff --git a/libebl/eblobjnotetypename.c b/libebl/eblobjnotetypename.c
index 9daddcd..4662906 100644
--- a/libebl/eblobjnotetypename.c
+++ b/libebl/eblobjnotetypename.c
@@ -31,6 +31,8 @@
 # include <config.h>
 #endif
 
+#include <system.h>
+
 #include <inttypes.h>
 #include <stdio.h>
 #include <string.h>
@@ -79,8 +81,7 @@
 	    }
 	}
 
-      if (strncmp (name, ELF_NOTE_GNU_BUILD_ATTRIBUTE_PREFIX,
-		   strlen (ELF_NOTE_GNU_BUILD_ATTRIBUTE_PREFIX)) == 0)
+      if (startswith (name, ELF_NOTE_GNU_BUILD_ATTRIBUTE_PREFIX))
 	{
 	  /* GNU Build Attribute notes (ab)use the owner name to store
 	     most of their data.  Don't decode everything here.  Just
diff --git a/libebl/eblopenbackend.c b/libebl/eblopenbackend.c
index a8af165..0c07296 100644
--- a/libebl/eblopenbackend.c
+++ b/libebl/eblopenbackend.c
@@ -274,7 +274,7 @@
   /* First allocate the data structure for the result.  We do this
      here since this assures that the structure is always large
      enough.  */
-  result = (Ebl *) calloc (1, sizeof (Ebl));
+  result = calloc (1, sizeof (Ebl));
   if (result == NULL)
     {
       // XXX uncomment
@@ -616,9 +616,9 @@
 				   / sizeof (dwarf_scn_names[0]));
   for (size_t cnt = 0; cnt < ndwarf_scn_names; ++cnt)
     if (strcmp (name, dwarf_scn_names[cnt]) == 0
-	|| (strncmp (name, ".zdebug", strlen (".zdebug")) == 0
+	|| (startswith (name, ".zdebug")
 	    && strcmp (&name[2], &dwarf_scn_names[cnt][1]) == 0)
-	|| (strncmp (name, ".gnu.debuglto_", strlen (".gnu.debuglto_")) == 0
+	|| (startswith (name, ".gnu.debuglto_")
 	    && strcmp (&name[14], dwarf_scn_names[cnt]) == 0))
       return true;
 
diff --git a/libelf/ChangeLog b/libelf/ChangeLog
index a1fd414..041da9b 100644
--- a/libelf/ChangeLog
+++ b/libelf/ChangeLog
@@ -1,3 +1,27 @@
+2021-09-06  Dmitry V. Levin  <ldv@altlinux.org>
+
+	* common.h (allocate_elf): Remove cast of calloc return value.
+	* elf_newdata.c (elf_newdata): Likewise.
+	* elf_getscn.c (elf_getscn): Remove casts of calloc return values.
+	* elf_newscn.c (elf_newscn): Likewise.
+	* elf32_updatefile.c (__elfw2): Remove casts of malloc return values.
+	* elf_getdata.c (convert_data): Likewise.
+	(__libelf_set_rawdata_wrlock): Remove cast of malloc return value.
+	* elf_begin.c (read_long_names): Remove cast of malloc return value.
+	* elf_readall.c (__libelf_readall): Likewise.
+	* elf_getarsym.c (elf_getarsym): Remove casts of malloc and realloc
+	return values.
+
+2021-07-19  Mark Wielaard  <mark@klomp.org>
+
+	* elf_strptr.c (validate_str): Check last char is zero first before
+	calling memrchr on the whole block.
+
+2021-06-09  Andrei Homescu  <ah@immunant.com>
+
+	* elf_getdata.c: Fix d_align for sections where alignment is larger
+	than offset.
+
 2020-12-12  Mark Wielaard  <mark@klomp.org>
 
 	* elf.h: Update from glibc.
diff --git a/libelf/common.h b/libelf/common.h
index e41c717..3718b3f 100644
--- a/libelf/common.h
+++ b/libelf/common.h
@@ -71,7 +71,7 @@
 allocate_elf (int fildes, void *map_address, int64_t offset, size_t maxsize,
               Elf_Cmd cmd, Elf *parent, Elf_Kind kind, size_t extra)
 {
-  Elf *result = (Elf *) calloc (1, sizeof (Elf) + extra);
+  Elf *result = calloc (1, sizeof (Elf) + extra);
   if (result == NULL)
     __libelf_seterrno (ELF_E_NOMEM);
   else
diff --git a/libelf/elf32_updatefile.c b/libelf/elf32_updatefile.c
index f67e626..1ff5890 100644
--- a/libelf/elf32_updatefile.c
+++ b/libelf/elf32_updatefile.c
@@ -218,7 +218,7 @@
 	return 1;
 
       Elf_ScnList *list = &elf->state.ELFW(elf,LIBELFBITS).scns;
-      Elf_Scn **scns = (Elf_Scn **) malloc (shnum * sizeof (Elf_Scn *));
+      Elf_Scn **scns = malloc (shnum * sizeof (Elf_Scn *));
       if (unlikely (scns == NULL))
 	{
 	  __libelf_seterrno (ELF_E_NOMEM);
@@ -688,7 +688,7 @@
 
       /* Get all sections into the array and sort them.  */
       Elf_ScnList *list = &elf->state.ELFW(elf,LIBELFBITS).scns;
-      Elf_Scn **scns = (Elf_Scn **) malloc (shnum * sizeof (Elf_Scn *));
+      Elf_Scn **scns = malloc (shnum * sizeof (Elf_Scn *));
       if (unlikely (scns == NULL))
 	{
 	  free (shdr_data_mem);
diff --git a/libelf/elf_begin.c b/libelf/elf_begin.c
index 32648c1..93d1e12 100644
--- a/libelf/elf_begin.c
+++ b/libelf/elf_begin.c
@@ -774,7 +774,7 @@
   /* Due to the stupid format of the long name table entry (which are not
      NUL terminted) we have to provide an appropriate representation anyhow.
      Therefore we always make a copy which has the appropriate form.  */
-  newp = (char *) malloc (len);
+  newp = malloc (len);
   if (newp != NULL)
     {
       char *runp;
diff --git a/libelf/elf_getarsym.c b/libelf/elf_getarsym.c
index 1f031fc..05ebf6a 100644
--- a/libelf/elf_getarsym.c
+++ b/libelf/elf_getarsym.c
@@ -198,7 +198,7 @@
 
       /* Now we can allocate the arrays needed to store the index.  */
       size_t ar_sym_len = (n + 1) * sizeof (Elf_Arsym);
-      elf->state.ar.ar_sym = (Elf_Arsym *) malloc (ar_sym_len);
+      elf->state.ar.ar_sym = malloc (ar_sym_len);
       if (elf->state.ar.ar_sym != NULL)
 	{
 	  void *file_data; /* unit32_t[n] or uint64_t[n] */
@@ -216,8 +216,7 @@
 	      file_data = temp_data;
 
 	      ar_sym_len += index_size - n * w;
-	      Elf_Arsym *newp = (Elf_Arsym *) realloc (elf->state.ar.ar_sym,
-						       ar_sym_len);
+	      Elf_Arsym *newp = realloc (elf->state.ar.ar_sym, ar_sym_len);
 	      if (newp == NULL)
 		{
 		  free (elf->state.ar.ar_sym);
diff --git a/libelf/elf_getdata.c b/libelf/elf_getdata.c
index 6ed4450..475c6de 100644
--- a/libelf/elf_getdata.c
+++ b/libelf/elf_getdata.c
@@ -146,7 +146,7 @@
 	scn->data_base = scn->rawdata_base;
       else
 	{
-	  scn->data_base = (char *) malloc (size);
+	  scn->data_base = malloc (size);
 	  if (scn->data_base == NULL)
 	    {
 	      __libelf_seterrno (ELF_E_NOMEM);
@@ -161,7 +161,7 @@
     {
       xfct_t fp;
 
-      scn->data_base = (char *) malloc (size);
+      scn->data_base = malloc (size);
       if (scn->data_base == NULL)
 	{
 	  __libelf_seterrno (ELF_E_NOMEM);
@@ -175,7 +175,7 @@
 	rawdata_source = scn->rawdata_base;
       else
 	{
-	  rawdata_source = (char *) malloc (size);
+	  rawdata_source = malloc (size);
 	  if (rawdata_source == NULL)
 	    {
 	      __libelf_seterrno (ELF_E_NOMEM);
@@ -328,8 +328,7 @@
 
 	  /* We have to read the data from the file.  Allocate the needed
 	     memory.  */
-	  scn->rawdata_base = scn->rawdata.d.d_buf
-	    = (char *) malloc (size);
+	  scn->rawdata_base = scn->rawdata.d.d_buf = malloc (size);
 	  if (scn->rawdata.d.d_buf == NULL)
 	    {
 	      __libelf_seterrno (ELF_E_NOMEM);
@@ -384,7 +383,18 @@
      which should be uncommon.  */
   align = align ?: 1;
   if (type != SHT_NOBITS && align > offset)
-    align = offset;
+    {
+      /* Align the offset to the next power of two. Uses algorithm from
+         https://graphics.stanford.edu/~seander/bithacks.html#RoundUpPowerOf2 */
+      align = offset - 1;
+      align |= align >> 1;
+      align |= align >> 2;
+      align |= align >> 4;
+      align |= align >> 8;
+      align |= align >> 16;
+      align |= align >> 32;
+      align++;
+    }
   scn->rawdata.d.d_align = align;
   if (elf->class == ELFCLASS32
       || (offsetof (struct Elf, state.elf32.ehdr)
diff --git a/libelf/elf_getscn.c b/libelf/elf_getscn.c
index e1fbaaa..be9c76f 100644
--- a/libelf/elf_getscn.c
+++ b/libelf/elf_getscn.c
@@ -68,7 +68,7 @@
       Elf_Scn *scn0 = &runp->data[0];
       if (elf->class == ELFCLASS32)
 	{
-	  scn0->shdr.e32 = (Elf32_Shdr *) calloc (1, sizeof (Elf32_Shdr));
+	  scn0->shdr.e32 = calloc (1, sizeof (Elf32_Shdr));
 	  if (scn0->shdr.e32 == NULL)
 	    {
 	      __libelf_seterrno (ELF_E_NOMEM);
@@ -77,7 +77,7 @@
 	}
       else
 	{
-	  scn0->shdr.e64 = (Elf64_Shdr *) calloc (1, sizeof (Elf64_Shdr));
+	  scn0->shdr.e64 = calloc (1, sizeof (Elf64_Shdr));
 	  if (scn0->shdr.e64 == NULL)
 	    {
 	      __libelf_seterrno (ELF_E_NOMEM);
diff --git a/libelf/elf_newdata.c b/libelf/elf_newdata.c
index 896f22c..0063d59 100644
--- a/libelf/elf_newdata.c
+++ b/libelf/elf_newdata.c
@@ -106,7 +106,7 @@
 	}
 
       /* Create a new, empty data descriptor.  */
-      result = (Elf_Data_List *) calloc (1, sizeof (Elf_Data_List));
+      result = calloc (1, sizeof (Elf_Data_List));
       if (result == NULL)
 	{
 	  __libelf_seterrno (ELF_E_NOMEM);
diff --git a/libelf/elf_newscn.c b/libelf/elf_newscn.c
index d15a642..d6bdf15 100644
--- a/libelf/elf_newscn.c
+++ b/libelf/elf_newscn.c
@@ -94,9 +94,9 @@
 	  1
 #endif
 	  )
-      newp = (Elf_ScnList *) calloc (sizeof (Elf_ScnList)
-				     + ((elf->state.elf.scnincr *= 2)
-					* sizeof (Elf_Scn)), 1);
+      newp = calloc (sizeof (Elf_ScnList)
+		     + ((elf->state.elf.scnincr *= 2)
+			* sizeof (Elf_Scn)), 1);
       if (newp == NULL)
 	{
 	  __libelf_seterrno (ELF_E_NOMEM);
@@ -122,7 +122,7 @@
   /* Create a section header for this section.  */
   if (elf->class == ELFCLASS32)
     {
-      result->shdr.e32 = (Elf32_Shdr *) calloc (1, sizeof (Elf32_Shdr));
+      result->shdr.e32 = calloc (1, sizeof (Elf32_Shdr));
       if (result->shdr.e32 == NULL)
 	{
 	  __libelf_seterrno (ELF_E_NOMEM);
@@ -131,7 +131,7 @@
     }
   else
     {
-      result->shdr.e64 = (Elf64_Shdr *) calloc (1, sizeof (Elf64_Shdr));
+      result->shdr.e64 = calloc (1, sizeof (Elf64_Shdr));
       if (result->shdr.e64 == NULL)
 	{
 	  __libelf_seterrno (ELF_E_NOMEM);
diff --git a/libelf/elf_readall.c b/libelf/elf_readall.c
index 384d251..0a3a233 100644
--- a/libelf/elf_readall.c
+++ b/libelf/elf_readall.c
@@ -107,7 +107,7 @@
 	}
 
       /* Allocate all the memory we need.  */
-      mem = (char *) malloc (elf->maximum_size);
+      mem = malloc (elf->maximum_size);
       if (mem != NULL)
 	{
 	  /* Read the file content.  */
diff --git a/libelf/elf_strptr.c b/libelf/elf_strptr.c
index 76f2caf..79a24d2 100644
--- a/libelf/elf_strptr.c
+++ b/libelf/elf_strptr.c
@@ -56,7 +56,9 @@
 static bool validate_str (const char *str, size_t from, size_t to)
 {
 #if HAVE_DECL_MEMRCHR
-  return memrchr (&str[from], '\0', to - from) != NULL;
+  // Check end first, which is likely a zero terminator, to prevent function call
+  return ((to > 0 && str[to - 1]  == '\0')
+	  || (to - from > 0 && memrchr (&str[from], '\0', to - from - 1) != NULL));
 #else
   do {
     if (to <= from)
diff --git a/patches/config.h.patch b/patches/config.h.patch
new file mode 100644
index 0000000..175e600
--- /dev/null
+++ b/patches/config.h.patch
@@ -0,0 +1,42 @@
+diff --git b/config.h a/config.h
+index f929481176ba..ea86194416c7 100644
+--- b/config.h
++++ a/config.h
+@@ -29,7 +29,7 @@
+ /* #undef HAVE_CFPREFERENCESCOPYAPPVALUE */
+ 
+ /* define if the compiler supports basic C++11 syntax */
+-/* #undef HAVE_CXX11 */
++#define HAVE_CXX11 1
+ 
+ /* Define if the GNU dcgettext() function is already present or preinstalled.
+    */
+@@ -60,7 +60,9 @@
+ #define HAVE_DECL_STRERROR_R 1
+ 
+ /* Define to 1 if you have the <error.h> header file. */
++#if defined(__BIONIC__) || defined(__GLIBC__)
+ #define HAVE_ERROR_H 1
++#endif
+ 
+ /* Define to 1 if you have the <err.h> header file. */
+ #define HAVE_ERR_H 1
+@@ -69,7 +71,7 @@
+ #define HAVE_FALLTHROUGH 1
+ 
+ /* Defined if __attribute__((gcc_struct)) is supported */
+-#define HAVE_GCC_STRUCT 1
++/* #undef HAVE_GCC_STRUCT */
+ 
+ /* Define if the GNU gettext() function is already present or preinstalled. */
+ #define HAVE_GETTEXT 1
+@@ -152,7 +154,9 @@
+ #define STDC_HEADERS 1
+ 
+ /* Define to 1 if strerror_r returns char *. */
++#if defined(__GLIBC__) || defined(__BIONIC__)
+ #define STRERROR_R_CHAR_P 1
++#endif
+ 
+ /* Support bzip2 decompression via -lbz2. */
+ /* #undef USE_BZLIB */
diff --git a/po/ChangeLog b/po/ChangeLog
index 740ca87..afbdc24 100644
--- a/po/ChangeLog
+++ b/po/ChangeLog
@@ -1,3 +1,32 @@
+2021-11-10  Mark Wielaard  <mark@klomp.org>
+
+	* *.po: Update for 0.186.
+
+2021-07-25  Hayatsu Shunsuke <hayatsu.shunsuke@gmail.com>
+
+	* ja.po: update Japanese translation
+
+2021-05-22  Mark Wielaard  <mark@klomp.org>
+
+	* *.po: Update for 0.185.
+
+2021-05-10  Mark Wielaard  <mark@klomp.org>
+
+	* *.po: Update for 0.184.
+
+2021-03-21  Dmitry V. Levin  <ldv@altlinux.org>
+
+	* Makevars (XGETTEXT_OPTIONS): Update.
+
+2021-02-21  Piotr Drąg  <piotrdrag@gmail.com>
+
+	* pl.po: Updated.
+
+2021-02-21  Piotr Drąg  <piotrdrag@gmail.com>
+
+	* POTFILES.in: Add libcpu/i386_lex.l, libcpu/i386_parse.y,
+	src/elfclassify.c and debuginfod/debuginfod-find.c.
+
 2021-02-05  Mark Wielaard  <mark@klomp.org>
 
 	* *.po: Update for 0.183.
diff --git a/po/Makevars b/po/Makevars
index 086de58..692394c 100644
--- a/po/Makevars
+++ b/po/Makevars
@@ -8,8 +8,15 @@
 top_builddir = ..
 
 # These options get passed to xgettext.
-XGETTEXT_OPTIONS = --keyword=_ --keyword=N_  --flag=error:3:c-format \
-		   --flag=ERROR:1:c-format --flag=argp_error:2:c-format \
+XGETTEXT_OPTIONS = --keyword=_ \
+		   --keyword=N_ \
+		   --keyword=sgettext:1g \
+		   --flag=_:1:pass-c-format \
+		   --flag=N_:1:pass-c-format \
+		   --flag=sgettext:1:pass-c-format \
+		   --flag=error:3:c-format \
+		   --flag=ERROR:1:c-format \
+		   --flag=argp_error:2:c-format \
 		   --add-comments
 
 # This is the copyright holder that gets inserted into the header of the
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 4eac6d0..65a6cfe 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -8,6 +8,8 @@
 
 # Library sources
 libasm/asm_error.c
+libcpu/i386_lex.l
+libcpu/i386_parse.y
 libdw/dwarf_error.c
 libdwfl/argp-std.c
 libdwfl/libdwflP.h
@@ -29,6 +31,7 @@
 src/ar.c
 src/arlib-argp.c
 src/arlib.c
+src/elfclassify.c
 src/elfcmp.c
 src/elfcompress.c
 src/elflint.c
@@ -43,6 +46,9 @@
 src/strip.c
 src/unstrip.c
 
+# debuginfod sources
+debuginfod/debuginfod-find.c
+
 # Tests
 tests/backtrace.c
 tests/dwflmodtest.c
diff --git a/po/de.po b/po/de.po
index 5090413..cb5e011 100644
--- a/po/de.po
+++ b/po/de.po
@@ -11,7 +11,7 @@
 msgstr ""
 "Project-Id-Version: elfutils VERSION\n"
 "Report-Msgid-Bugs-To: https://sourceware.org/bugzilla/\n"
-"POT-Creation-Date: 2021-02-05 21:10+0100\n"
+"POT-Creation-Date: 2021-11-10 16:21+0100\n"
 "PO-Revision-Date: 2009-06-29 15:15+0200\n"
 "Last-Translator: Michael Münch <micm@fedoraproject.org>\n"
 "Language-Team: German\n"
@@ -37,11 +37,6 @@
 "  - 'auto', 'tty', 'if-tty'\n"
 msgstr ""
 
-#: lib/color.c:194 src/objdump.c:728
-#, fuzzy, c-format
-msgid "cannot allocate memory"
-msgstr "konnte Verzeichnis nicht erstellen: %s"
-
 #: lib/printversion.c:40
 #, fuzzy, c-format
 msgid ""
@@ -54,8 +49,8 @@
 "GARANTIE,\n"
 "auch nicht für Marktgängigkeit oder Eignung für einen Bestimmten Zweck.\n"
 
-#: lib/xmalloc.c:48 lib/xmalloc.c:61 lib/xmalloc.c:73 src/readelf.c:3453
-#: src/readelf.c:11501 src/unstrip.c:312 src/unstrip.c:2398 src/unstrip.c:2603
+#: lib/xmalloc.c:48 lib/xmalloc.c:61 lib/xmalloc.c:73 src/readelf.c:11582
+#: src/unstrip.c:312
 #, c-format
 msgid "memory exhausted"
 msgstr "Kein Speicher mehr verfügbar"
@@ -107,6 +102,21 @@
 msgid "unknown error"
 msgstr "unbekannter Fehler"
 
+#: libcpu/i386_lex.l:122
+#, c-format
+msgid "invalid character '%c' at line %d; ignored"
+msgstr ""
+
+#: libcpu/i386_lex.l:123
+#, c-format
+msgid "invalid character '\\%o' at line %d; ignored"
+msgstr ""
+
+#: libcpu/i386_parse.y:554
+#, c-format
+msgid "while reading i386 CPU description: %s at line %d"
+msgstr ""
+
 #: libdw/dwarf_error.c:59
 msgid "invalid access"
 msgstr "Ungültiger Zugriff"
@@ -298,7 +308,7 @@
 msgid ".debug_addr section missing"
 msgstr ".debug_line Sektion fehlt"
 
-#: libdwfl/argp-std.c:47 src/stack.c:643 src/unstrip.c:2544
+#: libdwfl/argp-std.c:47 src/stack.c:643 src/unstrip.c:2550
 msgid "Input selection options:"
 msgstr "Eingabeauswahloptionen:"
 
@@ -534,8 +544,8 @@
 msgid "No backend"
 msgstr "Kein Backend"
 
-#: libebl/eblcorenotetypename.c:100 libebl/eblobjnotetypename.c:77
-#: libebl/eblobjnotetypename.c:109 libebl/eblobjnotetypename.c:130
+#: libebl/eblcorenotetypename.c:100 libebl/eblobjnotetypename.c:79
+#: libebl/eblobjnotetypename.c:110 libebl/eblobjnotetypename.c:131
 #: libebl/eblosabiname.c:73 libebl/eblsectionname.c:83
 #: libebl/eblsectiontypename.c:115 libebl/eblsegmenttypename.c:81
 msgid "<unknown>"
@@ -631,7 +641,7 @@
 msgid "invalid size of destination operand"
 msgstr "ungültige Grösse des Ziel-Operanden"
 
-#: libelf/elf_error.c:87 src/readelf.c:6209
+#: libelf/elf_error.c:87 src/readelf.c:6215
 #, c-format
 msgid "invalid encoding"
 msgstr "ungültige Kodierung"
@@ -719,8 +729,8 @@
 msgid "invalid section header"
 msgstr "ungültiger Abschnitts-Header"
 
-#: libelf/elf_error.c:191 src/readelf.c:10012 src/readelf.c:10612
-#: src/readelf.c:10713 src/readelf.c:10895
+#: libelf/elf_error.c:191 src/readelf.c:10093 src/readelf.c:10693
+#: src/readelf.c:10794 src/readelf.c:10976
 #, c-format
 msgid "invalid data"
 msgstr "Ungültige Daten"
@@ -851,7 +861,7 @@
 msgid "Print all information on one line, and indent inlines"
 msgstr ""
 
-#: src/addr2line.c:78 src/elfcmp.c:70 src/findtextrel.c:65 src/nm.c:100
+#: src/addr2line.c:78 src/elfcmp.c:70 src/findtextrel.c:66 src/nm.c:100
 #: src/strings.c:78
 msgid "Miscellaneous:"
 msgstr "Verschiedenes:"
@@ -1186,6 +1196,232 @@
 msgid "cannot read ELF header of %s(%s): %s"
 msgstr "\"Konnte ELF-Kopf von %s(%s): %s nicht lesen"
 
+#: src/elfclassify.c:91
+msgid "opening"
+msgstr ""
+
+#: src/elfclassify.c:98
+msgid "reading"
+msgstr ""
+
+#: src/elfclassify.c:244
+#, fuzzy
+#| msgid "cannot get ELF header"
+msgid "ELF header"
+msgstr "ELF Kopf konnte nicht ausgelesen werden"
+
+#: src/elfclassify.c:255
+#, fuzzy
+#| msgid "Program Headers:"
+msgid "program headers"
+msgstr "Programm-Köpfe:"
+
+#: src/elfclassify.c:264
+#, fuzzy
+#| msgid "Program Headers:"
+msgid "program header"
+msgstr "Programm-Köpfe:"
+
+#: src/elfclassify.c:284
+#, fuzzy
+#| msgid "invalid section header"
+msgid "section headers"
+msgstr "ungültiger Abschnitts-Header"
+
+#: src/elfclassify.c:295
+#, fuzzy
+msgid "section header string table index"
+msgstr "konnte Abschnittsdaten nicht holen: %s"
+
+#: src/elfclassify.c:309
+#, fuzzy
+msgid "could not obtain section header"
+msgstr "konnte Abschnittsdaten nicht holen: %s"
+
+#: src/elfclassify.c:315
+#, fuzzy
+msgid "could not obtain section name"
+msgstr "konnte Abschnittsdaten nicht holen: %s"
+
+#: src/elfclassify.c:828
+msgid "writing to standard output"
+msgstr ""
+
+#: src/elfclassify.c:855
+msgid "reading from standard input"
+msgstr ""
+
+#: src/elfclassify.c:876
+#, fuzzy
+#| msgid "Input selection options:"
+msgid "Classification options"
+msgstr "Eingabeauswahloptionen:"
+
+#: src/elfclassify.c:878
+msgid "File looks like an ELF object or archive/static library (default)"
+msgstr ""
+
+#: src/elfclassify.c:881
+msgid "File is an regular ELF object (not an archive/static library)"
+msgstr ""
+
+#: src/elfclassify.c:884
+msgid "File is an ELF archive or static library"
+msgstr ""
+
+#: src/elfclassify.c:887
+msgid "File is an ELF core dump file"
+msgstr ""
+
+#: src/elfclassify.c:890
+msgid ""
+"File is an ELF file with symbol table or .debug_* sections and can be "
+"stripped further"
+msgstr ""
+
+#: src/elfclassify.c:893
+msgid "File is (primarily) an ELF program executable (not primarily a DSO)"
+msgstr ""
+
+#: src/elfclassify.c:896
+msgid "File is an ELF program executable (might also be a DSO)"
+msgstr ""
+
+#: src/elfclassify.c:899
+msgid ""
+"File is (primarily) an ELF shared object (DSO) (not primarily an executable)"
+msgstr ""
+
+#: src/elfclassify.c:902
+msgid "File is an ELF shared object (DSO) (might also be an executable)"
+msgstr ""
+
+#: src/elfclassify.c:906
+#, fuzzy
+#| msgid "cannot find kernel modules"
+msgid "File is a linux kernel module"
+msgstr "Konnte Kernel Module nicht finden"
+
+#: src/elfclassify.c:908
+msgid "File is a debug only ELF file (separate .debug, .dwo or dwz multi-file)"
+msgstr ""
+
+#: src/elfclassify.c:911
+msgid "File is a loadable ELF object (program or shared object)"
+msgstr ""
+
+#: src/elfclassify.c:940
+msgid "Input flags"
+msgstr ""
+
+#: src/elfclassify.c:942
+msgid "Only classify regular (not symlink nor special device) files"
+msgstr ""
+
+#: src/elfclassify.c:944
+msgid ""
+"Also read file names to process from standard input, separated by newlines"
+msgstr ""
+
+#: src/elfclassify.c:947
+msgid ""
+"Also read file names to process from standard input, separated by ASCII NUL "
+"bytes"
+msgstr ""
+
+#: src/elfclassify.c:950
+msgid "Do not read files from standard input (default)"
+msgstr ""
+
+#: src/elfclassify.c:952
+msgid "Try to open compressed files or embedded (kernel) ELF images"
+msgstr ""
+
+#: src/elfclassify.c:955
+#, fuzzy
+#| msgid "Output format:"
+msgid "Output flags"
+msgstr "Ausgabeformat:"
+
+#: src/elfclassify.c:957
+msgid "Output names of files, separated by newline"
+msgstr ""
+
+#: src/elfclassify.c:959
+msgid "Output names of files, separated by ASCII NUL"
+msgstr ""
+
+#: src/elfclassify.c:961
+#, fuzzy
+#| msgid "More than one output file name given."
+msgid "Do not output file names"
+msgstr "Mehr als ein Name der Ausgabedatei angegeben."
+
+#: src/elfclassify.c:963
+msgid "If printing file names, print matching files (default)"
+msgstr ""
+
+#: src/elfclassify.c:965
+msgid "If printing file names, print files that do not match"
+msgstr ""
+
+#: src/elfclassify.c:967
+msgid "Additional flags"
+msgstr ""
+
+#: src/elfclassify.c:969
+msgid "Output additional information (can be specified multiple times)"
+msgstr ""
+
+#: src/elfclassify.c:971
+msgid "Suppress some error output (counterpart to --verbose)"
+msgstr ""
+
+#. Strings for arguments in help texts.
+#: src/elfclassify.c:979 src/elfcompress.c:1334 src/elflint.c:77
+#: src/readelf.c:158
+msgid "FILE..."
+msgstr "DATEI..."
+
+#: src/elfclassify.c:980
+msgid ""
+"Determine the type of an ELF file.\n"
+"\n"
+"All of the classification options must apply at the same time to a "
+"particular file.  Classification options can be negated using a \"--not-\" "
+"prefix.\n"
+"\n"
+"Since modern ELF does not clearly distinguish between programs and dynamic "
+"shared objects, you should normally use either --executable or --shared to "
+"identify the primary purpose of a file.  Only one of the --shared and --"
+"executable checks can pass for a file.\n"
+"\n"
+"If you want to know whether an ELF object might a program or a shared "
+"library (but could be both), then use --program or --library. Some ELF files "
+"will classify as both a program and a library.\n"
+"\n"
+"If you just want to know whether an ELF file is loadable (as program or "
+"library) use --loadable.  Note that files that only contain (separate) debug "
+"information (--debug-only) are never --loadable (even though they might "
+"contain program headers).  Linux kernel modules are also not --loadable (in "
+"the normal sense).\n"
+"\n"
+"Without any of the --print options, the program exits with status 0 if the "
+"requested checks pass for all input files, with 1 if a check fails for any "
+"file, and 2 if there is an environmental issue (such as a file read error or "
+"a memory allocation error).\n"
+"\n"
+"When printing file names, the program exits with status 0 even if no file "
+"names are printed, and exits with status 2 if there is an environmental "
+"issue.\n"
+"\n"
+"On usage error (e.g. a bad option was given), the program exits with a "
+"status code larger than 2.\n"
+"\n"
+"The --quiet or -q option suppresses some error warning output, but doesn't "
+"change the exit status."
+msgstr ""
+
 #: src/elfcmp.c:60
 msgid "Control options:"
 msgstr ""
@@ -1377,14 +1613,14 @@
 msgid "Invalid value '%s' for --gaps parameter."
 msgstr ""
 
-#: src/elfcmp.c:734 src/findtextrel.c:205 src/nm.c:364 src/ranlib.c:141
-#: src/size.c:272 src/strings.c:185 src/strip.c:1030 src/strip.c:1067
-#: src/unstrip.c:2194 src/unstrip.c:2223
+#: src/elfcmp.c:734 src/findtextrel.c:195 src/nm.c:364 src/ranlib.c:141
+#: src/size.c:272 src/strings.c:185 src/strip.c:1035 src/strip.c:1072
+#: src/unstrip.c:2197 src/unstrip.c:2226
 #, c-format
 msgid "cannot open '%s'"
 msgstr "'%s' kann nicht geöffnet werden"
 
-#: src/elfcmp.c:738 src/findtextrel.c:212 src/ranlib.c:158
+#: src/elfcmp.c:738 src/findtextrel.c:214 src/ranlib.c:158
 #, c-format
 msgid "cannot create ELF descriptor for '%s': %s"
 msgstr ""
@@ -1394,7 +1630,7 @@
 msgid "cannot create EBL descriptor for '%s'"
 msgstr ""
 
-#: src/elfcmp.c:761 src/findtextrel.c:394
+#: src/elfcmp.c:761 src/findtextrel.c:385
 #, c-format
 msgid "cannot get section header of section %zu: %s"
 msgstr ""
@@ -1409,74 +1645,69 @@
 msgid "cannot get relocation: %s"
 msgstr ""
 
-#: src/elfcompress.c:115 src/strip.c:308 src/unstrip.c:117
+#: src/elfcompress.c:117 src/strip.c:308 src/unstrip.c:117
 #, c-format
 msgid "-o option specified twice"
 msgstr ""
 
-#: src/elfcompress.c:122
+#: src/elfcompress.c:124
 #, fuzzy, c-format
 msgid "-t option specified twice"
 msgstr "Option -d zweimal angegeben"
 
-#: src/elfcompress.c:131
+#: src/elfcompress.c:133
 #, fuzzy, c-format
 msgid "unknown compression type '%s'"
 msgstr "unbekannter Typ"
 
 #. We need at least one input file.
-#: src/elfcompress.c:143 src/elfcompress.c:1347
+#: src/elfcompress.c:145 src/elfcompress.c:1345
 #, fuzzy, c-format
 msgid "No input file given"
 msgstr "Eingabedatei '%s' ignoriert"
 
-#: src/elfcompress.c:149 src/elfcompress.c:1352
+#: src/elfcompress.c:151 src/elfcompress.c:1350
 #, c-format
 msgid "Only one input file allowed together with '-o'"
 msgstr ""
 
-#: src/elfcompress.c:1309
+#: src/elfcompress.c:1307
 msgid "Place (de)compressed output into FILE"
 msgstr ""
 
-#: src/elfcompress.c:1312
+#: src/elfcompress.c:1310
 msgid ""
 "What type of compression to apply. TYPE can be 'none' (decompress), "
 "'zlib' (ELF ZLIB compression, the default, 'zlib-gabi' is an alias) or 'zlib-"
 "gnu' (.zdebug GNU style compression, 'gnu' is an alias)"
 msgstr ""
 
-#: src/elfcompress.c:1315
+#: src/elfcompress.c:1313
 msgid ""
 "SECTION name to (de)compress, SECTION is an extended wildcard pattern "
 "(defaults to '.?(z)debug*')"
 msgstr ""
 
-#: src/elfcompress.c:1318
+#: src/elfcompress.c:1316
 msgid "Print a message for each section being (de)compressed"
 msgstr ""
 
-#: src/elfcompress.c:1321
+#: src/elfcompress.c:1319
 msgid ""
 "Force compression of section even if it would become larger or update/"
 "rewrite the file even if no section would be (de)compressed"
 msgstr ""
 
-#: src/elfcompress.c:1324 src/strip.c:93
+#: src/elfcompress.c:1322 src/strip.c:93
 msgid "Relax a few rules to handle slightly broken ELF files"
 msgstr ""
 
-#: src/elfcompress.c:1327
+#: src/elfcompress.c:1325
 #, fuzzy
 msgid "Be silent when a section cannot be compressed"
 msgstr "konnte Abschnittsdaten nicht holen: %s"
 
-#. Strings for arguments in help texts.
-#: src/elfcompress.c:1336 src/elflint.c:77 src/readelf.c:158
-msgid "FILE..."
-msgstr "DATEI..."
-
-#: src/elfcompress.c:1337
+#: src/elfcompress.c:1335
 msgid "Compress or decompress sections in an ELF file."
 msgstr ""
 
@@ -1677,7 +1908,7 @@
 
 #: src/elflint.c:610 src/elflint.c:1498 src/elflint.c:1549 src/elflint.c:1655
 #: src/elflint.c:1991 src/elflint.c:2317 src/elflint.c:2943 src/elflint.c:3106
-#: src/elflint.c:3254 src/elflint.c:3444 src/elflint.c:4456
+#: src/elflint.c:3254 src/elflint.c:3456 src/elflint.c:4458
 #, c-format
 msgid "section [%2d] '%s': cannot get section data\n"
 msgstr ""
@@ -2654,692 +2885,692 @@
 msgid "section [%2d] '%s': unknown parent version '%s'\n"
 msgstr ""
 
-#: src/elflint.c:3436
+#: src/elflint.c:3448
 #, c-format
 msgid "section [%2d] '%s': empty object attributes section\n"
 msgstr ""
 
-#: src/elflint.c:3457
+#: src/elflint.c:3464
 #, c-format
 msgid "section [%2d] '%s': unrecognized attribute format\n"
 msgstr ""
 
-#: src/elflint.c:3473
+#: src/elflint.c:3475
 #, c-format
 msgid ""
 "section [%2d] '%s': offset %zu: zero length field in attribute section\n"
 msgstr ""
 
-#: src/elflint.c:3482
+#: src/elflint.c:3484
 #, c-format
 msgid "section [%2d] '%s': offset %zu: invalid length in attribute section\n"
 msgstr ""
 
-#: src/elflint.c:3494
+#: src/elflint.c:3496
 #, c-format
 msgid "section [%2d] '%s': offset %zu: unterminated vendor name string\n"
 msgstr ""
 
-#: src/elflint.c:3511
+#: src/elflint.c:3513
 #, c-format
 msgid ""
 "section [%2d] '%s': offset %zu: endless ULEB128 in attribute subsection tag\n"
 msgstr ""
 
-#: src/elflint.c:3520
+#: src/elflint.c:3522
 #, c-format
 msgid "section [%2d] '%s': offset %zu: truncated attribute section\n"
 msgstr ""
 
-#: src/elflint.c:3529
+#: src/elflint.c:3531
 #, c-format
 msgid ""
 "section [%2d] '%s': offset %zu: zero length field in attribute subsection\n"
 msgstr ""
 
-#: src/elflint.c:3544
+#: src/elflint.c:3546
 #, c-format
 msgid ""
 "section [%2d] '%s': offset %zu: invalid length in attribute subsection\n"
 msgstr ""
 
 #. Tag_File
-#: src/elflint.c:3555
+#: src/elflint.c:3557
 #, c-format
 msgid ""
 "section [%2d] '%s': offset %zu: attribute subsection has unexpected tag %u\n"
 msgstr ""
 
-#: src/elflint.c:3573
+#: src/elflint.c:3575
 #, c-format
 msgid "section [%2d] '%s': offset %zu: endless ULEB128 in attribute tag\n"
 msgstr ""
 
-#: src/elflint.c:3584
+#: src/elflint.c:3586
 #, c-format
 msgid "section [%2d] '%s': offset %zu: unterminated string in attribute\n"
 msgstr ""
 
-#: src/elflint.c:3597
+#: src/elflint.c:3599
 #, c-format
 msgid "section [%2d] '%s': offset %zu: unrecognized attribute tag %u\n"
 msgstr ""
 
-#: src/elflint.c:3601
+#: src/elflint.c:3603
 #, c-format
 msgid ""
 "section [%2d] '%s': offset %zu: unrecognized %s attribute value %<PRIu64>\n"
 msgstr ""
 
-#: src/elflint.c:3611
+#: src/elflint.c:3613
 #, c-format
 msgid "section [%2d] '%s': offset %zu: vendor '%s' unknown\n"
 msgstr ""
 
-#: src/elflint.c:3617
+#: src/elflint.c:3619
 #, c-format
 msgid ""
 "section [%2d] '%s': offset %zu: extra bytes after last attribute section\n"
 msgstr ""
 
-#: src/elflint.c:3714
+#: src/elflint.c:3716
 #, c-format
 msgid "cannot get section header of zeroth section\n"
 msgstr ""
 
-#: src/elflint.c:3718
+#: src/elflint.c:3720
 #, c-format
 msgid "zeroth section has nonzero name\n"
 msgstr ""
 
-#: src/elflint.c:3720
+#: src/elflint.c:3722
 #, c-format
 msgid "zeroth section has nonzero type\n"
 msgstr ""
 
-#: src/elflint.c:3722
+#: src/elflint.c:3724
 #, c-format
 msgid "zeroth section has nonzero flags\n"
 msgstr ""
 
-#: src/elflint.c:3724
+#: src/elflint.c:3726
 #, c-format
 msgid "zeroth section has nonzero address\n"
 msgstr ""
 
-#: src/elflint.c:3726
+#: src/elflint.c:3728
 #, c-format
 msgid "zeroth section has nonzero offset\n"
 msgstr ""
 
-#: src/elflint.c:3728
+#: src/elflint.c:3730
 #, c-format
 msgid "zeroth section has nonzero align value\n"
 msgstr ""
 
-#: src/elflint.c:3730
+#: src/elflint.c:3732
 #, c-format
 msgid "zeroth section has nonzero entry size value\n"
 msgstr ""
 
-#: src/elflint.c:3733
+#: src/elflint.c:3735
 #, c-format
 msgid ""
 "zeroth section has nonzero size value while ELF header has nonzero shnum "
 "value\n"
 msgstr ""
 
-#: src/elflint.c:3737
+#: src/elflint.c:3739
 #, c-format
 msgid ""
 "zeroth section has nonzero link value while ELF header does not signal "
 "overflow in shstrndx\n"
 msgstr ""
 
-#: src/elflint.c:3741
+#: src/elflint.c:3743
 #, c-format
 msgid ""
 "zeroth section has nonzero link value while ELF header does not signal "
 "overflow in phnum\n"
 msgstr ""
 
-#: src/elflint.c:3759
+#: src/elflint.c:3761
 #, c-format
 msgid "cannot get section header for section [%2zu] '%s': %s\n"
 msgstr ""
 
-#: src/elflint.c:3768
+#: src/elflint.c:3770
 #, c-format
 msgid "section [%2zu]: invalid name\n"
 msgstr ""
 
-#: src/elflint.c:3795
+#: src/elflint.c:3797
 #, c-format
 msgid "section [%2d] '%s' has wrong type: expected %s, is %s\n"
 msgstr ""
 
-#: src/elflint.c:3812
+#: src/elflint.c:3814
 #, c-format
 msgid "section [%2zu] '%s' has wrong flags: expected %s, is %s\n"
 msgstr ""
 
-#: src/elflint.c:3830
+#: src/elflint.c:3832
 #, c-format
 msgid ""
 "section [%2zu] '%s' has wrong flags: expected %s and possibly %s, is %s\n"
 msgstr ""
 
-#: src/elflint.c:3847
+#: src/elflint.c:3849
 #, c-format
 msgid "section [%2zu] '%s' present in object file\n"
 msgstr ""
 
-#: src/elflint.c:3853 src/elflint.c:3885
+#: src/elflint.c:3855 src/elflint.c:3887
 #, c-format
 msgid ""
 "section [%2zu] '%s' has SHF_ALLOC flag set but there is no loadable segment\n"
 msgstr ""
 
-#: src/elflint.c:3858 src/elflint.c:3890
+#: src/elflint.c:3860 src/elflint.c:3892
 #, c-format
 msgid ""
 "section [%2zu] '%s' has SHF_ALLOC flag not set but there are loadable "
 "segments\n"
 msgstr ""
 
-#: src/elflint.c:3866
+#: src/elflint.c:3868
 #, c-format
 msgid ""
 "section [%2zu] '%s' is extension section index table in non-object file\n"
 msgstr ""
 
-#: src/elflint.c:3909
+#: src/elflint.c:3911
 #, c-format
 msgid "section [%2zu] '%s': size not multiple of entry size\n"
 msgstr ""
 
-#: src/elflint.c:3914
+#: src/elflint.c:3916
 #, c-format
 msgid "cannot get section header\n"
 msgstr ""
 
-#: src/elflint.c:3924
+#: src/elflint.c:3926
 #, c-format
 msgid "section [%2zu] '%s' has unsupported type %d\n"
 msgstr ""
 
-#: src/elflint.c:3944
+#: src/elflint.c:3946
 #, c-format
 msgid ""
 "section [%2zu] '%s' contains invalid processor-specific flag(s) %#<PRIx64>\n"
 msgstr ""
 
-#: src/elflint.c:3954
+#: src/elflint.c:3956
 #, c-format
 msgid "section [%2zu] '%s' contains unknown flag(s) %#<PRIx64>\n"
 msgstr ""
 
-#: src/elflint.c:3962
+#: src/elflint.c:3964
 #, c-format
 msgid "section [%2zu] '%s': thread-local data sections address not zero\n"
 msgstr ""
 
-#: src/elflint.c:3972
+#: src/elflint.c:3974
 #, fuzzy, c-format
 msgid "section [%2zu] '%s': allocated section cannot be compressed\n"
 msgstr "konnte Abschnittsdaten nicht holen: %s"
 
-#: src/elflint.c:3977
+#: src/elflint.c:3979
 #, fuzzy, c-format
 msgid "section [%2zu] '%s': nobits section cannot be compressed\n"
 msgstr "konnte Abschnittsdaten nicht holen: %s"
 
-#: src/elflint.c:3983
+#: src/elflint.c:3985
 #, c-format
 msgid ""
 "section [%2zu] '%s': compressed section with no compression header: %s\n"
 msgstr ""
 
-#: src/elflint.c:3989
+#: src/elflint.c:3991
 #, c-format
 msgid "section [%2zu] '%s': invalid section reference in link value\n"
 msgstr ""
 
-#: src/elflint.c:3994
+#: src/elflint.c:3996
 #, c-format
 msgid "section [%2zu] '%s': invalid section reference in info value\n"
 msgstr ""
 
-#: src/elflint.c:4001
+#: src/elflint.c:4003
 #, c-format
 msgid "section [%2zu] '%s': strings flag set without merge flag\n"
 msgstr ""
 
-#: src/elflint.c:4006
+#: src/elflint.c:4008
 #, c-format
 msgid "section [%2zu] '%s': merge flag set but entry size is zero\n"
 msgstr ""
 
-#: src/elflint.c:4025
+#: src/elflint.c:4027
 #, c-format
 msgid "section [%2zu] '%s' has unexpected type %d for an executable section\n"
 msgstr ""
 
-#: src/elflint.c:4034
+#: src/elflint.c:4036
 #, c-format
 msgid "section [%2zu] '%s' must be of type NOBITS in debuginfo files\n"
 msgstr ""
 
-#: src/elflint.c:4041
+#: src/elflint.c:4043
 #, c-format
 msgid "section [%2zu] '%s' is both executable and writable\n"
 msgstr ""
 
-#: src/elflint.c:4072
+#: src/elflint.c:4074
 #, c-format
 msgid ""
 "section [%2zu] '%s' not fully contained in segment of program header entry "
 "%d\n"
 msgstr ""
 
-#: src/elflint.c:4082
+#: src/elflint.c:4084
 #, c-format
 msgid ""
 "section [%2zu] '%s' has type NOBITS but is read from the file in segment of "
 "program header entry %d\n"
 msgstr ""
 
-#: src/elflint.c:4108
+#: src/elflint.c:4110
 #, c-format
 msgid ""
 "section [%2zu] '%s' has type NOBITS but is read from the file in segment of "
 "program header entry %d and file contents is non-zero\n"
 msgstr ""
 
-#: src/elflint.c:4119
+#: src/elflint.c:4121
 #, c-format
 msgid ""
 "section [%2zu] '%s' has not type NOBITS but is not read from the file in "
 "segment of program header entry %d\n"
 msgstr ""
 
-#: src/elflint.c:4130
+#: src/elflint.c:4132
 #, c-format
 msgid "section [%2zu] '%s' is executable in nonexecutable segment %d\n"
 msgstr ""
 
-#: src/elflint.c:4140
+#: src/elflint.c:4142
 #, c-format
 msgid "section [%2zu] '%s' is writable in unwritable segment %d\n"
 msgstr ""
 
-#: src/elflint.c:4150
+#: src/elflint.c:4152
 #, c-format
 msgid ""
 "section [%2zu] '%s': alloc flag set but section not in any loaded segment\n"
 msgstr ""
 
-#: src/elflint.c:4156
+#: src/elflint.c:4158
 #, c-format
 msgid ""
 "section [%2zu] '%s': ELF header says this is the section header string table "
 "but type is not SHT_TYPE\n"
 msgstr ""
 
-#: src/elflint.c:4164
+#: src/elflint.c:4166
 #, c-format
 msgid ""
 "section [%2zu] '%s': relocatable files cannot have dynamic symbol tables\n"
 msgstr ""
 
-#: src/elflint.c:4215
+#: src/elflint.c:4217
 #, c-format
 msgid "more than one version symbol table present\n"
 msgstr ""
 
-#: src/elflint.c:4238
+#: src/elflint.c:4240
 #, c-format
 msgid "INTERP program header entry but no .interp section\n"
 msgstr ""
 
-#: src/elflint.c:4249
+#: src/elflint.c:4251
 #, c-format
 msgid ""
 "loadable segment [%u] is executable but contains no executable sections\n"
 msgstr ""
 
-#: src/elflint.c:4255
+#: src/elflint.c:4257
 #, c-format
 msgid "loadable segment [%u] is writable but contains no writable sections\n"
 msgstr ""
 
-#: src/elflint.c:4266
+#: src/elflint.c:4268
 #, c-format
 msgid ""
 "no .gnu.versym section present but .gnu.versym_d or .gnu.versym_r section "
 "exist\n"
 msgstr ""
 
-#: src/elflint.c:4279
+#: src/elflint.c:4281
 #, c-format
 msgid "duplicate version index %d\n"
 msgstr ""
 
-#: src/elflint.c:4293
+#: src/elflint.c:4295
 #, c-format
 msgid ".gnu.versym section present without .gnu.versym_d or .gnu.versym_r\n"
 msgstr ""
 
-#: src/elflint.c:4342
+#: src/elflint.c:4344
 #, c-format
 msgid "phdr[%d]: unknown core file note type %<PRIu32> at offset %<PRIu64>\n"
 msgstr ""
 
-#: src/elflint.c:4346
+#: src/elflint.c:4348
 #, c-format
 msgid ""
 "section [%2d] '%s': unknown core file note type %<PRIu32> at offset %zu\n"
 msgstr ""
 
-#: src/elflint.c:4395
+#: src/elflint.c:4397
 #, c-format
 msgid ""
 "phdr[%d]: unknown object file note type %<PRIu32> with owner name '%s' at "
 "offset %zu\n"
 msgstr ""
 
-#: src/elflint.c:4400
+#: src/elflint.c:4402
 #, c-format
 msgid ""
 "section [%2d] '%s': unknown object file note type %<PRIu32> with owner name "
 "'%s' at offset %zu\n"
 msgstr ""
 
-#: src/elflint.c:4419
+#: src/elflint.c:4421
 #, c-format
 msgid "phdr[%d]: no note entries defined for the type of file\n"
 msgstr ""
 
-#: src/elflint.c:4439
+#: src/elflint.c:4441
 #, c-format
 msgid "phdr[%d]: cannot get content of note section: %s\n"
 msgstr ""
 
-#: src/elflint.c:4442
+#: src/elflint.c:4444
 #, c-format
 msgid "phdr[%d]: extra %<PRIu64> bytes after last note\n"
 msgstr ""
 
-#: src/elflint.c:4463
+#: src/elflint.c:4465
 #, c-format
 msgid "section [%2d] '%s': no note entries defined for the type of file\n"
 msgstr ""
 
-#: src/elflint.c:4470
+#: src/elflint.c:4472
 #, c-format
 msgid "section [%2d] '%s': cannot get content of note section\n"
 msgstr ""
 
-#: src/elflint.c:4473
+#: src/elflint.c:4475
 #, c-format
 msgid "section [%2d] '%s': extra %<PRIu64> bytes after last note\n"
 msgstr ""
 
-#: src/elflint.c:4491
+#: src/elflint.c:4493
 #, c-format
 msgid ""
 "only executables, shared objects, and core files can have program headers\n"
 msgstr ""
 
-#: src/elflint.c:4506
+#: src/elflint.c:4508
 #, c-format
 msgid "cannot get program header entry %d: %s\n"
 msgstr ""
 
-#: src/elflint.c:4516
+#: src/elflint.c:4518
 #, c-format
 msgid "program header entry %d: unknown program header entry type %#<PRIx64>\n"
 msgstr ""
 
-#: src/elflint.c:4527
+#: src/elflint.c:4529
 #, c-format
 msgid "more than one INTERP entry in program header\n"
 msgstr ""
 
-#: src/elflint.c:4535
+#: src/elflint.c:4537
 #, c-format
 msgid "more than one TLS entry in program header\n"
 msgstr ""
 
-#: src/elflint.c:4542
+#: src/elflint.c:4544
 #, c-format
 msgid "static executable cannot have dynamic sections\n"
 msgstr ""
 
-#: src/elflint.c:4556
+#: src/elflint.c:4558
 #, c-format
 msgid "dynamic section reference in program header has wrong offset\n"
 msgstr ""
 
-#: src/elflint.c:4559
+#: src/elflint.c:4561
 #, c-format
 msgid "dynamic section size mismatch in program and section header\n"
 msgstr ""
 
-#: src/elflint.c:4569
+#: src/elflint.c:4571
 #, c-format
 msgid "more than one GNU_RELRO entry in program header\n"
 msgstr ""
 
-#: src/elflint.c:4590
+#: src/elflint.c:4592
 #, c-format
 msgid "loadable segment GNU_RELRO applies to is not writable\n"
 msgstr ""
 
-#: src/elflint.c:4601
+#: src/elflint.c:4603
 #, c-format
 msgid "loadable segment [%u] flags do not match GNU_RELRO [%u] flags\n"
 msgstr ""
 
-#: src/elflint.c:4608
+#: src/elflint.c:4610
 #, c-format
 msgid ""
 "GNU_RELRO [%u] flags are not a subset of the loadable segment [%u] flags\n"
 msgstr ""
 
-#: src/elflint.c:4617 src/elflint.c:4640
+#: src/elflint.c:4619 src/elflint.c:4642
 #, c-format
 msgid "%s segment not contained in a loaded segment\n"
 msgstr ""
 
-#: src/elflint.c:4646
+#: src/elflint.c:4648
 #, c-format
 msgid "program header offset in ELF header and PHDR entry do not match"
 msgstr ""
 
-#: src/elflint.c:4673
+#: src/elflint.c:4675
 #, c-format
 msgid "call frame search table reference in program header has wrong offset\n"
 msgstr ""
 
-#: src/elflint.c:4676
+#: src/elflint.c:4678
 #, c-format
 msgid "call frame search table size mismatch in program and section header\n"
 msgstr ""
 
-#: src/elflint.c:4689
+#: src/elflint.c:4691
 #, c-format
 msgid "PT_GNU_EH_FRAME present but no .eh_frame_hdr section\n"
 msgstr ""
 
-#: src/elflint.c:4697
+#: src/elflint.c:4699
 #, c-format
 msgid "call frame search table must be allocated\n"
 msgstr ""
 
-#: src/elflint.c:4700
+#: src/elflint.c:4702
 #, c-format
 msgid "section [%2zu] '%s' must be allocated\n"
 msgstr ""
 
-#: src/elflint.c:4704
+#: src/elflint.c:4706
 #, c-format
 msgid "call frame search table must not be writable\n"
 msgstr ""
 
-#: src/elflint.c:4707
+#: src/elflint.c:4709
 #, c-format
 msgid "section [%2zu] '%s' must not be writable\n"
 msgstr ""
 
-#: src/elflint.c:4712
+#: src/elflint.c:4714
 #, c-format
 msgid "call frame search table must not be executable\n"
 msgstr ""
 
-#: src/elflint.c:4715
+#: src/elflint.c:4717
 #, c-format
 msgid "section [%2zu] '%s' must not be executable\n"
 msgstr ""
 
-#: src/elflint.c:4726
+#: src/elflint.c:4728
 #, c-format
 msgid "program header entry %d: file size greater than memory size\n"
 msgstr ""
 
-#: src/elflint.c:4733
+#: src/elflint.c:4735
 #, c-format
 msgid "program header entry %d: alignment not a power of 2\n"
 msgstr ""
 
-#: src/elflint.c:4736
+#: src/elflint.c:4738
 #, c-format
 msgid ""
 "program header entry %d: file offset and virtual address not module of "
 "alignment\n"
 msgstr ""
 
-#: src/elflint.c:4749
+#: src/elflint.c:4751
 #, c-format
 msgid ""
 "executable/DSO with .eh_frame_hdr section does not have a PT_GNU_EH_FRAME "
 "program header entry"
 msgstr ""
 
-#: src/elflint.c:4783
+#: src/elflint.c:4785
 #, c-format
 msgid "cannot read ELF header: %s\n"
 msgstr ""
 
-#: src/elflint.c:4795
+#: src/elflint.c:4797
 #, fuzzy, c-format
 msgid "cannot create backend for ELF file\n"
 msgstr "neue Datei konnte nicht angelegt werden"
 
-#: src/elflint.c:4816
+#: src/elflint.c:4818
 #, c-format
 msgid "text relocation flag set but not needed\n"
 msgstr ""
 
-#: src/findtextrel.c:60
+#: src/findtextrel.c:61
 msgid "Input Selection:"
 msgstr ""
 
-#: src/findtextrel.c:61
+#: src/findtextrel.c:62
 msgid "Prepend PATH to all file names"
 msgstr ""
 
-#: src/findtextrel.c:63
+#: src/findtextrel.c:64
 msgid "Use PATH as root of debuginfo hierarchy"
 msgstr ""
 
 #. Short description of program.
-#: src/findtextrel.c:70
+#: src/findtextrel.c:71
 msgid "Locate source of text relocations in FILEs (a.out by default)."
 msgstr ""
 
 #. Strings for arguments in help texts.
-#: src/findtextrel.c:74 src/nm.c:108 src/objdump.c:71 src/size.c:80
+#: src/findtextrel.c:75 src/nm.c:108 src/objdump.c:71 src/size.c:80
 #: src/strings.c:87 src/strip.c:101
 msgid "[FILE...]"
 msgstr ""
 
-#: src/findtextrel.c:222
+#: src/findtextrel.c:224
 #, c-format
 msgid "cannot get ELF header '%s': %s"
 msgstr ""
 
-#: src/findtextrel.c:233
+#: src/findtextrel.c:235
 #, c-format
 msgid "'%s' is not a DSO or PIE"
 msgstr ""
 
-#: src/findtextrel.c:253
+#: src/findtextrel.c:255
 #, c-format
 msgid "getting get section header of section %zu: %s"
 msgstr ""
 
-#: src/findtextrel.c:277
+#: src/findtextrel.c:279
 #, c-format
 msgid "cannot read dynamic section: %s"
 msgstr ""
 
-#: src/findtextrel.c:298
+#: src/findtextrel.c:300
 #, c-format
 msgid "no text relocations reported in '%s'"
 msgstr ""
 
-#: src/findtextrel.c:310
+#: src/findtextrel.c:311
 #, c-format
 msgid "while reading ELF file"
 msgstr ""
 
-#: src/findtextrel.c:314
+#: src/findtextrel.c:315
 #, fuzzy, c-format
 msgid "cannot get program header count: %s"
 msgstr "konnte Programm-Kopf nicht erstellen: %s"
 
-#: src/findtextrel.c:325 src/findtextrel.c:342
+#: src/findtextrel.c:326 src/findtextrel.c:341
 #, fuzzy, c-format
 msgid "cannot get program header index at offset %zd: %s"
 msgstr "konnte Programm-Kopf nicht erstellen: %s"
 
-#: src/findtextrel.c:406
+#: src/findtextrel.c:397
 #, c-format
 msgid "cannot get symbol table section %zu in '%s': %s"
 msgstr ""
 
-#: src/findtextrel.c:427 src/findtextrel.c:450
+#: src/findtextrel.c:418 src/findtextrel.c:441
 #, c-format
 msgid "cannot get relocation at index %d in section %zu in '%s': %s"
 msgstr ""
 
-#: src/findtextrel.c:516
+#: src/findtextrel.c:507
 #, c-format
 msgid "%s not compiled with -fpic/-fPIC\n"
 msgstr ""
 
-#: src/findtextrel.c:570
+#: src/findtextrel.c:561
 #, c-format
 msgid ""
 "the file containing the function '%s' is not compiled with -fpic/-fPIC\n"
 msgstr ""
 
-#: src/findtextrel.c:577 src/findtextrel.c:597
+#: src/findtextrel.c:568 src/findtextrel.c:588
 #, c-format
 msgid ""
 "the file containing the function '%s' might not be compiled with -fpic/-"
 "fPIC\n"
 msgstr ""
 
-#: src/findtextrel.c:585
+#: src/findtextrel.c:576
 #, c-format
 msgid ""
 "either the file containing the function '%s' or the file containing the "
 "function '%s' is not compiled with -fpic/-fPIC\n"
 msgstr ""
 
-#: src/findtextrel.c:605
+#: src/findtextrel.c:596
 #, c-format
 msgid ""
 "a relocation modifies memory at offset %llu in a write-protected segment\n"
@@ -3448,12 +3679,12 @@
 msgstr "%s: INTERNER FEHLER %d (%s-%s): %s"
 
 #: src/nm.c:381 src/nm.c:393 src/size.c:288 src/size.c:297 src/size.c:308
-#: src/strip.c:2763
+#: src/strip.c:2767
 #, c-format
 msgid "while closing '%s'"
 msgstr "beim Schliessen von '%s'"
 
-#: src/nm.c:403 src/objdump.c:280 src/strip.c:818
+#: src/nm.c:403 src/objdump.c:280 src/strip.c:822
 #, c-format
 msgid "%s: File format not recognized"
 msgstr "%s: Dateiformat nicht erkannt"
@@ -3488,24 +3719,24 @@
 msgid "%s%s%s: file format not recognized"
 msgstr "%s%s%s: Dateiformat nicht erkannt"
 
-#: src/nm.c:705
+#: src/nm.c:704
 #, c-format
 msgid "cannot create search tree"
 msgstr "Kann Suchbaum nicht erstellen"
 
-#: src/nm.c:746 src/nm.c:1239 src/objdump.c:782 src/readelf.c:637
+#: src/nm.c:745 src/nm.c:1238 src/objdump.c:781 src/readelf.c:637
 #: src/readelf.c:1451 src/readelf.c:1602 src/readelf.c:1803 src/readelf.c:2009
-#: src/readelf.c:2199 src/readelf.c:2377 src/readelf.c:2453 src/readelf.c:2711
-#: src/readelf.c:2787 src/readelf.c:2874 src/readelf.c:3472 src/readelf.c:3522
-#: src/readelf.c:3592 src/readelf.c:11328 src/readelf.c:12523
-#: src/readelf.c:12734 src/readelf.c:12803 src/size.c:398 src/size.c:470
-#: src/strip.c:1084
+#: src/readelf.c:2199 src/readelf.c:2377 src/readelf.c:2453 src/readelf.c:2719
+#: src/readelf.c:2795 src/readelf.c:2882 src/readelf.c:3478 src/readelf.c:3528
+#: src/readelf.c:3598 src/readelf.c:11409 src/readelf.c:12603
+#: src/readelf.c:12814 src/readelf.c:12883 src/size.c:398 src/size.c:470
+#: src/strip.c:1089
 #, c-format
 msgid "cannot get section header string table index"
 msgstr ""
 
 #. We always print this prolog.
-#: src/nm.c:771
+#: src/nm.c:770
 #, c-format
 msgid ""
 "\n"
@@ -3519,35 +3750,58 @@
 "\n"
 
 #. The header line.
-#: src/nm.c:774
+#: src/nm.c:773
 #, c-format
 msgid ""
 "%*s%-*s %-*s Class  Type     %-*s %*s Section\n"
 "\n"
 msgstr ""
 
-#: src/nm.c:1250
+#: src/nm.c:775
+msgctxt "sysv"
+msgid "Name"
+msgstr ""
+
+#. TRANS: the "sysv|" parts makes the string unique.
+#: src/nm.c:777
+msgctxt "sysv"
+msgid "Value"
+msgstr ""
+
+#. TRANS: the "sysv|" parts makes the string unique.
+#: src/nm.c:779
+msgctxt "sysv"
+msgid "Size"
+msgstr ""
+
+#. TRANS: the "sysv|" parts makes the string unique.
+#: src/nm.c:781
+msgctxt "sysv"
+msgid "Line"
+msgstr ""
+
+#: src/nm.c:1249
 #, fuzzy, c-format
 msgid "%s: entry size in section %zd `%s' is not what we expect"
 msgstr "%s: entry size in section `%s' is not what we expect"
 
-#: src/nm.c:1255
+#: src/nm.c:1254
 #, fuzzy, c-format
 msgid "%s: size of section %zd `%s' is not multiple of entry size"
 msgstr "%s: entry size in section `%s' is not what we expect"
 
-#: src/nm.c:1334
+#: src/nm.c:1335
 #, fuzzy, c-format
 msgid "%s: entries (%zd) in section %zd `%s' is too large"
 msgstr "%s: entry size in section `%s' is not what we expect"
 
 #. XXX Add machine specific object file types.
-#: src/nm.c:1570
+#: src/nm.c:1571
 #, c-format
 msgid "%s%s%s%s: Invalid operation"
 msgstr "%s%s%s%s: Ungültige Operation"
 
-#: src/nm.c:1620
+#: src/nm.c:1621
 #, c-format
 msgid "%s%s%s: no symbols"
 msgstr "%s%s%s: keine Symbole"
@@ -3621,7 +3875,7 @@
 msgid "cannot disassemble"
 msgstr "Disassemblieren nicht möglich"
 
-#: src/objdump.c:760
+#: src/objdump.c:759
 #, fuzzy, c-format
 msgid "cannot create backend for elf file"
 msgstr "neue Datei konnte nicht angelegt werden"
@@ -3805,7 +4059,7 @@
 msgid "cannot generate Elf descriptor: %s"
 msgstr "konnte Elf-Deskriptor nicht erzeugen: %s"
 
-#: src/readelf.c:628 src/readelf.c:955 src/strip.c:1179
+#: src/readelf.c:628 src/readelf.c:955 src/strip.c:1184
 #, c-format
 msgid "cannot determine number of sections: %s"
 msgstr ""
@@ -3815,11 +4069,11 @@
 msgid "cannot get section: %s"
 msgstr ""
 
-#: src/readelf.c:655 src/readelf.c:1272 src/readelf.c:1483 src/readelf.c:12754
-#: src/unstrip.c:397 src/unstrip.c:428 src/unstrip.c:487 src/unstrip.c:608
-#: src/unstrip.c:629 src/unstrip.c:669 src/unstrip.c:885 src/unstrip.c:1216
-#: src/unstrip.c:1343 src/unstrip.c:1367 src/unstrip.c:1423 src/unstrip.c:1487
-#: src/unstrip.c:1662 src/unstrip.c:1813 src/unstrip.c:1956 src/unstrip.c:2055
+#: src/readelf.c:655 src/readelf.c:1272 src/readelf.c:1483 src/readelf.c:12834
+#: src/unstrip.c:397 src/unstrip.c:428 src/unstrip.c:491 src/unstrip.c:612
+#: src/unstrip.c:633 src/unstrip.c:673 src/unstrip.c:889 src/unstrip.c:1224
+#: src/unstrip.c:1351 src/unstrip.c:1375 src/unstrip.c:1431 src/unstrip.c:1472
+#: src/unstrip.c:1665 src/unstrip.c:1816 src/unstrip.c:1959 src/unstrip.c:2058
 #, c-format
 msgid "cannot get section header: %s"
 msgstr ""
@@ -3829,8 +4083,8 @@
 msgid "cannot get section name"
 msgstr "konnte Abschnittsdaten nicht holen: %s"
 
-#: src/readelf.c:672 src/readelf.c:6628 src/readelf.c:10600 src/readelf.c:10702
-#: src/readelf.c:10880
+#: src/readelf.c:672 src/readelf.c:6634 src/readelf.c:10681 src/readelf.c:10783
+#: src/readelf.c:10961
 #, c-format
 msgid "cannot get %s content: %s"
 msgstr ""
@@ -4152,7 +4406,7 @@
 "  Segment Sections..."
 msgstr ""
 
-#: src/readelf.c:1464 src/unstrip.c:2114 src/unstrip.c:2156 src/unstrip.c:2163
+#: src/readelf.c:1464 src/unstrip.c:2117 src/unstrip.c:2159 src/unstrip.c:2166
 #, c-format
 msgid "cannot get program header: %s"
 msgstr ""
@@ -4187,18 +4441,18 @@
 msgid "<INVALID SECTION>"
 msgstr ""
 
-#: src/readelf.c:1660 src/readelf.c:2387 src/readelf.c:3488 src/readelf.c:12625
-#: src/readelf.c:12632 src/readelf.c:12676 src/readelf.c:12683
+#: src/readelf.c:1660 src/readelf.c:2387 src/readelf.c:3494 src/readelf.c:12705
+#: src/readelf.c:12712 src/readelf.c:12756 src/readelf.c:12763
 msgid "Couldn't uncompress section"
 msgstr ""
 
-#: src/readelf.c:1665 src/readelf.c:2392 src/readelf.c:3493
+#: src/readelf.c:1665 src/readelf.c:2392 src/readelf.c:3499
 #, fuzzy, c-format
 msgid "cannot get section [%zd] header: %s"
 msgstr "konnte Abschnittsdaten nicht holen: %s"
 
-#: src/readelf.c:1809 src/readelf.c:2459 src/readelf.c:2717 src/readelf.c:2793
-#: src/readelf.c:3097 src/readelf.c:3171 src/readelf.c:5401
+#: src/readelf.c:1809 src/readelf.c:2459 src/readelf.c:2725 src/readelf.c:2801
+#: src/readelf.c:3105 src/readelf.c:3179 src/readelf.c:5407
 #, fuzzy, c-format
 msgid "invalid sh_link value in section %zu"
 msgstr "ungültige .debug_line Sektion"
@@ -4335,20 +4589,20 @@
 msgid "%5u: %0*<PRIx64> %6<PRId64> %-7s %-6s %-9s %6s %s"
 msgstr ""
 
-#: src/readelf.c:2590
+#: src/readelf.c:2595
 #, c-format
 msgid "bad dynamic symbol"
 msgstr ""
 
-#: src/readelf.c:2672
+#: src/readelf.c:2680
 msgid "none"
 msgstr "keine"
 
-#: src/readelf.c:2689
+#: src/readelf.c:2697
 msgid "| <unknown>"
 msgstr "| <unbekannt>"
 
-#: src/readelf.c:2720
+#: src/readelf.c:2728
 #, c-format
 msgid ""
 "\n"
@@ -4361,17 +4615,17 @@
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/readelf.c:2741
+#: src/readelf.c:2749
 #, fuzzy, c-format
 msgid "  %#06x: Version: %hu  File: %s  Cnt: %hu\n"
 msgstr "  %#06x: Version: %hu  Datei: %s  Cnt: %hu\n"
 
-#: src/readelf.c:2754
+#: src/readelf.c:2762
 #, c-format
 msgid "  %#06x: Name: %s  Flags: %s  Version: %hu\n"
 msgstr "  %#06x: Name: %s  Flags: %s  Version: %hu\n"
 
-#: src/readelf.c:2797
+#: src/readelf.c:2805
 #, c-format
 msgid ""
 "\n"
@@ -4384,18 +4638,18 @@
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/readelf.c:2825
+#: src/readelf.c:2833
 #, c-format
 msgid "  %#06x: Version: %hd  Flags: %s  Index: %hd  Cnt: %hd  Name: %s\n"
 msgstr ""
 
-#: src/readelf.c:2840
+#: src/readelf.c:2848
 #, c-format
 msgid "  %#06x: Parent %d: %s\n"
 msgstr ""
 
 #. Print the header.
-#: src/readelf.c:3101
+#: src/readelf.c:3109
 #, c-format
 msgid ""
 "\n"
@@ -4408,15 +4662,15 @@
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/readelf.c:3129
+#: src/readelf.c:3137
 msgid "   0 *local*                     "
 msgstr "   0 *lokal*                     "
 
-#: src/readelf.c:3134
+#: src/readelf.c:3142
 msgid "   1 *global*                    "
 msgstr "   1 *global*                    "
 
-#: src/readelf.c:3176
+#: src/readelf.c:3184
 #, c-format
 msgid ""
 "\n"
@@ -4431,66 +4685,66 @@
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/readelf.c:3198
+#: src/readelf.c:3206
 #, no-c-format
 msgid " Length  Number  % of total  Coverage\n"
 msgstr ""
 
-#: src/readelf.c:3200
+#: src/readelf.c:3208
 #, c-format
 msgid "      0  %6<PRIu32>      %5.1f%%\n"
 msgstr "      0  %6<PRIu32>      %5.1f%%\n"
 
-#: src/readelf.c:3207
+#: src/readelf.c:3215
 #, c-format
 msgid "%7d  %6<PRIu32>      %5.1f%%    %5.1f%%\n"
 msgstr "%7d  %6<PRIu32>      %5.1f%%    %5.1f%%\n"
 
-#: src/readelf.c:3220
+#: src/readelf.c:3228
 #, c-format
 msgid ""
 " Average number of tests:   successful lookup: %f\n"
 "\t\t\t  unsuccessful lookup: %f\n"
 msgstr ""
 
-#: src/readelf.c:3238 src/readelf.c:3302 src/readelf.c:3368
+#: src/readelf.c:3246 src/readelf.c:3310 src/readelf.c:3376
 #, c-format
 msgid "cannot get data for section %d: %s"
 msgstr ""
 
-#: src/readelf.c:3246
+#: src/readelf.c:3254
 #, fuzzy, c-format
 msgid "invalid data in sysv.hash section %d"
 msgstr "ungültige .debug_line Sektion"
 
-#: src/readelf.c:3275
+#: src/readelf.c:3283
 #, fuzzy, c-format
 msgid "invalid chain in sysv.hash section %d"
 msgstr "ungültige .debug_line Sektion"
 
-#: src/readelf.c:3310
+#: src/readelf.c:3318
 #, fuzzy, c-format
 msgid "invalid data in sysv.hash64 section %d"
 msgstr "ungültige .debug_line Sektion"
 
-#: src/readelf.c:3341
+#: src/readelf.c:3349
 #, fuzzy, c-format
 msgid "invalid chain in sysv.hash64 section %d"
 msgstr "ungültige .debug_line Sektion"
 
-#: src/readelf.c:3377
+#: src/readelf.c:3385
 #, fuzzy, c-format
 msgid "invalid data in gnu.hash section %d"
 msgstr "ungültige .debug_line Sektion"
 
-#: src/readelf.c:3444
+#: src/readelf.c:3451
 #, c-format
 msgid ""
 " Symbol Bias: %u\n"
 " Bitmask Size: %zu bytes  %<PRIuFAST32>%% bits set  2nd hash shift: %u\n"
 msgstr ""
 
-#: src/readelf.c:3533
+#: src/readelf.c:3539
 #, c-format
 msgid ""
 "\n"
@@ -4501,13 +4755,13 @@
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/readelf.c:3547
+#: src/readelf.c:3553
 msgid ""
 "       Library                       Time Stamp          Checksum Version "
 "Flags"
 msgstr ""
 
-#: src/readelf.c:3606
+#: src/readelf.c:3612
 #, c-format
 msgid ""
 "\n"
@@ -4515,102 +4769,102 @@
 "%#0<PRIx64>:\n"
 msgstr ""
 
-#: src/readelf.c:3623
+#: src/readelf.c:3629
 msgid "  Owner          Size\n"
 msgstr ""
 
-#: src/readelf.c:3647
+#: src/readelf.c:3653
 #, c-format
 msgid "  %-13s  %4<PRIu32>\n"
 msgstr "  %-13s  %4<PRIu32>\n"
 
 #. Unknown subsection, print and skip.
-#: src/readelf.c:3686
+#: src/readelf.c:3692
 #, c-format
 msgid "    %-4u %12<PRIu32>\n"
 msgstr "    %-4u %12<PRIu32>\n"
 
 #. Tag_File
-#: src/readelf.c:3691
+#: src/readelf.c:3697
 #, c-format
 msgid "    File: %11<PRIu32>\n"
 msgstr "    File: %11<PRIu32>\n"
 
-#: src/readelf.c:3740
+#: src/readelf.c:3746
 #, c-format
 msgid "      %s: %<PRId64>, %s\n"
 msgstr "      %s: %<PRId64>, %s\n"
 
-#: src/readelf.c:3743
+#: src/readelf.c:3749
 #, c-format
 msgid "      %s: %<PRId64>\n"
 msgstr "      %s: %<PRId64>\n"
 
-#: src/readelf.c:3746
+#: src/readelf.c:3752
 #, c-format
 msgid "      %s: %s\n"
 msgstr "      %s: %s\n"
 
-#: src/readelf.c:3756
+#: src/readelf.c:3762
 #, c-format
 msgid "      %u: %<PRId64>\n"
 msgstr "      %u: %<PRId64>\n"
 
-#: src/readelf.c:3759
+#: src/readelf.c:3765
 #, c-format
 msgid "      %u: %s\n"
 msgstr "      %u: %s\n"
 
-#: src/readelf.c:3829
+#: src/readelf.c:3835
 #, fuzzy, c-format
 msgid "sprintf failure"
 msgstr "mprotect fehlgeschlagen"
 
-#: src/readelf.c:4311
+#: src/readelf.c:4317
 msgid "empty block"
 msgstr ""
 
-#: src/readelf.c:4314
+#: src/readelf.c:4320
 #, c-format
 msgid "%zu byte block:"
 msgstr ""
 
-#: src/readelf.c:4792
+#: src/readelf.c:4798
 #, c-format
 msgid "%*s[%2<PRIuMAX>] %s  <TRUNCATED>\n"
 msgstr ""
 
-#: src/readelf.c:4859
+#: src/readelf.c:4865
 #, c-format
 msgid "%s %#<PRIx64> used with different address sizes"
 msgstr ""
 
-#: src/readelf.c:4866
+#: src/readelf.c:4872
 #, c-format
 msgid "%s %#<PRIx64> used with different offset sizes"
 msgstr ""
 
-#: src/readelf.c:4873
+#: src/readelf.c:4879
 #, c-format
 msgid "%s %#<PRIx64> used with different base addresses"
 msgstr ""
 
-#: src/readelf.c:4880
+#: src/readelf.c:4886
 #, c-format
 msgid "%s %#<PRIx64> used with different attribute %s and %s"
 msgstr ""
 
-#: src/readelf.c:4980
+#: src/readelf.c:4986
 #, c-format
 msgid " [%6tx]  <UNUSED GARBAGE IN REST OF SECTION>\n"
 msgstr ""
 
-#: src/readelf.c:4988
+#: src/readelf.c:4994
 #, c-format
 msgid " [%6tx]  <UNUSED GARBAGE> ... %<PRIu64> bytes ...\n"
 msgstr ""
 
-#: src/readelf.c:5091
+#: src/readelf.c:5097
 #, c-format
 msgid ""
 "\n"
@@ -4618,79 +4872,79 @@
 " [ Code]\n"
 msgstr ""
 
-#: src/readelf.c:5099
+#: src/readelf.c:5105
 #, c-format
 msgid ""
 "\n"
 "Abbreviation section at offset %<PRIu64>:\n"
 msgstr ""
 
-#: src/readelf.c:5112
+#: src/readelf.c:5118
 #, c-format
 msgid " *** error while reading abbreviation: %s\n"
 msgstr ""
 
-#: src/readelf.c:5128
+#: src/readelf.c:5134
 #, c-format
 msgid " [%5u] offset: %<PRId64>, children: %s, tag: %s\n"
 msgstr ""
 
-#: src/readelf.c:5161 src/readelf.c:5470 src/readelf.c:5637 src/readelf.c:6022
-#: src/readelf.c:6638 src/readelf.c:8375 src/readelf.c:9064 src/readelf.c:9537
-#: src/readelf.c:9788 src/readelf.c:9954 src/readelf.c:10341
-#: src/readelf.c:10401
+#: src/readelf.c:5167 src/readelf.c:5476 src/readelf.c:5643 src/readelf.c:6028
+#: src/readelf.c:6644 src/readelf.c:8399 src/readelf.c:9145 src/readelf.c:9618
+#: src/readelf.c:9869 src/readelf.c:10035 src/readelf.c:10422
+#: src/readelf.c:10482
 #, c-format
 msgid ""
 "\n"
 "DWARF section [%2zu] '%s' at offset %#<PRIx64>:\n"
 msgstr ""
 
-#: src/readelf.c:5174
+#: src/readelf.c:5180
 #, fuzzy, c-format
 msgid "cannot get .debug_addr section data: %s"
 msgstr "konnte Abschnittsdaten nicht holen: %s"
 
-#: src/readelf.c:5274 src/readelf.c:5298 src/readelf.c:5682 src/readelf.c:9109
+#: src/readelf.c:5280 src/readelf.c:5304 src/readelf.c:5688 src/readelf.c:9190
 #, fuzzy, c-format
 msgid " Length:         %8<PRIu64>\n"
 msgstr "      %s: %<PRId64>\n"
 
-#: src/readelf.c:5276 src/readelf.c:5313 src/readelf.c:5695 src/readelf.c:9122
+#: src/readelf.c:5282 src/readelf.c:5319 src/readelf.c:5701 src/readelf.c:9203
 #, fuzzy, c-format
 msgid " DWARF version:  %8<PRIu16>\n"
 msgstr "      %s: %<PRId64>\n"
 
-#: src/readelf.c:5277 src/readelf.c:5322 src/readelf.c:5704 src/readelf.c:9131
+#: src/readelf.c:5283 src/readelf.c:5328 src/readelf.c:5710 src/readelf.c:9212
 #, fuzzy, c-format
 msgid " Address size:   %8<PRIu64>\n"
 msgstr "      %s: %<PRId64>\n"
 
-#: src/readelf.c:5279 src/readelf.c:5332 src/readelf.c:5714 src/readelf.c:9141
+#: src/readelf.c:5285 src/readelf.c:5338 src/readelf.c:5720 src/readelf.c:9222
 #, fuzzy, c-format
 msgid " Segment size:   %8<PRIu64>\n"
 msgstr "      %s: %<PRId64>\n"
 
-#: src/readelf.c:5317 src/readelf.c:5699 src/readelf.c:9126 src/readelf.c:10533
+#: src/readelf.c:5323 src/readelf.c:5705 src/readelf.c:9207 src/readelf.c:10614
 #, fuzzy, c-format
 msgid "Unknown version"
 msgstr "unbekannte Version"
 
-#: src/readelf.c:5327 src/readelf.c:5540 src/readelf.c:5709 src/readelf.c:9136
+#: src/readelf.c:5333 src/readelf.c:5546 src/readelf.c:5715 src/readelf.c:9217
 #, fuzzy, c-format
 msgid "unsupported address size"
 msgstr "Kein Adress-Wert"
 
-#: src/readelf.c:5338 src/readelf.c:5551 src/readelf.c:5719 src/readelf.c:9146
+#: src/readelf.c:5344 src/readelf.c:5557 src/readelf.c:5725 src/readelf.c:9227
 #, c-format
 msgid "unsupported segment size"
 msgstr ""
 
-#: src/readelf.c:5391 src/readelf.c:5465
+#: src/readelf.c:5397 src/readelf.c:5471
 #, c-format
 msgid "cannot get .debug_aranges content: %s"
 msgstr ""
 
-#: src/readelf.c:5406
+#: src/readelf.c:5412
 #, c-format
 msgid ""
 "\n"
@@ -4701,239 +4955,239 @@
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/readelf.c:5437
+#: src/readelf.c:5443
 #, c-format
 msgid " [%*zu] ???\n"
 msgstr " [%*zu] ???\n"
 
-#: src/readelf.c:5439
+#: src/readelf.c:5445
 #, c-format
 msgid ""
 " [%*zu] start: %0#*<PRIx64>, length: %5<PRIu64>, CU DIE offset: %6<PRId64>\n"
 msgstr ""
 
-#: src/readelf.c:5483 src/readelf.c:8402
+#: src/readelf.c:5489 src/readelf.c:8426
 #, c-format
 msgid ""
 "\n"
 "Table at offset %zu:\n"
 msgstr ""
 
-#: src/readelf.c:5487 src/readelf.c:5663 src/readelf.c:6662 src/readelf.c:8413
-#: src/readelf.c:9090
+#: src/readelf.c:5493 src/readelf.c:5669 src/readelf.c:6668 src/readelf.c:8437
+#: src/readelf.c:9171
 #, c-format
 msgid "invalid data in section [%zu] '%s'"
 msgstr ""
 
-#: src/readelf.c:5503
+#: src/readelf.c:5509
 #, fuzzy, c-format
 msgid ""
 "\n"
 " Length:        %6<PRIu64>\n"
 msgstr "      %s: %<PRId64>\n"
 
-#: src/readelf.c:5515
+#: src/readelf.c:5521
 #, fuzzy, c-format
 msgid " DWARF version: %6<PRIuFAST16>\n"
 msgstr "      %s: %<PRId64>\n"
 
-#: src/readelf.c:5519
+#: src/readelf.c:5525
 #, c-format
 msgid "unsupported aranges version"
 msgstr ""
 
-#: src/readelf.c:5530
+#: src/readelf.c:5536
 #, fuzzy, c-format
 msgid " CU offset:     %6<PRIx64>\n"
 msgstr "      %s: %<PRId64>\n"
 
-#: src/readelf.c:5536
+#: src/readelf.c:5542
 #, c-format
 msgid " Address size:  %6<PRIu64>\n"
 msgstr ""
 
-#: src/readelf.c:5547
+#: src/readelf.c:5553
 #, c-format
 msgid ""
 " Segment size:  %6<PRIu64>\n"
 "\n"
 msgstr ""
 
-#: src/readelf.c:5602
+#: src/readelf.c:5608
 #, c-format
 msgid "   %zu padding bytes\n"
 msgstr ""
 
-#: src/readelf.c:5646
+#: src/readelf.c:5652
 #, fuzzy, c-format
 msgid "cannot get .debug_rnglists content: %s"
 msgstr "konnte Programm-Kopf nicht erstellen: %s"
 
-#: src/readelf.c:5669 src/readelf.c:9096
+#: src/readelf.c:5675 src/readelf.c:9177
 #, fuzzy, c-format
 msgid ""
 "Table at Offset 0x%<PRIx64>:\n"
 "\n"
 msgstr "      %s: %<PRId64>\n"
 
-#: src/readelf.c:5724 src/readelf.c:9151
+#: src/readelf.c:5730 src/readelf.c:9232
 #, fuzzy, c-format
 msgid " Offset entries: %8<PRIu64>\n"
 msgstr "      %s: %<PRId64>\n"
 
-#: src/readelf.c:5740 src/readelf.c:9167
+#: src/readelf.c:5746 src/readelf.c:9248
 #, c-format
 msgid " Unknown CU base: "
 msgstr ""
 
-#: src/readelf.c:5742 src/readelf.c:9169
+#: src/readelf.c:5748 src/readelf.c:9250
 #, c-format
 msgid " CU [%6<PRIx64>] base: "
 msgstr ""
 
-#: src/readelf.c:5748 src/readelf.c:9175
+#: src/readelf.c:5754 src/readelf.c:9256
 #, c-format
 msgid " Not associated with a CU.\n"
 msgstr ""
 
-#: src/readelf.c:5759 src/readelf.c:9186
+#: src/readelf.c:5765 src/readelf.c:9267
 #, c-format
 msgid "too many offset entries for unit length"
 msgstr ""
 
-#: src/readelf.c:5763 src/readelf.c:9190
+#: src/readelf.c:5769 src/readelf.c:9271
 #, fuzzy, c-format
 msgid "  Offsets starting at 0x%<PRIx64>:\n"
 msgstr "      %s: %<PRId64>\n"
 
-#: src/readelf.c:5815
+#: src/readelf.c:5821
 #, fuzzy, c-format
 msgid "invalid range list data"
 msgstr "Ungültige Daten"
 
-#: src/readelf.c:6000 src/readelf.c:9515
+#: src/readelf.c:6006 src/readelf.c:9596
 #, c-format
 msgid ""
 "   %zu padding bytes\n"
 "\n"
 msgstr ""
 
-#: src/readelf.c:6017
+#: src/readelf.c:6023
 #, c-format
 msgid "cannot get .debug_ranges content: %s"
 msgstr ""
 
-#: src/readelf.c:6053 src/readelf.c:9570
+#: src/readelf.c:6059 src/readelf.c:9651
 #, c-format
 msgid ""
 "\n"
 " Unknown CU base: "
 msgstr ""
 
-#: src/readelf.c:6055 src/readelf.c:9572
+#: src/readelf.c:6061 src/readelf.c:9653
 #, c-format
 msgid ""
 "\n"
 " CU [%6<PRIx64>] base: "
 msgstr ""
 
-#: src/readelf.c:6064 src/readelf.c:9598 src/readelf.c:9624
+#: src/readelf.c:6070 src/readelf.c:9679 src/readelf.c:9705
 #, c-format
 msgid " [%6tx]  <INVALID DATA>\n"
 msgstr ""
 
-#: src/readelf.c:6089 src/readelf.c:9708
+#: src/readelf.c:6095 src/readelf.c:9789
 #, fuzzy
 msgid "base address"
 msgstr "Außerhalb des Adressbereiches"
 
-#: src/readelf.c:6099 src/readelf.c:9718
+#: src/readelf.c:6105 src/readelf.c:9799
 #, fuzzy, c-format
 msgid " [%6tx] empty list\n"
 msgstr " [%6tx]  %s..%s\n"
 
-#: src/readelf.c:6359
+#: src/readelf.c:6365
 msgid "         <INVALID DATA>\n"
 msgstr ""
 
-#: src/readelf.c:6616
+#: src/readelf.c:6622
 #, fuzzy, c-format
 msgid "cannot get ELF: %s"
 msgstr "ELF Kopf konnte nicht ausgelesen werden"
 
-#: src/readelf.c:6634
+#: src/readelf.c:6640
 #, c-format
 msgid ""
 "\n"
 "Call frame information section [%2zu] '%s' at offset %#<PRIx64>:\n"
 msgstr ""
 
-#: src/readelf.c:6684
+#: src/readelf.c:6690
 #, c-format
 msgid ""
 "\n"
 " [%6tx] Zero terminator\n"
 msgstr ""
 
-#: src/readelf.c:6785 src/readelf.c:6939
+#: src/readelf.c:6791 src/readelf.c:6945
 #, fuzzy, c-format
 msgid "invalid augmentation length"
 msgstr "ungültige Abschnittsausrichtung"
 
-#: src/readelf.c:6800
+#: src/readelf.c:6806
 msgid "FDE address encoding: "
 msgstr ""
 
-#: src/readelf.c:6806
+#: src/readelf.c:6812
 msgid "LSDA pointer encoding: "
 msgstr ""
 
-#: src/readelf.c:6916
+#: src/readelf.c:6922
 #, c-format
 msgid " (offset: %#<PRIx64>)"
 msgstr ""
 
-#: src/readelf.c:6923
+#: src/readelf.c:6929
 #, c-format
 msgid " (end offset: %#<PRIx64>)"
 msgstr ""
 
-#: src/readelf.c:6960
+#: src/readelf.c:6966
 #, c-format
 msgid "   %-26sLSDA pointer: %#<PRIx64>\n"
 msgstr ""
 
-#: src/readelf.c:7045
+#: src/readelf.c:7051
 #, c-format
 msgid "DIE [%<PRIx64>] cannot get attribute code: %s"
 msgstr ""
 
-#: src/readelf.c:7055
+#: src/readelf.c:7061
 #, c-format
 msgid "DIE [%<PRIx64>] cannot get attribute form: %s"
 msgstr ""
 
-#: src/readelf.c:7077
+#: src/readelf.c:7083
 #, c-format
 msgid "DIE [%<PRIx64>] cannot get attribute '%s' (%s) value: %s"
 msgstr ""
 
-#: src/readelf.c:7407
+#: src/readelf.c:7413
 #, fuzzy, c-format
 msgid "invalid file (%<PRId64>): %s"
 msgstr "Ungültige Datei"
 
-#: src/readelf.c:7411
+#: src/readelf.c:7417
 #, fuzzy, c-format
 msgid "no srcfiles for CU [%<PRIx64>]"
 msgstr "unbekannte Form %<PRIx64>"
 
-#: src/readelf.c:7415
+#: src/readelf.c:7421
 #, fuzzy, c-format
 msgid "couldn't get DWARF CU: %s"
 msgstr "ELF Kopf konnte nicht ausgelesen werden"
 
-#: src/readelf.c:7728
+#: src/readelf.c:7736
 #, c-format
 msgid ""
 "\n"
@@ -4941,12 +5195,12 @@
 " [Offset]\n"
 msgstr ""
 
-#: src/readelf.c:7778
+#: src/readelf.c:7786
 #, fuzzy, c-format
 msgid "cannot get next unit: %s"
 msgstr "konnte Abschnittsdaten nicht holen: %s"
 
-#: src/readelf.c:7797
+#: src/readelf.c:7806
 #, c-format
 msgid ""
 " Type unit at offset %<PRIu64>:\n"
@@ -4955,7 +5209,7 @@
 " Type signature: %#<PRIx64>, Type offset: %#<PRIx64> [%<PRIx64>]\n"
 msgstr ""
 
-#: src/readelf.c:7809
+#: src/readelf.c:7818
 #, c-format
 msgid ""
 " Compilation unit at offset %<PRIu64>:\n"
@@ -4963,37 +5217,37 @@
 "%<PRIu8>, Offset size: %<PRIu8>\n"
 msgstr ""
 
-#: src/readelf.c:7819 src/readelf.c:7982
+#: src/readelf.c:7828 src/readelf.c:7989
 #, c-format
 msgid " Unit type: %s (%<PRIu8>)"
 msgstr ""
 
-#: src/readelf.c:7846
+#: src/readelf.c:7855
 #, c-format
 msgid "unknown version (%d) or unit type (%d)"
 msgstr ""
 
-#: src/readelf.c:7875
+#: src/readelf.c:7884
 #, c-format
 msgid "cannot get DIE offset: %s"
 msgstr ""
 
-#: src/readelf.c:7884
+#: src/readelf.c:7893
 #, fuzzy, c-format
 msgid "cannot get tag of DIE at offset [%<PRIx64>] in section '%s': %s"
 msgstr "konnte Programm-Kopf nicht erstellen: %s"
 
-#: src/readelf.c:7922
+#: src/readelf.c:7929
 #, c-format
 msgid "cannot get next DIE: %s\n"
 msgstr ""
 
-#: src/readelf.c:7930
+#: src/readelf.c:7937
 #, c-format
 msgid "cannot get next DIE: %s"
 msgstr ""
 
-#: src/readelf.c:7974
+#: src/readelf.c:7981
 #, c-format
 msgid ""
 " Split compilation unit at offset %<PRIu64>:\n"
@@ -5001,7 +5255,7 @@
 "%<PRIu8>, Offset size: %<PRIu8>\n"
 msgstr ""
 
-#: src/readelf.c:8026
+#: src/readelf.c:8033
 #, c-format
 msgid ""
 "\n"
@@ -5009,18 +5263,18 @@
 "\n"
 msgstr ""
 
-#: src/readelf.c:8358
+#: src/readelf.c:8365
 #, fuzzy, c-format
 msgid "unknown form: %s"
 msgstr "unbekannte Form %<PRIx64>"
 
-#: src/readelf.c:8389
+#: src/readelf.c:8413
 #, c-format
 msgid "cannot get line data section data: %s"
 msgstr ""
 
 #. Print what we got so far.
-#: src/readelf.c:8491
+#: src/readelf.c:8517
 #, c-format
 msgid ""
 "\n"
@@ -5039,177 +5293,187 @@
 "Opcodes:\n"
 msgstr ""
 
-#: src/readelf.c:8513
+#: src/readelf.c:8539
 #, fuzzy, c-format
 msgid "cannot handle .debug_line version: %u\n"
 msgstr "ungültige .debug_line Sektion"
 
-#: src/readelf.c:8521
+#: src/readelf.c:8547
 #, fuzzy, c-format
 msgid "cannot handle address size: %u\n"
 msgstr "Kein Adress-Wert"
 
-#: src/readelf.c:8529
+#: src/readelf.c:8555
 #, c-format
 msgid "cannot handle segment selector size: %u\n"
 msgstr ""
 
-#: src/readelf.c:8539
+#: src/readelf.c:8565
 #, c-format
 msgid "invalid data at offset %tu in section [%zu] '%s'"
 msgstr ""
 
-#: src/readelf.c:8554
+#: src/readelf.c:8580
 #, c-format
 msgid "  [%*<PRIuFAST8>]  %hhu argument\n"
 msgid_plural "  [%*<PRIuFAST8>]  %hhu arguments\n"
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/readelf.c:8565
+#: src/readelf.c:8591
 msgid ""
 "\n"
 "Directory table:"
 msgstr ""
 
-#: src/readelf.c:8571 src/readelf.c:8648
+#: src/readelf.c:8597 src/readelf.c:8674
 #, fuzzy, c-format
 msgid "      ["
 msgstr "      %s: %s\n"
 
-#: src/readelf.c:8642
+#: src/readelf.c:8668
 msgid ""
 "\n"
 "File name table:"
 msgstr ""
 
-#: src/readelf.c:8703
+#: src/readelf.c:8729
 msgid " Entry Dir   Time      Size      Name"
 msgstr ""
 
-#: src/readelf.c:8742
+#: src/readelf.c:8775
 msgid ""
 "\n"
 "No line number statements."
 msgstr ""
 
-#: src/readelf.c:8746
+#: src/readelf.c:8779
 msgid ""
 "\n"
 "Line number statements:"
 msgstr ""
 
-#: src/readelf.c:8766
+#: src/readelf.c:8794
 #, c-format
 msgid "invalid maximum operations per instruction is zero"
 msgstr ""
 
-#: src/readelf.c:8800
+#: src/readelf.c:8828
 #, c-format
 msgid " special opcode %u: address+%u = "
 msgstr ""
 
-#: src/readelf.c:8804
+#: src/readelf.c:8832
 #, c-format
 msgid ", op_index = %u, line%+d = %zu\n"
 msgstr ""
 
-#: src/readelf.c:8807
+#: src/readelf.c:8835
 #, c-format
 msgid ", line%+d = %zu\n"
 msgstr ""
 
-#: src/readelf.c:8825
+#: src/readelf.c:8853
 #, c-format
 msgid " extended opcode %u: "
 msgstr ""
 
-#: src/readelf.c:8830
+#: src/readelf.c:8858
 msgid " end of sequence"
 msgstr ""
 
-#: src/readelf.c:8848
+#: src/readelf.c:8876
 #, fuzzy, c-format
 msgid " set address to "
 msgstr "Außerhalb des Adressbereiches"
 
-#: src/readelf.c:8876
+#: src/readelf.c:8904
 #, c-format
 msgid " define new file: dir=%u, mtime=%<PRIu64>, length=%<PRIu64>, name=%s\n"
 msgstr ""
 
-#: src/readelf.c:8890
+#: src/readelf.c:8918
 #, c-format
 msgid " set discriminator to %u\n"
 msgstr ""
 
+#: src/readelf.c:8945
+#, c-format
+msgid " set inlined context %u, function name %s (0x%x)\n"
+msgstr ""
+
+#: src/readelf.c:8969
+#, c-format
+msgid " set function name %s (0x%x)\n"
+msgstr ""
+
 #. Unknown, ignore it.
-#: src/readelf.c:8895
+#: src/readelf.c:8976
 #, fuzzy
 msgid " unknown opcode"
 msgstr "unbekannter Typ"
 
 #. Takes no argument.
-#: src/readelf.c:8907
+#: src/readelf.c:8988
 msgid " copy"
 msgstr ""
 
-#: src/readelf.c:8918
+#: src/readelf.c:8999
 #, c-format
 msgid " advance address by %u to "
 msgstr ""
 
-#: src/readelf.c:8922 src/readelf.c:8983
+#: src/readelf.c:9003 src/readelf.c:9064
 #, c-format
 msgid ", op_index to %u"
 msgstr ""
 
-#: src/readelf.c:8934
+#: src/readelf.c:9015
 #, c-format
 msgid " advance line by constant %d to %<PRId64>\n"
 msgstr ""
 
-#: src/readelf.c:8944
+#: src/readelf.c:9025
 #, c-format
 msgid " set file to %<PRIu64>\n"
 msgstr ""
 
-#: src/readelf.c:8955
+#: src/readelf.c:9036
 #, c-format
 msgid " set column to %<PRIu64>\n"
 msgstr ""
 
-#: src/readelf.c:8962
+#: src/readelf.c:9043
 #, c-format
 msgid " set '%s' to %<PRIuFAST8>\n"
 msgstr ""
 
 #. Takes no argument.
-#: src/readelf.c:8968
+#: src/readelf.c:9049
 msgid " set basic block flag"
 msgstr ""
 
-#: src/readelf.c:8979
+#: src/readelf.c:9060
 #, c-format
 msgid " advance address by constant %u to "
 msgstr ""
 
-#: src/readelf.c:8999
+#: src/readelf.c:9080
 #, c-format
 msgid " advance address by fixed value %u to \n"
 msgstr ""
 
 #. Takes no argument.
-#: src/readelf.c:9009
+#: src/readelf.c:9090
 msgid " set prologue end flag"
 msgstr ""
 
 #. Takes no argument.
-#: src/readelf.c:9014
+#: src/readelf.c:9095
 msgid " set epilogue begin flag"
 msgstr ""
 
-#: src/readelf.c:9024
+#: src/readelf.c:9105
 #, c-format
 msgid " set isa to %u\n"
 msgstr ""
@@ -5217,108 +5481,108 @@
 #. This is a new opcode the generator but not we know about.
 #. Read the parameters associated with it but then discard
 #. everything.  Read all the parameters for this opcode.
-#: src/readelf.c:9033
+#: src/readelf.c:9114
 #, c-format
 msgid " unknown opcode with %<PRIu8> parameter:"
 msgid_plural " unknown opcode with %<PRIu8> parameters:"
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/readelf.c:9073
+#: src/readelf.c:9154
 #, fuzzy, c-format
 msgid "cannot get .debug_loclists content: %s"
 msgstr "konnte Eintrag aus der Symboltabelle nicht holen: %s"
 
-#: src/readelf.c:9239
+#: src/readelf.c:9320
 #, c-format
 msgid "    <INVALID DATA>\n"
 msgstr ""
 
-#: src/readelf.c:9279
+#: src/readelf.c:9360
 #, fuzzy, c-format
 msgid "invalid loclists data"
 msgstr "Ungültige Daten"
 
-#: src/readelf.c:9532
+#: src/readelf.c:9613
 #, c-format
 msgid "cannot get .debug_loc content: %s"
 msgstr ""
 
-#: src/readelf.c:9745 src/readelf.c:10789
+#: src/readelf.c:9826 src/readelf.c:10870
 msgid "   <INVALID DATA>\n"
 msgstr ""
 
-#: src/readelf.c:9800 src/readelf.c:9963
+#: src/readelf.c:9881 src/readelf.c:10044
 #, c-format
 msgid "cannot get macro information section data: %s"
 msgstr ""
 
-#: src/readelf.c:9880
+#: src/readelf.c:9961
 #, c-format
 msgid "%*s*** non-terminated string at end of section"
 msgstr ""
 
-#: src/readelf.c:9903
+#: src/readelf.c:9984
 #, c-format
 msgid "%*s*** missing DW_MACINFO_start_file argument at end of section"
 msgstr ""
 
-#: src/readelf.c:10004
+#: src/readelf.c:10085
 #, fuzzy, c-format
 msgid " Offset:             0x%<PRIx64>\n"
 msgstr "      %s: %<PRId64>\n"
 
-#: src/readelf.c:10016
+#: src/readelf.c:10097
 #, fuzzy, c-format
 msgid " Version:            %<PRIu16>\n"
 msgstr "      %s: %<PRId64>\n"
 
-#: src/readelf.c:10022 src/readelf.c:10909
+#: src/readelf.c:10103 src/readelf.c:10990
 #, c-format
 msgid "  unknown version, cannot parse section\n"
 msgstr ""
 
-#: src/readelf.c:10029
+#: src/readelf.c:10110
 #, fuzzy, c-format
 msgid " Flag:               0x%<PRIx8>"
 msgstr "      %s: %<PRId64>\n"
 
-#: src/readelf.c:10058
+#: src/readelf.c:10139
 #, c-format
 msgid " Offset length:      %<PRIu8>\n"
 msgstr ""
 
-#: src/readelf.c:10066
+#: src/readelf.c:10147
 #, c-format
 msgid " .debug_line offset: 0x%<PRIx64>\n"
 msgstr ""
 
-#: src/readelf.c:10091
+#: src/readelf.c:10172
 #, c-format
 msgid "  extension opcode table, %<PRIu8> items:\n"
 msgstr ""
 
-#: src/readelf.c:10098
+#: src/readelf.c:10179
 #, c-format
 msgid "    [%<PRIx8>]"
 msgstr ""
 
-#: src/readelf.c:10110
+#: src/readelf.c:10191
 #, c-format
 msgid " %<PRIu8> arguments:"
 msgstr ""
 
-#: src/readelf.c:10125
+#: src/readelf.c:10206
 #, c-format
 msgid " no arguments."
 msgstr ""
 
-#: src/readelf.c:10326
+#: src/readelf.c:10407
 #, c-format
 msgid " [%5d] DIE offset: %6<PRId64>, CU DIE offset: %6<PRId64>, name: %s\n"
 msgstr ""
 
-#: src/readelf.c:10370
+#: src/readelf.c:10451
 #, c-format
 msgid ""
 "\n"
@@ -5326,72 +5590,78 @@
 " %*s  String\n"
 msgstr ""
 
-#: src/readelf.c:10385
+#. TRANS: the debugstr| prefix makes the string unique.
+#: src/readelf.c:10456
+msgctxt "debugstr"
+msgid "Offset"
+msgstr ""
+
+#: src/readelf.c:10466
 #, c-format
 msgid " *** error, missing string terminator\n"
 msgstr ""
 
-#: src/readelf.c:10414
+#: src/readelf.c:10495
 #, fuzzy, c-format
 msgid "cannot get .debug_str_offsets section data: %s"
 msgstr "konnte Abschnittsdaten nicht holen: %s"
 
-#: src/readelf.c:10513
+#: src/readelf.c:10594
 #, fuzzy, c-format
 msgid " Length:        %8<PRIu64>\n"
 msgstr "      %s: %<PRId64>\n"
 
-#: src/readelf.c:10515
+#: src/readelf.c:10596
 #, fuzzy, c-format
 msgid " Offset size:   %8<PRIu8>\n"
 msgstr "      %s: %<PRId64>\n"
 
-#: src/readelf.c:10529
+#: src/readelf.c:10610
 #, fuzzy, c-format
 msgid " DWARF version: %8<PRIu16>\n"
 msgstr "      %s: %<PRId64>\n"
 
-#: src/readelf.c:10538
+#: src/readelf.c:10619
 #, fuzzy, c-format
 msgid " Padding:       %8<PRIx16>\n"
 msgstr "      %s: %<PRId64>\n"
 
-#: src/readelf.c:10592
+#: src/readelf.c:10673
 #, c-format
 msgid ""
 "\n"
 "Call frame search table section [%2zu] '.eh_frame_hdr':\n"
 msgstr ""
 
-#: src/readelf.c:10694
+#: src/readelf.c:10775
 #, c-format
 msgid ""
 "\n"
 "Exception handling table section [%2zu] '.gcc_except_table':\n"
 msgstr ""
 
-#: src/readelf.c:10717
+#: src/readelf.c:10798
 #, c-format
 msgid " LPStart encoding:    %#x "
 msgstr ""
 
-#: src/readelf.c:10729
+#: src/readelf.c:10810
 #, c-format
 msgid " TType encoding:      %#x "
 msgstr ""
 
-#: src/readelf.c:10744
+#: src/readelf.c:10825
 #, c-format
 msgid " Call site encoding:  %#x "
 msgstr ""
 
-#: src/readelf.c:10757
+#: src/readelf.c:10838
 msgid ""
 "\n"
 " Call site table:"
 msgstr ""
 
-#: src/readelf.c:10771
+#: src/readelf.c:10852
 #, c-format
 msgid ""
 " [%4u] Call site start:   %#<PRIx64>\n"
@@ -5400,142 +5670,142 @@
 "        Action:            %u\n"
 msgstr ""
 
-#: src/readelf.c:10844
+#: src/readelf.c:10925
 #, c-format
 msgid "invalid TType encoding"
 msgstr ""
 
-#: src/readelf.c:10871
+#: src/readelf.c:10952
 #, c-format
 msgid ""
 "\n"
 "GDB section [%2zu] '%s' at offset %#<PRIx64> contains %<PRId64> bytes :\n"
 msgstr ""
 
-#: src/readelf.c:10900
+#: src/readelf.c:10981
 #, fuzzy, c-format
 msgid " Version:         %<PRId32>\n"
 msgstr "      %s: %<PRId64>\n"
 
-#: src/readelf.c:10918
+#: src/readelf.c:10999
 #, c-format
 msgid " CU offset:       %#<PRIx32>\n"
 msgstr ""
 
-#: src/readelf.c:10925
+#: src/readelf.c:11006
 #, c-format
 msgid " TU offset:       %#<PRIx32>\n"
 msgstr ""
 
-#: src/readelf.c:10932
+#: src/readelf.c:11013
 #, c-format
 msgid " address offset:  %#<PRIx32>\n"
 msgstr ""
 
-#: src/readelf.c:10939
+#: src/readelf.c:11020
 #, c-format
 msgid " symbol offset:   %#<PRIx32>\n"
 msgstr ""
 
-#: src/readelf.c:10946
+#: src/readelf.c:11027
 #, c-format
 msgid " constant offset: %#<PRIx32>\n"
 msgstr ""
 
-#: src/readelf.c:10960
+#: src/readelf.c:11041
 #, c-format
 msgid ""
 "\n"
 " CU list at offset %#<PRIx32> contains %zu entries:\n"
 msgstr ""
 
-#: src/readelf.c:10985
+#: src/readelf.c:11066
 #, c-format
 msgid ""
 "\n"
 " TU list at offset %#<PRIx32> contains %zu entries:\n"
 msgstr ""
 
-#: src/readelf.c:11014
+#: src/readelf.c:11095
 #, c-format
 msgid ""
 "\n"
 " Address list at offset %#<PRIx32> contains %zu entries:\n"
 msgstr ""
 
-#: src/readelf.c:11046
+#: src/readelf.c:11127
 #, c-format
 msgid ""
 "\n"
 " Symbol table at offset %#<PRIx32> contains %zu slots:\n"
 msgstr ""
 
-#: src/readelf.c:11184
+#: src/readelf.c:11265
 #, c-format
 msgid "cannot get debug context descriptor: %s"
 msgstr ""
 
-#: src/readelf.c:11552 src/readelf.c:12179 src/readelf.c:12290
-#: src/readelf.c:12348
+#: src/readelf.c:11633 src/readelf.c:12260 src/readelf.c:12371
+#: src/readelf.c:12429
 #, c-format
 msgid "cannot convert core note data: %s"
 msgstr ""
 
-#: src/readelf.c:11915
+#: src/readelf.c:11996
 #, c-format
 msgid ""
 "\n"
 "%*s... <repeats %u more times> ..."
 msgstr ""
 
-#: src/readelf.c:12427
+#: src/readelf.c:12508
 msgid "  Owner          Data size  Type\n"
 msgstr ""
 
-#: src/readelf.c:12456
+#: src/readelf.c:12536
 #, c-format
 msgid "  %-13.*s  %9<PRId32>  %s\n"
 msgstr ""
 
-#: src/readelf.c:12508
+#: src/readelf.c:12588
 #, fuzzy, c-format
 msgid "cannot get content of note: %s"
 msgstr "Konnte Inhalt von %s: %s nicht lesen"
 
-#: src/readelf.c:12542
+#: src/readelf.c:12622
 #, c-format
 msgid ""
 "\n"
 "Note section [%2zu] '%s' of %<PRIu64> bytes at offset %#0<PRIx64>:\n"
 msgstr ""
 
-#: src/readelf.c:12565
+#: src/readelf.c:12645
 #, c-format
 msgid ""
 "\n"
 "Note segment of %<PRIu64> bytes at offset %#0<PRIx64>:\n"
 msgstr ""
 
-#: src/readelf.c:12612
+#: src/readelf.c:12692
 #, fuzzy, c-format
 msgid ""
 "\n"
 "Section [%zu] '%s' has no data to dump.\n"
 msgstr "konnte Abschnittsdaten nicht holen: %s"
 
-#: src/readelf.c:12639 src/readelf.c:12690
+#: src/readelf.c:12719 src/readelf.c:12770
 #, fuzzy, c-format
 msgid "cannot get data for section [%zu] '%s': %s"
 msgstr "konnte Abschnittsdaten nicht holen: %s"
 
-#: src/readelf.c:12644
+#: src/readelf.c:12724
 #, c-format
 msgid ""
 "\n"
 "Hex dump of section [%zu] '%s', %<PRIu64> bytes at offset %#0<PRIx64>:\n"
 msgstr ""
 
-#: src/readelf.c:12649
+#: src/readelf.c:12729
 #, c-format
 msgid ""
 "\n"
@@ -5543,21 +5813,21 @@
 "%#0<PRIx64>:\n"
 msgstr ""
 
-#: src/readelf.c:12663
+#: src/readelf.c:12743
 #, fuzzy, c-format
 msgid ""
 "\n"
 "Section [%zu] '%s' has no strings to dump.\n"
 msgstr "konnte Abschnittsdaten nicht holen: %s"
 
-#: src/readelf.c:12695
+#: src/readelf.c:12775
 #, c-format
 msgid ""
 "\n"
 "String section [%zu] '%s' contains %<PRIu64> bytes at offset %#0<PRIx64>:\n"
 msgstr ""
 
-#: src/readelf.c:12700
+#: src/readelf.c:12780
 #, c-format
 msgid ""
 "\n"
@@ -5565,45 +5835,45 @@
 "offset %#0<PRIx64>:\n"
 msgstr ""
 
-#: src/readelf.c:12749
+#: src/readelf.c:12829
 #, c-format
 msgid ""
 "\n"
 "section [%lu] does not exist"
 msgstr ""
 
-#: src/readelf.c:12779
+#: src/readelf.c:12859
 #, c-format
 msgid ""
 "\n"
 "section '%s' does not exist"
 msgstr ""
 
-#: src/readelf.c:12836
+#: src/readelf.c:12916
 #, c-format
 msgid "cannot get symbol index of archive '%s': %s"
 msgstr ""
 
-#: src/readelf.c:12839
+#: src/readelf.c:12919
 #, c-format
 msgid ""
 "\n"
 "Archive '%s' has no symbol index\n"
 msgstr ""
 
-#: src/readelf.c:12843
+#: src/readelf.c:12923
 #, c-format
 msgid ""
 "\n"
 "Index of archive '%s' has %zu entries:\n"
 msgstr ""
 
-#: src/readelf.c:12861
+#: src/readelf.c:12941
 #, fuzzy, c-format
 msgid "cannot extract member at offset %zu in '%s': %s"
 msgstr "konnte Programm-Kopf nicht erstellen: %s"
 
-#: src/readelf.c:12866
+#: src/readelf.c:12946
 #, c-format
 msgid "Archive member '%s' contains:\n"
 msgstr ""
@@ -5666,11 +5936,63 @@
 msgid "%s: file format not recognized"
 msgstr ""
 
+#: src/size.c:328
+msgctxt "bsd"
+msgid "text"
+msgstr ""
+
+#: src/size.c:329
+msgctxt "bsd"
+msgid "data"
+msgstr ""
+
+#: src/size.c:330
+msgctxt "bsd"
+msgid "bss"
+msgstr ""
+
+#: src/size.c:331
+msgctxt "bsd"
+msgid "dec"
+msgstr ""
+
+#: src/size.c:332
+msgctxt "bsd"
+msgid "hex"
+msgstr ""
+
+#: src/size.c:333
+msgctxt "bsd"
+msgid "filename"
+msgstr ""
+
 #: src/size.c:418 src/size.c:560
 #, c-format
 msgid " (ex %s)"
 msgstr ""
 
+#: src/size.c:420
+#, fuzzy
+#| msgid "invalid section"
+msgctxt "sysv"
+msgid "section"
+msgstr "ungültiger Abschnitt"
+
+#: src/size.c:421
+msgctxt "sysv"
+msgid "size"
+msgstr ""
+
+#: src/size.c:422
+msgctxt "sysv"
+msgid "addr"
+msgstr ""
+
+#: src/size.c:451 src/size.c:454 src/size.c:457
+msgctxt "sysv"
+msgid "Total"
+msgstr ""
+
 #: src/size.c:482
 #, fuzzy, c-format
 msgid "cannot get section header"
@@ -5959,17 +6281,17 @@
 msgid "bad relocation"
 msgstr "Relocations anzeigen"
 
-#: src/strip.c:747 src/strip.c:771
+#: src/strip.c:751 src/strip.c:775
 #, c-format
 msgid "cannot stat input file '%s'"
 msgstr ""
 
-#: src/strip.c:761
+#: src/strip.c:765
 #, c-format
 msgid "while opening '%s'"
 msgstr ""
 
-#: src/strip.c:799
+#: src/strip.c:803
 #, c-format
 msgid "%s: cannot use -o or -f when stripping archive"
 msgstr ""
@@ -5980,132 +6302,132 @@
 #. result = handle_ar (fd, elf, NULL, fname,
 #. preserve_dates ? tv : NULL);
 #.
-#: src/strip.c:811
+#: src/strip.c:815
 #, fuzzy, c-format
 msgid "%s: no support for stripping archive"
 msgstr "%s: Kein Eintrag %s in dem Archiv!\n"
 
-#: src/strip.c:1047
+#: src/strip.c:1052
 #, c-format
 msgid "cannot open EBL backend"
 msgstr ""
 
-#: src/strip.c:1092
+#: src/strip.c:1097
 #, fuzzy, c-format
 msgid "cannot get number of phdrs"
 msgstr "konnte Programm-Kopf nicht erstellen: %s"
 
-#: src/strip.c:1106 src/strip.c:1149
+#: src/strip.c:1111 src/strip.c:1154
 #, fuzzy, c-format
 msgid "cannot create new ehdr for file '%s': %s"
 msgstr "neue Datei konnte nicht angelegt werden"
 
-#: src/strip.c:1116 src/strip.c:1159
+#: src/strip.c:1121 src/strip.c:1164
 #, fuzzy, c-format
 msgid "cannot create new phdr for file '%s': %s"
 msgstr "neue Datei konnte nicht angelegt werden"
 
-#: src/strip.c:1240
+#: src/strip.c:1244
 #, c-format
 msgid "illformed file '%s'"
 msgstr ""
 
-#: src/strip.c:1250
+#: src/strip.c:1254
 #, fuzzy, c-format
 msgid "Cannot remove allocated section '%s'"
 msgstr "konnte Abschnittsdaten nicht holen: %s"
 
-#: src/strip.c:1259
+#: src/strip.c:1263
 #, fuzzy, c-format
 msgid "Cannot both keep and remove section '%s'"
 msgstr "Konnte Archiv '%s' nicht öffnen"
 
-#: src/strip.c:1624 src/strip.c:1739
+#: src/strip.c:1628 src/strip.c:1743
 #, c-format
 msgid "while generating output file: %s"
 msgstr ""
 
-#: src/strip.c:1688
+#: src/strip.c:1692
 #, fuzzy, c-format
 msgid "%s: error while updating ELF header: %s"
 msgstr "Fehler beim Schliessen des Elf-Desktriptor: %s\n"
 
-#: src/strip.c:1697
+#: src/strip.c:1701
 #, fuzzy, c-format
 msgid "%s: error while getting shdrstrndx: %s"
 msgstr "Fehler beim Schliessen des Elf-Desktriptor: %s\n"
 
-#: src/strip.c:1705 src/strip.c:2550
+#: src/strip.c:1709 src/strip.c:2554
 #, fuzzy, c-format
 msgid "%s: error updating shdrstrndx: %s"
 msgstr "Fehler beim Schliessen des Elf-Desktriptor: %s\n"
 
-#: src/strip.c:1722
+#: src/strip.c:1726
 #, c-format
 msgid "while preparing output for '%s'"
 msgstr ""
 
-#: src/strip.c:1784 src/strip.c:1847
+#: src/strip.c:1788 src/strip.c:1851
 #, c-format
 msgid "while create section header section: %s"
 msgstr ""
 
-#: src/strip.c:1793
+#: src/strip.c:1797
 #, c-format
 msgid "cannot allocate section data: %s"
 msgstr ""
 
-#: src/strip.c:1859
+#: src/strip.c:1863
 #, c-format
 msgid "while create section header string table: %s"
 msgstr ""
 
-#: src/strip.c:1866
+#: src/strip.c:1870
 #, c-format
 msgid "no memory to create section header string table"
 msgstr ""
 
-#: src/strip.c:2079
+#: src/strip.c:2083
 #, c-format
 msgid "Cannot remove symbol [%zd] from allocated symbol table [%zd]"
 msgstr ""
 
-#: src/strip.c:2466 src/strip.c:2574
+#: src/strip.c:2470 src/strip.c:2578
 #, c-format
 msgid "while writing '%s': %s"
 msgstr ""
 
-#: src/strip.c:2477
+#: src/strip.c:2481
 #, c-format
 msgid "while creating '%s'"
 msgstr ""
 
-#: src/strip.c:2500
+#: src/strip.c:2504
 #, c-format
 msgid "while computing checksum for debug information"
 msgstr ""
 
-#: src/strip.c:2541
+#: src/strip.c:2545
 #, c-format
 msgid "%s: error while creating ELF header: %s"
 msgstr ""
 
-#: src/strip.c:2559
+#: src/strip.c:2563
 #, c-format
 msgid "%s: error while reading the file: %s"
 msgstr ""
 
-#: src/strip.c:2599 src/strip.c:2619
+#: src/strip.c:2603 src/strip.c:2623
 #, fuzzy, c-format
 msgid "while writing '%s'"
 msgstr "beim Schliessen von '%s'"
 
-#: src/strip.c:2656 src/strip.c:2663
+#: src/strip.c:2660 src/strip.c:2667
 #, c-format
 msgid "error while finishing '%s': %s"
 msgstr ""
 
-#: src/strip.c:2680 src/strip.c:2756
+#: src/strip.c:2684 src/strip.c:2760
 #, c-format
 msgid "cannot set access and modification date of '%s'"
 msgstr ""
@@ -6191,7 +6513,7 @@
 msgid "cannot get shdrstrndx:%s"
 msgstr "konnte Abschnittsdaten nicht holen: %s"
 
-#: src/unstrip.c:244 src/unstrip.c:2085
+#: src/unstrip.c:244 src/unstrip.c:2088
 #, c-format
 msgid "cannot get ELF header: %s"
 msgstr ""
@@ -6211,12 +6533,12 @@
 msgid "cannot copy ELF header: %s"
 msgstr ""
 
-#: src/unstrip.c:265 src/unstrip.c:2103 src/unstrip.c:2146
+#: src/unstrip.c:265 src/unstrip.c:2106 src/unstrip.c:2149
 #, fuzzy, c-format
 msgid "cannot get number of program headers: %s"
 msgstr "konnte Programm-Kopf nicht erstellen: %s"
 
-#: src/unstrip.c:270 src/unstrip.c:2107
+#: src/unstrip.c:270 src/unstrip.c:2110
 #, c-format
 msgid "cannot create program headers: %s"
 msgstr "konnte Programm-Kopf nicht erstellen: %s"
@@ -6231,12 +6553,12 @@
 msgid "cannot copy section header: %s"
 msgstr ""
 
-#: src/unstrip.c:289 src/unstrip.c:1707
+#: src/unstrip.c:289 src/unstrip.c:1710
 #, c-format
 msgid "cannot get section data: %s"
 msgstr "konnte Abschnittsdaten nicht holen: %s"
 
-#: src/unstrip.c:291 src/unstrip.c:1709
+#: src/unstrip.c:291 src/unstrip.c:1712
 #, c-format
 msgid "cannot copy section data: %s"
 msgstr "konnte Abschnittsdaten nicht kopieren: %s"
@@ -6246,14 +6568,14 @@
 msgid "cannot create directory '%s'"
 msgstr "konnte Verzeichnis nicht erstellen: %s"
 
-#: src/unstrip.c:393 src/unstrip.c:655 src/unstrip.c:689 src/unstrip.c:857
-#: src/unstrip.c:1749
+#: src/unstrip.c:393 src/unstrip.c:659 src/unstrip.c:693 src/unstrip.c:861
+#: src/unstrip.c:1752
 #, c-format
 msgid "cannot get symbol table entry: %s"
 msgstr "konnte Eintrag aus der Symboltabelle nicht holen: %s"
 
-#: src/unstrip.c:409 src/unstrip.c:658 src/unstrip.c:679 src/unstrip.c:692
-#: src/unstrip.c:1770 src/unstrip.c:1965 src/unstrip.c:1989
+#: src/unstrip.c:409 src/unstrip.c:662 src/unstrip.c:683 src/unstrip.c:696
+#: src/unstrip.c:1773 src/unstrip.c:1968 src/unstrip.c:1992
 #, c-format
 msgid "cannot update symbol table: %s"
 msgstr "konnte Symboltabelle nicht aktualisieren: %s"
@@ -6263,243 +6585,253 @@
 msgid "cannot update section header: %s"
 msgstr ""
 
-#: src/unstrip.c:465 src/unstrip.c:479
+#: src/unstrip.c:465
+#, c-format
+msgid "gelf_getrel failed: %s"
+msgstr ""
+
+#: src/unstrip.c:468 src/unstrip.c:483
 #, c-format
 msgid "cannot update relocation: %s"
 msgstr ""
 
-#: src/unstrip.c:578
+#: src/unstrip.c:480
+#, c-format
+msgid "gelf_getrela failed: %s"
+msgstr ""
+
+#: src/unstrip.c:582
 #, c-format
 msgid "cannot get symbol version: %s"
 msgstr ""
 
-#: src/unstrip.c:591
+#: src/unstrip.c:595
 #, c-format
 msgid "unexpected section type in [%zu] with sh_link to symtab"
 msgstr ""
 
-#: src/unstrip.c:846
+#: src/unstrip.c:850
 #, fuzzy, c-format
 msgid "cannot get symbol section data: %s"
 msgstr "konnte Abschnittsdaten nicht holen: %s"
 
-#: src/unstrip.c:848
+#: src/unstrip.c:852
 #, fuzzy, c-format
 msgid "cannot get string section data: %s"
 msgstr "konnte Abschnittsdaten nicht holen: %s"
 
-#: src/unstrip.c:865
+#: src/unstrip.c:869
 #, fuzzy, c-format
 msgid "invalid string offset in symbol [%zu]"
 msgstr "ungültiger Offset %zu für Symbol %s"
 
-#: src/unstrip.c:1023 src/unstrip.c:1427
+#: src/unstrip.c:1027 src/unstrip.c:1435
 #, fuzzy, c-format
 msgid "cannot read section [%zu] name: %s"
 msgstr "konnte Abschnittsdaten nicht holen: %s"
 
-#: src/unstrip.c:1038
+#: src/unstrip.c:1042
 #, fuzzy, c-format
 msgid "bad sh_link for group section: %s"
 msgstr "ungültige .debug_line Sektion"
 
-#: src/unstrip.c:1044
+#: src/unstrip.c:1048
 #, fuzzy, c-format
 msgid "couldn't get shdr for group section: %s"
 msgstr "konnte Versionierungsabschnitt nicht erstellen: %s"
 
-#: src/unstrip.c:1049
+#: src/unstrip.c:1053
 #, fuzzy, c-format
 msgid "bad data for group symbol section: %s"
 msgstr "ungültige .debug_line Sektion"
 
-#: src/unstrip.c:1055
+#: src/unstrip.c:1059
 #, fuzzy, c-format
 msgid "couldn't get symbol for group section: %s"
 msgstr "konnte Programm-Kopf nicht erstellen: %s"
 
-#: src/unstrip.c:1060
+#: src/unstrip.c:1064
 #, fuzzy, c-format
 msgid "bad symbol name for group section: %s"
 msgstr "konnte Programm-Kopf nicht erstellen: %s"
 
-#: src/unstrip.c:1102 src/unstrip.c:1121 src/unstrip.c:1159
-#, c-format
-msgid "cannot read '.gnu.prelink_undo' section: %s"
-msgstr ""
-
-#: src/unstrip.c:1139
-#, c-format
-msgid "overflow with shnum = %zu in '%s' section"
-msgstr ""
-
-#: src/unstrip.c:1150
-#, c-format
-msgid "invalid contents in '%s' section"
-msgstr ""
-
-#: src/unstrip.c:1206 src/unstrip.c:1553
+#: src/unstrip.c:1075 src/unstrip.c:1556
 #, fuzzy, c-format
 msgid "cannot find matching section for [%zu] '%s'"
 msgstr "konnte Abschnittsdaten nicht holen: %s"
 
-#: src/unstrip.c:1331 src/unstrip.c:1347 src/unstrip.c:1633 src/unstrip.c:1924
+#: src/unstrip.c:1120 src/unstrip.c:1139 src/unstrip.c:1177
+#, c-format
+msgid "cannot read '.gnu.prelink_undo' section: %s"
+msgstr ""
+
+#: src/unstrip.c:1157
+#, c-format
+msgid "overflow with shnum = %zu in '%s' section"
+msgstr ""
+
+#: src/unstrip.c:1168
+#, c-format
+msgid "invalid contents in '%s' section"
+msgstr ""
+
+#: src/unstrip.c:1339 src/unstrip.c:1355 src/unstrip.c:1636 src/unstrip.c:1927
 #, c-format
 msgid "cannot add section name to string table: %s"
 msgstr ""
 
-#: src/unstrip.c:1356
+#: src/unstrip.c:1364
 #, c-format
 msgid "cannot update section header string table data: %s"
 msgstr ""
 
-#: src/unstrip.c:1385 src/unstrip.c:1389
+#: src/unstrip.c:1393 src/unstrip.c:1397
 #, c-format
 msgid "cannot get section header string table section index: %s"
 msgstr ""
 
-#: src/unstrip.c:1393 src/unstrip.c:1397 src/unstrip.c:1648
+#: src/unstrip.c:1401 src/unstrip.c:1405 src/unstrip.c:1651
 #, c-format
 msgid "cannot get section count: %s"
 msgstr ""
 
-#: src/unstrip.c:1400
+#: src/unstrip.c:1408
 #, c-format
 msgid "more sections in stripped file than debug file -- arguments reversed?"
 msgstr ""
 
-#: src/unstrip.c:1404
+#: src/unstrip.c:1412
 #, c-format
 msgid "no sections in stripped file"
 msgstr ""
 
-#: src/unstrip.c:1475 src/unstrip.c:1568
+#: src/unstrip.c:1460 src/unstrip.c:1571
 #, c-format
 msgid "cannot read section header string table: %s"
 msgstr ""
 
-#: src/unstrip.c:1627
+#: src/unstrip.c:1630
 #, c-format
 msgid "cannot add new section: %s"
 msgstr ""
 
-#: src/unstrip.c:1757
+#: src/unstrip.c:1760
 #, fuzzy, c-format
 msgid "symbol [%zu] has invalid section index"
 msgstr "ungültiger Abschnittsindex"
 
-#: src/unstrip.c:1789
+#: src/unstrip.c:1792
 #, fuzzy, c-format
 msgid "group has invalid section index [%zd]"
 msgstr "ungültiger Abschnittsindex"
 
-#: src/unstrip.c:2064
+#: src/unstrip.c:2067
 #, fuzzy, c-format
 msgid "cannot read section data: %s"
 msgstr "konnte Abschnittsdaten nicht holen: %s"
 
-#: src/unstrip.c:2093
+#: src/unstrip.c:2096
 #, c-format
 msgid "cannot update ELF header: %s"
 msgstr ""
 
-#: src/unstrip.c:2117
+#: src/unstrip.c:2120
 #, c-format
 msgid "cannot update program header: %s"
 msgstr "konnte Programm-Kopf nicht aktualisieren: %s"
 
-#: src/unstrip.c:2122 src/unstrip.c:2205
+#: src/unstrip.c:2125 src/unstrip.c:2208
 #, c-format
 msgid "cannot write output file: %s"
 msgstr ""
 
-#: src/unstrip.c:2173
+#: src/unstrip.c:2176
 #, c-format
 msgid "DWARF data not adjusted for prelinking bias; consider prelink -u"
 msgstr ""
 
-#: src/unstrip.c:2176
+#: src/unstrip.c:2179
 #, c-format
 msgid ""
 "DWARF data in '%s' not adjusted for prelinking bias; consider prelink -u"
 msgstr ""
 
-#: src/unstrip.c:2196 src/unstrip.c:2247 src/unstrip.c:2259 src/unstrip.c:2345
+#: src/unstrip.c:2199 src/unstrip.c:2251 src/unstrip.c:2263 src/unstrip.c:2353
 #, c-format
 msgid "cannot create ELF descriptor: %s"
 msgstr ""
 
-#: src/unstrip.c:2238
+#: src/unstrip.c:2237
 msgid "WARNING: "
 msgstr ""
 
-#: src/unstrip.c:2240
+#: src/unstrip.c:2239
 msgid ", use --force"
 msgstr ""
 
-#: src/unstrip.c:2263
+#: src/unstrip.c:2267
 msgid "ELF header identification (e_ident) different"
 msgstr ""
 
-#: src/unstrip.c:2266
+#: src/unstrip.c:2271
 msgid "ELF header type (e_type) different"
 msgstr ""
 
-#: src/unstrip.c:2269
+#: src/unstrip.c:2275
 msgid "ELF header machine type (e_machine) different"
 msgstr ""
 
-#: src/unstrip.c:2272
+#: src/unstrip.c:2279
 msgid "stripped program header (e_phnum) smaller than unstripped"
 msgstr ""
 
-#: src/unstrip.c:2302
+#: src/unstrip.c:2310
 #, c-format
 msgid "cannot find stripped file for module '%s': %s"
 msgstr ""
 
-#: src/unstrip.c:2306
+#: src/unstrip.c:2314
 #, c-format
 msgid "cannot open stripped file '%s' for module '%s': %s"
 msgstr ""
 
-#: src/unstrip.c:2321
+#: src/unstrip.c:2329
 #, c-format
 msgid "cannot find debug file for module '%s': %s"
 msgstr ""
 
-#: src/unstrip.c:2325
+#: src/unstrip.c:2333
 #, c-format
 msgid "cannot open debug file '%s' for module '%s': %s"
 msgstr ""
 
-#: src/unstrip.c:2338
+#: src/unstrip.c:2346
 #, c-format
 msgid "module '%s' file '%s' is not stripped"
 msgstr ""
 
-#: src/unstrip.c:2369
+#: src/unstrip.c:2377
 #, c-format
 msgid "cannot cache section addresses for module '%s': %s"
 msgstr ""
 
-#: src/unstrip.c:2501
+#: src/unstrip.c:2505
 #, c-format
 msgid "no matching modules found"
 msgstr "kein passendes Modul gefunden"
 
-#: src/unstrip.c:2510
+#: src/unstrip.c:2515
 #, c-format
 msgid "matched more than one module"
 msgstr "mehr als ein passendes Modul"
 
-#: src/unstrip.c:2554
+#: src/unstrip.c:2560
 msgid ""
 "STRIPPED-FILE DEBUG-FILE\n"
 "[MODULE...]"
 msgstr ""
 
-#: src/unstrip.c:2555
+#: src/unstrip.c:2561
 msgid ""
 "Combine stripped files with separate symbols and debug information.\n"
 "\n"
@@ -6527,7 +6859,23 @@
 "was found, or . if FILE contains the debug information."
 msgstr ""
 
-#: tests/backtrace.c:436
+#. Short description of program.
+#: debuginfod/debuginfod-find.c:42
+msgid "Request debuginfo-related content from debuginfods listed in $"
+msgstr ""
+
+#. Strings for arguments in help texts.
+#: debuginfod/debuginfod-find.c:46
+msgid ""
+"debuginfo BUILDID\n"
+"debuginfo PATH\n"
+"executable BUILDID\n"
+"executable PATH\n"
+"source BUILDID /FILENAME\n"
+"source PATH /FILENAME\n"
+msgstr ""
+
+#: tests/backtrace.c:483
 msgid "Run executable"
 msgstr ""
 
@@ -6539,6 +6887,10 @@
 msgid "Show instances of inlined functions"
 msgstr ""
 
+#, fuzzy, c-format
+#~ msgid "cannot allocate memory"
+#~ msgstr "konnte Verzeichnis nicht erstellen: %s"
+
 #~ msgid "%s+%#<PRIx64> <%s+%#<PRIx64>>"
 #~ msgstr "%s+%#<PRIx64> <%s+%#<PRIx64>>"
 
@@ -6622,9 +6974,6 @@
 #~ msgid "only one option of -G and -r is allowed"
 #~ msgstr "nur eine Option aus -G und -r erlaubt"
 
-#~ msgid "More than one output file name given."
-#~ msgstr "Mehr als ein Name der Ausgabedatei angegeben."
-
 #~ msgid "-) without matching -("
 #~ msgstr "-) ohne Übereinstimmung -("
 
diff --git a/po/es.po b/po/es.po
index bdfcc14..a65b516 100644
--- a/po/es.po
+++ b/po/es.po
@@ -10,7 +10,7 @@
 msgstr ""
 "Project-Id-Version: elfutils.master.es\n"
 "Report-Msgid-Bugs-To: https://sourceware.org/bugzilla/\n"
-"POT-Creation-Date: 2021-02-05 21:10+0100\n"
+"POT-Creation-Date: 2021-11-10 16:21+0100\n"
 "PO-Revision-Date: 2011-01-10 15:17-0300\n"
 "Last-Translator: Claudio Rodrigo Pereyra Diaz <claudiorodrigo@pereyradiaz."
 "com.ar>\n"
@@ -39,11 +39,6 @@
 "  - 'auto', 'tty', 'if-tty'\n"
 msgstr ""
 
-#: lib/color.c:194 src/objdump.c:728
-#, fuzzy, c-format
-msgid "cannot allocate memory"
-msgstr "No se puede asignar sección PLT: %s"
-
 #: lib/printversion.c:40
 #, fuzzy, c-format
 msgid ""
@@ -57,8 +52,8 @@
 "garantía, ni siquiera para SU COMERCIALIZACIÓN o PARA SER USADO CON UN FIN "
 "DETERMINADO.\n"
 
-#: lib/xmalloc.c:48 lib/xmalloc.c:61 lib/xmalloc.c:73 src/readelf.c:3453
-#: src/readelf.c:11501 src/unstrip.c:312 src/unstrip.c:2398 src/unstrip.c:2603
+#: lib/xmalloc.c:48 lib/xmalloc.c:61 lib/xmalloc.c:73 src/readelf.c:11582
+#: src/unstrip.c:312
 #, c-format
 msgid "memory exhausted"
 msgstr "memoria agotada"
@@ -110,6 +105,24 @@
 msgid "unknown error"
 msgstr "error desconocido"
 
+#: libcpu/i386_lex.l:122
+#, fuzzy, c-format
+#| msgid "invalid page size value '%s': ignored"
+msgid "invalid character '%c' at line %d; ignored"
+msgstr "Valor de tamaño de página'%s': ignorado"
+
+#: libcpu/i386_lex.l:123
+#, fuzzy, c-format
+#| msgid "invalid page size value '%s': ignored"
+msgid "invalid character '\\%o' at line %d; ignored"
+msgstr "Valor de tamaño de página'%s': ignorado"
+
+#: libcpu/i386_parse.y:554
+#, fuzzy, c-format
+#| msgid "while reading linker script '%s': %s at line %d"
+msgid "while reading i386 CPU description: %s at line %d"
+msgstr "al leer script de enlace '%s': %s en línea %d"
+
 #: libdw/dwarf_error.c:59
 msgid "invalid access"
 msgstr "Acceso inválido"
@@ -300,7 +313,7 @@
 msgid ".debug_addr section missing"
 msgstr ".debug_ranges section faltante"
 
-#: libdwfl/argp-std.c:47 src/stack.c:643 src/unstrip.c:2544
+#: libdwfl/argp-std.c:47 src/stack.c:643 src/unstrip.c:2550
 msgid "Input selection options:"
 msgstr "Opciones de selección de entrada:"
 
@@ -533,8 +546,8 @@
 msgid "No backend"
 msgstr "No hay segundo plano (Backend)"
 
-#: libebl/eblcorenotetypename.c:100 libebl/eblobjnotetypename.c:77
-#: libebl/eblobjnotetypename.c:109 libebl/eblobjnotetypename.c:130
+#: libebl/eblcorenotetypename.c:100 libebl/eblobjnotetypename.c:79
+#: libebl/eblobjnotetypename.c:110 libebl/eblobjnotetypename.c:131
 #: libebl/eblosabiname.c:73 libebl/eblsectionname.c:83
 #: libebl/eblsectiontypename.c:115 libebl/eblsegmenttypename.c:81
 msgid "<unknown>"
@@ -630,7 +643,7 @@
 msgid "invalid size of destination operand"
 msgstr "tamaño inválido del operando destino"
 
-#: libelf/elf_error.c:87 src/readelf.c:6209
+#: libelf/elf_error.c:87 src/readelf.c:6215
 #, c-format
 msgid "invalid encoding"
 msgstr "codificación inválida"
@@ -716,8 +729,8 @@
 msgid "invalid section header"
 msgstr "encabezamiento de sección inválida"
 
-#: libelf/elf_error.c:191 src/readelf.c:10012 src/readelf.c:10612
-#: src/readelf.c:10713 src/readelf.c:10895
+#: libelf/elf_error.c:191 src/readelf.c:10093 src/readelf.c:10693
+#: src/readelf.c:10794 src/readelf.c:10976
 #, c-format
 msgid "invalid data"
 msgstr "datos inválidos"
@@ -854,7 +867,7 @@
 msgid "Print all information on one line, and indent inlines"
 msgstr ""
 
-#: src/addr2line.c:78 src/elfcmp.c:70 src/findtextrel.c:65 src/nm.c:100
+#: src/addr2line.c:78 src/elfcmp.c:70 src/findtextrel.c:66 src/nm.c:100
 #: src/strings.c:78
 msgid "Miscellaneous:"
 msgstr "Misceláneos:"
@@ -1190,6 +1203,233 @@
 msgid "cannot read ELF header of %s(%s): %s"
 msgstr "no se puede leer el encabezamiento ELF de %s(%s): %s"
 
+#: src/elfclassify.c:91
+msgid "opening"
+msgstr ""
+
+#: src/elfclassify.c:98
+msgid "reading"
+msgstr ""
+
+#: src/elfclassify.c:244
+#, fuzzy
+#| msgid "cannot get ELF header"
+msgid "ELF header"
+msgstr "no se puede obtener el encabezamiento ELF"
+
+#: src/elfclassify.c:255
+#, fuzzy
+#| msgid "Program Headers:"
+msgid "program headers"
+msgstr "encabezamientos de programa:"
+
+#: src/elfclassify.c:264
+#, fuzzy
+#| msgid "Program Headers:"
+msgid "program header"
+msgstr "encabezamientos de programa:"
+
+#: src/elfclassify.c:284
+#, fuzzy
+#| msgid "Section Headers:"
+msgid "section headers"
+msgstr "encabezamientos de sección:"
+
+#: src/elfclassify.c:295
+#, fuzzy
+#| msgid "cannot get section header string table index"
+msgid "section header string table index"
+msgstr "no se puede obtener índice de cadena de encabezamiento de sección"
+
+#: src/elfclassify.c:309
+#, fuzzy
+msgid "could not obtain section header"
+msgstr "no se puede obtener encabezamiento de sección\n"
+
+#: src/elfclassify.c:315
+#, fuzzy
+msgid "could not obtain section name"
+msgstr "no se puede obtener encabezamiento de sección\n"
+
+#: src/elfclassify.c:828
+msgid "writing to standard output"
+msgstr ""
+
+#: src/elfclassify.c:855
+msgid "reading from standard input"
+msgstr ""
+
+#: src/elfclassify.c:876
+#, fuzzy
+#| msgid "Input selection options:"
+msgid "Classification options"
+msgstr "Opciones de selección de entrada:"
+
+#: src/elfclassify.c:878
+msgid "File looks like an ELF object or archive/static library (default)"
+msgstr ""
+
+#: src/elfclassify.c:881
+msgid "File is an regular ELF object (not an archive/static library)"
+msgstr ""
+
+#: src/elfclassify.c:884
+msgid "File is an ELF archive or static library"
+msgstr ""
+
+#: src/elfclassify.c:887
+msgid "File is an ELF core dump file"
+msgstr ""
+
+#: src/elfclassify.c:890
+msgid ""
+"File is an ELF file with symbol table or .debug_* sections and can be "
+"stripped further"
+msgstr ""
+
+#: src/elfclassify.c:893
+msgid "File is (primarily) an ELF program executable (not primarily a DSO)"
+msgstr ""
+
+#: src/elfclassify.c:896
+msgid "File is an ELF program executable (might also be a DSO)"
+msgstr ""
+
+#: src/elfclassify.c:899
+msgid ""
+"File is (primarily) an ELF shared object (DSO) (not primarily an executable)"
+msgstr ""
+
+#: src/elfclassify.c:902
+msgid "File is an ELF shared object (DSO) (might also be an executable)"
+msgstr ""
+
+#: src/elfclassify.c:906
+#, fuzzy
+#| msgid "cannot find kernel modules"
+msgid "File is a linux kernel module"
+msgstr "no se pueden hallar módulos de kernel"
+
+#: src/elfclassify.c:908
+msgid "File is a debug only ELF file (separate .debug, .dwo or dwz multi-file)"
+msgstr ""
+
+#: src/elfclassify.c:911
+msgid "File is a loadable ELF object (program or shared object)"
+msgstr ""
+
+#: src/elfclassify.c:940
+msgid "Input flags"
+msgstr ""
+
+#: src/elfclassify.c:942
+msgid "Only classify regular (not symlink nor special device) files"
+msgstr ""
+
+#: src/elfclassify.c:944
+msgid ""
+"Also read file names to process from standard input, separated by newlines"
+msgstr ""
+
+#: src/elfclassify.c:947
+msgid ""
+"Also read file names to process from standard input, separated by ASCII NUL "
+"bytes"
+msgstr ""
+
+#: src/elfclassify.c:950
+msgid "Do not read files from standard input (default)"
+msgstr ""
+
+#: src/elfclassify.c:952
+msgid "Try to open compressed files or embedded (kernel) ELF images"
+msgstr ""
+
+#: src/elfclassify.c:955
+#, fuzzy
+#| msgid "Output format:"
+msgid "Output flags"
+msgstr "Formato de salida:"
+
+#: src/elfclassify.c:957
+msgid "Output names of files, separated by newline"
+msgstr ""
+
+#: src/elfclassify.c:959
+msgid "Output names of files, separated by ASCII NUL"
+msgstr ""
+
+#: src/elfclassify.c:961
+#, fuzzy
+#| msgid "More than one output file name given."
+msgid "Do not output file names"
+msgstr "Se ha dado más de un nombre de archivo de salida."
+
+#: src/elfclassify.c:963
+msgid "If printing file names, print matching files (default)"
+msgstr ""
+
+#: src/elfclassify.c:965
+msgid "If printing file names, print files that do not match"
+msgstr ""
+
+#: src/elfclassify.c:967
+msgid "Additional flags"
+msgstr ""
+
+#: src/elfclassify.c:969
+msgid "Output additional information (can be specified multiple times)"
+msgstr ""
+
+#: src/elfclassify.c:971
+msgid "Suppress some error output (counterpart to --verbose)"
+msgstr ""
+
+#. Strings for arguments in help texts.
+#: src/elfclassify.c:979 src/elfcompress.c:1334 src/elflint.c:77
+#: src/readelf.c:158
+msgid "FILE..."
+msgstr "FICHERO..."
+
+#: src/elfclassify.c:980
+msgid ""
+"Determine the type of an ELF file.\n"
+"\n"
+"All of the classification options must apply at the same time to a "
+"particular file.  Classification options can be negated using a \"--not-\" "
+"prefix.\n"
+"\n"
+"Since modern ELF does not clearly distinguish between programs and dynamic "
+"shared objects, you should normally use either --executable or --shared to "
+"identify the primary purpose of a file.  Only one of the --shared and --"
+"executable checks can pass for a file.\n"
+"\n"
+"If you want to know whether an ELF object might a program or a shared "
+"library (but could be both), then use --program or --library. Some ELF files "
+"will classify as both a program and a library.\n"
+"\n"
+"If you just want to know whether an ELF file is loadable (as program or "
+"library) use --loadable.  Note that files that only contain (separate) debug "
+"information (--debug-only) are never --loadable (even though they might "
+"contain program headers).  Linux kernel modules are also not --loadable (in "
+"the normal sense).\n"
+"\n"
+"Without any of the --print options, the program exits with status 0 if the "
+"requested checks pass for all input files, with 1 if a check fails for any "
+"file, and 2 if there is an environmental issue (such as a file read error or "
+"a memory allocation error).\n"
+"\n"
+"When printing file names, the program exits with status 0 even if no file "
+"names are printed, and exits with status 2 if there is an environmental "
+"issue.\n"
+"\n"
+"On usage error (e.g. a bad option was given), the program exits with a "
+"status code larger than 2.\n"
+"\n"
+"The --quiet or -q option suppresses some error warning output, but doesn't "
+"change the exit status."
+msgstr ""
+
 #: src/elfcmp.c:60
 msgid "Control options:"
 msgstr "Opciones de control:"
@@ -1385,14 +1625,14 @@
 msgid "Invalid value '%s' for --gaps parameter."
 msgstr "Valor inválido '%s' para parámetro --gaps"
 
-#: src/elfcmp.c:734 src/findtextrel.c:205 src/nm.c:364 src/ranlib.c:141
-#: src/size.c:272 src/strings.c:185 src/strip.c:1030 src/strip.c:1067
-#: src/unstrip.c:2194 src/unstrip.c:2223
+#: src/elfcmp.c:734 src/findtextrel.c:195 src/nm.c:364 src/ranlib.c:141
+#: src/size.c:272 src/strings.c:185 src/strip.c:1035 src/strip.c:1072
+#: src/unstrip.c:2197 src/unstrip.c:2226
 #, c-format
 msgid "cannot open '%s'"
 msgstr "Imposible abrir '%s'"
 
-#: src/elfcmp.c:738 src/findtextrel.c:212 src/ranlib.c:158
+#: src/elfcmp.c:738 src/findtextrel.c:214 src/ranlib.c:158
 #, c-format
 msgid "cannot create ELF descriptor for '%s': %s"
 msgstr "No puede crear descriptor ELF para '%s': %s"
@@ -1402,7 +1642,7 @@
 msgid "cannot create EBL descriptor for '%s'"
 msgstr "no se puede crear el descriptor EBL para '%s'"
 
-#: src/elfcmp.c:761 src/findtextrel.c:394
+#: src/elfcmp.c:761 src/findtextrel.c:385
 #, c-format
 msgid "cannot get section header of section %zu: %s"
 msgstr "No se puede obtener el encabezamiento de sección %zu: %s"
@@ -1417,76 +1657,71 @@
 msgid "cannot get relocation: %s"
 msgstr "No se puede obtener reubicación: %s"
 
-#: src/elfcompress.c:115 src/strip.c:308 src/unstrip.c:117
+#: src/elfcompress.c:117 src/strip.c:308 src/unstrip.c:117
 #, c-format
 msgid "-o option specified twice"
 msgstr "opción -o especificada dos veces"
 
-#: src/elfcompress.c:122
+#: src/elfcompress.c:124
 #, fuzzy, c-format
 msgid "-t option specified twice"
 msgstr "opción -f especificada dos veces"
 
-#: src/elfcompress.c:131
+#: src/elfcompress.c:133
 #, fuzzy, c-format
 msgid "unknown compression type '%s'"
 msgstr "tipo desconocido"
 
 #. We need at least one input file.
-#: src/elfcompress.c:143 src/elfcompress.c:1347
+#: src/elfcompress.c:145 src/elfcompress.c:1345
 #, fuzzy, c-format
 msgid "No input file given"
 msgstr "archivo de entrada vacío"
 
-#: src/elfcompress.c:149 src/elfcompress.c:1352
+#: src/elfcompress.c:151 src/elfcompress.c:1350
 #, fuzzy, c-format
 msgid "Only one input file allowed together with '-o'"
 msgstr "Sólo se permite ingresar un archivo junto con '-o' y '-f'"
 
-#: src/elfcompress.c:1309
+#: src/elfcompress.c:1307
 #, fuzzy
 msgid "Place (de)compressed output into FILE"
 msgstr "Colocar la salida obtenida en FICHERO"
 
-#: src/elfcompress.c:1312
+#: src/elfcompress.c:1310
 msgid ""
 "What type of compression to apply. TYPE can be 'none' (decompress), "
 "'zlib' (ELF ZLIB compression, the default, 'zlib-gabi' is an alias) or 'zlib-"
 "gnu' (.zdebug GNU style compression, 'gnu' is an alias)"
 msgstr ""
 
-#: src/elfcompress.c:1315
+#: src/elfcompress.c:1313
 msgid ""
 "SECTION name to (de)compress, SECTION is an extended wildcard pattern "
 "(defaults to '.?(z)debug*')"
 msgstr ""
 
-#: src/elfcompress.c:1318
+#: src/elfcompress.c:1316
 msgid "Print a message for each section being (de)compressed"
 msgstr ""
 
-#: src/elfcompress.c:1321
+#: src/elfcompress.c:1319
 msgid ""
 "Force compression of section even if it would become larger or update/"
 "rewrite the file even if no section would be (de)compressed"
 msgstr ""
 
-#: src/elfcompress.c:1324 src/strip.c:93
+#: src/elfcompress.c:1322 src/strip.c:93
 msgid "Relax a few rules to handle slightly broken ELF files"
 msgstr "Relaja algunas reglas para manejar ficheros ELF rotos"
 
-#: src/elfcompress.c:1327
+#: src/elfcompress.c:1325
 #, fuzzy
 msgid "Be silent when a section cannot be compressed"
 msgstr ""
 "Sección [%2zu] '%s': dirección de secciones de datos de hilo-local no cero\n"
 
-#. Strings for arguments in help texts.
-#: src/elfcompress.c:1336 src/elflint.c:77 src/readelf.c:158
-msgid "FILE..."
-msgstr "FICHERO..."
-
-#: src/elfcompress.c:1337
+#: src/elfcompress.c:1335
 msgid "Compress or decompress sections in an ELF file."
 msgstr ""
 
@@ -1697,7 +1932,7 @@
 
 #: src/elflint.c:610 src/elflint.c:1498 src/elflint.c:1549 src/elflint.c:1655
 #: src/elflint.c:1991 src/elflint.c:2317 src/elflint.c:2943 src/elflint.c:3106
-#: src/elflint.c:3254 src/elflint.c:3444 src/elflint.c:4456
+#: src/elflint.c:3254 src/elflint.c:3456 src/elflint.c:4458
 #, c-format
 msgid "section [%2d] '%s': cannot get section data\n"
 msgstr "Sección [%2d] '%s': No se pueden obtener datos de sección\n"
@@ -2845,17 +3080,17 @@
 msgid "section [%2d] '%s': unknown parent version '%s'\n"
 msgstr "Sección [%2d] '%s': desconocida versión principal '%s'\n"
 
-#: src/elflint.c:3436
+#: src/elflint.c:3448
 #, c-format
 msgid "section [%2d] '%s': empty object attributes section\n"
 msgstr "Sección [%2d] '%s': sección de atributos de objeto vacío\n"
 
-#: src/elflint.c:3457
+#: src/elflint.c:3464
 #, c-format
 msgid "section [%2d] '%s': unrecognized attribute format\n"
 msgstr "Sección[%2d] '%s': formato de atributo no reconocido\n"
 
-#: src/elflint.c:3473
+#: src/elflint.c:3475
 #, c-format
 msgid ""
 "section [%2d] '%s': offset %zu: zero length field in attribute section\n"
@@ -2863,21 +3098,21 @@
 "Sección[%2d] '%s': compensación %zu: campo de longitud cero en sección de "
 "atributo\n"
 
-#: src/elflint.c:3482
+#: src/elflint.c:3484
 #, c-format
 msgid "section [%2d] '%s': offset %zu: invalid length in attribute section\n"
 msgstr ""
 "Sección[%2d] '%s': compensación %zu: longitud inválida en sección de "
 "atributo\n"
 
-#: src/elflint.c:3494
+#: src/elflint.c:3496
 #, c-format
 msgid "section [%2d] '%s': offset %zu: unterminated vendor name string\n"
 msgstr ""
 "Sección[%2d] '%s': compensación %zu: cadena de nombre de proveedor sin "
 "terminar\n"
 
-#: src/elflint.c:3511
+#: src/elflint.c:3513
 #, c-format
 msgid ""
 "section [%2d] '%s': offset %zu: endless ULEB128 in attribute subsection tag\n"
@@ -2885,12 +3120,12 @@
 "Sección [%2d] '%s': compensación %zu: sin fin ULEB128 en etiqueta de sub-"
 "sección de atributo\n"
 
-#: src/elflint.c:3520
+#: src/elflint.c:3522
 #, c-format
 msgid "section [%2d] '%s': offset %zu: truncated attribute section\n"
 msgstr "Sección [%2d] '%s': compensación %zu: sección de atributo truncado\n"
 
-#: src/elflint.c:3529
+#: src/elflint.c:3531
 #, c-format
 msgid ""
 "section [%2d] '%s': offset %zu: zero length field in attribute subsection\n"
@@ -2898,7 +3133,7 @@
 "Sección [%2d] '%s': compensación %zu: campo de longitud cero length en sub-"
 "sección de atributo\n"
 
-#: src/elflint.c:3544
+#: src/elflint.c:3546
 #, c-format
 msgid ""
 "section [%2d] '%s': offset %zu: invalid length in attribute subsection\n"
@@ -2907,7 +3142,7 @@
 "atributo\n"
 
 #. Tag_File
-#: src/elflint.c:3555
+#: src/elflint.c:3557
 #, c-format
 msgid ""
 "section [%2d] '%s': offset %zu: attribute subsection has unexpected tag %u\n"
@@ -2915,26 +3150,26 @@
 "Sección[%2d] '%s': compensación %zu: sub-sección de atributo tiene etiqueta "
 "inesperada %u\n"
 
-#: src/elflint.c:3573
+#: src/elflint.c:3575
 #, c-format
 msgid "section [%2d] '%s': offset %zu: endless ULEB128 in attribute tag\n"
 msgstr ""
 "Sección[%2d] '%s': compensación %zu: sin fin ULEB128 en etiqueta de "
 "atributo\n"
 
-#: src/elflint.c:3584
+#: src/elflint.c:3586
 #, c-format
 msgid "section [%2d] '%s': offset %zu: unterminated string in attribute\n"
 msgstr ""
 "Sección [%2d] '%s': compensación %zu: cadena sin terminar en atributo\n"
 
-#: src/elflint.c:3597
+#: src/elflint.c:3599
 #, c-format
 msgid "section [%2d] '%s': offset %zu: unrecognized attribute tag %u\n"
 msgstr ""
 "Sección [%2d] '%s': compensación %zu: etiqueta de atributo no reconocida %u\n"
 
-#: src/elflint.c:3601
+#: src/elflint.c:3603
 #, c-format
 msgid ""
 "section [%2d] '%s': offset %zu: unrecognized %s attribute value %<PRIu64>\n"
@@ -2942,12 +3177,12 @@
 "Sección [%2d] '%s': compensación %zu: no reconocido %s valor de atributo "
 "%<PRIu64>\n"
 
-#: src/elflint.c:3611
+#: src/elflint.c:3613
 #, c-format
 msgid "section [%2d] '%s': offset %zu: vendor '%s' unknown\n"
 msgstr "Sección [%2d] '%s': compensación %zu: proveedor '%s' desconocido\n"
 
-#: src/elflint.c:3617
+#: src/elflint.c:3619
 #, c-format
 msgid ""
 "section [%2d] '%s': offset %zu: extra bytes after last attribute section\n"
@@ -2955,47 +3190,47 @@
 "Sección [%2d] '%s': compensación %zu: extra bytes después de la última "
 "sección de atributo\n"
 
-#: src/elflint.c:3714
+#: src/elflint.c:3716
 #, c-format
 msgid "cannot get section header of zeroth section\n"
 msgstr "no puede obtener encabezamiento de sección de sección zeroth\n"
 
-#: src/elflint.c:3718
+#: src/elflint.c:3720
 #, c-format
 msgid "zeroth section has nonzero name\n"
 msgstr "Sección zeroth tiene nombre nonzero\n"
 
-#: src/elflint.c:3720
+#: src/elflint.c:3722
 #, c-format
 msgid "zeroth section has nonzero type\n"
 msgstr "Sección zeroth tiene tipo nonzero\n"
 
-#: src/elflint.c:3722
+#: src/elflint.c:3724
 #, c-format
 msgid "zeroth section has nonzero flags\n"
 msgstr "Sección zeroth tiene banderas nonzero\n"
 
-#: src/elflint.c:3724
+#: src/elflint.c:3726
 #, c-format
 msgid "zeroth section has nonzero address\n"
 msgstr "Sección zeroth tiene dirección nonzero\n"
 
-#: src/elflint.c:3726
+#: src/elflint.c:3728
 #, c-format
 msgid "zeroth section has nonzero offset\n"
 msgstr "Sección zeroth tiene compensación nonzero\n"
 
-#: src/elflint.c:3728
+#: src/elflint.c:3730
 #, c-format
 msgid "zeroth section has nonzero align value\n"
 msgstr "Sección zeroth tiene valor de alineación nonzero\n"
 
-#: src/elflint.c:3730
+#: src/elflint.c:3732
 #, c-format
 msgid "zeroth section has nonzero entry size value\n"
 msgstr "Sección zeroth tiene valor de tamaño de entrada nonzero\n"
 
-#: src/elflint.c:3733
+#: src/elflint.c:3735
 #, c-format
 msgid ""
 "zeroth section has nonzero size value while ELF header has nonzero shnum "
@@ -3004,7 +3239,7 @@
 "Sección zeroth tiene valor de tamaño nonzero mientras que el encabezamiento "
 "ELF tiene valor shnum nonzero\n"
 
-#: src/elflint.c:3737
+#: src/elflint.c:3739
 #, c-format
 msgid ""
 "zeroth section has nonzero link value while ELF header does not signal "
@@ -3013,7 +3248,7 @@
 "Sección zeroth tiene valor de enlace nonzero mientras que el encabezamiento "
 "ELF no señala sobreflujo en shstrndx\n"
 
-#: src/elflint.c:3741
+#: src/elflint.c:3743
 #, c-format
 msgid ""
 "zeroth section has nonzero link value while ELF header does not signal "
@@ -3022,27 +3257,27 @@
 "la sección zeroth tiene un valor de enlace distinto a cero mientras que el "
 "encabezamiento ELF no señala desbordamiento en phnum\n"
 
-#: src/elflint.c:3759
+#: src/elflint.c:3761
 #, c-format
 msgid "cannot get section header for section [%2zu] '%s': %s\n"
 msgstr "No se puede obtener encabezamiento para sección [%2zu] '%s': %s\n"
 
-#: src/elflint.c:3768
+#: src/elflint.c:3770
 #, c-format
 msgid "section [%2zu]: invalid name\n"
 msgstr "Sección [%2zu]: nombre inválido\n"
 
-#: src/elflint.c:3795
+#: src/elflint.c:3797
 #, c-format
 msgid "section [%2d] '%s' has wrong type: expected %s, is %s\n"
 msgstr "Sección [%2d] '%s' tiene tipo errado: %s esperado, es %s\n"
 
-#: src/elflint.c:3812
+#: src/elflint.c:3814
 #, c-format
 msgid "section [%2zu] '%s' has wrong flags: expected %s, is %s\n"
 msgstr "Sección [%2zu] '%s' tiene banderas erradas: %s esperado, es %s\n"
 
-#: src/elflint.c:3830
+#: src/elflint.c:3832
 #, c-format
 msgid ""
 "section [%2zu] '%s' has wrong flags: expected %s and possibly %s, is %s\n"
@@ -3050,12 +3285,12 @@
 "Sección [%2zu] '%s' tiene banderas erradas: %s esperado y posiblemente %s, "
 "es %s\n"
 
-#: src/elflint.c:3847
+#: src/elflint.c:3849
 #, c-format
 msgid "section [%2zu] '%s' present in object file\n"
 msgstr "Sección [%2zu] '%s' presente en archivo objeto\n"
 
-#: src/elflint.c:3853 src/elflint.c:3885
+#: src/elflint.c:3855 src/elflint.c:3887
 #, c-format
 msgid ""
 "section [%2zu] '%s' has SHF_ALLOC flag set but there is no loadable segment\n"
@@ -3063,7 +3298,7 @@
 "Sección [%2zu] '%s' tiene bandera SHF_ALLOC establecida pero no es un "
 "segmento cargable\n"
 
-#: src/elflint.c:3858 src/elflint.c:3890
+#: src/elflint.c:3860 src/elflint.c:3892
 #, c-format
 msgid ""
 "section [%2zu] '%s' has SHF_ALLOC flag not set but there are loadable "
@@ -3072,7 +3307,7 @@
 "Sección [%2zu] '%s' no tiene bandera SHF_ALLOC establecida pero hay "
 "segmentos cargables\n"
 
-#: src/elflint.c:3866
+#: src/elflint.c:3868
 #, c-format
 msgid ""
 "section [%2zu] '%s' is extension section index table in non-object file\n"
@@ -3080,22 +3315,22 @@
 "Sección [%2zu] '%s' es tabla de índice de sección de extensión en archivo no-"
 "objeto\n"
 
-#: src/elflint.c:3909
+#: src/elflint.c:3911
 #, c-format
 msgid "section [%2zu] '%s': size not multiple of entry size\n"
 msgstr "Sección [%2zu] '%s': tamaño no es múltiplo de tamaño de entrada\n"
 
-#: src/elflint.c:3914
+#: src/elflint.c:3916
 #, c-format
 msgid "cannot get section header\n"
 msgstr "no se puede obtener encabezamiento de sección\n"
 
-#: src/elflint.c:3924
+#: src/elflint.c:3926
 #, c-format
 msgid "section [%2zu] '%s' has unsupported type %d\n"
 msgstr "sección [%2zu] '%s' tiene tipo %d incompatible \n"
 
-#: src/elflint.c:3944
+#: src/elflint.c:3946
 #, c-format
 msgid ""
 "section [%2zu] '%s' contains invalid processor-specific flag(s) %#<PRIx64>\n"
@@ -3103,76 +3338,76 @@
 "Sección [%2zu] '%s' contiene bandera(s) de procesador-específico inválidas "
 "%#<PRIx64>\n"
 
-#: src/elflint.c:3954
+#: src/elflint.c:3956
 #, c-format
 msgid "section [%2zu] '%s' contains unknown flag(s) %#<PRIx64>\n"
 msgstr "Sección [%2zu] '%s' contiene bandera(s) desconocidas %#<PRIx64>\n"
 
-#: src/elflint.c:3962
+#: src/elflint.c:3964
 #, c-format
 msgid "section [%2zu] '%s': thread-local data sections address not zero\n"
 msgstr ""
 "Sección [%2zu] '%s': dirección de secciones de datos de hilo-local no cero\n"
 
-#: src/elflint.c:3972
+#: src/elflint.c:3974
 #, fuzzy, c-format
 msgid "section [%2zu] '%s': allocated section cannot be compressed\n"
 msgstr ""
 "Sección [%2zu] '%s': dirección de secciones de datos de hilo-local no cero\n"
 
-#: src/elflint.c:3977
+#: src/elflint.c:3979
 #, fuzzy, c-format
 msgid "section [%2zu] '%s': nobits section cannot be compressed\n"
 msgstr "Sección [%2d] '%s': no hay sección de dispersión presente\n"
 
-#: src/elflint.c:3983
+#: src/elflint.c:3985
 #, fuzzy, c-format
 msgid ""
 "section [%2zu] '%s': compressed section with no compression header: %s\n"
 msgstr "Sección [%2d] '%s': grupo de sección con sólo un miembro\n"
 
-#: src/elflint.c:3989
+#: src/elflint.c:3991
 #, c-format
 msgid "section [%2zu] '%s': invalid section reference in link value\n"
 msgstr ""
 "Sección [%2zu] '%s': referencia de sección inválida en valor de enlace\n"
 
-#: src/elflint.c:3994
+#: src/elflint.c:3996
 #, c-format
 msgid "section [%2zu] '%s': invalid section reference in info value\n"
 msgstr ""
 "Sección [%2zu] '%s': referencia de sección inválida en valor de información\n"
 
-#: src/elflint.c:4001
+#: src/elflint.c:4003
 #, c-format
 msgid "section [%2zu] '%s': strings flag set without merge flag\n"
 msgstr ""
 "Sección [%2zu] '%s': bandera de cadenas establecida sin bandera de fusión\n"
 
-#: src/elflint.c:4006
+#: src/elflint.c:4008
 #, c-format
 msgid "section [%2zu] '%s': merge flag set but entry size is zero\n"
 msgstr ""
 "Sección [%2zu] '%s': bandera de fusión establecida pero tamaño de entrada es "
 "cero\n"
 
-#: src/elflint.c:4025
+#: src/elflint.c:4027
 #, c-format
 msgid "section [%2zu] '%s' has unexpected type %d for an executable section\n"
 msgstr ""
 "Sección [%2zu] '%s' tiene un tipo %d inesperado para una sección ejecutable\n"
 
-#: src/elflint.c:4034
+#: src/elflint.c:4036
 #, fuzzy, c-format
 msgid "section [%2zu] '%s' must be of type NOBITS in debuginfo files\n"
 msgstr "sección [%2zu] '%s' no debe tener permiso de escritura\n"
 
-#: src/elflint.c:4041
+#: src/elflint.c:4043
 #, c-format
 msgid "section [%2zu] '%s' is both executable and writable\n"
 msgstr "Sección [%2zu] '%s' es tanto de ejecución como de escritura\n"
 
-#: src/elflint.c:4072
+#: src/elflint.c:4074
 #, c-format
 msgid ""
 "section [%2zu] '%s' not fully contained in segment of program header entry "
@@ -3181,7 +3416,7 @@
 "Sección [%2zu] '%s' no contenida totalmente en segmento de entrada de "
 "encabezamiento de programa %d\n"
 
-#: src/elflint.c:4082
+#: src/elflint.c:4084
 #, c-format
 msgid ""
 "section [%2zu] '%s' has type NOBITS but is read from the file in segment of "
@@ -3190,7 +3425,7 @@
 "Sección [%2zu] '%s' no tiene tipo NOBITS pero es leída desde el archivo en "
 "segmento de entrada de encabezamiento de programa %d\n"
 
-#: src/elflint.c:4108
+#: src/elflint.c:4110
 #, fuzzy, c-format
 msgid ""
 "section [%2zu] '%s' has type NOBITS but is read from the file in segment of "
@@ -3199,7 +3434,7 @@
 "Sección [%2zu] '%s' no tiene tipo NOBITS pero es leída desde el archivo en "
 "segmento de entrada de encabezamiento de programa %d\n"
 
-#: src/elflint.c:4119
+#: src/elflint.c:4121
 #, c-format
 msgid ""
 "section [%2zu] '%s' has not type NOBITS but is not read from the file in "
@@ -3208,18 +3443,18 @@
 "Sección [%2zu] '%s' no tiene tipo NOBITS pero no es leída desde el fichero "
 "en segmento de entrada de encabezamiento de programa %d\n"
 
-#: src/elflint.c:4130
+#: src/elflint.c:4132
 #, c-format
 msgid "section [%2zu] '%s' is executable in nonexecutable segment %d\n"
 msgstr "Sección [%2zu] '%s' es ejecutable en segmento no ejecutable %d\n"
 
-#: src/elflint.c:4140
+#: src/elflint.c:4142
 #, c-format
 msgid "section [%2zu] '%s' is writable in unwritable segment %d\n"
 msgstr ""
 "Sección [%2zu] '%s' es de escritura en segmento que no es de escritura %d\n"
 
-#: src/elflint.c:4150
+#: src/elflint.c:4152
 #, c-format
 msgid ""
 "section [%2zu] '%s': alloc flag set but section not in any loaded segment\n"
@@ -3227,7 +3462,7 @@
 "Sección [%2zu] '%s': asignación de bandera establecida pero sección no en "
 "ningún segmento cargado\n"
 
-#: src/elflint.c:4156
+#: src/elflint.c:4158
 #, c-format
 msgid ""
 "section [%2zu] '%s': ELF header says this is the section header string table "
@@ -3236,7 +3471,7 @@
 "Sección [%2zu] '%s': encabezamiento ELF dice esta es la tabla de cadena de "
 "encabezamiento de sección, pero el tipo no es SHT_TYPE\n"
 
-#: src/elflint.c:4164
+#: src/elflint.c:4166
 #, c-format
 msgid ""
 "section [%2zu] '%s': relocatable files cannot have dynamic symbol tables\n"
@@ -3244,32 +3479,32 @@
 "sección [%2zu] '%s': ficheros reubicables no pueden tener tablas de símbolos "
 "dinámicos\n"
 
-#: src/elflint.c:4215
+#: src/elflint.c:4217
 #, c-format
 msgid "more than one version symbol table present\n"
 msgstr "Más de una tabla de símbolos presente\n"
 
-#: src/elflint.c:4238
+#: src/elflint.c:4240
 #, c-format
 msgid "INTERP program header entry but no .interp section\n"
 msgstr ""
 "Entrada de encabezamiento de programa INTERP pero no la sección .interp\n"
 
-#: src/elflint.c:4249
+#: src/elflint.c:4251
 #, c-format
 msgid ""
 "loadable segment [%u] is executable but contains no executable sections\n"
 msgstr ""
 "segmento cargable [%u] es ejecutable pero no contiene secciones ejecutables\n"
 
-#: src/elflint.c:4255
+#: src/elflint.c:4257
 #, c-format
 msgid "loadable segment [%u] is writable but contains no writable sections\n"
 msgstr ""
 "segmento cargable [%u] es de escritura pero contiene secciones protegidas "
 "contra escritura\n"
 
-#: src/elflint.c:4266
+#: src/elflint.c:4268
 #, c-format
 msgid ""
 "no .gnu.versym section present but .gnu.versym_d or .gnu.versym_r section "
@@ -3278,26 +3513,26 @@
 "Sección no .gnu.versym presente, pero la sección .gnu.versym_d o la sección ."
 "gnu.versym_r existen\n"
 
-#: src/elflint.c:4279
+#: src/elflint.c:4281
 #, c-format
 msgid "duplicate version index %d\n"
 msgstr "Duplicar índice de versión %d\n"
 
-#: src/elflint.c:4293
+#: src/elflint.c:4295
 #, c-format
 msgid ".gnu.versym section present without .gnu.versym_d or .gnu.versym_r\n"
 msgstr ""
 "Sección .gnu.versym presente sin las secciones .gnu.versym_d o .gnu."
 "versym_r\n"
 
-#: src/elflint.c:4342
+#: src/elflint.c:4344
 #, c-format
 msgid "phdr[%d]: unknown core file note type %<PRIu32> at offset %<PRIu64>\n"
 msgstr ""
 "phdr[%d]: tipo de nota de fichero core desconocido %<PRIu32> en compensación "
 "%<PRIu64>\n"
 
-#: src/elflint.c:4346
+#: src/elflint.c:4348
 #, fuzzy, c-format
 msgid ""
 "section [%2d] '%s': unknown core file note type %<PRIu32> at offset %zu\n"
@@ -3305,7 +3540,7 @@
 "Sección [%2d] '%s': tipo de nota de fichero core desconocido %<PRIu32> en "
 "compensación %Zu\n"
 
-#: src/elflint.c:4395
+#: src/elflint.c:4397
 #, fuzzy, c-format
 msgid ""
 "phdr[%d]: unknown object file note type %<PRIu32> with owner name '%s' at "
@@ -3314,7 +3549,7 @@
 "phdr[%d]: tipo de nota de fichero objeto desconocido %<PRIu32> en "
 "compensación %Zu\n"
 
-#: src/elflint.c:4400
+#: src/elflint.c:4402
 #, fuzzy, c-format
 msgid ""
 "section [%2d] '%s': unknown object file note type %<PRIu32> with owner name "
@@ -3323,40 +3558,40 @@
 "Sección [%2d] '%s': tipo de nota de fichero objeto desconocido %<PRIu32> en "
 "compensación %Zu\n"
 
-#: src/elflint.c:4419
+#: src/elflint.c:4421
 #, c-format
 msgid "phdr[%d]: no note entries defined for the type of file\n"
 msgstr "phdr[%d]: no hay entradas de nota definidas para el tipo de archivo\n"
 
-#: src/elflint.c:4439
+#: src/elflint.c:4441
 #, c-format
 msgid "phdr[%d]: cannot get content of note section: %s\n"
 msgstr "phdr[%d]: no puede obtener contenido de sección de nota: %s\n"
 
-#: src/elflint.c:4442
+#: src/elflint.c:4444
 #, c-format
 msgid "phdr[%d]: extra %<PRIu64> bytes after last note\n"
 msgstr "phdr[%d]: extra %<PRIu64> bytes después de la última nota\n"
 
-#: src/elflint.c:4463
+#: src/elflint.c:4465
 #, c-format
 msgid "section [%2d] '%s': no note entries defined for the type of file\n"
 msgstr ""
 "Sección [%2d] '%s': no hay entradas de nota definidas para el tipo de "
 "archivo\n"
 
-#: src/elflint.c:4470
+#: src/elflint.c:4472
 #, c-format
 msgid "section [%2d] '%s': cannot get content of note section\n"
 msgstr ""
 "Sección[%2d] '%s': no se puede obtener el contenido de sección de nota\n"
 
-#: src/elflint.c:4473
+#: src/elflint.c:4475
 #, c-format
 msgid "section [%2d] '%s': extra %<PRIu64> bytes after last note\n"
 msgstr "Sección[%2d] '%s': extra %<PRIu64> bytes después de la última nota\n"
 
-#: src/elflint.c:4491
+#: src/elflint.c:4493
 #, c-format
 msgid ""
 "only executables, shared objects, and core files can have program headers\n"
@@ -3364,145 +3599,145 @@
 "Sólo ejecutables, objetos compartidos y ficheros core pueden tener "
 "encabezamientos de programas\n"
 
-#: src/elflint.c:4506
+#: src/elflint.c:4508
 #, c-format
 msgid "cannot get program header entry %d: %s\n"
 msgstr "no se puede obtener entrada de encabezamiento %d: %s\n"
 
-#: src/elflint.c:4516
+#: src/elflint.c:4518
 #, c-format
 msgid "program header entry %d: unknown program header entry type %#<PRIx64>\n"
 msgstr ""
 "entrada de encabezamiento de programa %d: tipo %#<PRIx64> de entrada de "
 "encabezamiento de programa desconocido\n"
 
-#: src/elflint.c:4527
+#: src/elflint.c:4529
 #, c-format
 msgid "more than one INTERP entry in program header\n"
 msgstr "Más de una entrada INTERP en encabezamiento de programa\n"
 
-#: src/elflint.c:4535
+#: src/elflint.c:4537
 #, c-format
 msgid "more than one TLS entry in program header\n"
 msgstr "más de una entrada TLS en encabezamiento de programa\n"
 
-#: src/elflint.c:4542
+#: src/elflint.c:4544
 #, c-format
 msgid "static executable cannot have dynamic sections\n"
 msgstr "ejecutable estático no puede tener secciones dinámicas\n"
 
-#: src/elflint.c:4556
+#: src/elflint.c:4558
 #, c-format
 msgid "dynamic section reference in program header has wrong offset\n"
 msgstr ""
 "Referencia de sección dinámica en encabezamiento de programa tiene "
 "compensación errada\n"
 
-#: src/elflint.c:4559
+#: src/elflint.c:4561
 #, c-format
 msgid "dynamic section size mismatch in program and section header\n"
 msgstr ""
 "No coinciden tamaño de sección dinámica en programa y encabezamiento de "
 "sección\n"
 
-#: src/elflint.c:4569
+#: src/elflint.c:4571
 #, c-format
 msgid "more than one GNU_RELRO entry in program header\n"
 msgstr "Más de una entrada GNU_RELRO en encabezamiento de programa\n"
 
-#: src/elflint.c:4590
+#: src/elflint.c:4592
 #, c-format
 msgid "loadable segment GNU_RELRO applies to is not writable\n"
 msgstr "Segmento cargable GNU_RELRO que se aplica no es de escritura\n"
 
-#: src/elflint.c:4601
+#: src/elflint.c:4603
 #, c-format
 msgid "loadable segment [%u] flags do not match GNU_RELRO [%u] flags\n"
 msgstr ""
 "Banderas de segmento cargable [%u] no coinciden con banderas GNU_RELRO [%u]\n"
 
-#: src/elflint.c:4608
+#: src/elflint.c:4610
 #, c-format
 msgid ""
 "GNU_RELRO [%u] flags are not a subset of the loadable segment [%u] flags\n"
 msgstr ""
 
-#: src/elflint.c:4617 src/elflint.c:4640
+#: src/elflint.c:4619 src/elflint.c:4642
 #, c-format
 msgid "%s segment not contained in a loaded segment\n"
 msgstr "Segmento %s no contenido en un segmento cargable\n"
 
-#: src/elflint.c:4646
+#: src/elflint.c:4648
 #, c-format
 msgid "program header offset in ELF header and PHDR entry do not match"
 msgstr ""
 "Compensación de encabezamiento de programa en encabezamiento ELF y entrada "
 "PHDR no coinciden"
 
-#: src/elflint.c:4673
+#: src/elflint.c:4675
 #, c-format
 msgid "call frame search table reference in program header has wrong offset\n"
 msgstr ""
 "Referencia de tabla de búsqueda de marco de llamada en encabezamiento de "
 "programa tiene una compensación errada\n"
 
-#: src/elflint.c:4676
+#: src/elflint.c:4678
 #, c-format
 msgid "call frame search table size mismatch in program and section header\n"
 msgstr ""
 "Tamaño de tabla de búsqueda de marco de llamada no coincide con programa y "
 "encabezamiento de sección\n"
 
-#: src/elflint.c:4689
+#: src/elflint.c:4691
 #, c-format
 msgid "PT_GNU_EH_FRAME present but no .eh_frame_hdr section\n"
 msgstr "PT_GNU_EH_FRAME presente pero no la sección.eh_frame_hdr\n"
 
-#: src/elflint.c:4697
+#: src/elflint.c:4699
 #, c-format
 msgid "call frame search table must be allocated\n"
 msgstr "tabla de búsqueda de marco de llamada debe ser asignada\n"
 
-#: src/elflint.c:4700
+#: src/elflint.c:4702
 #, c-format
 msgid "section [%2zu] '%s' must be allocated\n"
 msgstr "sección [%2zu] '%s' debe ser asignada\n"
 
-#: src/elflint.c:4704
+#: src/elflint.c:4706
 #, c-format
 msgid "call frame search table must not be writable\n"
 msgstr ""
 "tabla de búsqueda de marco de llamada no debe tener permiso de escritura\n"
 
-#: src/elflint.c:4707
+#: src/elflint.c:4709
 #, c-format
 msgid "section [%2zu] '%s' must not be writable\n"
 msgstr "sección [%2zu] '%s' no debe tener permiso de escritura\n"
 
-#: src/elflint.c:4712
+#: src/elflint.c:4714
 #, c-format
 msgid "call frame search table must not be executable\n"
 msgstr "tabla de búsqueda de marco de llamada no debe ser ejecutable\n"
 
-#: src/elflint.c:4715
+#: src/elflint.c:4717
 #, c-format
 msgid "section [%2zu] '%s' must not be executable\n"
 msgstr "sección [%2zu] '%s' no debe ser ejecutable\n"
 
-#: src/elflint.c:4726
+#: src/elflint.c:4728
 #, c-format
 msgid "program header entry %d: file size greater than memory size\n"
 msgstr ""
 "entrada de encabezamiento de programa %d: tamaño de fichero mayor que el "
 "tamaño de memoria\n"
 
-#: src/elflint.c:4733
+#: src/elflint.c:4735
 #, c-format
 msgid "program header entry %d: alignment not a power of 2\n"
 msgstr ""
 "entrada de encabezamiento de programa %d: alineamiento no es potencia de 2\n"
 
-#: src/elflint.c:4736
+#: src/elflint.c:4738
 #, c-format
 msgid ""
 "program header entry %d: file offset and virtual address not module of "
@@ -3511,7 +3746,7 @@
 "entrada de encabezamiento de programa %d: compensación de fichero y "
 "dirección virtual no módulo de alineación\n"
 
-#: src/elflint.c:4749
+#: src/elflint.c:4751
 #, c-format
 msgid ""
 "executable/DSO with .eh_frame_hdr section does not have a PT_GNU_EH_FRAME "
@@ -3520,111 +3755,111 @@
 "ejecutable/DSO con sección .eh_frame_hdr no tiene una entrada de "
 "encabezamiento de programa PT_GNU_EH_FRAME"
 
-#: src/elflint.c:4783
+#: src/elflint.c:4785
 #, c-format
 msgid "cannot read ELF header: %s\n"
 msgstr "No se puede leer encabezamiento ELF: %s\n"
 
-#: src/elflint.c:4795
+#: src/elflint.c:4797
 #, fuzzy, c-format
 msgid "cannot create backend for ELF file\n"
 msgstr "no sepuede crear fichero nuevo"
 
-#: src/elflint.c:4816
+#: src/elflint.c:4818
 #, c-format
 msgid "text relocation flag set but not needed\n"
 msgstr "Bandera de reubicación de texto establecida pero no necesaria\n"
 
-#: src/findtextrel.c:60
+#: src/findtextrel.c:61
 msgid "Input Selection:"
 msgstr "Selección de entrada:"
 
-#: src/findtextrel.c:61
+#: src/findtextrel.c:62
 msgid "Prepend PATH to all file names"
 msgstr "Agregar RUTA a todos los nombres de ficheros"
 
-#: src/findtextrel.c:63
+#: src/findtextrel.c:64
 msgid "Use PATH as root of debuginfo hierarchy"
 msgstr "Usar RUTA como root de jerarquía de debuginfo"
 
 #. Short description of program.
-#: src/findtextrel.c:70
+#: src/findtextrel.c:71
 msgid "Locate source of text relocations in FILEs (a.out by default)."
 msgstr ""
 "Localizar origen de reubicaciones de texto en FICHEROS (a.out por defecto)."
 
 #. Strings for arguments in help texts.
-#: src/findtextrel.c:74 src/nm.c:108 src/objdump.c:71 src/size.c:80
+#: src/findtextrel.c:75 src/nm.c:108 src/objdump.c:71 src/size.c:80
 #: src/strings.c:87 src/strip.c:101
 msgid "[FILE...]"
 msgstr "[FICHERO...]"
 
-#: src/findtextrel.c:222
+#: src/findtextrel.c:224
 #, c-format
 msgid "cannot get ELF header '%s': %s"
 msgstr "No se puede obtener encabezamiento ELF '%s': %s"
 
-#: src/findtextrel.c:233
+#: src/findtextrel.c:235
 #, c-format
 msgid "'%s' is not a DSO or PIE"
 msgstr "'%s' es no un DSO o PIE"
 
-#: src/findtextrel.c:253
+#: src/findtextrel.c:255
 #, c-format
 msgid "getting get section header of section %zu: %s"
 msgstr "obtener encabezamiento de sección get de sección %zu: %s"
 
-#: src/findtextrel.c:277
+#: src/findtextrel.c:279
 #, c-format
 msgid "cannot read dynamic section: %s"
 msgstr "No se puede leer sección dinámica: %s"
 
-#: src/findtextrel.c:298
+#: src/findtextrel.c:300
 #, c-format
 msgid "no text relocations reported in '%s'"
 msgstr "no hay reubicaciones de texto reportado en '%s'"
 
-#: src/findtextrel.c:310
+#: src/findtextrel.c:311
 #, c-format
 msgid "while reading ELF file"
 msgstr "Error al leer fichero ELF"
 
-#: src/findtextrel.c:314
+#: src/findtextrel.c:315
 #, fuzzy, c-format
 msgid "cannot get program header count: %s"
 msgstr "no se puede obtener memoria para encabezamiento del programa: %s"
 
-#: src/findtextrel.c:325 src/findtextrel.c:342
+#: src/findtextrel.c:326 src/findtextrel.c:341
 #, fuzzy, c-format
 msgid "cannot get program header index at offset %zd: %s"
 msgstr ""
 "Nos se puede obtener el índice de encabezamiento de programa en compensación "
 "%d: %s"
 
-#: src/findtextrel.c:406
+#: src/findtextrel.c:397
 #, c-format
 msgid "cannot get symbol table section %zu in '%s': %s"
 msgstr "No se puede obtener tabla de símbolos %zu en '%s': %s"
 
-#: src/findtextrel.c:427 src/findtextrel.c:450
+#: src/findtextrel.c:418 src/findtextrel.c:441
 #, c-format
 msgid "cannot get relocation at index %d in section %zu in '%s': %s"
 msgstr ""
 "No se puede obtener reubicación en índice %d en sección %zu en '%s': %s"
 
-#: src/findtextrel.c:516
+#: src/findtextrel.c:507
 #, c-format
 msgid "%s not compiled with -fpic/-fPIC\n"
 msgstr "%s no compilado con -fpic/-fPIC\n"
 
-#: src/findtextrel.c:570
+#: src/findtextrel.c:561
 #, c-format
 msgid ""
 "the file containing the function '%s' is not compiled with -fpic/-fPIC\n"
 msgstr ""
 "El archivo que contiene la función '%s' no está compilado con -fpic/-fPIC\n"
 
-#: src/findtextrel.c:577 src/findtextrel.c:597
+#: src/findtextrel.c:568 src/findtextrel.c:588
 #, c-format
 msgid ""
 "the file containing the function '%s' might not be compiled with -fpic/-"
@@ -3633,7 +3868,7 @@
 "el fichero que contiene la función '%s' podría no estar compilado con -fpic/-"
 "fPIC\n"
 
-#: src/findtextrel.c:585
+#: src/findtextrel.c:576
 #, c-format
 msgid ""
 "either the file containing the function '%s' or the file containing the "
@@ -3642,7 +3877,7 @@
 "Tanto el fichero que contiene la función '%s' como el fichero que contiene "
 "la función '%s' no están compilados con -fpic/-fPIC\n"
 
-#: src/findtextrel.c:605
+#: src/findtextrel.c:596
 #, c-format
 msgid ""
 "a relocation modifies memory at offset %llu in a write-protected segment\n"
@@ -3751,12 +3986,12 @@
 msgstr "%s: ERROR INTERNO %d (%s-%s): %s"
 
 #: src/nm.c:381 src/nm.c:393 src/size.c:288 src/size.c:297 src/size.c:308
-#: src/strip.c:2763
+#: src/strip.c:2767
 #, c-format
 msgid "while closing '%s'"
 msgstr "error al cerrar '%s'"
 
-#: src/nm.c:403 src/objdump.c:280 src/strip.c:818
+#: src/nm.c:403 src/objdump.c:280 src/strip.c:822
 #, c-format
 msgid "%s: File format not recognized"
 msgstr "%s: No se reconoce el formato del fichero"
@@ -3791,24 +4026,24 @@
 msgid "%s%s%s: file format not recognized"
 msgstr "%s%s%s: no se reconoció el formato de fichero"
 
-#: src/nm.c:705
+#: src/nm.c:704
 #, c-format
 msgid "cannot create search tree"
 msgstr "No se puede crear el árbol de búsqueda"
 
-#: src/nm.c:746 src/nm.c:1239 src/objdump.c:782 src/readelf.c:637
+#: src/nm.c:745 src/nm.c:1238 src/objdump.c:781 src/readelf.c:637
 #: src/readelf.c:1451 src/readelf.c:1602 src/readelf.c:1803 src/readelf.c:2009
-#: src/readelf.c:2199 src/readelf.c:2377 src/readelf.c:2453 src/readelf.c:2711
-#: src/readelf.c:2787 src/readelf.c:2874 src/readelf.c:3472 src/readelf.c:3522
-#: src/readelf.c:3592 src/readelf.c:11328 src/readelf.c:12523
-#: src/readelf.c:12734 src/readelf.c:12803 src/size.c:398 src/size.c:470
-#: src/strip.c:1084
+#: src/readelf.c:2199 src/readelf.c:2377 src/readelf.c:2453 src/readelf.c:2719
+#: src/readelf.c:2795 src/readelf.c:2882 src/readelf.c:3478 src/readelf.c:3528
+#: src/readelf.c:3598 src/readelf.c:11409 src/readelf.c:12603
+#: src/readelf.c:12814 src/readelf.c:12883 src/size.c:398 src/size.c:470
+#: src/strip.c:1089
 #, c-format
 msgid "cannot get section header string table index"
 msgstr "no se puede obtener índice de cadena de encabezamiento de sección"
 
 #. We always print this prolog.
-#: src/nm.c:771
+#: src/nm.c:770
 #, c-format
 msgid ""
 "\n"
@@ -3822,7 +4057,7 @@
 "\n"
 
 #. The header line.
-#: src/nm.c:774
+#: src/nm.c:773
 #, c-format
 msgid ""
 "%*s%-*s %-*s Class  Type     %-*s %*s Section\n"
@@ -3831,30 +4066,53 @@
 "%*s%-*s %-*s Clase  Tipo     %-*s %*s Sección\n"
 "\n"
 
-#: src/nm.c:1250
+#: src/nm.c:775
+msgctxt "sysv"
+msgid "Name"
+msgstr ""
+
+#. TRANS: the "sysv|" parts makes the string unique.
+#: src/nm.c:777
+msgctxt "sysv"
+msgid "Value"
+msgstr ""
+
+#. TRANS: the "sysv|" parts makes the string unique.
+#: src/nm.c:779
+msgctxt "sysv"
+msgid "Size"
+msgstr ""
+
+#. TRANS: the "sysv|" parts makes the string unique.
+#: src/nm.c:781
+msgctxt "sysv"
+msgid "Line"
+msgstr ""
+
+#: src/nm.c:1249
 #, fuzzy, c-format
 msgid "%s: entry size in section %zd `%s' is not what we expect"
 msgstr ""
 "%s: el tamaño de la entrada en la sección `%s' no es el que esperábamos "
 
-#: src/nm.c:1255
+#: src/nm.c:1254
 #, fuzzy, c-format
 msgid "%s: size of section %zd `%s' is not multiple of entry size"
 msgstr "%s: Tamaño de sección `%s' no es múltiplo de tamaño de entrada"
 
-#: src/nm.c:1334
+#: src/nm.c:1335
 #, fuzzy, c-format
 msgid "%s: entries (%zd) in section %zd `%s' is too large"
 msgstr ""
 "%s: el tamaño de la entrada en la sección `%s' no es el que esperábamos "
 
 #. XXX Add machine specific object file types.
-#: src/nm.c:1570
+#: src/nm.c:1571
 #, c-format
 msgid "%s%s%s%s: Invalid operation"
 msgstr "%s%s%s%s: Operación inválida"
 
-#: src/nm.c:1620
+#: src/nm.c:1621
 #, c-format
 msgid "%s%s%s: no symbols"
 msgstr "%s%s%s: No hay símbolos"
@@ -3931,7 +4189,7 @@
 msgid "cannot disassemble"
 msgstr "No se puede desensamblar"
 
-#: src/objdump.c:760
+#: src/objdump.c:759
 #, fuzzy, c-format
 msgid "cannot create backend for elf file"
 msgstr "no sepuede crear fichero nuevo"
@@ -4119,7 +4377,7 @@
 msgid "cannot generate Elf descriptor: %s"
 msgstr "no se puede crear descriptor ELF: %s"
 
-#: src/readelf.c:628 src/readelf.c:955 src/strip.c:1179
+#: src/readelf.c:628 src/readelf.c:955 src/strip.c:1184
 #, c-format
 msgid "cannot determine number of sections: %s"
 msgstr "no se pudieron determinar el número de secciones: %s"
@@ -4129,11 +4387,11 @@
 msgid "cannot get section: %s"
 msgstr "No se puede encontrar la sección: %s"
 
-#: src/readelf.c:655 src/readelf.c:1272 src/readelf.c:1483 src/readelf.c:12754
-#: src/unstrip.c:397 src/unstrip.c:428 src/unstrip.c:487 src/unstrip.c:608
-#: src/unstrip.c:629 src/unstrip.c:669 src/unstrip.c:885 src/unstrip.c:1216
-#: src/unstrip.c:1343 src/unstrip.c:1367 src/unstrip.c:1423 src/unstrip.c:1487
-#: src/unstrip.c:1662 src/unstrip.c:1813 src/unstrip.c:1956 src/unstrip.c:2055
+#: src/readelf.c:655 src/readelf.c:1272 src/readelf.c:1483 src/readelf.c:12834
+#: src/unstrip.c:397 src/unstrip.c:428 src/unstrip.c:491 src/unstrip.c:612
+#: src/unstrip.c:633 src/unstrip.c:673 src/unstrip.c:889 src/unstrip.c:1224
+#: src/unstrip.c:1351 src/unstrip.c:1375 src/unstrip.c:1431 src/unstrip.c:1472
+#: src/unstrip.c:1665 src/unstrip.c:1816 src/unstrip.c:1959 src/unstrip.c:2058
 #, c-format
 msgid "cannot get section header: %s"
 msgstr "No se puede obtener encabezamiento de sección: %s"
@@ -4143,8 +4401,8 @@
 msgid "cannot get section name"
 msgstr "no se puede obtener encabezamiento de sección\n"
 
-#: src/readelf.c:672 src/readelf.c:6628 src/readelf.c:10600 src/readelf.c:10702
-#: src/readelf.c:10880
+#: src/readelf.c:672 src/readelf.c:6634 src/readelf.c:10681 src/readelf.c:10783
+#: src/readelf.c:10961
 #, c-format
 msgid "cannot get %s content: %s"
 msgstr "No se puede obtener el contenido %s: %s"
@@ -4487,7 +4745,7 @@
 " Sección para asignación de segmento:\n"
 "  Secciones de segmento..."
 
-#: src/readelf.c:1464 src/unstrip.c:2114 src/unstrip.c:2156 src/unstrip.c:2163
+#: src/readelf.c:1464 src/unstrip.c:2117 src/unstrip.c:2159 src/unstrip.c:2166
 #, c-format
 msgid "cannot get program header: %s"
 msgstr "no se puede obtener memoria para encabezamiento del programa: %s"
@@ -4530,18 +4788,18 @@
 msgid "<INVALID SECTION>"
 msgstr "<SECCIÓN INVÁLIDA>"
 
-#: src/readelf.c:1660 src/readelf.c:2387 src/readelf.c:3488 src/readelf.c:12625
-#: src/readelf.c:12632 src/readelf.c:12676 src/readelf.c:12683
+#: src/readelf.c:1660 src/readelf.c:2387 src/readelf.c:3494 src/readelf.c:12705
+#: src/readelf.c:12712 src/readelf.c:12756 src/readelf.c:12763
 msgid "Couldn't uncompress section"
 msgstr ""
 
-#: src/readelf.c:1665 src/readelf.c:2392 src/readelf.c:3493
+#: src/readelf.c:1665 src/readelf.c:2392 src/readelf.c:3499
 #, fuzzy, c-format
 msgid "cannot get section [%zd] header: %s"
 msgstr "No se puede obtener encabezamiento de sección: %s"
 
-#: src/readelf.c:1809 src/readelf.c:2459 src/readelf.c:2717 src/readelf.c:2793
-#: src/readelf.c:3097 src/readelf.c:3171 src/readelf.c:5401
+#: src/readelf.c:1809 src/readelf.c:2459 src/readelf.c:2725 src/readelf.c:2801
+#: src/readelf.c:3105 src/readelf.c:3179 src/readelf.c:5407
 #, fuzzy, c-format
 msgid "invalid sh_link value in section %zu"
 msgstr ".debug_line section inválida"
@@ -4704,20 +4962,20 @@
 msgid "%5u: %0*<PRIx64> %6<PRId64> %-7s %-6s %-9s %6s %s"
 msgstr "%5u: %0*<PRIx64> %6<PRId64> %-7s %-6s %-9s %6s %s"
 
-#: src/readelf.c:2590
+#: src/readelf.c:2595
 #, c-format
 msgid "bad dynamic symbol"
 msgstr "símbolo dinámico erróneo"
 
-#: src/readelf.c:2672
+#: src/readelf.c:2680
 msgid "none"
 msgstr "nada"
 
-#: src/readelf.c:2689
+#: src/readelf.c:2697
 msgid "| <unknown>"
 msgstr "| <desconocido>"
 
-#: src/readelf.c:2720
+#: src/readelf.c:2728
 #, c-format
 msgid ""
 "\n"
@@ -4738,17 +4996,17 @@
 " Dirección: %#0*<PRIx64>  Compensación: %#08<PRIx64>  Enlace a sección: "
 "[%2u] '%s'\n"
 
-#: src/readelf.c:2741
+#: src/readelf.c:2749
 #, c-format
 msgid "  %#06x: Version: %hu  File: %s  Cnt: %hu\n"
 msgstr "  %#06x: Versión: %hu  Fichero: %s  Conteo: %hu\n"
 
-#: src/readelf.c:2754
+#: src/readelf.c:2762
 #, c-format
 msgid "  %#06x: Name: %s  Flags: %s  Version: %hu\n"
 msgstr "  %#06x: Nombre: %s  Banderas: %s  Versión: %hu\n"
 
-#: src/readelf.c:2797
+#: src/readelf.c:2805
 #, c-format
 msgid ""
 "\n"
@@ -4769,19 +5027,19 @@
 " Dirección: %#0*<PRIx64>  Compensación: %#08<PRIx64>  Enlace a sección: "
 "[%2u] '%s'\n"
 
-#: src/readelf.c:2825
+#: src/readelf.c:2833
 #, c-format
 msgid "  %#06x: Version: %hd  Flags: %s  Index: %hd  Cnt: %hd  Name: %s\n"
 msgstr ""
 "  %#06x: Versión: %hd  Banderas: %s  Índice: %hd  Conteo: %hd  Nombre: %s\n"
 
-#: src/readelf.c:2840
+#: src/readelf.c:2848
 #, c-format
 msgid "  %#06x: Parent %d: %s\n"
 msgstr "  %#06x: Principal %d: %s\n"
 
 #. Print the header.
-#: src/readelf.c:3101
+#: src/readelf.c:3109
 #, c-format
 msgid ""
 "\n"
@@ -4802,15 +5060,15 @@
 " Dirección: %#0*<PRIx64>  Compensación: %#08<PRIx64>  Enlace a sección: "
 "[%2u] '%s'"
 
-#: src/readelf.c:3129
+#: src/readelf.c:3137
 msgid "   0 *local*                     "
 msgstr "   0 *local*                     "
 
-#: src/readelf.c:3134
+#: src/readelf.c:3142
 msgid "   1 *global*                    "
 msgstr "   1 *global*                    "
 
-#: src/readelf.c:3176
+#: src/readelf.c:3184
 #, c-format
 msgid ""
 "\n"
@@ -4835,22 +5093,22 @@
 " Dirección: %#0*<PRIx64>  Compensación: %#08<PRIx64>  Enlace a sección: "
 "[%2u] '%s'\n"
 
-#: src/readelf.c:3198
+#: src/readelf.c:3206
 #, no-c-format
 msgid " Length  Number  % of total  Coverage\n"
 msgstr " Longitud  Número  % of total  Cobertura\n"
 
-#: src/readelf.c:3200
+#: src/readelf.c:3208
 #, c-format
 msgid "      0  %6<PRIu32>      %5.1f%%\n"
 msgstr "      0  %6<PRIu32>      %5.1f%%\n"
 
-#: src/readelf.c:3207
+#: src/readelf.c:3215
 #, c-format
 msgid "%7d  %6<PRIu32>      %5.1f%%    %5.1f%%\n"
 msgstr "%7d  %6<PRIu32>      %5.1f%%    %5.1f%%\n"
 
-#: src/readelf.c:3220
+#: src/readelf.c:3228
 #, c-format
 msgid ""
 " Average number of tests:   successful lookup: %f\n"
@@ -4859,37 +5117,37 @@
 " Número promedio de pruebas:   búsqueda exitosa: %f\n"
 "                          búsqueda sin éxito: %f\n"
 
-#: src/readelf.c:3238 src/readelf.c:3302 src/readelf.c:3368
+#: src/readelf.c:3246 src/readelf.c:3310 src/readelf.c:3376
 #, c-format
 msgid "cannot get data for section %d: %s"
 msgstr "No se pueden obtener datos para la sección %d: %s"
 
-#: src/readelf.c:3246
+#: src/readelf.c:3254
 #, fuzzy, c-format
 msgid "invalid data in sysv.hash section %d"
 msgstr "Datos inválidos en sección [%zu] '%s'"
 
-#: src/readelf.c:3275
+#: src/readelf.c:3283
 #, fuzzy, c-format
 msgid "invalid chain in sysv.hash section %d"
 msgstr "Datos inválidos en sección [%zu] '%s'"
 
-#: src/readelf.c:3310
+#: src/readelf.c:3318
 #, fuzzy, c-format
 msgid "invalid data in sysv.hash64 section %d"
 msgstr "Datos inválidos en sección [%zu] '%s'"
 
-#: src/readelf.c:3341
+#: src/readelf.c:3349
 #, fuzzy, c-format
 msgid "invalid chain in sysv.hash64 section %d"
 msgstr "Datos inválidos en sección [%zu] '%s'"
 
-#: src/readelf.c:3377
+#: src/readelf.c:3385
 #, fuzzy, c-format
 msgid "invalid data in gnu.hash section %d"
 msgstr "Datos inválidos en sección [%zu] '%s'"
 
-#: src/readelf.c:3444
+#: src/readelf.c:3451
 #, c-format
 msgid ""
 " Symbol Bias: %u\n"
@@ -4899,7 +5157,7 @@
 " Tamaño de Bitmask: %zu bytes  %<PRIuFAST32>%% bits establecen segundo "
 "cambio de dispersión: %u\n"
 
-#: src/readelf.c:3533
+#: src/readelf.c:3539
 #, c-format
 msgid ""
 "\n"
@@ -4916,7 +5174,7 @@
 "Sección de lista de biblioteca [%2zu] '%s' en compensación %#0<PRIx64> "
 "contiene entradas %d:\n"
 
-#: src/readelf.c:3547
+#: src/readelf.c:3553
 msgid ""
 "       Library                       Time Stamp          Checksum Version "
 "Flags"
@@ -4924,7 +5182,7 @@
 "       Biblioteca                       Marca de tiempo          Indicadores "
 "de versión de suma de verificación"
 
-#: src/readelf.c:3606
+#: src/readelf.c:3612
 #, c-format
 msgid ""
 "\n"
@@ -4935,102 +5193,102 @@
 "Sección de atributos de objeto [%2zu] '%s' de %<PRIu64> bytes con "
 "desplazamiento %#0<PRIx64>:\n"
 
-#: src/readelf.c:3623
+#: src/readelf.c:3629
 msgid "  Owner          Size\n"
 msgstr "  Propietario          Tamaño\n"
 
-#: src/readelf.c:3647
+#: src/readelf.c:3653
 #, c-format
 msgid "  %-13s  %4<PRIu32>\n"
 msgstr "  %-13s  %4<PRIu32>\n"
 
 #. Unknown subsection, print and skip.
-#: src/readelf.c:3686
+#: src/readelf.c:3692
 #, c-format
 msgid "    %-4u %12<PRIu32>\n"
 msgstr "    %-4u %12<PRIu32>\n"
 
 #. Tag_File
-#: src/readelf.c:3691
+#: src/readelf.c:3697
 #, c-format
 msgid "    File: %11<PRIu32>\n"
 msgstr "    File: %11<PRIu32>\n"
 
-#: src/readelf.c:3740
+#: src/readelf.c:3746
 #, c-format
 msgid "      %s: %<PRId64>, %s\n"
 msgstr "      %s: %<PRId64>, %s\n"
 
-#: src/readelf.c:3743
+#: src/readelf.c:3749
 #, c-format
 msgid "      %s: %<PRId64>\n"
 msgstr "      %s: %<PRId64>\n"
 
-#: src/readelf.c:3746
+#: src/readelf.c:3752
 #, c-format
 msgid "      %s: %s\n"
 msgstr "      %s: %s\n"
 
-#: src/readelf.c:3756
+#: src/readelf.c:3762
 #, c-format
 msgid "      %u: %<PRId64>\n"
 msgstr "      %u: %<PRId64>\n"
 
-#: src/readelf.c:3759
+#: src/readelf.c:3765
 #, c-format
 msgid "      %u: %s\n"
 msgstr "      %u: %s\n"
 
-#: src/readelf.c:3829
+#: src/readelf.c:3835
 #, fuzzy, c-format
 msgid "sprintf failure"
 msgstr "mprotect falló"
 
-#: src/readelf.c:4311
+#: src/readelf.c:4317
 msgid "empty block"
 msgstr "bloque vacío"
 
-#: src/readelf.c:4314
+#: src/readelf.c:4320
 #, c-format
 msgid "%zu byte block:"
 msgstr "bloque de byte %zu:"
 
-#: src/readelf.c:4792
+#: src/readelf.c:4798
 #, fuzzy, c-format
 msgid "%*s[%2<PRIuMAX>] %s  <TRUNCATED>\n"
 msgstr "%*s[%4<PRIuMAX>] %s  <TRUNCATED>\n"
 
-#: src/readelf.c:4859
+#: src/readelf.c:4865
 #, c-format
 msgid "%s %#<PRIx64> used with different address sizes"
 msgstr "%s %#<PRIx64> utilizado con direcciones de diferente tamaño"
 
-#: src/readelf.c:4866
+#: src/readelf.c:4872
 #, c-format
 msgid "%s %#<PRIx64> used with different offset sizes"
 msgstr "%s %#<PRIx64> utilizado con offsetr de diferente tamaño"
 
-#: src/readelf.c:4873
+#: src/readelf.c:4879
 #, fuzzy, c-format
 msgid "%s %#<PRIx64> used with different base addresses"
 msgstr "%s %#<PRIx64> utilizado con direcciones de diferente tamaño"
 
-#: src/readelf.c:4880
+#: src/readelf.c:4886
 #, fuzzy, c-format
 msgid "%s %#<PRIx64> used with different attribute %s and %s"
 msgstr "%s %#<PRIx64> utilizado con direcciones de diferente tamaño"
 
-#: src/readelf.c:4980
+#: src/readelf.c:4986
 #, c-format
 msgid " [%6tx]  <UNUSED GARBAGE IN REST OF SECTION>\n"
 msgstr " [%6tx] <MATERIAL INUTIL SIN UTILIZAR EN EL RESTO DE LA SECCION>\n"
 
-#: src/readelf.c:4988
+#: src/readelf.c:4994
 #, c-format
 msgid " [%6tx]  <UNUSED GARBAGE> ... %<PRIu64> bytes ...\n"
 msgstr " [%6tx]  <MATERIAL INUTIL NO UTILIZADO> ... %<PRIu64> bytes ...\n"
 
-#: src/readelf.c:5091
+#: src/readelf.c:5097
 #, c-format
 msgid ""
 "\n"
@@ -5041,7 +5299,7 @@
 "Sección DWARF [%2zu] '%s' en compensación %#<PRIx64>:\n"
 " [ Código]\n"
 
-#: src/readelf.c:5099
+#: src/readelf.c:5105
 #, c-format
 msgid ""
 "\n"
@@ -5050,20 +5308,20 @@
 "\n"
 "Sección de abreviatura en compensación %<PRIu64>:\n"
 
-#: src/readelf.c:5112
+#: src/readelf.c:5118
 #, c-format
 msgid " *** error while reading abbreviation: %s\n"
 msgstr " *** error en lectura de abreviatura: %s\n"
 
-#: src/readelf.c:5128
+#: src/readelf.c:5134
 #, c-format
 msgid " [%5u] offset: %<PRId64>, children: %s, tag: %s\n"
 msgstr " [%5u] compensación: %<PRId64>, hijos: %s, etiqueta: %s\n"
 
-#: src/readelf.c:5161 src/readelf.c:5470 src/readelf.c:5637 src/readelf.c:6022
-#: src/readelf.c:6638 src/readelf.c:8375 src/readelf.c:9064 src/readelf.c:9537
-#: src/readelf.c:9788 src/readelf.c:9954 src/readelf.c:10341
-#: src/readelf.c:10401
+#: src/readelf.c:5167 src/readelf.c:5476 src/readelf.c:5643 src/readelf.c:6028
+#: src/readelf.c:6644 src/readelf.c:8399 src/readelf.c:9145 src/readelf.c:9618
+#: src/readelf.c:9869 src/readelf.c:10035 src/readelf.c:10422
+#: src/readelf.c:10482
 #, c-format
 msgid ""
 "\n"
@@ -5072,52 +5330,52 @@
 "\n"
 "Sección DWARF [%2zu] '%s' en compensación %#<PRIx64>:\n"
 
-#: src/readelf.c:5174
+#: src/readelf.c:5180
 #, fuzzy, c-format
 msgid "cannot get .debug_addr section data: %s"
 msgstr "no se pueden obtener datos de sección: %s"
 
-#: src/readelf.c:5274 src/readelf.c:5298 src/readelf.c:5682 src/readelf.c:9109
+#: src/readelf.c:5280 src/readelf.c:5304 src/readelf.c:5688 src/readelf.c:9190
 #, fuzzy, c-format
 msgid " Length:         %8<PRIu64>\n"
 msgstr " (compensación: %#<PRIx64>)"
 
-#: src/readelf.c:5276 src/readelf.c:5313 src/readelf.c:5695 src/readelf.c:9122
+#: src/readelf.c:5282 src/readelf.c:5319 src/readelf.c:5701 src/readelf.c:9203
 #, fuzzy, c-format
 msgid " DWARF version:  %8<PRIu16>\n"
 msgstr "      %s: %<PRId64>\n"
 
-#: src/readelf.c:5277 src/readelf.c:5322 src/readelf.c:5704 src/readelf.c:9131
+#: src/readelf.c:5283 src/readelf.c:5328 src/readelf.c:5710 src/readelf.c:9212
 #, fuzzy, c-format
 msgid " Address size:   %8<PRIu64>\n"
 msgstr " (fin de compensación: %#<PRIx64>)"
 
-#: src/readelf.c:5279 src/readelf.c:5332 src/readelf.c:5714 src/readelf.c:9141
+#: src/readelf.c:5285 src/readelf.c:5338 src/readelf.c:5720 src/readelf.c:9222
 #, fuzzy, c-format
 msgid " Segment size:   %8<PRIu64>\n"
 msgstr " establecer archivo a %<PRIu64>\n"
 
-#: src/readelf.c:5317 src/readelf.c:5699 src/readelf.c:9126 src/readelf.c:10533
+#: src/readelf.c:5323 src/readelf.c:5705 src/readelf.c:9207 src/readelf.c:10614
 #, fuzzy, c-format
 msgid "Unknown version"
 msgstr "versión desconocida"
 
-#: src/readelf.c:5327 src/readelf.c:5540 src/readelf.c:5709 src/readelf.c:9136
+#: src/readelf.c:5333 src/readelf.c:5546 src/readelf.c:5715 src/readelf.c:9217
 #, fuzzy, c-format
 msgid "unsupported address size"
 msgstr "no hay valor de dirección"
 
-#: src/readelf.c:5338 src/readelf.c:5551 src/readelf.c:5719 src/readelf.c:9146
+#: src/readelf.c:5344 src/readelf.c:5557 src/readelf.c:5725 src/readelf.c:9227
 #, c-format
 msgid "unsupported segment size"
 msgstr ""
 
-#: src/readelf.c:5391 src/readelf.c:5465
+#: src/readelf.c:5397 src/readelf.c:5471
 #, c-format
 msgid "cannot get .debug_aranges content: %s"
 msgstr "no se ha podido obtener contenido de .debug_aranges: %s"
 
-#: src/readelf.c:5406
+#: src/readelf.c:5412
 #, c-format
 msgid ""
 "\n"
@@ -5132,12 +5390,12 @@
 "\n"
 "Sección DWARF [%2zu] '%s' en compensación %#<PRIx64> contiene entradas %zu:\n"
 
-#: src/readelf.c:5437
+#: src/readelf.c:5443
 #, c-format
 msgid " [%*zu] ???\n"
 msgstr " [%*zu] ???\n"
 
-#: src/readelf.c:5439
+#: src/readelf.c:5445
 #, c-format
 msgid ""
 " [%*zu] start: %0#*<PRIx64>, length: %5<PRIu64>, CU DIE offset: %6<PRId64>\n"
@@ -5145,7 +5403,7 @@
 " Inicio [%*zu]: %0#*<PRIx64>, longitud: %5<PRIu64>, compensación CU DIE: "
 "%6<PRId64>\n"
 
-#: src/readelf.c:5483 src/readelf.c:8402
+#: src/readelf.c:5489 src/readelf.c:8426
 #, fuzzy, c-format
 msgid ""
 "\n"
@@ -5154,150 +5412,150 @@
 "\n"
 "Tabla en compensación %Zu:\n"
 
-#: src/readelf.c:5487 src/readelf.c:5663 src/readelf.c:6662 src/readelf.c:8413
-#: src/readelf.c:9090
+#: src/readelf.c:5493 src/readelf.c:5669 src/readelf.c:6668 src/readelf.c:8437
+#: src/readelf.c:9171
 #, c-format
 msgid "invalid data in section [%zu] '%s'"
 msgstr "Datos inválidos en sección [%zu] '%s'"
 
-#: src/readelf.c:5503
+#: src/readelf.c:5509
 #, fuzzy, c-format
 msgid ""
 "\n"
 " Length:        %6<PRIu64>\n"
 msgstr " (compensación: %#<PRIx64>)"
 
-#: src/readelf.c:5515
+#: src/readelf.c:5521
 #, fuzzy, c-format
 msgid " DWARF version: %6<PRIuFAST16>\n"
 msgstr "      %s: %<PRId64>\n"
 
-#: src/readelf.c:5519
+#: src/readelf.c:5525
 #, c-format
 msgid "unsupported aranges version"
 msgstr ""
 
-#: src/readelf.c:5530
+#: src/readelf.c:5536
 #, fuzzy, c-format
 msgid " CU offset:     %6<PRIx64>\n"
 msgstr " (compensación: %#<PRIx64>)"
 
-#: src/readelf.c:5536
+#: src/readelf.c:5542
 #, fuzzy, c-format
 msgid " Address size:  %6<PRIu64>\n"
 msgstr " (fin de compensación: %#<PRIx64>)"
 
-#: src/readelf.c:5547
+#: src/readelf.c:5553
 #, fuzzy, c-format
 msgid ""
 " Segment size:  %6<PRIu64>\n"
 "\n"
 msgstr " establecer archivo a %<PRIu64>\n"
 
-#: src/readelf.c:5602
+#: src/readelf.c:5608
 #, c-format
 msgid "   %zu padding bytes\n"
 msgstr ""
 
-#: src/readelf.c:5646
+#: src/readelf.c:5652
 #, fuzzy, c-format
 msgid "cannot get .debug_rnglists content: %s"
 msgstr "no se ha podido obtener contenido de .debug_ranges: %s"
 
-#: src/readelf.c:5669 src/readelf.c:9096
+#: src/readelf.c:5675 src/readelf.c:9177
 #, fuzzy, c-format
 msgid ""
 "Table at Offset 0x%<PRIx64>:\n"
 "\n"
 msgstr " (fin de compensación: %#<PRIx64>)"
 
-#: src/readelf.c:5724 src/readelf.c:9151
+#: src/readelf.c:5730 src/readelf.c:9232
 #, fuzzy, c-format
 msgid " Offset entries: %8<PRIu64>\n"
 msgstr " (compensación: %#<PRIx64>)"
 
-#: src/readelf.c:5740 src/readelf.c:9167
+#: src/readelf.c:5746 src/readelf.c:9248
 #, c-format
 msgid " Unknown CU base: "
 msgstr ""
 
-#: src/readelf.c:5742 src/readelf.c:9169
+#: src/readelf.c:5748 src/readelf.c:9250
 #, c-format
 msgid " CU [%6<PRIx64>] base: "
 msgstr ""
 
-#: src/readelf.c:5748 src/readelf.c:9175
+#: src/readelf.c:5754 src/readelf.c:9256
 #, c-format
 msgid " Not associated with a CU.\n"
 msgstr ""
 
-#: src/readelf.c:5759 src/readelf.c:9186
+#: src/readelf.c:5765 src/readelf.c:9267
 #, c-format
 msgid "too many offset entries for unit length"
 msgstr ""
 
-#: src/readelf.c:5763 src/readelf.c:9190
+#: src/readelf.c:5769 src/readelf.c:9271
 #, fuzzy, c-format
 msgid "  Offsets starting at 0x%<PRIx64>:\n"
 msgstr "  Propietario          Tamaño\n"
 
-#: src/readelf.c:5815
+#: src/readelf.c:5821
 #, fuzzy, c-format
 msgid "invalid range list data"
 msgstr "datos inválidos"
 
-#: src/readelf.c:6000 src/readelf.c:9515
+#: src/readelf.c:6006 src/readelf.c:9596
 #, c-format
 msgid ""
 "   %zu padding bytes\n"
 "\n"
 msgstr ""
 
-#: src/readelf.c:6017
+#: src/readelf.c:6023
 #, c-format
 msgid "cannot get .debug_ranges content: %s"
 msgstr "no se ha podido obtener contenido de .debug_ranges: %s"
 
-#: src/readelf.c:6053 src/readelf.c:9570
+#: src/readelf.c:6059 src/readelf.c:9651
 #, c-format
 msgid ""
 "\n"
 " Unknown CU base: "
 msgstr ""
 
-#: src/readelf.c:6055 src/readelf.c:9572
+#: src/readelf.c:6061 src/readelf.c:9653
 #, c-format
 msgid ""
 "\n"
 " CU [%6<PRIx64>] base: "
 msgstr ""
 
-#: src/readelf.c:6064 src/readelf.c:9598 src/readelf.c:9624
+#: src/readelf.c:6070 src/readelf.c:9679 src/readelf.c:9705
 #, c-format
 msgid " [%6tx]  <INVALID DATA>\n"
 msgstr " [%6tx]  <DATOS INVÁLIDOS>\n"
 
-#: src/readelf.c:6089 src/readelf.c:9708
+#: src/readelf.c:6095 src/readelf.c:9789
 #, fuzzy
 msgid "base address"
 msgstr "Establecer dirección a %s\n"
 
-#: src/readelf.c:6099 src/readelf.c:9718
+#: src/readelf.c:6105 src/readelf.c:9799
 #, fuzzy, c-format
 msgid " [%6tx] empty list\n"
 msgstr " [%6tx]  lista vacía\n"
 
-#: src/readelf.c:6359
+#: src/readelf.c:6365
 #, fuzzy
 msgid "         <INVALID DATA>\n"
 msgstr "   <DATOS INVÁLIDOS>\n"
 
-#: src/readelf.c:6616
+#: src/readelf.c:6622
 #, fuzzy, c-format
 msgid "cannot get ELF: %s"
 msgstr "no se puede leer encabezamiento ELF: %s"
 
-#: src/readelf.c:6634
+#: src/readelf.c:6640
 #, c-format
 msgid ""
 "\n"
@@ -5307,7 +5565,7 @@
 "Sección de información de marco de llamada [%2zu] '%s' en compensación "
 "%#<PRIx64>:\n"
 
-#: src/readelf.c:6684
+#: src/readelf.c:6690
 #, c-format
 msgid ""
 "\n"
@@ -5316,65 +5574,65 @@
 "\n"
 " [%6tx] Terminator cero\n"
 
-#: src/readelf.c:6785 src/readelf.c:6939
+#: src/readelf.c:6791 src/readelf.c:6945
 #, c-format
 msgid "invalid augmentation length"
 msgstr "longitud de aumento inválida"
 
-#: src/readelf.c:6800
+#: src/readelf.c:6806
 msgid "FDE address encoding: "
 msgstr "Codificación de dirección FDE:"
 
-#: src/readelf.c:6806
+#: src/readelf.c:6812
 msgid "LSDA pointer encoding: "
 msgstr "Codificación de puntero LSDA:"
 
-#: src/readelf.c:6916
+#: src/readelf.c:6922
 #, c-format
 msgid " (offset: %#<PRIx64>)"
 msgstr " (compensación: %#<PRIx64>)"
 
-#: src/readelf.c:6923
+#: src/readelf.c:6929
 #, c-format
 msgid " (end offset: %#<PRIx64>)"
 msgstr " (fin de compensación: %#<PRIx64>)"
 
-#: src/readelf.c:6960
+#: src/readelf.c:6966
 #, c-format
 msgid "   %-26sLSDA pointer: %#<PRIx64>\n"
 msgstr "Puntero   %-26sLSDA: %#<PRIx64>\n"
 
-#: src/readelf.c:7045
+#: src/readelf.c:7051
 #, fuzzy, c-format
 msgid "DIE [%<PRIx64>] cannot get attribute code: %s"
 msgstr "No se puede obtener código de atributo: %s"
 
-#: src/readelf.c:7055
+#: src/readelf.c:7061
 #, fuzzy, c-format
 msgid "DIE [%<PRIx64>] cannot get attribute form: %s"
 msgstr "No se puede obtener forma de atributo: %s"
 
-#: src/readelf.c:7077
+#: src/readelf.c:7083
 #, fuzzy, c-format
 msgid "DIE [%<PRIx64>] cannot get attribute '%s' (%s) value: %s"
 msgstr "No se puede obtener valor: %s"
 
-#: src/readelf.c:7407
+#: src/readelf.c:7413
 #, fuzzy, c-format
 msgid "invalid file (%<PRId64>): %s"
 msgstr "Archivo inválido"
 
-#: src/readelf.c:7411
+#: src/readelf.c:7417
 #, fuzzy, c-format
 msgid "no srcfiles for CU [%<PRIx64>]"
 msgstr " establecer archivo a %<PRIu64>\n"
 
-#: src/readelf.c:7415
+#: src/readelf.c:7421
 #, fuzzy, c-format
 msgid "couldn't get DWARF CU: %s"
 msgstr "no se puede leer encabezamiento ELF: %s"
 
-#: src/readelf.c:7728
+#: src/readelf.c:7736
 #, c-format
 msgid ""
 "\n"
@@ -5385,12 +5643,12 @@
 "Sección DWARF [%2zu] '%s' en compensación %#<PRIx64>:\n"
 " [Offset]\n"
 
-#: src/readelf.c:7778
+#: src/readelf.c:7786
 #, fuzzy, c-format
 msgid "cannot get next unit: %s"
 msgstr "No se puede obtener próximo DIE: %s"
 
-#: src/readelf.c:7797
+#: src/readelf.c:7806
 #, fuzzy, c-format
 msgid ""
 " Type unit at offset %<PRIu64>:\n"
@@ -5403,7 +5661,7 @@
 "Tamaño de dirección: %<PRIu8>, Tamaño de compensación: %<PRIu8>\n"
 " Tipo de firma: %#<PRIx64>, Tipo de compensación: %#<PRIx64>\n"
 
-#: src/readelf.c:7809
+#: src/readelf.c:7818
 #, c-format
 msgid ""
 " Compilation unit at offset %<PRIu64>:\n"
@@ -5414,39 +5672,39 @@
 " Versión: %<PRIu16>, Compensación de sección de abreviatura: %<PRIu64>,  "
 "Tamaño de dirección: %<PRIu8>, Tamaño de compensación: %<PRIu8>\n"
 
-#: src/readelf.c:7819 src/readelf.c:7982
+#: src/readelf.c:7828 src/readelf.c:7989
 #, c-format
 msgid " Unit type: %s (%<PRIu8>)"
 msgstr ""
 
-#: src/readelf.c:7846
+#: src/readelf.c:7855
 #, c-format
 msgid "unknown version (%d) or unit type (%d)"
 msgstr ""
 
-#: src/readelf.c:7875
+#: src/readelf.c:7884
 #, c-format
 msgid "cannot get DIE offset: %s"
 msgstr "no se puede obtener DIE en compensación: %s"
 
-#: src/readelf.c:7884
+#: src/readelf.c:7893
 #, fuzzy, c-format
 msgid "cannot get tag of DIE at offset [%<PRIx64>] in section '%s': %s"
 msgstr ""
 "no se ha podido obtener etiqueta de DIE en compensación%<PRIu64> en sección "
 "'%s': %s"
 
-#: src/readelf.c:7922
+#: src/readelf.c:7929
 #, c-format
 msgid "cannot get next DIE: %s\n"
 msgstr "No se puede obtener próximo DIE: %s\n"
 
-#: src/readelf.c:7930
+#: src/readelf.c:7937
 #, c-format
 msgid "cannot get next DIE: %s"
 msgstr "No se puede obtener próximo DIE: %s"
 
-#: src/readelf.c:7974
+#: src/readelf.c:7981
 #, fuzzy, c-format
 msgid ""
 " Split compilation unit at offset %<PRIu64>:\n"
@@ -5457,7 +5715,7 @@
 " Versión: %<PRIu16>, Compensación de sección de abreviatura: %<PRIu64>,  "
 "Tamaño de dirección: %<PRIu8>, Tamaño de compensación: %<PRIu8>\n"
 
-#: src/readelf.c:8026
+#: src/readelf.c:8033
 #, fuzzy, c-format
 msgid ""
 "\n"
@@ -5467,18 +5725,18 @@
 "\n"
 "Sección DWARF [%2zu] '%s' en compensación %#<PRIx64>:\n"
 
-#: src/readelf.c:8358
+#: src/readelf.c:8365
 #, fuzzy, c-format
 msgid "unknown form: %s"
 msgstr "Forma %<PRIx64> desconocida"
 
-#: src/readelf.c:8389
+#: src/readelf.c:8413
 #, c-format
 msgid "cannot get line data section data: %s"
 msgstr "No se puede obtener sección de datos de línea: %s"
 
 #. Print what we got so far.
-#: src/readelf.c:8491
+#: src/readelf.c:8517
 #, fuzzy, c-format
 msgid ""
 "\n"
@@ -5509,34 +5767,34 @@
 "\n"
 "Códigos operativos:\n"
 
-#: src/readelf.c:8513
+#: src/readelf.c:8539
 #, fuzzy, c-format
 msgid "cannot handle .debug_line version: %u\n"
 msgstr "no se puede obtener versión de símbolo: %s"
 
-#: src/readelf.c:8521
+#: src/readelf.c:8547
 #, fuzzy, c-format
 msgid "cannot handle address size: %u\n"
 msgstr "no hay valor de dirección"
 
-#: src/readelf.c:8529
+#: src/readelf.c:8555
 #, fuzzy, c-format
 msgid "cannot handle segment selector size: %u\n"
 msgstr "No se puede encontrar la sección: %s"
 
-#: src/readelf.c:8539
+#: src/readelf.c:8565
 #, c-format
 msgid "invalid data at offset %tu in section [%zu] '%s'"
 msgstr "datos inválidos en compensación %tu en sección [%zu] '%s'"
 
-#: src/readelf.c:8554
+#: src/readelf.c:8580
 #, c-format
 msgid "  [%*<PRIuFAST8>]  %hhu argument\n"
 msgid_plural "  [%*<PRIuFAST8>]  %hhu arguments\n"
 msgstr[0] "  [%*<PRIuFAST8>]  argumento %hhu \n"
 msgstr[1] "  [%*<PRIuFAST8>]  argumento %hhu\n"
 
-#: src/readelf.c:8565
+#: src/readelf.c:8591
 msgid ""
 "\n"
 "Directory table:"
@@ -5544,12 +5802,12 @@
 "\n"
 "Tabla de Directorio:"
 
-#: src/readelf.c:8571 src/readelf.c:8648
+#: src/readelf.c:8597 src/readelf.c:8674
 #, fuzzy, c-format
 msgid "      ["
 msgstr "      %s: %s\n"
 
-#: src/readelf.c:8642
+#: src/readelf.c:8668
 #, fuzzy
 msgid ""
 "\n"
@@ -5558,7 +5816,7 @@
 "\n"
 " Tabla de sitio de llamada:"
 
-#: src/readelf.c:8703
+#: src/readelf.c:8729
 #, fuzzy
 msgid " Entry Dir   Time      Size      Name"
 msgstr ""
@@ -5566,7 +5824,7 @@
 "Tabla de nombre de archivo:\n"
 " Directorio de entrada   Tiempo      Tamaño      Nombre"
 
-#: src/readelf.c:8742
+#: src/readelf.c:8775
 #, fuzzy
 msgid ""
 "\n"
@@ -5575,7 +5833,7 @@
 "\n"
 " Declaraciones de número de Línea:"
 
-#: src/readelf.c:8746
+#: src/readelf.c:8779
 msgid ""
 "\n"
 "Line number statements:"
@@ -5583,121 +5841,132 @@
 "\n"
 " Declaraciones de número de Línea:"
 
-#: src/readelf.c:8766
+#: src/readelf.c:8794
 #, fuzzy, c-format
 msgid "invalid maximum operations per instruction is zero"
 msgstr "longitud mínima inválida de tamaño de cadena coincidente"
 
-#: src/readelf.c:8800
+#: src/readelf.c:8828
 #, fuzzy, c-format
 msgid " special opcode %u: address+%u = "
 msgstr " opcode especial %u: dirección+%u = %s, línea%+d = %zu\n"
 
-#: src/readelf.c:8804
+#: src/readelf.c:8832
 #, fuzzy, c-format
 msgid ", op_index = %u, line%+d = %zu\n"
 msgstr ""
 " opcode especial %u: dirección+%u = %s,  op_index = %u, línea%+d = %zu\n"
 
-#: src/readelf.c:8807
+#: src/readelf.c:8835
 #, c-format
 msgid ", line%+d = %zu\n"
 msgstr ""
 
-#: src/readelf.c:8825
+#: src/readelf.c:8853
 #, c-format
 msgid " extended opcode %u: "
 msgstr "  Código operativo extendido %u: "
 
-#: src/readelf.c:8830
+#: src/readelf.c:8858
 #, fuzzy
 msgid " end of sequence"
 msgstr "Fin de secuencia"
 
-#: src/readelf.c:8848
+#: src/readelf.c:8876
 #, fuzzy, c-format
 msgid " set address to "
 msgstr "Establecer dirección a %s\n"
 
-#: src/readelf.c:8876
+#: src/readelf.c:8904
 #, fuzzy, c-format
 msgid " define new file: dir=%u, mtime=%<PRIu64>, length=%<PRIu64>, name=%s\n"
 msgstr ""
 "definir nuevo archivo: dir=%u, mtime=%<PRIu64>, longitud=%<PRIu64>, nombre="
 "%s\n"
 
-#: src/readelf.c:8890
+#: src/readelf.c:8918
 #, c-format
 msgid " set discriminator to %u\n"
 msgstr " establecer discriminador a %u\n"
 
+#: src/readelf.c:8945
+#, c-format
+msgid " set inlined context %u, function name %s (0x%x)\n"
+msgstr ""
+
+#: src/readelf.c:8969
+#, fuzzy, c-format
+#| msgid "Also show function names"
+msgid " set function name %s (0x%x)\n"
+msgstr "También mostrar nombres de función"
+
 #. Unknown, ignore it.
-#: src/readelf.c:8895
+#: src/readelf.c:8976
 #, fuzzy
 msgid " unknown opcode"
 msgstr "código operativo desconocido "
 
 #. Takes no argument.
-#: src/readelf.c:8907
+#: src/readelf.c:8988
 msgid " copy"
 msgstr "Copiar"
 
-#: src/readelf.c:8918
+#: src/readelf.c:8999
 #, fuzzy, c-format
 msgid " advance address by %u to "
 msgstr "Dirección de avance por %u a %s\n"
 
-#: src/readelf.c:8922 src/readelf.c:8983
+#: src/readelf.c:9003 src/readelf.c:9064
 #, c-format
 msgid ", op_index to %u"
 msgstr ""
 
-#: src/readelf.c:8934
+#: src/readelf.c:9015
 #, c-format
 msgid " advance line by constant %d to %<PRId64>\n"
 msgstr " línea de avance por la constante %d a %<PRId64>\n"
 
-#: src/readelf.c:8944
+#: src/readelf.c:9025
 #, c-format
 msgid " set file to %<PRIu64>\n"
 msgstr " establecer archivo a %<PRIu64>\n"
 
-#: src/readelf.c:8955
+#: src/readelf.c:9036
 #, c-format
 msgid " set column to %<PRIu64>\n"
 msgstr "  Establecer columna a %<PRIu64>\n"
 
-#: src/readelf.c:8962
+#: src/readelf.c:9043
 #, c-format
 msgid " set '%s' to %<PRIuFAST8>\n"
 msgstr "Establecer '%s' a %<PRIuFAST8>\n"
 
 #. Takes no argument.
-#: src/readelf.c:8968
+#: src/readelf.c:9049
 msgid " set basic block flag"
 msgstr "Establecer bandera de bloque básico"
 
-#: src/readelf.c:8979
+#: src/readelf.c:9060
 #, fuzzy, c-format
 msgid " advance address by constant %u to "
 msgstr "Dirección de avance por constante %u a %s\n"
 
-#: src/readelf.c:8999
+#: src/readelf.c:9080
 #, fuzzy, c-format
 msgid " advance address by fixed value %u to \n"
 msgstr "dirección de avance por valor corregido %u a %s\n"
 
 #. Takes no argument.
-#: src/readelf.c:9009
+#: src/readelf.c:9090
 msgid " set prologue end flag"
 msgstr " Establecer bandera prologue_end"
 
 #. Takes no argument.
-#: src/readelf.c:9014
+#: src/readelf.c:9095
 msgid " set epilogue begin flag"
 msgstr " Establecer bandera epilogue_begin"
 
-#: src/readelf.c:9024
+#: src/readelf.c:9105
 #, c-format
 msgid " set isa to %u\n"
 msgstr " establecer isa para %u\n"
@@ -5705,110 +5974,110 @@
 #. This is a new opcode the generator but not we know about.
 #. Read the parameters associated with it but then discard
 #. everything.  Read all the parameters for this opcode.
-#: src/readelf.c:9033
+#: src/readelf.c:9114
 #, c-format
 msgid " unknown opcode with %<PRIu8> parameter:"
 msgid_plural " unknown opcode with %<PRIu8> parameters:"
 msgstr[0] " opcódigo con parámetro %<PRIu8> desconocido:"
 msgstr[1] " opcódigo con parámetros %<PRIu8> desconocido:"
 
-#: src/readelf.c:9073
+#: src/readelf.c:9154
 #, fuzzy, c-format
 msgid "cannot get .debug_loclists content: %s"
 msgstr "no es posible obtener contenido de .debug_loc: %s"
 
-#: src/readelf.c:9239
+#: src/readelf.c:9320
 #, fuzzy, c-format
 msgid "    <INVALID DATA>\n"
 msgstr "   <DATOS INVÁLIDOS>\n"
 
-#: src/readelf.c:9279
+#: src/readelf.c:9360
 #, fuzzy, c-format
 msgid "invalid loclists data"
 msgstr "datos inválidos"
 
-#: src/readelf.c:9532
+#: src/readelf.c:9613
 #, c-format
 msgid "cannot get .debug_loc content: %s"
 msgstr "no es posible obtener contenido de .debug_loc: %s"
 
-#: src/readelf.c:9745 src/readelf.c:10789
+#: src/readelf.c:9826 src/readelf.c:10870
 msgid "   <INVALID DATA>\n"
 msgstr "   <DATOS INVÁLIDOS>\n"
 
-#: src/readelf.c:9800 src/readelf.c:9963
+#: src/readelf.c:9881 src/readelf.c:10044
 #, c-format
 msgid "cannot get macro information section data: %s"
 msgstr "no es posible obtener datos de la sección de macro información: %s"
 
-#: src/readelf.c:9880
+#: src/readelf.c:9961
 #, c-format
 msgid "%*s*** non-terminated string at end of section"
 msgstr "%*s*** cadena no finalizada al final de la sección"
 
-#: src/readelf.c:9903
+#: src/readelf.c:9984
 #, fuzzy, c-format
 msgid "%*s*** missing DW_MACINFO_start_file argument at end of section"
 msgstr "%*s*** cadena no finalizada al final de la sección"
 
-#: src/readelf.c:10004
+#: src/readelf.c:10085
 #, fuzzy, c-format
 msgid " Offset:             0x%<PRIx64>\n"
 msgstr "  Propietario          Tamaño\n"
 
-#: src/readelf.c:10016
+#: src/readelf.c:10097
 #, fuzzy, c-format
 msgid " Version:            %<PRIu16>\n"
 msgstr "      %s: %<PRId64>\n"
 
-#: src/readelf.c:10022 src/readelf.c:10909
+#: src/readelf.c:10103 src/readelf.c:10990
 #, c-format
 msgid "  unknown version, cannot parse section\n"
 msgstr ""
 
-#: src/readelf.c:10029
+#: src/readelf.c:10110
 #, fuzzy, c-format
 msgid " Flag:               0x%<PRIx8>"
 msgstr "  Dirección de punto de entrada:               %#<PRIx64>\n"
 
-#: src/readelf.c:10058
+#: src/readelf.c:10139
 #, fuzzy, c-format
 msgid " Offset length:      %<PRIu8>\n"
 msgstr " (compensación: %#<PRIx64>)"
 
-#: src/readelf.c:10066
+#: src/readelf.c:10147
 #, fuzzy, c-format
 msgid " .debug_line offset: 0x%<PRIx64>\n"
 msgstr " (fin de compensación: %#<PRIx64>)"
 
-#: src/readelf.c:10091
+#: src/readelf.c:10172
 #, fuzzy, c-format
 msgid "  extension opcode table, %<PRIu8> items:\n"
 msgstr " opcódigo con parámetro %<PRIu8> desconocido:"
 
-#: src/readelf.c:10098
+#: src/readelf.c:10179
 #, c-format
 msgid "    [%<PRIx8>]"
 msgstr ""
 
-#: src/readelf.c:10110
+#: src/readelf.c:10191
 #, fuzzy, c-format
 msgid " %<PRIu8> arguments:"
 msgstr "  [%*<PRIuFAST8>]  argumento %hhu \n"
 
-#: src/readelf.c:10125
+#: src/readelf.c:10206
 #, c-format
 msgid " no arguments."
 msgstr ""
 
-#: src/readelf.c:10326
+#: src/readelf.c:10407
 #, c-format
 msgid " [%5d] DIE offset: %6<PRId64>, CU DIE offset: %6<PRId64>, name: %s\n"
 msgstr ""
 " Compensación [%5d] DIE: %6<PRId64>, Compensación CU DIE: %6<PRId64>, "
 "nombre: %s\n"
 
-#: src/readelf.c:10370
+#: src/readelf.c:10451
 #, c-format
 msgid ""
 "\n"
@@ -5819,37 +6088,43 @@
 "Sección DWARF [%2zu] '%s' en compensación %#<PRIx64>:\n"
 " %*s  String\n"
 
-#: src/readelf.c:10385
+#. TRANS: the debugstr| prefix makes the string unique.
+#: src/readelf.c:10456
+msgctxt "debugstr"
+msgid "Offset"
+msgstr ""
+
+#: src/readelf.c:10466
 #, fuzzy, c-format
 msgid " *** error, missing string terminator\n"
 msgstr " *** error en lectura de cadenas: %s\n"
 
-#: src/readelf.c:10414
+#: src/readelf.c:10495
 #, fuzzy, c-format
 msgid "cannot get .debug_str_offsets section data: %s"
 msgstr "no se pueden obtener datos de sección: %s"
 
-#: src/readelf.c:10513
+#: src/readelf.c:10594
 #, fuzzy, c-format
 msgid " Length:        %8<PRIu64>\n"
 msgstr " (compensación: %#<PRIx64>)"
 
-#: src/readelf.c:10515
+#: src/readelf.c:10596
 #, fuzzy, c-format
 msgid " Offset size:   %8<PRIu8>\n"
 msgstr " (compensación: %#<PRIx64>)"
 
-#: src/readelf.c:10529
+#: src/readelf.c:10610
 #, fuzzy, c-format
 msgid " DWARF version: %8<PRIu16>\n"
 msgstr "      %s: %<PRId64>\n"
 
-#: src/readelf.c:10538
+#: src/readelf.c:10619
 #, fuzzy, c-format
 msgid " Padding:       %8<PRIx16>\n"
 msgstr " (compensación: %#<PRIx64>)"
 
-#: src/readelf.c:10592
+#: src/readelf.c:10673
 #, c-format
 msgid ""
 "\n"
@@ -5858,7 +6133,7 @@
 "\n"
 "Sección de tabla de búsqueda de marco de llamada [%2zu] '.eh_frame_hdr':\n"
 
-#: src/readelf.c:10694
+#: src/readelf.c:10775
 #, c-format
 msgid ""
 "\n"
@@ -5867,22 +6142,22 @@
 "\n"
 "Excepción en el manejo de la sección de tabla [%2zu] '.gcc_except_table':\n"
 
-#: src/readelf.c:10717
+#: src/readelf.c:10798
 #, c-format
 msgid " LPStart encoding:    %#x "
 msgstr "Codificación LPStart:    %#x "
 
-#: src/readelf.c:10729
+#: src/readelf.c:10810
 #, c-format
 msgid " TType encoding:      %#x "
 msgstr "Codificación TType:      %#x "
 
-#: src/readelf.c:10744
+#: src/readelf.c:10825
 #, c-format
 msgid " Call site encoding:  %#x "
 msgstr "Codificación de sitio de llamada:  %#x "
 
-#: src/readelf.c:10757
+#: src/readelf.c:10838
 msgid ""
 "\n"
 " Call site table:"
@@ -5890,7 +6165,7 @@
 "\n"
 " Tabla de sitio de llamada:"
 
-#: src/readelf.c:10771
+#: src/readelf.c:10852
 #, c-format
 msgid ""
 " [%4u] Call site start:   %#<PRIx64>\n"
@@ -5903,12 +6178,12 @@
 "        Landing pad:       %#<PRIx64>\n"
 "        Action:            %u\n"
 
-#: src/readelf.c:10844
+#: src/readelf.c:10925
 #, c-format
 msgid "invalid TType encoding"
 msgstr "Codificación TType inválida"
 
-#: src/readelf.c:10871
+#: src/readelf.c:10952
 #, fuzzy, c-format
 msgid ""
 "\n"
@@ -5917,37 +6192,37 @@
 "\n"
 "Sección DWARF [%2zu] '%s' en compensación %#<PRIx64> contiene entrada %zu:\n"
 
-#: src/readelf.c:10900
+#: src/readelf.c:10981
 #, fuzzy, c-format
 msgid " Version:         %<PRId32>\n"
 msgstr "      %s: %<PRId64>\n"
 
-#: src/readelf.c:10918
+#: src/readelf.c:10999
 #, fuzzy, c-format
 msgid " CU offset:       %#<PRIx32>\n"
 msgstr " (compensación: %#<PRIx64>)"
 
-#: src/readelf.c:10925
+#: src/readelf.c:11006
 #, fuzzy, c-format
 msgid " TU offset:       %#<PRIx32>\n"
 msgstr " (compensación: %#<PRIx64>)"
 
-#: src/readelf.c:10932
+#: src/readelf.c:11013
 #, fuzzy, c-format
 msgid " address offset:  %#<PRIx32>\n"
 msgstr " (fin de compensación: %#<PRIx64>)"
 
-#: src/readelf.c:10939
+#: src/readelf.c:11020
 #, fuzzy, c-format
 msgid " symbol offset:   %#<PRIx32>\n"
 msgstr " (compensación: %#<PRIx64>)"
 
-#: src/readelf.c:10946
+#: src/readelf.c:11027
 #, fuzzy, c-format
 msgid " constant offset: %#<PRIx32>\n"
 msgstr " (fin de compensación: %#<PRIx64>)"
 
-#: src/readelf.c:10960
+#: src/readelf.c:11041
 #, fuzzy, c-format
 msgid ""
 "\n"
@@ -5956,7 +6231,7 @@
 "\n"
 "Sección DWARF [%2zu] '%s' en compensación %#<PRIx64> contiene entrada %zu:\n"
 
-#: src/readelf.c:10985
+#: src/readelf.c:11066
 #, fuzzy, c-format
 msgid ""
 "\n"
@@ -5965,7 +6240,7 @@
 "\n"
 "Sección DWARF [%2zu] '%s' en compensación %#<PRIx64> contiene entrada %zu:\n"
 
-#: src/readelf.c:11014
+#: src/readelf.c:11095
 #, fuzzy, c-format
 msgid ""
 "\n"
@@ -5974,7 +6249,7 @@
 "\n"
 "Sección DWARF [%2zu] '%s' en compensación %#<PRIx64> contiene entrada %zu:\n"
 
-#: src/readelf.c:11046
+#: src/readelf.c:11127
 #, fuzzy, c-format
 msgid ""
 "\n"
@@ -5983,18 +6258,18 @@
 "\n"
 "Tabla de símbolos inválida en compensación %#0<PRIx64>\n"
 
-#: src/readelf.c:11184
+#: src/readelf.c:11265
 #, c-format
 msgid "cannot get debug context descriptor: %s"
 msgstr "no se puede depurar descriptor de contexto: %s"
 
-#: src/readelf.c:11552 src/readelf.c:12179 src/readelf.c:12290
-#: src/readelf.c:12348
+#: src/readelf.c:11633 src/readelf.c:12260 src/readelf.c:12371
+#: src/readelf.c:12429
 #, c-format
 msgid "cannot convert core note data: %s"
 msgstr "no es posible convertir datos de la nota principal: %s"
 
-#: src/readelf.c:11915
+#: src/readelf.c:11996
 #, c-format
 msgid ""
 "\n"
@@ -6003,21 +6278,21 @@
 "\n"
 "%*s... <repeats %u more times> ..."
 
-#: src/readelf.c:12427
+#: src/readelf.c:12508
 msgid "  Owner          Data size  Type\n"
 msgstr "  Owner          Data size  Type\n"
 
-#: src/readelf.c:12456
+#: src/readelf.c:12536
 #, c-format
 msgid "  %-13.*s  %9<PRId32>  %s\n"
 msgstr "  %-13.*s  %9<PRId32>  %s\n"
 
-#: src/readelf.c:12508
+#: src/readelf.c:12588
 #, fuzzy, c-format
 msgid "cannot get content of note: %s"
 msgstr "no se puede obtener el contenido de sección de nota: %s"
 
-#: src/readelf.c:12542
+#: src/readelf.c:12622
 #, c-format
 msgid ""
 "\n"
@@ -6026,7 +6301,7 @@
 "\n"
 "Sección de nota [%2zu] '%s' de %<PRIu64> bytes en compensación %#0<PRIx64>:\n"
 
-#: src/readelf.c:12565
+#: src/readelf.c:12645
 #, c-format
 msgid ""
 "\n"
@@ -6035,7 +6310,7 @@
 "\n"
 "Segmento de nota de %<PRIu64> bytes en compensación %#0<PRIx64>:\n"
 
-#: src/readelf.c:12612
+#: src/readelf.c:12692
 #, fuzzy, c-format
 msgid ""
 "\n"
@@ -6044,12 +6319,12 @@
 "\n"
 "Sección [%Zu] '%s' no tiene datos para volcar.\n"
 
-#: src/readelf.c:12639 src/readelf.c:12690
+#: src/readelf.c:12719 src/readelf.c:12770
 #, fuzzy, c-format
 msgid "cannot get data for section [%zu] '%s': %s"
 msgstr "no se pueden obtener datos para sección [%Zu] '%s': %s"
 
-#: src/readelf.c:12644
+#: src/readelf.c:12724
 #, fuzzy, c-format
 msgid ""
 "\n"
@@ -6059,7 +6334,7 @@
 "Volcado Hex de sección [%Zu] '%s', %<PRIu64> bytes en compensación "
 "%#0<PRIx64>:\n"
 
-#: src/readelf.c:12649
+#: src/readelf.c:12729
 #, fuzzy, c-format
 msgid ""
 "\n"
@@ -6070,7 +6345,7 @@
 "Volcado Hex de sección [%Zu] '%s', %<PRIu64> bytes en compensación "
 "%#0<PRIx64>:\n"
 
-#: src/readelf.c:12663
+#: src/readelf.c:12743
 #, fuzzy, c-format
 msgid ""
 "\n"
@@ -6079,7 +6354,7 @@
 "\n"
 "Sección [%Zu] '%s' no tiene datos para volcar.\n"
 
-#: src/readelf.c:12695
+#: src/readelf.c:12775
 #, fuzzy, c-format
 msgid ""
 "\n"
@@ -6089,7 +6364,7 @@
 "Sección de cadena [%Zu] '%s' contiene %<PRIu64> bytes en compensación "
 "%#0<PRIx64>:\n"
 
-#: src/readelf.c:12700
+#: src/readelf.c:12780
 #, fuzzy, c-format
 msgid ""
 "\n"
@@ -6100,7 +6375,7 @@
 "Sección de cadena [%Zu] '%s' contiene %<PRIu64> bytes en compensación "
 "%#0<PRIx64>:\n"
 
-#: src/readelf.c:12749
+#: src/readelf.c:12829
 #, c-format
 msgid ""
 "\n"
@@ -6109,7 +6384,7 @@
 "\n"
 "sección [%lu] no existe"
 
-#: src/readelf.c:12779
+#: src/readelf.c:12859
 #, c-format
 msgid ""
 "\n"
@@ -6118,12 +6393,12 @@
 "\n"
 "sección '%s' no existe"
 
-#: src/readelf.c:12836
+#: src/readelf.c:12916
 #, c-format
 msgid "cannot get symbol index of archive '%s': %s"
 msgstr "no se puede obtener el índice de símbolo de archivo '%s': %s"
 
-#: src/readelf.c:12839
+#: src/readelf.c:12919
 #, c-format
 msgid ""
 "\n"
@@ -6132,7 +6407,7 @@
 "\n"
 "Archivo '%s' no tiene índice de símbolo\n"
 
-#: src/readelf.c:12843
+#: src/readelf.c:12923
 #, fuzzy, c-format
 msgid ""
 "\n"
@@ -6141,12 +6416,12 @@
 "\n"
 "Índice de archivo '%s' tiene %Zu entradas:\n"
 
-#: src/readelf.c:12861
+#: src/readelf.c:12941
 #, fuzzy, c-format
 msgid "cannot extract member at offset %zu in '%s': %s"
 msgstr "no es posible extraer miembro en compensación %Zu en '%s': %s"
 
-#: src/readelf.c:12866
+#: src/readelf.c:12946
 #, c-format
 msgid "Archive member '%s' contains:\n"
 msgstr "Miembro de archivo contiene '%s':\n"
@@ -6213,11 +6488,63 @@
 msgid "%s: file format not recognized"
 msgstr "%s: No se reconoce el formato del fichero"
 
+#: src/size.c:328
+msgctxt "bsd"
+msgid "text"
+msgstr ""
+
+#: src/size.c:329
+msgctxt "bsd"
+msgid "data"
+msgstr ""
+
+#: src/size.c:330
+msgctxt "bsd"
+msgid "bss"
+msgstr ""
+
+#: src/size.c:331
+msgctxt "bsd"
+msgid "dec"
+msgstr ""
+
+#: src/size.c:332
+msgctxt "bsd"
+msgid "hex"
+msgstr ""
+
+#: src/size.c:333
+msgctxt "bsd"
+msgid "filename"
+msgstr ""
+
 #: src/size.c:418 src/size.c:560
 #, c-format
 msgid " (ex %s)"
 msgstr " (ex %s)"
 
+#: src/size.c:420
+#, fuzzy
+#| msgid "invalid section"
+msgctxt "sysv"
+msgid "section"
+msgstr "sección inválida"
+
+#: src/size.c:421
+msgctxt "sysv"
+msgid "size"
+msgstr ""
+
+#: src/size.c:422
+msgctxt "sysv"
+msgid "addr"
+msgstr ""
+
+#: src/size.c:451 src/size.c:454 src/size.c:457
+msgctxt "sysv"
+msgid "Total"
+msgstr ""
+
 #: src/size.c:482
 #, fuzzy, c-format
 msgid "cannot get section header"
@@ -6509,17 +6836,17 @@
 msgid "bad relocation"
 msgstr "Mostrar reubicaciones"
 
-#: src/strip.c:747 src/strip.c:771
+#: src/strip.c:751 src/strip.c:775
 #, c-format
 msgid "cannot stat input file '%s'"
 msgstr "no sepuede stat fichero de entrada '%s'"
 
-#: src/strip.c:761
+#: src/strip.c:765
 #, c-format
 msgid "while opening '%s'"
 msgstr "mientras se abría '%s'"
 
-#: src/strip.c:799
+#: src/strip.c:803
 #, c-format
 msgid "%s: cannot use -o or -f when stripping archive"
 msgstr "%s: no puede utilizarse -o o -f cuando se extrae un archivo"
@@ -6530,132 +6857,132 @@
 #. result = handle_ar (fd, elf, NULL, fname,
 #. preserve_dates ? tv : NULL);
 #.
-#: src/strip.c:811
+#: src/strip.c:815
 #, fuzzy, c-format
 msgid "%s: no support for stripping archive"
 msgstr "%s: no puede utilizarse -o o -f cuando se extrae un archivo"
 
-#: src/strip.c:1047
+#: src/strip.c:1052
 #, c-format
 msgid "cannot open EBL backend"
 msgstr "No se puede abrir el segundo plano EBL"
 
-#: src/strip.c:1092
+#: src/strip.c:1097
 #, fuzzy, c-format
 msgid "cannot get number of phdrs"
 msgstr "no se pudo determinar la cantidad de encabezados de programa: %s"
 
-#: src/strip.c:1106 src/strip.c:1149
+#: src/strip.c:1111 src/strip.c:1154
 #, fuzzy, c-format
 msgid "cannot create new ehdr for file '%s': %s"
 msgstr "no se puede crear fichero nuevo '%s': %s"
 
-#: src/strip.c:1116 src/strip.c:1159
+#: src/strip.c:1121 src/strip.c:1164
 #, fuzzy, c-format
 msgid "cannot create new phdr for file '%s': %s"
 msgstr "no se puede crear fichero nuevo '%s': %s"
 
-#: src/strip.c:1240
+#: src/strip.c:1244
 #, c-format
 msgid "illformed file '%s'"
 msgstr "Fichero illformed '%s'"
 
-#: src/strip.c:1250
+#: src/strip.c:1254
 #, fuzzy, c-format
 msgid "Cannot remove allocated section '%s'"
 msgstr "No se puede asignar sección PLT: %s"
 
-#: src/strip.c:1259
+#: src/strip.c:1263
 #, fuzzy, c-format
 msgid "Cannot both keep and remove section '%s'"
 msgstr "No se puede añadir nueva sección: %s"
 
-#: src/strip.c:1624 src/strip.c:1739
+#: src/strip.c:1628 src/strip.c:1743
 #, c-format
 msgid "while generating output file: %s"
 msgstr "al generar fichero de salida: %s"
 
-#: src/strip.c:1688
+#: src/strip.c:1692
 #, fuzzy, c-format
 msgid "%s: error while updating ELF header: %s"
 msgstr "%s: error al crear encabezamiento ELF: %s"
 
-#: src/strip.c:1697
+#: src/strip.c:1701
 #, fuzzy, c-format
 msgid "%s: error while getting shdrstrndx: %s"
 msgstr "%s: error al crear encabezamiento ELF: %s"
 
-#: src/strip.c:1705 src/strip.c:2550
+#: src/strip.c:1709 src/strip.c:2554
 #, fuzzy, c-format
 msgid "%s: error updating shdrstrndx: %s"
 msgstr "%s: error al crear encabezamiento ELF: %s"
 
-#: src/strip.c:1722
+#: src/strip.c:1726
 #, c-format
 msgid "while preparing output for '%s'"
 msgstr "al preparar salida para '%s'"
 
-#: src/strip.c:1784 src/strip.c:1847
+#: src/strip.c:1788 src/strip.c:1851
 #, c-format
 msgid "while create section header section: %s"
 msgstr "al crear sección de encabezamiento de sección: %s"
 
-#: src/strip.c:1793
+#: src/strip.c:1797
 #, c-format
 msgid "cannot allocate section data: %s"
 msgstr "no se puede asignar espacio para los datos: %s"
 
-#: src/strip.c:1859
+#: src/strip.c:1863
 #, c-format
 msgid "while create section header string table: %s"
 msgstr "al crear tabla de cadenas de encabezamiento de sección: %s"
 
-#: src/strip.c:1866
+#: src/strip.c:1870
 #, fuzzy, c-format
 msgid "no memory to create section header string table"
 msgstr "al crear tabla de cadenas de encabezamiento de sección: %s"
 
-#: src/strip.c:2079
+#: src/strip.c:2083
 #, c-format
 msgid "Cannot remove symbol [%zd] from allocated symbol table [%zd]"
 msgstr ""
 
-#: src/strip.c:2466 src/strip.c:2574
+#: src/strip.c:2470 src/strip.c:2578
 #, c-format
 msgid "while writing '%s': %s"
 msgstr "al escribir '%s': %s"
 
-#: src/strip.c:2477
+#: src/strip.c:2481
 #, c-format
 msgid "while creating '%s'"
 msgstr "al crear '%s'"
 
-#: src/strip.c:2500
+#: src/strip.c:2504
 #, c-format
 msgid "while computing checksum for debug information"
 msgstr "al computar la suma de verificación para información de depuración"
 
-#: src/strip.c:2541
+#: src/strip.c:2545
 #, c-format
 msgid "%s: error while creating ELF header: %s"
 msgstr "%s: error al crear encabezamiento ELF: %s"
 
-#: src/strip.c:2559
+#: src/strip.c:2563
 #, c-format
 msgid "%s: error while reading the file: %s"
 msgstr "%s: error al leer el fichero: %s"
 
-#: src/strip.c:2599 src/strip.c:2619
+#: src/strip.c:2603 src/strip.c:2623
 #, c-format
 msgid "while writing '%s'"
 msgstr "al escribir '%s'"
 
-#: src/strip.c:2656 src/strip.c:2663
+#: src/strip.c:2660 src/strip.c:2667
 #, c-format
 msgid "error while finishing '%s': %s"
 msgstr "Error al terminar '%s': %s"
 
-#: src/strip.c:2680 src/strip.c:2756
+#: src/strip.c:2684 src/strip.c:2760
 #, c-format
 msgid "cannot set access and modification date of '%s'"
 msgstr "no es posible establecer acceso y fecha de modificación de '%s'"
@@ -6743,7 +7070,7 @@
 msgid "cannot get shdrstrndx:%s"
 msgstr "No se puede encontrar la sección: %s"
 
-#: src/unstrip.c:244 src/unstrip.c:2085
+#: src/unstrip.c:244 src/unstrip.c:2088
 #, c-format
 msgid "cannot get ELF header: %s"
 msgstr "no se puede leer encabezamiento ELF: %s"
@@ -6763,12 +7090,12 @@
 msgid "cannot copy ELF header: %s"
 msgstr "no se puede copiar encabezamiento ELF: %s"
 
-#: src/unstrip.c:265 src/unstrip.c:2103 src/unstrip.c:2146
+#: src/unstrip.c:265 src/unstrip.c:2106 src/unstrip.c:2149
 #, fuzzy, c-format
 msgid "cannot get number of program headers: %s"
 msgstr "no se pudo determinar la cantidad de encabezados de programa: %s"
 
-#: src/unstrip.c:270 src/unstrip.c:2107
+#: src/unstrip.c:270 src/unstrip.c:2110
 #, c-format
 msgid "cannot create program headers: %s"
 msgstr "No pueden crear encabezamientos de programa: %s"
@@ -6783,12 +7110,12 @@
 msgid "cannot copy section header: %s"
 msgstr "no se puede copiar encabezamiento de sección: %s"
 
-#: src/unstrip.c:289 src/unstrip.c:1707
+#: src/unstrip.c:289 src/unstrip.c:1710
 #, c-format
 msgid "cannot get section data: %s"
 msgstr "no se pueden obtener datos de sección: %s"
 
-#: src/unstrip.c:291 src/unstrip.c:1709
+#: src/unstrip.c:291 src/unstrip.c:1712
 #, c-format
 msgid "cannot copy section data: %s"
 msgstr "no pueden copiar datos de sección: %s"
@@ -6798,14 +7125,14 @@
 msgid "cannot create directory '%s'"
 msgstr "no se puede crear el directorio '%s'"
 
-#: src/unstrip.c:393 src/unstrip.c:655 src/unstrip.c:689 src/unstrip.c:857
-#: src/unstrip.c:1749
+#: src/unstrip.c:393 src/unstrip.c:659 src/unstrip.c:693 src/unstrip.c:861
+#: src/unstrip.c:1752
 #, c-format
 msgid "cannot get symbol table entry: %s"
 msgstr "no se puede obtener entrada de tabla de símbolos: %s"
 
-#: src/unstrip.c:409 src/unstrip.c:658 src/unstrip.c:679 src/unstrip.c:692
-#: src/unstrip.c:1770 src/unstrip.c:1965 src/unstrip.c:1989
+#: src/unstrip.c:409 src/unstrip.c:662 src/unstrip.c:683 src/unstrip.c:696
+#: src/unstrip.c:1773 src/unstrip.c:1968 src/unstrip.c:1992
 #, c-format
 msgid "cannot update symbol table: %s"
 msgstr "no se puede actualizar tabla de símbolos: %s"
@@ -6815,170 +7142,180 @@
 msgid "cannot update section header: %s"
 msgstr "no se puede actualizar encabezamiento de sección: %s"
 
-#: src/unstrip.c:465 src/unstrip.c:479
+#: src/unstrip.c:465
+#, c-format
+msgid "gelf_getrel failed: %s"
+msgstr ""
+
+#: src/unstrip.c:468 src/unstrip.c:483
 #, c-format
 msgid "cannot update relocation: %s"
 msgstr "no se puede actualizar reubicación: %s"
 
-#: src/unstrip.c:578
+#: src/unstrip.c:480
+#, c-format
+msgid "gelf_getrela failed: %s"
+msgstr ""
+
+#: src/unstrip.c:582
 #, c-format
 msgid "cannot get symbol version: %s"
 msgstr "no se puede obtener versión de símbolo: %s"
 
-#: src/unstrip.c:591
+#: src/unstrip.c:595
 #, fuzzy, c-format
 msgid "unexpected section type in [%zu] with sh_link to symtab"
 msgstr "tipo de sección inesperado en [%Zu] con sh_link para symtab"
 
-#: src/unstrip.c:846
+#: src/unstrip.c:850
 #, fuzzy, c-format
 msgid "cannot get symbol section data: %s"
 msgstr "no se pueden obtener datos de sección: %s"
 
-#: src/unstrip.c:848
+#: src/unstrip.c:852
 #, fuzzy, c-format
 msgid "cannot get string section data: %s"
 msgstr "no se pueden obtener datos de sección: %s"
 
-#: src/unstrip.c:865
+#: src/unstrip.c:869
 #, fuzzy, c-format
 msgid "invalid string offset in symbol [%zu]"
 msgstr "compensación de cadena inválida en símbolo [%Zu]"
 
-#: src/unstrip.c:1023 src/unstrip.c:1427
+#: src/unstrip.c:1027 src/unstrip.c:1435
 #, fuzzy, c-format
 msgid "cannot read section [%zu] name: %s"
 msgstr "no se puede leer nombre [%Zu]: %s"
 
-#: src/unstrip.c:1038
+#: src/unstrip.c:1042
 #, fuzzy, c-format
 msgid "bad sh_link for group section: %s"
 msgstr ".debug_line section inválida"
 
-#: src/unstrip.c:1044
+#: src/unstrip.c:1048
 #, fuzzy, c-format
 msgid "couldn't get shdr for group section: %s"
 msgstr "No se puede obtener encabezamiento de sección 0th: %s"
 
-#: src/unstrip.c:1049
+#: src/unstrip.c:1053
 #, fuzzy, c-format
 msgid "bad data for group symbol section: %s"
 msgstr "no se puede obtener sección para símbolos\n"
 
-#: src/unstrip.c:1055
+#: src/unstrip.c:1059
 #, fuzzy, c-format
 msgid "couldn't get symbol for group section: %s"
 msgstr "no se puede obtener versión de símbolo: %s"
 
-#: src/unstrip.c:1060
+#: src/unstrip.c:1064
 #, fuzzy, c-format
 msgid "bad symbol name for group section: %s"
 msgstr "No se puede obtener el encabezamiento de sección %zu: %s"
 
-#: src/unstrip.c:1102 src/unstrip.c:1121 src/unstrip.c:1159
-#, c-format
-msgid "cannot read '.gnu.prelink_undo' section: %s"
-msgstr "no se puede leer sección '.gnu.prelink_undo': %s"
-
-#: src/unstrip.c:1139
-#, c-format
-msgid "overflow with shnum = %zu in '%s' section"
-msgstr ""
-
-#: src/unstrip.c:1150
-#, c-format
-msgid "invalid contents in '%s' section"
-msgstr "contenido inválido en sección '%s'"
-
-#: src/unstrip.c:1206 src/unstrip.c:1553
+#: src/unstrip.c:1075 src/unstrip.c:1556
 #, fuzzy, c-format
 msgid "cannot find matching section for [%zu] '%s'"
 msgstr "no se puede hallar sección coincidente para [%Zu] '%s'"
 
-#: src/unstrip.c:1331 src/unstrip.c:1347 src/unstrip.c:1633 src/unstrip.c:1924
+#: src/unstrip.c:1120 src/unstrip.c:1139 src/unstrip.c:1177
+#, c-format
+msgid "cannot read '.gnu.prelink_undo' section: %s"
+msgstr "no se puede leer sección '.gnu.prelink_undo': %s"
+
+#: src/unstrip.c:1157
+#, c-format
+msgid "overflow with shnum = %zu in '%s' section"
+msgstr ""
+
+#: src/unstrip.c:1168
+#, c-format
+msgid "invalid contents in '%s' section"
+msgstr "contenido inválido en sección '%s'"
+
+#: src/unstrip.c:1339 src/unstrip.c:1355 src/unstrip.c:1636 src/unstrip.c:1927
 #, c-format
 msgid "cannot add section name to string table: %s"
 msgstr "no se puede añadir nombre de sección a tabla de cadenas: %s"
 
-#: src/unstrip.c:1356
+#: src/unstrip.c:1364
 #, c-format
 msgid "cannot update section header string table data: %s"
 msgstr ""
 "no se pueden actualizar datos de tabla de cadenas de encabezamiento de "
 "sección: %s"
 
-#: src/unstrip.c:1385 src/unstrip.c:1389
+#: src/unstrip.c:1393 src/unstrip.c:1397
 #, c-format
 msgid "cannot get section header string table section index: %s"
 msgstr ""
 "no se puede obtener índice de sección de tabla de cadenas de encabezamiento "
 "de sección: %s"
 
-#: src/unstrip.c:1393 src/unstrip.c:1397 src/unstrip.c:1648
+#: src/unstrip.c:1401 src/unstrip.c:1405 src/unstrip.c:1651
 #, c-format
 msgid "cannot get section count: %s"
 msgstr "No se puede obtener cuenta de sección: %s"
 
-#: src/unstrip.c:1400
+#: src/unstrip.c:1408
 #, c-format
 msgid "more sections in stripped file than debug file -- arguments reversed?"
 msgstr ""
 "más secciones en el archivo despojado que en el archivo de depuración -- "
 "¿argumentos invertidos?"
 
-#: src/unstrip.c:1404
+#: src/unstrip.c:1412
 #, c-format
 msgid "no sections in stripped file"
 msgstr ""
 
-#: src/unstrip.c:1475 src/unstrip.c:1568
+#: src/unstrip.c:1460 src/unstrip.c:1571
 #, c-format
 msgid "cannot read section header string table: %s"
 msgstr "no se puede obtener tabla de cadenas de encabezamiento de sección: %s"
 
-#: src/unstrip.c:1627
+#: src/unstrip.c:1630
 #, c-format
 msgid "cannot add new section: %s"
 msgstr "No se puede añadir nueva sección: %s"
 
-#: src/unstrip.c:1757
+#: src/unstrip.c:1760
 #, fuzzy, c-format
 msgid "symbol [%zu] has invalid section index"
 msgstr "símbolo [%Zu] tiene índice de sección inválido"
 
-#: src/unstrip.c:1789
+#: src/unstrip.c:1792
 #, fuzzy, c-format
 msgid "group has invalid section index [%zd]"
 msgstr "símbolo [%Zu] tiene índice de sección inválido"
 
-#: src/unstrip.c:2064
+#: src/unstrip.c:2067
 #, c-format
 msgid "cannot read section data: %s"
 msgstr "no se puede leer la sección de datos: %s"
 
-#: src/unstrip.c:2093
+#: src/unstrip.c:2096
 #, c-format
 msgid "cannot update ELF header: %s"
 msgstr "No se puede actualizar encabezamiento ELF: %s"
 
-#: src/unstrip.c:2117
+#: src/unstrip.c:2120
 #, c-format
 msgid "cannot update program header: %s"
 msgstr "no se puede actualizar encabezamiento de programa: %s"
 
-#: src/unstrip.c:2122 src/unstrip.c:2205
+#: src/unstrip.c:2125 src/unstrip.c:2208
 #, c-format
 msgid "cannot write output file: %s"
 msgstr "no se puede escribir al archivo de salida: %s"
 
-#: src/unstrip.c:2173
+#: src/unstrip.c:2176
 #, c-format
 msgid "DWARF data not adjusted for prelinking bias; consider prelink -u"
 msgstr ""
 "datos DWARF no se ajustan para polarización de pre-enlace; considere prelink "
 "-u"
 
-#: src/unstrip.c:2176
+#: src/unstrip.c:2179
 #, c-format
 msgid ""
 "DWARF data in '%s' not adjusted for prelinking bias; consider prelink -u"
@@ -6986,77 +7323,77 @@
 "Datos DWARF en '%s' no se ajustan a polarización de pre-enlace; considere "
 "prelink -u"
 
-#: src/unstrip.c:2196 src/unstrip.c:2247 src/unstrip.c:2259 src/unstrip.c:2345
+#: src/unstrip.c:2199 src/unstrip.c:2251 src/unstrip.c:2263 src/unstrip.c:2353
 #, c-format
 msgid "cannot create ELF descriptor: %s"
 msgstr "no se puede crear un descriptor ELF: %s"
 
-#: src/unstrip.c:2238
+#: src/unstrip.c:2237
 msgid "WARNING: "
 msgstr ""
 
-#: src/unstrip.c:2240
+#: src/unstrip.c:2239
 msgid ", use --force"
 msgstr ""
 
-#: src/unstrip.c:2263
+#: src/unstrip.c:2267
 msgid "ELF header identification (e_ident) different"
 msgstr ""
 
-#: src/unstrip.c:2266
+#: src/unstrip.c:2271
 msgid "ELF header type (e_type) different"
 msgstr ""
 
-#: src/unstrip.c:2269
+#: src/unstrip.c:2275
 msgid "ELF header machine type (e_machine) different"
 msgstr ""
 
-#: src/unstrip.c:2272
+#: src/unstrip.c:2279
 msgid "stripped program header (e_phnum) smaller than unstripped"
 msgstr ""
 
-#: src/unstrip.c:2302
+#: src/unstrip.c:2310
 #, c-format
 msgid "cannot find stripped file for module '%s': %s"
 msgstr "no se puede hallar archivo obtenido para módulo '%s': %s "
 
-#: src/unstrip.c:2306
+#: src/unstrip.c:2314
 #, c-format
 msgid "cannot open stripped file '%s' for module '%s': %s"
 msgstr "No se puede abrir el archivo '%s' obtenido para módulo '%s': %s"
 
-#: src/unstrip.c:2321
+#: src/unstrip.c:2329
 #, c-format
 msgid "cannot find debug file for module '%s': %s"
 msgstr "no puede hallar archivo de depuración para módulo '%s': %su"
 
-#: src/unstrip.c:2325
+#: src/unstrip.c:2333
 #, c-format
 msgid "cannot open debug file '%s' for module '%s': %s"
 msgstr "No puede abrir archivo de depuración '%s' para módulo '%s': %s"
 
-#: src/unstrip.c:2338
+#: src/unstrip.c:2346
 #, c-format
 msgid "module '%s' file '%s' is not stripped"
 msgstr "No se obtuvo el archivo '%s' de módulo '%s' "
 
-#: src/unstrip.c:2369
+#: src/unstrip.c:2377
 #, c-format
 msgid "cannot cache section addresses for module '%s': %s"
 msgstr ""
 "No puede almacenar en cache direcciones de sección para módulo '%s': %s"
 
-#: src/unstrip.c:2501
+#: src/unstrip.c:2505
 #, c-format
 msgid "no matching modules found"
 msgstr "No se encontraron módulos coincidentes"
 
-#: src/unstrip.c:2510
+#: src/unstrip.c:2515
 #, c-format
 msgid "matched more than one module"
 msgstr "coincidió con más de un módulo"
 
-#: src/unstrip.c:2554
+#: src/unstrip.c:2560
 msgid ""
 "STRIPPED-FILE DEBUG-FILE\n"
 "[MODULE...]"
@@ -7064,7 +7401,7 @@
 "STRIPPED-FILE DEBUG-FILE\n"
 "[MODULE...]"
 
-#: src/unstrip.c:2555
+#: src/unstrip.c:2561
 #, fuzzy
 msgid ""
 "Combine stripped files with separate symbols and debug information.\n"
@@ -7117,7 +7454,23 @@
 "file.  DEBUGFILE is the separate debuginfo file name, or - if no debuginfo "
 "was found, or . if FILE contains the debug information."
 
-#: tests/backtrace.c:436
+#. Short description of program.
+#: debuginfod/debuginfod-find.c:42
+msgid "Request debuginfo-related content from debuginfods listed in $"
+msgstr ""
+
+#. Strings for arguments in help texts.
+#: debuginfod/debuginfod-find.c:46
+msgid ""
+"debuginfo BUILDID\n"
+"debuginfo PATH\n"
+"executable BUILDID\n"
+"executable PATH\n"
+"source BUILDID /FILENAME\n"
+"source PATH /FILENAME\n"
+msgstr ""
+
+#: tests/backtrace.c:483
 msgid "Run executable"
 msgstr ""
 
@@ -7130,6 +7483,10 @@
 msgid "Show instances of inlined functions"
 msgstr ""
 
+#, fuzzy, c-format
+#~ msgid "cannot allocate memory"
+#~ msgstr "No se puede asignar sección PLT: %s"
+
 #, fuzzy
 #~ msgid ""
 #~ " [%6tx] base address\n"
@@ -7440,18 +7797,12 @@
 #~ msgid "unknown option `-%c %s'"
 #~ msgstr "opción desconocida `-%c %s'"
 
-#~ msgid "invalid page size value '%s': ignored"
-#~ msgstr "Valor de tamaño de página'%s': ignorado"
-
 #~ msgid "invalid hash style '%s'"
 #~ msgstr "estilo de dispersión inválido '%s'"
 
 #~ msgid "invalid build-ID style '%s'"
 #~ msgstr "estilo de cuerpo-ID inválido '%s'"
 
-#~ msgid "More than one output file name given."
-#~ msgstr "Se ha dado más de un nombre de archivo de salida."
-
 #~ msgid "Invalid optimization level `%s'"
 #~ msgstr "Nivel de optimización inválido `%s'"
 
@@ -7693,9 +8044,6 @@
 #~ msgid "while reading version script '%s': %s at line %d"
 #~ msgstr "al leer script de versión '%s': %s en línea %d"
 
-#~ msgid "while reading linker script '%s': %s at line %d"
-#~ msgstr "al leer script de enlace '%s': %s en línea %d"
-
 #, fuzzy
 #~ msgid ""
 #~ "symbol '%s' is declared both local and global for unnamed version '%s'"
diff --git a/po/ja.po b/po/ja.po
index 9fe007c..595bdff 100644
--- a/po/ja.po
+++ b/po/ja.po
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: ja\n"
 "Report-Msgid-Bugs-To: https://sourceware.org/bugzilla/\n"
-"POT-Creation-Date: 2021-02-05 21:10+0100\n"
+"POT-Creation-Date: 2021-11-10 16:21+0100\n"
 "PO-Revision-Date: 2009-09-20 15:32+0900\n"
 "Last-Translator: Hyu_gabaru Ryu_ichi <hyu_gabaru@yahoo.co.jp>\n"
 "Language-Team: Japanese <jp@li.org>\n"
@@ -34,27 +34,19 @@
 "  - 'auto', 'tty', 'if-tty'\n"
 msgstr ""
 
-#: lib/color.c:194 src/objdump.c:728
-#, fuzzy, c-format
-msgid "cannot allocate memory"
-msgstr "PLT セクションを割り当てられません: %s"
-
 #: lib/printversion.c:40
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "Copyright (C) %s The elfutils developers <%s>.\n"
 "This is free software; see the source for copying conditions.  There is NO\n"
 "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
 msgstr ""
-"Copyright (C) %s Red Hat, Inc.\n"
-"This is free software; see the source for copying conditions.  There is NO\n"
-"warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
 
-#: lib/xmalloc.c:48 lib/xmalloc.c:61 lib/xmalloc.c:73 src/readelf.c:3453
-#: src/readelf.c:11501 src/unstrip.c:312 src/unstrip.c:2398 src/unstrip.c:2603
+#: lib/xmalloc.c:48 lib/xmalloc.c:61 lib/xmalloc.c:73 src/readelf.c:11582
+#: src/unstrip.c:312
 #, c-format
 msgid "memory exhausted"
-msgstr "メモリー消費済み"
+msgstr "メモリー枯渇"
 
 #: libasm/asm_error.c:65 libdw/dwarf_error.c:57 libdwfl/libdwflP.h:51
 #: libelf/elf_error.c:60
@@ -64,7 +56,7 @@
 #: libasm/asm_error.c:66 libdw/dwarf_error.c:67 libdwfl/libdwflP.h:53
 #: libelf/elf_error.c:91
 msgid "out of memory"
-msgstr "メモリー不足"
+msgstr "メモリー不足です"
 
 #: libasm/asm_error.c:67
 msgid "cannot create output file"
@@ -72,7 +64,7 @@
 
 #: libasm/asm_error.c:68
 msgid "invalid parameter"
-msgstr "不当なパラメーター"
+msgstr "不当なパラメーターです"
 
 #: libasm/asm_error.c:69
 msgid "cannot change mode of output file"
@@ -84,28 +76,43 @@
 
 #: libasm/asm_error.c:71
 msgid "duplicate symbol"
-msgstr "重複シンボル"
+msgstr "重複シンボルです"
 
 #: libasm/asm_error.c:72
 msgid "invalid section type for operation"
-msgstr "操作に不当なセクションタイプ"
+msgstr "操作に不当なセクションタイプです"
 
 #: libasm/asm_error.c:73
 msgid "error during output of data"
-msgstr "データの出力中にエラー"
+msgstr "データ出力中のエラーです"
 
 #: libasm/asm_error.c:74
 msgid "no backend support available"
-msgstr "バックエンドサポートが利用できません"
+msgstr "バックエンドサポートを利用できません"
 
 #: libasm/asm_error.c:83 libdw/dwarf_error.c:58 libdwfl/libdwflP.h:52
 #: libelf/elf_error.c:63
 msgid "unknown error"
-msgstr "不明なエラー"
+msgstr "不明なエラーです"
+
+#: libcpu/i386_lex.l:122
+#, c-format
+msgid "invalid character '%c' at line %d; ignored"
+msgstr "不当な文字 '%c' が %d 行目にあります; 無視しました"
+
+#: libcpu/i386_lex.l:123
+#, c-format
+msgid "invalid character '\\%o' at line %d; ignored"
+msgstr "不当な文字 '\\%o' が %d 行目にあります; 無視しました"
+
+#: libcpu/i386_parse.y:554
+#, c-format
+msgid "while reading i386 CPU description: %s at line %d"
+msgstr "i386 CPU description の読み込み中: %2$d 行目の %1$s"
 
 #: libdw/dwarf_error.c:59
 msgid "invalid access"
-msgstr "不当なアクセス"
+msgstr "不当なアクセスです"
 
 #: libdw/dwarf_error.c:60
 msgid "no regular file"
@@ -113,11 +120,11 @@
 
 #: libdw/dwarf_error.c:61
 msgid "I/O error"
-msgstr "I/O エラー"
+msgstr "I/O エラーです"
 
 #: libdw/dwarf_error.c:62
 msgid "invalid ELF file"
-msgstr "不当な ELF ファイル"
+msgstr "不当な ELF ファイルです"
 
 #: libdw/dwarf_error.c:63
 msgid "no DWARF information"
@@ -125,31 +132,31 @@
 
 #: libdw/dwarf_error.c:64
 msgid "cannot decompress DWARF"
-msgstr ""
+msgstr "DWARF を展開できません"
 
 #: libdw/dwarf_error.c:65
 msgid "no ELF file"
-msgstr "ELF ファイルがありません"
+msgstr "ELF ファイルではありません"
 
 #: libdw/dwarf_error.c:66
 msgid "cannot get ELF header"
-msgstr "ELF ヘッダーを得られません"
+msgstr "ELF ヘッダーを取得できません"
 
 #: libdw/dwarf_error.c:68
 msgid "not implemented"
-msgstr "未実装"
+msgstr "未実装です"
 
 #: libdw/dwarf_error.c:69 libelf/elf_error.c:111 libelf/elf_error.c:159
 msgid "invalid command"
-msgstr "不当なコマンド"
+msgstr "不当なコマンドです"
 
 #: libdw/dwarf_error.c:70
 msgid "invalid version"
-msgstr "不当なバージョン"
+msgstr "不当なバージョンです"
 
 #: libdw/dwarf_error.c:71
 msgid "invalid file"
-msgstr "不当なファイル"
+msgstr "不当なファイルです"
 
 #: libdw/dwarf_error.c:72
 msgid "no entries found"
@@ -157,26 +164,23 @@
 
 #: libdw/dwarf_error.c:73
 msgid "invalid DWARF"
-msgstr "不当な DWARF"
+msgstr "不当な DWARFです"
 
 #: libdw/dwarf_error.c:74
 msgid "no string data"
-msgstr "文字データがありません"
+msgstr "文字列データではありません"
 
 #: libdw/dwarf_error.c:75
-#, fuzzy
 msgid ".debug_str section missing"
-msgstr ".debug_ranges セクションがありません"
+msgstr ".debug_str セクションが見つかりません"
 
 #: libdw/dwarf_error.c:76
-#, fuzzy
 msgid ".debug_line_str section missing"
-msgstr ".debug_line セクションがありません"
+msgstr ".debug_line_str セクションが見つかりません"
 
 #: libdw/dwarf_error.c:77
-#, fuzzy
 msgid ".debug_str_offsets section missing"
-msgstr ".debug_ranges セクションがありません"
+msgstr ".debug_str_offsets セクションが見つかりません"
 
 #: libdw/dwarf_error.c:78
 msgid "no address value"
@@ -184,23 +188,23 @@
 
 #: libdw/dwarf_error.c:79
 msgid "no constant value"
-msgstr "固定値ではありません"
+msgstr "定数値ではありません"
 
 #: libdw/dwarf_error.c:80
 msgid "no reference value"
-msgstr "参照値がありません"
+msgstr "参照値ではありません"
 
 #: libdw/dwarf_error.c:81
 msgid "invalid reference value"
-msgstr "不当な参照値"
+msgstr "不当な参照値です"
 
 #: libdw/dwarf_error.c:82
 msgid ".debug_line section missing"
-msgstr ".debug_line セクションがありません"
+msgstr ".debug_line セクションが見つかりません"
 
 #: libdw/dwarf_error.c:83
 msgid "invalid .debug_line section"
-msgstr "不当な .debug_line セクション"
+msgstr "不当な .debug_line セクションです"
 
 #: libdw/dwarf_error.c:84
 msgid "debug information too big"
@@ -208,28 +212,25 @@
 
 #: libdw/dwarf_error.c:85
 msgid "invalid DWARF version"
-msgstr "不当な DWARF バージョン"
+msgstr "不当な DWARF バージョンです"
 
 #: libdw/dwarf_error.c:86
 msgid "invalid directory index"
-msgstr "不当なディレクトリー索引"
+msgstr "不当なディレクトリー索引です"
 
 #: libdw/dwarf_error.c:87 libdwfl/libdwflP.h:73
 msgid "address out of range"
 msgstr "アドレスが範囲外です"
 
 #: libdw/dwarf_error.c:88
-#, fuzzy
 msgid ".debug_loc section missing"
-msgstr ".debug_line セクションがありません"
+msgstr ".debug_loc セクションが見つかりません"
 
 #: libdw/dwarf_error.c:89
-#, fuzzy
 msgid ".debug_loclists section missing"
-msgstr ".debug_line セクションがありません"
+msgstr ".debug_loclists セクション見つかりません"
 
 #: libdw/dwarf_error.c:90
-#, fuzzy
 msgid "not a location list value"
 msgstr "ロケーションリスト値ではありません"
 
@@ -239,95 +240,91 @@
 
 #: libdw/dwarf_error.c:92
 msgid "invalid line index"
-msgstr "不当な行索引"
+msgstr "不当な行索引です"
 
 #: libdw/dwarf_error.c:93
 msgid "invalid address range index"
-msgstr "不当なアドレス範囲索引"
+msgstr "不当なアドレス範囲索引です"
 
 #: libdw/dwarf_error.c:94 libdwfl/libdwflP.h:74
 msgid "no matching address range"
-msgstr "アドレス範囲に対応しません"
+msgstr "一致するアドレス範囲がありません"
 
 #: libdw/dwarf_error.c:95
 msgid "no flag value"
-msgstr "フラグ値がありません"
+msgstr "フラグ値ではありません"
 
 #: libdw/dwarf_error.c:96 libelf/elf_error.c:236
 msgid "invalid offset"
-msgstr "不当なオフセット"
+msgstr "不当なオフセットです"
 
 #: libdw/dwarf_error.c:97
 msgid ".debug_ranges section missing"
-msgstr ".debug_ranges セクションがありません"
+msgstr ".debug_ranges セクションが見つかりません"
 
 #: libdw/dwarf_error.c:98
-#, fuzzy
 msgid ".debug_rnglists section missing"
-msgstr ".debug_ranges セクションがありません"
+msgstr ".debug_rnglists セクションが見つかりません"
 
 #: libdw/dwarf_error.c:99
 msgid "invalid CFI section"
-msgstr "不当な CFI セクション"
+msgstr "不当な CFI セクションです"
 
 #: libdw/dwarf_error.c:100
 msgid "no alternative debug link found"
-msgstr ""
+msgstr "代替デバッグリンクが見つかりません"
 
 #: libdw/dwarf_error.c:101
-#, fuzzy
 msgid "invalid opcode"
-msgstr "不当なオペランド"
+msgstr "不当なオペコードです"
 
 #: libdw/dwarf_error.c:102
 msgid "not a CU (unit) DIE"
-msgstr ""
+msgstr "CU (unit) DIE ではありません"
 
 #: libdw/dwarf_error.c:103
-#, fuzzy
 msgid "unknown language code"
-msgstr "不明な命令コード"
+msgstr "不明な言語コードです"
 
 #: libdw/dwarf_error.c:104
-#, fuzzy
 msgid ".debug_addr section missing"
-msgstr ".debug_ranges セクションがありません"
+msgstr ".debug_addr セクションが見つかりません"
 
-#: libdwfl/argp-std.c:47 src/stack.c:643 src/unstrip.c:2544
+#: libdwfl/argp-std.c:47 src/stack.c:643 src/unstrip.c:2550
 msgid "Input selection options:"
-msgstr "選択オプションを入力してください:"
+msgstr "入力選択オプション:"
 
 #: libdwfl/argp-std.c:48
 msgid "Find addresses in FILE"
-msgstr "ふぁいる 中のアドレスを探す"
+msgstr "FILE の中から アドレスを探す"
 
 #: libdwfl/argp-std.c:50
 msgid "Find addresses from signatures found in COREFILE"
-msgstr "COREFILE 中で見つかった署名からアドレスを探す"
+msgstr "COREFILE 中で 見つかった 署名から アドレスを 探す"
 
 #: libdwfl/argp-std.c:52
 msgid "Find addresses in files mapped into process PID"
-msgstr "プロセス PID に対応するファイル中のアドレスを探す"
+msgstr "プロセス PID に 対応する ファイル中の アドレスを 探す"
 
 #: libdwfl/argp-std.c:54
 msgid ""
 "Find addresses in files mapped as read from FILE in Linux /proc/PID/maps "
 "format"
 msgstr ""
-"Linux の /proc/PID/maps 形式の ふぁいる から読み込んだものに対応するファイル"
-"のアドレスを探す"
+"Linux の /proc/PID/maps 形式の FILE から 読み込んだ マッピング された ファイ"
+"ル から アドレスを 探す"
 
 #: libdwfl/argp-std.c:56
 msgid "Find addresses in the running kernel"
-msgstr "実行中のカーネルのアドレスを探す"
+msgstr "実行中の カーネルから アドレスを 探す"
 
 #: libdwfl/argp-std.c:58
 msgid "Kernel with all modules"
-msgstr "全てのモジュール付きのカーネル"
+msgstr "全ての モジュール付きの カーネル"
 
 #: libdwfl/argp-std.c:60 src/stack.c:650
 msgid "Search path for separate debuginfo files"
-msgstr "分離した debuginfo ファイルべきパスを探す"
+msgstr "分離された debuginfo ファイルを 探索する パス"
 
 #: libdwfl/argp-std.c:161
 msgid "only one of -e, -p, -k, -K, or --core allowed"
@@ -340,21 +337,20 @@
 #. Non-fatal to have no modules since we do have the kernel.
 #: libdwfl/argp-std.c:238
 msgid "cannot find kernel modules"
-msgstr "カーネルモジュールを見つけられません"
+msgstr "カーネルモジュールが見つかりません"
 
 #: libdwfl/argp-std.c:255
 msgid "cannot find kernel or modules"
-msgstr "カーネルかモジュールを見つけられません"
+msgstr "カーネルまたはモジュールが見つかりません"
 
 #: libdwfl/argp-std.c:294
 #, c-format
 msgid "cannot read ELF core file: %s"
-msgstr "ELF コアファイルを読めません: %s"
+msgstr "ELF コアファイルを読み込めません: %s"
 
 #: libdwfl/argp-std.c:317
-#, fuzzy
 msgid "Not enough memory"
-msgstr "メモリー不足"
+msgstr "メモリーが十分ではありません"
 
 #: libdwfl/argp-std.c:327
 msgid "No modules recognized in core file"
@@ -362,177 +358,166 @@
 
 #: libdwfl/libdwflP.h:54
 msgid "See errno"
-msgstr ""
+msgstr "errno を参照してください"
 
 #: libdwfl/libdwflP.h:55
 msgid "See elf_errno"
-msgstr ""
+msgstr "elf_errno を参照してください"
 
 #: libdwfl/libdwflP.h:56
 msgid "See dwarf_errno"
-msgstr ""
+msgstr "dwarf_errno を参照してください"
 
 #: libdwfl/libdwflP.h:57
 msgid "See ebl_errno (XXX missing)"
-msgstr ""
+msgstr "ebl_errno を参照してください(XXX が見つかりません)"
 
 #: libdwfl/libdwflP.h:58
 msgid "gzip decompression failed"
-msgstr ""
+msgstr "gzip の展開に失敗しました"
 
 #: libdwfl/libdwflP.h:59
 msgid "bzip2 decompression failed"
-msgstr ""
+msgstr "bzip2 の展開に失敗しました"
 
 #: libdwfl/libdwflP.h:60
 msgid "LZMA decompression failed"
-msgstr ""
+msgstr "LZMA の展開に失敗しました"
 
 #: libdwfl/libdwflP.h:61
 msgid "zstd decompression failed"
-msgstr ""
+msgstr "zstd の展開に失敗しました"
 
 #: libdwfl/libdwflP.h:62
 msgid "no support library found for machine"
-msgstr ""
+msgstr "マシン用のサポートライブラリが見つかりません"
 
 #: libdwfl/libdwflP.h:63
 msgid "Callbacks missing for ET_REL file"
-msgstr ""
+msgstr "ET_REL ファイル用のコールバックが見つかりません"
 
 #: libdwfl/libdwflP.h:64
 msgid "Unsupported relocation type"
-msgstr ""
+msgstr "未対応のリロケーションタイプです"
 
 #: libdwfl/libdwflP.h:65
 msgid "r_offset is bogus"
-msgstr ""
+msgstr "r_offset が偽物です"
 
 #: libdwfl/libdwflP.h:66 libelf/elf_error.c:115 libelf/elf_error.c:175
 msgid "offset out of range"
-msgstr "オフセットが範囲を越えている"
+msgstr "オフセットが範囲外です"
 
 #: libdwfl/libdwflP.h:67
-#, fuzzy
 msgid "relocation refers to undefined symbol"
-msgstr "定義されたシンボルの印刷サイズ"
+msgstr "リロケーションが未定義シンボルを参照しています"
 
 #: libdwfl/libdwflP.h:68
 msgid "Callback returned failure"
-msgstr ""
+msgstr "コールバックが失敗を返しました"
 
 #: libdwfl/libdwflP.h:69
-#, fuzzy
 msgid "No DWARF information found"
-msgstr "DWARF 情報がありません"
+msgstr "DWARF 情報が見つかりません"
 
 #: libdwfl/libdwflP.h:70
 msgid "No symbol table found"
-msgstr ""
+msgstr "シンボルテーブルが見つかりません"
 
 #: libdwfl/libdwflP.h:71
-#, fuzzy
 msgid "No ELF program headers"
-msgstr "プログラムヘッダーを得られません: %s"
+msgstr "ELF プログラムヘッダーではありません"
 
 #: libdwfl/libdwflP.h:72
 msgid "address range overlaps an existing module"
-msgstr ""
+msgstr "アドレス範囲が既存モジュールと重なります"
 
 #: libdwfl/libdwflP.h:75
 msgid "image truncated"
-msgstr ""
+msgstr "イメージが切り詰められています"
 
 #: libdwfl/libdwflP.h:76
-#, fuzzy
 msgid "ELF file opened"
-msgstr "ファイルのオープンを追跡します。"
+msgstr "既に ELF ファイルを開いています"
 
 #: libdwfl/libdwflP.h:77
-#, fuzzy
 msgid "not a valid ELF file"
-msgstr "不当な ELF ファイル"
+msgstr "不当な ELF ファイルです"
 
 #: libdwfl/libdwflP.h:78
-#, fuzzy
 msgid "cannot handle DWARF type description"
-msgstr "Elf 記述子を生成できません: %s"
+msgstr "DWARF type description を操作できません"
 
 #: libdwfl/libdwflP.h:79
 msgid "ELF file does not match build ID"
-msgstr ""
+msgstr "ELF ファイルがビルド ID と一致しません"
 
 #: libdwfl/libdwflP.h:80
-#, fuzzy
 msgid "corrupt .gnu.prelink_undo section data"
-msgstr "ラインデータセクションデータを得られません: %s"
+msgstr ".gnu.prelink_undo セクションデータが壊れています"
 
 #: libdwfl/libdwflP.h:81
 msgid "Internal error due to ebl"
-msgstr ""
+msgstr "ebl に起因する内部エラー"
 
 #: libdwfl/libdwflP.h:82
 msgid "Missing data in core file"
-msgstr ""
+msgstr "コアファイルの中にデータが見つかりません"
 
 #: libdwfl/libdwflP.h:83
-#, fuzzy
 msgid "Invalid register"
-msgstr "不当なパラメーター"
+msgstr "不当なレジスターです"
 
 #: libdwfl/libdwflP.h:84
 msgid "Error reading process memory"
-msgstr ""
+msgstr "プロセスメモリーの読み込みエラーです"
 
 #: libdwfl/libdwflP.h:85
 msgid "Couldn't find architecture of any ELF"
-msgstr ""
+msgstr "ELF のアーキテクチャが1つも見つかりませんでした"
 
 #: libdwfl/libdwflP.h:86
 msgid "Error parsing /proc filesystem"
-msgstr ""
+msgstr "/proc ファイルシステムのパースエラーです"
 
 #: libdwfl/libdwflP.h:87
-#, fuzzy
 msgid "Invalid DWARF"
-msgstr "不当な DWARF"
+msgstr "不当な DWARF です"
 
 #: libdwfl/libdwflP.h:88
 msgid "Unsupported DWARF"
-msgstr ""
+msgstr "未対応の DWARF です"
 
 #: libdwfl/libdwflP.h:89
 msgid "Unable to find more threads"
-msgstr ""
+msgstr "これ以上スレッドが見つかりません"
 
 #: libdwfl/libdwflP.h:90
 msgid "Dwfl already has attached state"
-msgstr ""
+msgstr "Dwfl は既にアタッチ状態です"
 
 #: libdwfl/libdwflP.h:91
 msgid "Dwfl has no attached state"
-msgstr ""
+msgstr "Dwfl はアタッチ状態ではありません"
 
 #: libdwfl/libdwflP.h:92
 msgid "Unwinding not supported for this architecture"
-msgstr ""
+msgstr "このアーキテクチャに対応していない巻き戻しです"
 
 #: libdwfl/libdwflP.h:93
-#, fuzzy
 msgid "Invalid argument"
-msgstr "不当なパラメーター"
+msgstr "不当な引数です"
 
 #: libdwfl/libdwflP.h:94
-#, fuzzy
 msgid "Not an ET_CORE ELF file"
-msgstr "不当な ELF ファイル"
+msgstr "ET_CORE ELF ファイルではありません"
 
 #: libebl/eblbackendname.c:41
 msgid "No backend"
 msgstr "バックエンドがありません"
 
-#: libebl/eblcorenotetypename.c:100 libebl/eblobjnotetypename.c:77
-#: libebl/eblobjnotetypename.c:109 libebl/eblobjnotetypename.c:130
+#: libebl/eblcorenotetypename.c:100 libebl/eblobjnotetypename.c:79
+#: libebl/eblobjnotetypename.c:110 libebl/eblobjnotetypename.c:131
 #: libebl/eblosabiname.c:73 libebl/eblsectionname.c:83
 #: libebl/eblsectiontypename.c:115 libebl/eblsegmenttypename.c:81
 msgid "<unknown>"
@@ -544,14 +529,14 @@
 msgstr "<不明>: %#<PRIx64>"
 
 #: libebl/eblobjnote.c:58
-#, fuzzy, c-format
+#, c-format
 msgid "unknown SDT version %u\n"
-msgstr "不明なバージョン"
+msgstr "不明な SDT バージョン %u です\n"
 
 #: libebl/eblobjnote.c:76
-#, fuzzy, c-format
+#, c-format
 msgid "invalid SDT probe descriptor\n"
-msgstr "不当なファイル記述子"
+msgstr "不当な SDT probe 記述子です\n"
 
 #: libebl/eblobjnote.c:126
 #, c-format
@@ -586,7 +571,7 @@
 #: libebl/eblobjnote.c:300
 #, c-format
 msgid "    Build ID: "
-msgstr "   ビルト ID: "
+msgstr "   ビルド ID: "
 
 #. A non-null terminated version string.
 #: libebl/eblobjnote.c:311
@@ -597,7 +582,7 @@
 #: libebl/eblobjnote.c:638
 #, c-format
 msgid "    OS: %s, ABI: "
-msgstr "    OS: %s、ABI: "
+msgstr ""
 
 #: libebl/eblosabiname.c:70
 msgid "Stand alone"
@@ -610,98 +595,96 @@
 
 #: libelf/elf_error.c:67
 msgid "unknown version"
-msgstr "不明なバージョン"
+msgstr "不明なバージョンです"
 
 #: libelf/elf_error.c:71
 msgid "unknown type"
-msgstr "不明なタイプ"
+msgstr "不明なタイプです"
 
 #: libelf/elf_error.c:75
 msgid "invalid `Elf' handle"
-msgstr "無効な `Elf' の処理"
+msgstr "無効な `Elf' のハンドルです"
 
 #: libelf/elf_error.c:79
 msgid "invalid size of source operand"
-msgstr "ソース演算子の大きさが無効"
+msgstr "ソース演算子の大きさが無効です"
 
 #: libelf/elf_error.c:83
 msgid "invalid size of destination operand"
-msgstr "宛先演算子の大きさが無効"
+msgstr "宛先演算子の大きさが無効です"
 
-#: libelf/elf_error.c:87 src/readelf.c:6209
+#: libelf/elf_error.c:87 src/readelf.c:6215
 #, c-format
 msgid "invalid encoding"
-msgstr "無効なエンコード"
+msgstr "無効なエンコードです"
 
 #: libelf/elf_error.c:95
 msgid "invalid file descriptor"
-msgstr "不当なファイル記述子"
+msgstr "不当なファイル記述子です"
 
 #: libelf/elf_error.c:99
-#, fuzzy
 msgid "invalid ELF file data"
-msgstr "不当な ELF ファイル"
+msgstr "不当な ELF ファイルデータです"
 
 #: libelf/elf_error.c:103
 msgid "invalid operation"
-msgstr "不当な操作"
+msgstr "不当な操作です"
 
 #: libelf/elf_error.c:107
 msgid "ELF version not set"
-msgstr "ELF のバージョンが設定されていない"
+msgstr "ELF のバージョンが設定されていません"
 
 #: libelf/elf_error.c:119
 msgid "invalid fmag field in archive header"
-msgstr "アーカイブヘッダーの不当な fmag 領域"
+msgstr "アーカイブヘッダーの不当な fmag 領域です"
 
 #: libelf/elf_error.c:123
 msgid "invalid archive file"
-msgstr "不当なアーカイブファイル"
+msgstr "不当なアーカイブファイルです"
 
 #: libelf/elf_error.c:127
 msgid "descriptor is not for an archive"
-msgstr "記述子はアーカイブ用ではありません"
+msgstr "記述子がアーカイブ用ではありません"
 
 #: libelf/elf_error.c:131
 msgid "no index available"
-msgstr "索引が使えません"
+msgstr "利用できる索引がありません"
 
 #: libelf/elf_error.c:135
 msgid "cannot read data from file"
-msgstr "ファイルからデータを読みません"
+msgstr "ファイルからデータを読み込めません"
 
 #: libelf/elf_error.c:139
 msgid "cannot write data to file"
-msgstr "ファイルへデータを書けません"
+msgstr "ファイルへデータを書き込めません"
 
 #: libelf/elf_error.c:143
 msgid "invalid binary class"
-msgstr "不当なバイナリークラス"
+msgstr "不当なバイナリークラスです"
 
 #: libelf/elf_error.c:147
 msgid "invalid section index"
-msgstr "不当なセクション索引"
+msgstr "不当なセクション索引です"
 
 #: libelf/elf_error.c:151
 msgid "invalid operand"
-msgstr "不当なオペランド"
+msgstr "不当なオペランドです"
 
 #: libelf/elf_error.c:155
 msgid "invalid section"
-msgstr "不当なセクション"
+msgstr "不当なセクションです"
 
 #: libelf/elf_error.c:163
 msgid "executable header not created first"
-msgstr "エクゼキュータブルヘッダーが最初に作られていません"
+msgstr "実行可能ヘッダーが最初に作られていません"
 
 #: libelf/elf_error.c:167
 msgid "file descriptor disabled"
-msgstr "ファイル記述子が機能しません"
+msgstr "ファイル記述子が無効化されています"
 
 #: libelf/elf_error.c:171
-#, fuzzy
 msgid "archive/member file descriptor mismatch"
-msgstr "アーカイブ/メンバー領域が不整合です"
+msgstr "アーカイブ/メンバーのファイル記述子の不整合です"
 
 #: libelf/elf_error.c:179
 msgid "cannot manipulate null section"
@@ -709,21 +692,21 @@
 
 #: libelf/elf_error.c:183
 msgid "data/scn mismatch"
-msgstr "データ/scnが不整合です"
+msgstr "データ/scnの不整合です"
 
 #: libelf/elf_error.c:187
 msgid "invalid section header"
-msgstr "不当なセクションヘッダー"
+msgstr "不当なセクションヘッダーです"
 
-#: libelf/elf_error.c:191 src/readelf.c:10012 src/readelf.c:10612
-#: src/readelf.c:10713 src/readelf.c:10895
+#: libelf/elf_error.c:191 src/readelf.c:10093 src/readelf.c:10693
+#: src/readelf.c:10794 src/readelf.c:10976
 #, c-format
 msgid "invalid data"
-msgstr "不当なデータ"
+msgstr "不当なデータです"
 
 #: libelf/elf_error.c:195
 msgid "unknown data encoding"
-msgstr "不明なデータエンコード"
+msgstr "不明なデータエンコードです"
 
 #: libelf/elf_error.c:199
 msgid "section `sh_size' too small for data"
@@ -731,15 +714,15 @@
 
 #: libelf/elf_error.c:203
 msgid "invalid section alignment"
-msgstr "不当なセクション調整"
+msgstr "不当なセクションアラインメントです"
 
 #: libelf/elf_error.c:207
 msgid "invalid section entry size"
-msgstr "不当なセクション項目の大きさ"
+msgstr "不当なセクション項目の大きさです"
 
 #: libelf/elf_error.c:211
 msgid "update() for write on read-only file"
-msgstr "読込み専用ファイルでの書込みのための update()"
+msgstr "読み込み専用ファイルへの書き込みの update() です"
 
 #: libelf/elf_error.c:215
 msgid "no such file"
@@ -747,119 +730,114 @@
 
 #: libelf/elf_error.c:219
 msgid "only relocatable files can contain section groups"
-msgstr "リロケータブルファイルのみセクショングループを含むことができます"
+msgstr "リロケータブルファイルのみがセクショングループを含むことができます"
 
 #: libelf/elf_error.c:224
 msgid ""
 "program header only allowed in executables, shared objects, and core files"
 msgstr ""
-"プログラムヘッダーはエクゼキュータブルか、共用オブジェクト、コアファイルにの"
-"み認められています"
+"プログラムヘッダーは、実行可能ファイル、共有オブジェクト、コアファイルにのみ"
+"認められています"
 
 #: libelf/elf_error.c:231
 msgid "file has no program header"
 msgstr "ファイルにプログラムヘッダーがありません"
 
 #: libelf/elf_error.c:241
-#, fuzzy
 msgid "invalid section type"
-msgstr "不当なセクション"
+msgstr "不当なセクションタイプです"
 
 #: libelf/elf_error.c:246
-#, fuzzy
 msgid "invalid section flags"
-msgstr "不当なセクション"
+msgstr "不当なセクションフラグです"
 
 #: libelf/elf_error.c:251
-#, fuzzy
 msgid "section does not contain compressed data"
-msgstr "セクション [%2d] '%s': セクションデータを得られません\n"
+msgstr "セクションが圧縮データを含んでいません"
 
 #: libelf/elf_error.c:256
 msgid "section contains compressed data"
-msgstr ""
+msgstr "セクションが圧縮データを含んでいます"
 
 #: libelf/elf_error.c:261
-#, fuzzy
 msgid "unknown compression type"
-msgstr "不明なタイプ"
+msgstr "不明な圧縮タイプです"
 
 #: libelf/elf_error.c:266
-#, fuzzy
 msgid "cannot compress data"
-msgstr "セクションデータを割り当てられません: %s"
+msgstr "データを圧縮できません"
 
 #: libelf/elf_error.c:271
-#, fuzzy
 msgid "cannot decompress data"
-msgstr "セクションデータを割り当てられません: %s"
+msgstr "データを展開できません"
 
 #: src/addr2line.c:57
-#, fuzzy
 msgid "Input format options:"
-msgstr "選択オプションを入力してください:"
+msgstr "入力フォーマットオプション:"
 
 #: src/addr2line.c:59
 msgid "Treat addresses as offsets relative to NAME section."
-msgstr ""
+msgstr "アドレスを NAME セクションに 対する 相対 オフセット として 扱う"
 
 #: src/addr2line.c:61
-#, fuzzy
 msgid "Output format options:"
-msgstr "出力形式:"
+msgstr "出力フォーマットオプション:"
 
 #: src/addr2line.c:62
 msgid "Print address before each entry"
-msgstr ""
+msgstr "各項目の前にアドレスを表示"
 
 #: src/addr2line.c:63
 msgid "Show only base names of source files"
-msgstr ""
+msgstr "ソースファイルの ベースネーム のみ 表示"
 
 #: src/addr2line.c:65
 msgid "Show absolute file names using compilation directory"
-msgstr ""
+msgstr "コンパイルディレクトリを 使用して 絶対ファイル名を 表示"
 
 #: src/addr2line.c:66
 msgid "Also show function names"
-msgstr ""
+msgstr "関数名も表示"
 
 #: src/addr2line.c:67
 msgid "Also show symbol or section names"
-msgstr ""
+msgstr "シンボル名 または セクション名も 表示"
 
 #: src/addr2line.c:68
 msgid "Also show symbol and the section names"
-msgstr ""
+msgstr "シンボル名と セクション名も 表示"
 
 #: src/addr2line.c:69
 msgid "Also show line table flags"
-msgstr ""
+msgstr "行テーブルフラグも表示"
 
 #: src/addr2line.c:71
 msgid ""
 "Show all source locations that caused inline expansion of subroutines at the "
 "address."
 msgstr ""
+"アドレスの サブルーチンの インライン展開を 引き起こした 全ての ソース位置を "
+"表示"
 
 #: src/addr2line.c:74
 msgid "Show demangled symbols (ARG is always ignored)"
-msgstr ""
+msgstr "デマングルされた シンボルを 表示 (ARGは常に無視される)"
 
 #: src/addr2line.c:76
 msgid "Print all information on one line, and indent inlines"
-msgstr ""
+msgstr "全ての 情報を 一行で 表示し、 字下げする"
 
-#: src/addr2line.c:78 src/elfcmp.c:70 src/findtextrel.c:65 src/nm.c:100
+#: src/addr2line.c:78 src/elfcmp.c:70 src/findtextrel.c:66 src/nm.c:100
 #: src/strings.c:78
 msgid "Miscellaneous:"
-msgstr "雑則:"
+msgstr "Misc:"
 
 #. Short description of program.
 #: src/addr2line.c:86
 msgid ""
 "Locate source files and line information for ADDRs (in a.out by default)."
 msgstr ""
+"ADDR のソースファイルと行の情報を 検索する (デフォルトでは a.out から)"
 
 #. Strings for arguments in help texts.
 #: src/addr2line.c:90
@@ -879,7 +857,7 @@
 #: src/addr2line.c:652
 #, c-format
 msgid "cannot find symbol '%s'"
-msgstr ""
+msgstr "シンボル '%s' が見つかりません"
 
 #: src/addr2line.c:657
 #, c-format
@@ -888,7 +866,7 @@
 
 #: src/ar.c:67
 msgid "Commands:"
-msgstr "コマンド:"
+msgstr "コマンド:"
 
 #: src/ar.c:68
 msgid "Delete files from archive."
@@ -904,23 +882,23 @@
 
 #: src/ar.c:71
 msgid "Quick append files to archive."
-msgstr "アーカイブへの即座のファイル追加。"
+msgstr "アーカイブへ ファイルを 素早く 追加。"
 
 #: src/ar.c:73
 msgid "Replace existing or insert new file into archive."
-msgstr "アーカイブへの既存のファイルの置き換えか、新しいファイルの挿入。"
+msgstr "アーカイブの既存ファイルの置き換えまたは新しいファイルの挿入。"
 
 #: src/ar.c:74
 msgid "Display content of archive."
-msgstr "アーカイブの内容の表示"
+msgstr "アーカイブの内容の表示。"
 
 #: src/ar.c:75
 msgid "Extract files from archive."
-msgstr "アーカイブからのファイルの取出し"
+msgstr "アーカイブからのファイルの取出し。"
 
 #: src/ar.c:77
 msgid "Command Modifiers:"
-msgstr "コマンド修飾子:"
+msgstr "コマンド修飾子:"
 
 #: src/ar.c:78
 msgid "Preserve original dates."
@@ -932,11 +910,11 @@
 
 #: src/ar.c:81
 msgid "Do not replace existing files with extracted files."
-msgstr "既存のファイルを抽出したファイルで置き換えない。"
+msgstr "抽出したファイルで既存のファイルを置き換えない。"
 
 #: src/ar.c:82
 msgid "Allow filename to be truncated if necessary."
-msgstr "必要ならばファイル名の切り捨てを認める。"
+msgstr "必要ならば ファイル名の 切り詰めを 認める。"
 
 #: src/ar.c:84
 msgid "Provide verbose output."
@@ -960,7 +938,7 @@
 
 #: src/ar.c:89
 msgid "Suppress message when library has to be created."
-msgstr "ライブラリーを生成しなければならない時にメッセージを抑止する。"
+msgstr "ライブラリーを 生作成なければ ならない時に メッセージを 抑止する。"
 
 #: src/ar.c:91
 msgid "Use full path for file matching."
@@ -968,17 +946,17 @@
 
 #: src/ar.c:92
 msgid "Update only older files in archive."
-msgstr "アーカイブの古いファイルのみ更新する。"
+msgstr "アーカイブの 古い ファイルのみ 更新する。"
 
 #. Short description of program.
 #: src/ar.c:98
 msgid "Create, modify, and extract from archives."
-msgstr "アーカイブから作成や、修正、抽出する。"
+msgstr "アーカイブの作成や修正、アーカイブからの抽出を行う。"
 
 #. Strings for arguments in help texts.
 #: src/ar.c:101
 msgid "[MEMBER] [COUNT] ARCHIVE [FILE...]"
-msgstr "[メンバー] [合計] アーカイブ [ファイル...]"
+msgstr ""
 
 #: src/ar.c:180
 #, c-format
@@ -1003,7 +981,7 @@
 #: src/ar.c:218
 #, c-format
 msgid "invalid COUNT parameter %s"
-msgstr "不当な COUNT パラメーター %s"
+msgstr "不当な COUNT パラメーター %s です"
 
 #: src/ar.c:225
 #, c-format
@@ -1018,7 +996,7 @@
 #: src/ar.c:244
 #, c-format
 msgid "command option required"
-msgstr ""
+msgstr "コマンドオプションが必要です"
 
 #: src/ar.c:295
 #, c-format
@@ -1028,7 +1006,7 @@
 #: src/ar.c:389
 #, c-format
 msgid "cannot open archive '%s'"
-msgstr "アーカイブ '%s' を開くことができません"
+msgstr "アーカイブ '%s' を開けません"
 
 #: src/ar.c:399
 #, c-format
@@ -1043,7 +1021,7 @@
 #: src/ar.c:407
 #, c-format
 msgid "cannot stat archive '%s'"
-msgstr "アーカイブに stat できません: '%s'"
+msgstr "アーカイブ '%s' を stat できません"
 
 #: src/ar.c:419
 #, c-format
@@ -1053,22 +1031,22 @@
 #: src/ar.c:472 src/ar.c:927 src/ar.c:1134
 #, c-format
 msgid "cannot create hash table"
-msgstr "ハッシュテーブルを生成できません"
+msgstr "ハッシュテーブルを作成できません"
 
 #: src/ar.c:479 src/ar.c:934 src/ar.c:1143
 #, c-format
 msgid "cannot insert into hash table"
-msgstr "ハッシュに挿入できません"
+msgstr "ハッシュテーブルに挿入できません"
 
 #: src/ar.c:487 src/ranlib.c:148
 #, c-format
 msgid "cannot stat '%s'"
-msgstr "'%s' に stat できません"
+msgstr "'%s' を stat できません"
 
 #: src/ar.c:589
 #, c-format
 msgid "cannot read content of %s: %s"
-msgstr "%s の内容を読むことができません: %s"
+msgstr "%s の内容を読み込めません: %s"
 
 #: src/ar.c:632
 #, c-format
@@ -1078,7 +1056,7 @@
 #: src/ar.c:654
 #, c-format
 msgid "failed to write %s"
-msgstr "%s への書込みに失敗しました"
+msgstr "%s への書き込みに失敗しました"
 
 #: src/ar.c:666
 #, c-format
@@ -1098,7 +1076,7 @@
 #: src/ar.c:764 src/ar.c:1019 src/ar.c:1423 src/ranlib.c:222
 #, c-format
 msgid "cannot create new file"
-msgstr "新しいファイルを生成できません"
+msgstr "新しいファイルを作成できません"
 
 #: src/ar.c:1225
 #, c-format
@@ -1128,50 +1106,50 @@
 #: src/ar.c:1288
 #, c-format
 msgid "cannot get ELF descriptor for %s: %s\n"
-msgstr "%s の ELF 記述子を得られません: %s\n"
+msgstr "%s の ELF 記述子を取得できません: %s\n"
 
 #: src/ar.c:1308
 #, c-format
 msgid "cannot read %s: %s"
-msgstr "%s を読みません: %s"
+msgstr "%s を読み込めません: %s"
 
 #: src/ar.c:1483
-#, fuzzy, c-format
+#, c-format
 msgid "cannot represent ar_date"
-msgstr "セクションデータを割り当てられません: %s"
+msgstr "ar_date を表現できません"
 
 #: src/ar.c:1489
-#, fuzzy, c-format
+#, c-format
 msgid "cannot represent ar_uid"
-msgstr "セクションデータを割り当てられません: %s"
+msgstr "ar_uid を表現できません"
 
 #: src/ar.c:1495
-#, fuzzy, c-format
+#, c-format
 msgid "cannot represent ar_gid"
-msgstr "セクションデータを割り当てられません: %s"
+msgstr "ar_gid を表現できません"
 
 #: src/ar.c:1501
-#, fuzzy, c-format
+#, c-format
 msgid "cannot represent ar_mode"
-msgstr "セクションを得られません: %s"
+msgstr "ar_mode を表現できません"
 
 #: src/ar.c:1507
-#, fuzzy, c-format
+#, c-format
 msgid "cannot represent ar_size"
-msgstr "%s を開けません"
+msgstr "ar_size を表現できません"
 
 #: src/arlib-argp.c:32
 msgid "Use zero for uid, gid, and date in archive members."
-msgstr ""
+msgstr "アーカイブメンバの uid、 gid、 日付に ゼロを 使用する。"
 
 #: src/arlib-argp.c:34
 msgid "Use actual uid, gid, and date in archive members."
-msgstr ""
+msgstr "アーカイブメンバに 実際のuid、 gid、 日付を 使用する。"
 
 #: src/arlib-argp.c:63
 #, c-format
 msgid "%s (default)"
-msgstr ""
+msgstr "%s (デフォルト)"
 
 #. The archive is too big.
 #: src/arlib.c:213
@@ -1182,38 +1160,262 @@
 #: src/arlib.c:226
 #, c-format
 msgid "cannot read ELF header of %s(%s): %s"
-msgstr "%s(%s) の  ELF ヘッダーを読めません: %s"
+msgstr "%s(%s) の  ELF ヘッダーを読み込めません: %s"
+
+#: src/elfclassify.c:91
+msgid "opening"
+msgstr ""
+
+#: src/elfclassify.c:98
+msgid "reading"
+msgstr ""
+
+#: src/elfclassify.c:244
+msgid "ELF header"
+msgstr ""
+
+#: src/elfclassify.c:255
+msgid "program headers"
+msgstr ""
+
+#: src/elfclassify.c:264
+msgid "program header"
+msgstr ""
+
+#: src/elfclassify.c:284
+msgid "section headers"
+msgstr ""
+
+#: src/elfclassify.c:295
+msgid "section header string table index"
+msgstr ""
+
+#: src/elfclassify.c:309
+msgid "could not obtain section header"
+msgstr "セクションヘッダーを取得できませんでした"
+
+#: src/elfclassify.c:315
+msgid "could not obtain section name"
+msgstr "セクション名を取得できませんでした"
+
+#: src/elfclassify.c:828
+msgid "writing to standard output"
+msgstr ""
+
+#: src/elfclassify.c:855
+msgid "reading from standard input"
+msgstr ""
+
+#: src/elfclassify.c:876
+msgid "Classification options"
+msgstr "分類オプション"
+
+#: src/elfclassify.c:878
+msgid "File looks like an ELF object or archive/static library (default)"
+msgstr ""
+"ELF オブジェクト または アーカイブ/静的ライブラリに 見えるファイル (デフォル"
+"ト)"
+
+#: src/elfclassify.c:881
+msgid "File is an regular ELF object (not an archive/static library)"
+msgstr ""
+"ファイルは 通常の ELF オブジェクト (アーカイブ/静的ライブラリ でない)"
+
+#: src/elfclassify.c:884
+msgid "File is an ELF archive or static library"
+msgstr "ファイルは ELF アーカイブ または 静的ライブラリ"
+
+#: src/elfclassify.c:887
+msgid "File is an ELF core dump file"
+msgstr "ファイルは ELF コアダンプファイル"
+
+#: src/elfclassify.c:890
+msgid ""
+"File is an ELF file with symbol table or .debug_* sections and can be "
+"stripped further"
+msgstr ""
+"ファイルは シンボルテーブル または .debug_* セクション付きの さらにストリップ"
+"可能な ELF ファイル"
+
+#: src/elfclassify.c:893
+msgid "File is (primarily) an ELF program executable (not primarily a DSO)"
+msgstr "ファイルは (主に) ELF 実行可能プログラム (主として DSO ではない)"
+
+#: src/elfclassify.c:896
+msgid "File is an ELF program executable (might also be a DSO)"
+msgstr "ファイルは ELF 実行可能プログラム (DSO かもしれない)"
+
+#: src/elfclassify.c:899
+msgid ""
+"File is (primarily) an ELF shared object (DSO) (not primarily an executable)"
+msgstr ""
+"ファイルは (主に) ELF 共有オブジェクト(DSO) (主として 実行可能プログラム"
+"でない)"
+
+#: src/elfclassify.c:902
+msgid "File is an ELF shared object (DSO) (might also be an executable)"
+msgstr ""
+"ファイルは ELF 共有オブジェクト(DSO) (実行可能プログラム かもしれない)"
+
+#: src/elfclassify.c:906
+msgid "File is a linux kernel module"
+msgstr "ファイルは linux カーネル モジュール"
+
+#: src/elfclassify.c:908
+msgid "File is a debug only ELF file (separate .debug, .dwo or dwz multi-file)"
+msgstr ""
+"ファイルは デバッグ専用 ELF ファイル (分離した .debug、 .dwo または dwz マル"
+"チファイル)"
+
+#: src/elfclassify.c:911
+msgid "File is a loadable ELF object (program or shared object)"
+msgstr ""
+"ファイルは ロード可能な ELF オブジェクト (プログラム または 共有オブジェク"
+"ト)"
+
+#: src/elfclassify.c:940
+msgid "Input flags"
+msgstr "入力フラグ"
+
+#: src/elfclassify.c:942
+msgid "Only classify regular (not symlink nor special device) files"
+msgstr ""
+"通常 (シンボリックリンク や 特別デバイス でない) ファイルのみを 分類する"
+
+#: src/elfclassify.c:944
+msgid ""
+"Also read file names to process from standard input, separated by newlines"
+msgstr "処理するファイル名を 標準入力から 改行区切りで 読み込む"
+
+#: src/elfclassify.c:947
+msgid ""
+"Also read file names to process from standard input, separated by ASCII NUL "
+"bytes"
+msgstr "処理するファイル名を 標準入力から ASCII ヌル文字区切りで 読み込む"
+
+#: src/elfclassify.c:950
+msgid "Do not read files from standard input (default)"
+msgstr "標準入力から ファイルを 読み込まない (デフォルト)"
+
+#: src/elfclassify.c:952
+msgid "Try to open compressed files or embedded (kernel) ELF images"
+msgstr ""
+"圧縮ファイル または 組み込み(カーネル) ELF イメージ のオープンを 試みる"
+
+#: src/elfclassify.c:955
+msgid "Output flags"
+msgstr "出力フラグ"
+
+#: src/elfclassify.c:957
+msgid "Output names of files, separated by newline"
+msgstr "改行区切りで ファイル名を 出力する"
+
+#: src/elfclassify.c:959
+msgid "Output names of files, separated by ASCII NUL"
+msgstr "ASCII ヌル文字区切りで ファイル名を 出力する"
+
+#: src/elfclassify.c:961
+msgid "Do not output file names"
+msgstr "ファイル名を出力しない"
+
+#: src/elfclassify.c:963
+msgid "If printing file names, print matching files (default)"
+msgstr ""
+"ファイル名を 表示するならば、 一致するファイルを 表示する (デフォルト)"
+
+#: src/elfclassify.c:965
+msgid "If printing file names, print files that do not match"
+msgstr "ファイル名を 表示するならば、 一致しないファイルを 表示する"
+
+#: src/elfclassify.c:967
+msgid "Additional flags"
+msgstr "追加のフラグ"
+
+#: src/elfclassify.c:969
+msgid "Output additional information (can be specified multiple times)"
+msgstr "追加の情報を 出力する (複数回指定されうる)"
+
+#: src/elfclassify.c:971
+msgid "Suppress some error output (counterpart to --verbose)"
+msgstr "いくつかのエラー出力を 抑制する ( --verbose の反対)"
+
+#. Strings for arguments in help texts.
+#: src/elfclassify.c:979 src/elfcompress.c:1334 src/elflint.c:77
+#: src/readelf.c:158
+msgid "FILE..."
+msgstr ""
+
+#: src/elfclassify.c:980
+msgid ""
+"Determine the type of an ELF file.\n"
+"\n"
+"All of the classification options must apply at the same time to a "
+"particular file.  Classification options can be negated using a \"--not-\" "
+"prefix.\n"
+"\n"
+"Since modern ELF does not clearly distinguish between programs and dynamic "
+"shared objects, you should normally use either --executable or --shared to "
+"identify the primary purpose of a file.  Only one of the --shared and --"
+"executable checks can pass for a file.\n"
+"\n"
+"If you want to know whether an ELF object might a program or a shared "
+"library (but could be both), then use --program or --library. Some ELF files "
+"will classify as both a program and a library.\n"
+"\n"
+"If you just want to know whether an ELF file is loadable (as program or "
+"library) use --loadable.  Note that files that only contain (separate) debug "
+"information (--debug-only) are never --loadable (even though they might "
+"contain program headers).  Linux kernel modules are also not --loadable (in "
+"the normal sense).\n"
+"\n"
+"Without any of the --print options, the program exits with status 0 if the "
+"requested checks pass for all input files, with 1 if a check fails for any "
+"file, and 2 if there is an environmental issue (such as a file read error or "
+"a memory allocation error).\n"
+"\n"
+"When printing file names, the program exits with status 0 even if no file "
+"names are printed, and exits with status 2 if there is an environmental "
+"issue.\n"
+"\n"
+"On usage error (e.g. a bad option was given), the program exits with a "
+"status code larger than 2.\n"
+"\n"
+"The --quiet or -q option suppresses some error warning output, but doesn't "
+"change the exit status."
+msgstr ""
 
 #: src/elfcmp.c:60
 msgid "Control options:"
-msgstr ""
+msgstr "制御オプション:"
 
 #: src/elfcmp.c:62
 msgid "Output all differences, not just the first"
-msgstr ""
+msgstr "最初のものに限らず、 全ての差異を 出力する"
 
 #: src/elfcmp.c:63
 msgid ""
 "Control treatment of gaps in loadable segments [ignore|match] (default: "
 "ignore)"
 msgstr ""
+"ロード可能セグメントの gap の 扱いを 制御する [ignore|match] (デフォルト: "
+"ignore)"
 
 #: src/elfcmp.c:65
 msgid "Ignore permutation of buckets in SHT_HASH section"
-msgstr ""
+msgstr "SHT_HASH セクションの バケットの 並べ替えを 無視"
 
 #: src/elfcmp.c:67
 msgid "Ignore differences in build ID"
-msgstr ""
+msgstr "ビルド ID の差異を 無視"
 
 #: src/elfcmp.c:68
 msgid "Output nothing; yield exit status only"
-msgstr ""
+msgstr "何も出力しない。 終了ステータスのみを生じさせる"
 
 #. Short description of program.
 #: src/elfcmp.c:75
 msgid "Compare relevant parts of two ELF files for equality."
-msgstr ""
+msgstr "2つの ELF ファイルの 関連のある部分の 等価性を 比較する。"
 
 #. Strings for arguments in help texts.
 #: src/elfcmp.c:79
@@ -1222,12 +1424,12 @@
 
 #: src/elfcmp.c:141
 msgid "Invalid number of parameters.\n"
-msgstr ""
+msgstr "不当なパラメータ数です\n"
 
 #: src/elfcmp.c:172 src/elfcmp.c:177
 #, c-format
 msgid "cannot get ELF header of '%s': %s"
-msgstr ""
+msgstr "'%s' の ELF ヘッダーを取得できません: %s"
 
 #: src/elfcmp.c:203
 #, c-format
@@ -1235,9 +1437,9 @@
 msgstr ""
 
 #: src/elfcmp.c:210 src/elfcmp.c:213
-#, fuzzy, c-format
+#, c-format
 msgid "cannot get section count of '%s': %s"
-msgstr "セクションを得られません: %s"
+msgstr "'%s' のセクションヘッダー数を取得できません: %s"
 
 #: src/elfcmp.c:218
 #, c-format
@@ -1245,19 +1447,19 @@
 msgstr ""
 
 #: src/elfcmp.c:225 src/elfcmp.c:228
-#, fuzzy, c-format
+#, c-format
 msgid "cannot get program header count of '%s': %s"
-msgstr "プログラムヘッダーを得られません: %s"
+msgstr "'%s' のプログラムヘッダー数を取得できません: %s"
 
 #: src/elfcmp.c:233
-#, fuzzy, c-format
+#, c-format
 msgid "%s %s diff: program header count"
-msgstr "ファイルにプログラムヘッダーがありません"
+msgstr ""
 
 #: src/elfcmp.c:241 src/elfcmp.c:244
-#, fuzzy, c-format
+#, c-format
 msgid "cannot get hdrstrndx of '%s': %s"
-msgstr "セクションを得られません: %s"
+msgstr "'%s' の hdrstrndx を取得できません: %s"
 
 #: src/elfcmp.c:249
 #, c-format
@@ -1270,9 +1472,9 @@
 msgstr ""
 
 #: src/elfcmp.c:330
-#, fuzzy, c-format
+#, c-format
 msgid "%s %s differ: section [%zu] '%s' header"
-msgstr "セクション [%zu] '%s' の不当なデータ"
+msgstr ""
 
 #: src/elfcmp.c:338 src/elfcmp.c:344
 #, c-format
@@ -1280,16 +1482,14 @@
 msgstr ""
 
 #: src/elfcmp.c:353
-#, fuzzy, c-format
+#, c-format
 msgid "symbol table [%zu] in '%s' has zero sh_entsize"
 msgstr ""
-"\n"
-"シンボルテーブル [%2u] '%s' には %u 個の項目があります:\n"
 
 #: src/elfcmp.c:365 src/elfcmp.c:371
 #, c-format
 msgid "cannot get symbol in '%s': %s"
-msgstr ""
+msgstr "'%s' のシンボルを取得できません: %s"
 
 #: src/elfcmp.c:393
 #, c-format
@@ -1307,9 +1507,9 @@
 msgstr ""
 
 #: src/elfcmp.c:451
-#, fuzzy, c-format
+#, c-format
 msgid "cannot read note section [%zu] '%s' in '%s': %s"
-msgstr "セクション [%Zu] '%s' からデータが得られません: %s"
+msgstr ""
 
 #: src/elfcmp.c:462
 #, c-format
@@ -1354,7 +1554,7 @@
 #: src/elfcmp.c:595 src/elfcmp.c:600
 #, c-format
 msgid "cannot load data of '%s': %s"
-msgstr ""
+msgstr "'%s' のデータをロードできません: %s"
 
 #: src/elfcmp.c:619 src/elfcmp.c:625
 #, c-format
@@ -1374,119 +1574,114 @@
 #: src/elfcmp.c:706
 #, c-format
 msgid "Invalid value '%s' for --gaps parameter."
-msgstr ""
+msgstr "--gaps パラメータ に対する不当な値 '%s' です"
 
-#: src/elfcmp.c:734 src/findtextrel.c:205 src/nm.c:364 src/ranlib.c:141
-#: src/size.c:272 src/strings.c:185 src/strip.c:1030 src/strip.c:1067
-#: src/unstrip.c:2194 src/unstrip.c:2223
+#: src/elfcmp.c:734 src/findtextrel.c:195 src/nm.c:364 src/ranlib.c:141
+#: src/size.c:272 src/strings.c:185 src/strip.c:1035 src/strip.c:1072
+#: src/unstrip.c:2197 src/unstrip.c:2226
 #, c-format
 msgid "cannot open '%s'"
 msgstr "'%s' を開けません"
 
-#: src/elfcmp.c:738 src/findtextrel.c:212 src/ranlib.c:158
+#: src/elfcmp.c:738 src/findtextrel.c:214 src/ranlib.c:158
 #, c-format
 msgid "cannot create ELF descriptor for '%s': %s"
-msgstr ""
+msgstr "'%s' の ELF 記述子を作成できません: %s"
 
 #: src/elfcmp.c:743
 #, c-format
 msgid "cannot create EBL descriptor for '%s'"
-msgstr ""
+msgstr "'%s' の EBL 記述子を作成できません"
 
-#: src/elfcmp.c:761 src/findtextrel.c:394
+#: src/elfcmp.c:761 src/findtextrel.c:385
 #, c-format
 msgid "cannot get section header of section %zu: %s"
-msgstr ""
+msgstr "セクション %zu のセクションヘッダーを取得できません: %s"
 
 #: src/elfcmp.c:771
 #, c-format
 msgid "cannot get content of section %zu: %s"
-msgstr ""
+msgstr "セクション %zu の内容を取得できません: %s"
 
 #: src/elfcmp.c:781 src/elfcmp.c:795
 #, c-format
 msgid "cannot get relocation: %s"
-msgstr ""
+msgstr "リロケーションを取得できません: %s"
 
-#: src/elfcompress.c:115 src/strip.c:308 src/unstrip.c:117
+#: src/elfcompress.c:117 src/strip.c:308 src/unstrip.c:117
 #, c-format
 msgid "-o option specified twice"
 msgstr "-o オプションが 2 回指定されています"
 
-#: src/elfcompress.c:122
-#, fuzzy, c-format
+#: src/elfcompress.c:124
+#, c-format
 msgid "-t option specified twice"
-msgstr "-f オプションが 2 回指定されています"
+msgstr "-t オプションが 2 回指定されています"
 
-#: src/elfcompress.c:131
-#, fuzzy, c-format
+#: src/elfcompress.c:133
+#, c-format
 msgid "unknown compression type '%s'"
-msgstr "不明なタイプ"
+msgstr "不明な圧縮タイプ '%s'"
 
 #. We need at least one input file.
-#: src/elfcompress.c:143 src/elfcompress.c:1347
-#, fuzzy, c-format
+#: src/elfcompress.c:145 src/elfcompress.c:1345
+#, c-format
 msgid "No input file given"
-msgstr "入力ファイルが空です"
+msgstr "入力ファイルが与えられていません"
 
-#: src/elfcompress.c:149 src/elfcompress.c:1352
-#, fuzzy, c-format
+#: src/elfcompress.c:151 src/elfcompress.c:1350
+#, c-format
 msgid "Only one input file allowed together with '-o'"
-msgstr "'-o' と '-f' と一緒の場合は入力ファイルは 1 つしか認められません"
+msgstr "'-o' と一緒の場合は入力ファイルは 1 つしか認められません"
 
-#: src/elfcompress.c:1309
-#, fuzzy
+#: src/elfcompress.c:1307
 msgid "Place (de)compressed output into FILE"
-msgstr "はぎ取った出力を ふぁいる に置く"
+msgstr "圧縮(展開)した出力を FILE に置く"
 
-#: src/elfcompress.c:1312
+#: src/elfcompress.c:1310
 msgid ""
 "What type of compression to apply. TYPE can be 'none' (decompress), "
 "'zlib' (ELF ZLIB compression, the default, 'zlib-gabi' is an alias) or 'zlib-"
 "gnu' (.zdebug GNU style compression, 'gnu' is an alias)"
 msgstr ""
 
-#: src/elfcompress.c:1315
+#: src/elfcompress.c:1313
 msgid ""
 "SECTION name to (de)compress, SECTION is an extended wildcard pattern "
 "(defaults to '.?(z)debug*')"
 msgstr ""
+"圧縮(展開)する セクション名。 SECTION は 拡張 ワイルドカード パターン(デ"
+"フォルトで  '.?(z)debug*')"
 
-#: src/elfcompress.c:1318
+#: src/elfcompress.c:1316
 msgid "Print a message for each section being (de)compressed"
-msgstr ""
+msgstr "圧縮(展開) されている 各セクション に対する メッセージを 表示"
 
-#: src/elfcompress.c:1321
+#: src/elfcompress.c:1319
 msgid ""
 "Force compression of section even if it would become larger or update/"
 "rewrite the file even if no section would be (de)compressed"
 msgstr ""
 
-#: src/elfcompress.c:1324 src/strip.c:93
+#: src/elfcompress.c:1322 src/strip.c:93
 msgid "Relax a few rules to handle slightly broken ELF files"
 msgstr "少し壊れた ELF ファイルを取り扱うためにルールを少し緩和する"
 
-#: src/elfcompress.c:1327
-#, fuzzy
+#: src/elfcompress.c:1325
 msgid "Be silent when a section cannot be compressed"
-msgstr "セクション [%2d] '%s': セクションデータを得られません\n"
+msgstr "セクションを圧縮できないときに静かにする"
 
-#. Strings for arguments in help texts.
-#: src/elfcompress.c:1336 src/elflint.c:77 src/readelf.c:158
-msgid "FILE..."
-msgstr "ふぁいる..."
-
-#: src/elfcompress.c:1337
+#: src/elfcompress.c:1335
 msgid "Compress or decompress sections in an ELF file."
-msgstr ""
+msgstr "ELF ファイルの セクションを 圧縮 または 展開する"
 
 #: src/elflint.c:63
 msgid "Be extremely strict, flag level 2 features."
-msgstr "非常に厳密にやってください、フラグレベル 2 機能。"
+msgstr "非常に厳格にする。 フラグレベル 2 機能。"
 
 #: src/elflint.c:64
 msgid "Do not print anything if successful"
-msgstr "成功したら何も印刷しない"
+msgstr "成功した場合は何も表示しない"
 
 #: src/elflint.c:65
 msgid "Binary is a separate debuginfo file"
@@ -1497,7 +1692,8 @@
 "Binary has been created with GNU ld and is therefore known to be broken in "
 "certain ways"
 msgstr ""
-"バイナリーは GNU ld で作成され、従ってある方法で壊れているのが知られている"
+"バイナリーは GNU ld で作成され、 従って、 ある方法で 壊れることが 知られてい"
+"る"
 
 #. Short description of program.
 #: src/elflint.c:73
@@ -1505,14 +1701,14 @@
 msgstr "ELF ファイルが gABI/psABI 仕様へ準拠しているかの厳密なチェック。"
 
 #: src/elflint.c:154 src/readelf.c:368
-#, fuzzy, c-format
+#, c-format
 msgid "cannot open input file '%s'"
-msgstr "入力ファイルを開けません"
+msgstr "入力ファイル '%s' を開けません"
 
 #: src/elflint.c:161
-#, fuzzy, c-format
+#, c-format
 msgid "cannot generate Elf descriptor for '%s': %s\n"
-msgstr "Elf 記述子を生成できません: %s\n"
+msgstr "'%s' に対する Elf 記述子を生成できません: %s\n"
 
 #: src/elflint.c:180
 #, c-format
@@ -1530,7 +1726,7 @@
 #: src/elflint.c:284
 #, c-format
 msgid " error while freeing sub-ELF descriptor: %s\n"
-msgstr "副-ELF 記述子を解放している時にエラー: %s\n"
+msgstr "sub-ELF 記述子を解放している時にエラー: %s\n"
 
 #. We cannot do anything.
 #: src/elflint.c:292
@@ -1559,7 +1755,7 @@
 msgstr "不明な OS ABI e_ident[%d] == '%s'\n"
 
 #: src/elflint.c:380
-#, fuzzy, c-format
+#, c-format
 msgid "unsupported ABI version e_ident[%d] == %d\n"
 msgstr "不明な ABI バージョン e_ident[%d] == %d\n"
 
@@ -1625,7 +1821,7 @@
 msgstr ""
 
 #: src/elflint.c:487
-#, fuzzy, c-format
+#, c-format
 msgid "invalid number of program header table entries\n"
 msgstr "プログラムヘッダー項目数として不当な数\n"
 
@@ -1674,16 +1870,16 @@
 "一部分が設定されていません\n"
 
 #: src/elflint.c:594
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "section [%2d] '%s': section group [%2zu] '%s' does not precede group member\n"
 msgstr ""
-"セクション [%2d] '%s': セクショングループ [%2zu] '%s' がグループメンバーを継"
-"続していません\n"
+"セクション [%2d] '%s': セクショングループ [%2zu] '%s' がグループメンバーより"
+"前にありません\n"
 
 #: src/elflint.c:610 src/elflint.c:1498 src/elflint.c:1549 src/elflint.c:1655
 #: src/elflint.c:1991 src/elflint.c:2317 src/elflint.c:2943 src/elflint.c:3106
-#: src/elflint.c:3254 src/elflint.c:3444 src/elflint.c:4456
+#: src/elflint.c:3254 src/elflint.c:3456 src/elflint.c:4458
 #, c-format
 msgid "section [%2d] '%s': cannot get section data\n"
 msgstr "セクション [%2d] '%s': セクションデータを得られません\n"
@@ -2735,712 +2931,720 @@
 msgid "section [%2d] '%s': unknown parent version '%s'\n"
 msgstr ""
 
-#: src/elflint.c:3436
+#: src/elflint.c:3448
 #, c-format
 msgid "section [%2d] '%s': empty object attributes section\n"
 msgstr ""
 
-#: src/elflint.c:3457
+#: src/elflint.c:3464
 #, c-format
 msgid "section [%2d] '%s': unrecognized attribute format\n"
 msgstr ""
 
-#: src/elflint.c:3473
+#: src/elflint.c:3475
 #, c-format
 msgid ""
 "section [%2d] '%s': offset %zu: zero length field in attribute section\n"
 msgstr ""
 
-#: src/elflint.c:3482
+#: src/elflint.c:3484
 #, c-format
 msgid "section [%2d] '%s': offset %zu: invalid length in attribute section\n"
 msgstr ""
 
-#: src/elflint.c:3494
+#: src/elflint.c:3496
 #, c-format
 msgid "section [%2d] '%s': offset %zu: unterminated vendor name string\n"
 msgstr ""
 
-#: src/elflint.c:3511
+#: src/elflint.c:3513
 #, c-format
 msgid ""
 "section [%2d] '%s': offset %zu: endless ULEB128 in attribute subsection tag\n"
 msgstr ""
 
-#: src/elflint.c:3520
+#: src/elflint.c:3522
 #, c-format
 msgid "section [%2d] '%s': offset %zu: truncated attribute section\n"
 msgstr ""
 
-#: src/elflint.c:3529
+#: src/elflint.c:3531
 #, c-format
 msgid ""
 "section [%2d] '%s': offset %zu: zero length field in attribute subsection\n"
 msgstr ""
 
-#: src/elflint.c:3544
+#: src/elflint.c:3546
 #, c-format
 msgid ""
 "section [%2d] '%s': offset %zu: invalid length in attribute subsection\n"
 msgstr ""
 
 #. Tag_File
-#: src/elflint.c:3555
+#: src/elflint.c:3557
 #, c-format
 msgid ""
 "section [%2d] '%s': offset %zu: attribute subsection has unexpected tag %u\n"
 msgstr ""
 
-#: src/elflint.c:3573
+#: src/elflint.c:3575
 #, c-format
 msgid "section [%2d] '%s': offset %zu: endless ULEB128 in attribute tag\n"
 msgstr ""
 
-#: src/elflint.c:3584
+#: src/elflint.c:3586
 #, c-format
 msgid "section [%2d] '%s': offset %zu: unterminated string in attribute\n"
 msgstr ""
 
-#: src/elflint.c:3597
+#: src/elflint.c:3599
 #, c-format
 msgid "section [%2d] '%s': offset %zu: unrecognized attribute tag %u\n"
 msgstr ""
 
-#: src/elflint.c:3601
+#: src/elflint.c:3603
 #, c-format
 msgid ""
 "section [%2d] '%s': offset %zu: unrecognized %s attribute value %<PRIu64>\n"
 msgstr ""
 
-#: src/elflint.c:3611
+#: src/elflint.c:3613
 #, c-format
 msgid "section [%2d] '%s': offset %zu: vendor '%s' unknown\n"
 msgstr ""
 
-#: src/elflint.c:3617
+#: src/elflint.c:3619
 #, c-format
 msgid ""
 "section [%2d] '%s': offset %zu: extra bytes after last attribute section\n"
 msgstr ""
 
-#: src/elflint.c:3714
+#: src/elflint.c:3716
 #, c-format
 msgid "cannot get section header of zeroth section\n"
 msgstr ""
 
-#: src/elflint.c:3718
+#: src/elflint.c:3720
 #, c-format
 msgid "zeroth section has nonzero name\n"
 msgstr ""
 
-#: src/elflint.c:3720
+#: src/elflint.c:3722
 #, c-format
 msgid "zeroth section has nonzero type\n"
 msgstr ""
 
-#: src/elflint.c:3722
+#: src/elflint.c:3724
 #, c-format
 msgid "zeroth section has nonzero flags\n"
 msgstr ""
 
-#: src/elflint.c:3724
+#: src/elflint.c:3726
 #, c-format
 msgid "zeroth section has nonzero address\n"
 msgstr ""
 
-#: src/elflint.c:3726
+#: src/elflint.c:3728
 #, c-format
 msgid "zeroth section has nonzero offset\n"
 msgstr ""
 
-#: src/elflint.c:3728
+#: src/elflint.c:3730
 #, c-format
 msgid "zeroth section has nonzero align value\n"
 msgstr ""
 
-#: src/elflint.c:3730
+#: src/elflint.c:3732
 #, c-format
 msgid "zeroth section has nonzero entry size value\n"
 msgstr ""
 
-#: src/elflint.c:3733
+#: src/elflint.c:3735
 #, c-format
 msgid ""
 "zeroth section has nonzero size value while ELF header has nonzero shnum "
 "value\n"
 msgstr ""
 
-#: src/elflint.c:3737
+#: src/elflint.c:3739
 #, c-format
 msgid ""
 "zeroth section has nonzero link value while ELF header does not signal "
 "overflow in shstrndx\n"
 msgstr ""
 
-#: src/elflint.c:3741
+#: src/elflint.c:3743
 #, c-format
 msgid ""
 "zeroth section has nonzero link value while ELF header does not signal "
 "overflow in phnum\n"
 msgstr ""
 
-#: src/elflint.c:3759
+#: src/elflint.c:3761
 #, c-format
 msgid "cannot get section header for section [%2zu] '%s': %s\n"
 msgstr ""
 
-#: src/elflint.c:3768
+#: src/elflint.c:3770
 #, c-format
 msgid "section [%2zu]: invalid name\n"
 msgstr ""
 
-#: src/elflint.c:3795
+#: src/elflint.c:3797
 #, c-format
 msgid "section [%2d] '%s' has wrong type: expected %s, is %s\n"
 msgstr ""
 
-#: src/elflint.c:3812
+#: src/elflint.c:3814
 #, c-format
 msgid "section [%2zu] '%s' has wrong flags: expected %s, is %s\n"
 msgstr ""
 
-#: src/elflint.c:3830
+#: src/elflint.c:3832
 #, c-format
 msgid ""
 "section [%2zu] '%s' has wrong flags: expected %s and possibly %s, is %s\n"
 msgstr ""
 
-#: src/elflint.c:3847
+#: src/elflint.c:3849
 #, c-format
 msgid "section [%2zu] '%s' present in object file\n"
 msgstr ""
 
-#: src/elflint.c:3853 src/elflint.c:3885
+#: src/elflint.c:3855 src/elflint.c:3887
 #, c-format
 msgid ""
 "section [%2zu] '%s' has SHF_ALLOC flag set but there is no loadable segment\n"
 msgstr ""
 
-#: src/elflint.c:3858 src/elflint.c:3890
+#: src/elflint.c:3860 src/elflint.c:3892
 #, c-format
 msgid ""
 "section [%2zu] '%s' has SHF_ALLOC flag not set but there are loadable "
 "segments\n"
 msgstr ""
 
-#: src/elflint.c:3866
+#: src/elflint.c:3868
 #, c-format
 msgid ""
 "section [%2zu] '%s' is extension section index table in non-object file\n"
 msgstr ""
 
-#: src/elflint.c:3909
+#: src/elflint.c:3911
 #, c-format
 msgid "section [%2zu] '%s': size not multiple of entry size\n"
 msgstr ""
 
-#: src/elflint.c:3914
+#: src/elflint.c:3916
 #, c-format
 msgid "cannot get section header\n"
 msgstr ""
 
-#: src/elflint.c:3924
+#: src/elflint.c:3926
 #, c-format
 msgid "section [%2zu] '%s' has unsupported type %d\n"
 msgstr ""
 
-#: src/elflint.c:3944
+#: src/elflint.c:3946
 #, c-format
 msgid ""
 "section [%2zu] '%s' contains invalid processor-specific flag(s) %#<PRIx64>\n"
 msgstr ""
 
-#: src/elflint.c:3954
+#: src/elflint.c:3956
 #, c-format
 msgid "section [%2zu] '%s' contains unknown flag(s) %#<PRIx64>\n"
 msgstr ""
 
-#: src/elflint.c:3962
+#: src/elflint.c:3964
 #, c-format
 msgid "section [%2zu] '%s': thread-local data sections address not zero\n"
 msgstr ""
 
-#: src/elflint.c:3972
+#: src/elflint.c:3974
 #, fuzzy, c-format
 msgid "section [%2zu] '%s': allocated section cannot be compressed\n"
 msgstr "セクション [%2d] '%s': セクションデータを得られません\n"
 
-#: src/elflint.c:3977
+#: src/elflint.c:3979
 #, fuzzy, c-format
 msgid "section [%2zu] '%s': nobits section cannot be compressed\n"
 msgstr "セクション [%2d] '%s': セクションデータを得られません\n"
 
-#: src/elflint.c:3983
+#: src/elflint.c:3985
 #, c-format
 msgid ""
 "section [%2zu] '%s': compressed section with no compression header: %s\n"
 msgstr ""
 
-#: src/elflint.c:3989
+#: src/elflint.c:3991
 #, c-format
 msgid "section [%2zu] '%s': invalid section reference in link value\n"
 msgstr ""
 
-#: src/elflint.c:3994
+#: src/elflint.c:3996
 #, c-format
 msgid "section [%2zu] '%s': invalid section reference in info value\n"
 msgstr ""
 
-#: src/elflint.c:4001
+#: src/elflint.c:4003
 #, c-format
 msgid "section [%2zu] '%s': strings flag set without merge flag\n"
 msgstr ""
 
-#: src/elflint.c:4006
+#: src/elflint.c:4008
 #, c-format
 msgid "section [%2zu] '%s': merge flag set but entry size is zero\n"
 msgstr ""
 
-#: src/elflint.c:4025
+#: src/elflint.c:4027
 #, c-format
 msgid "section [%2zu] '%s' has unexpected type %d for an executable section\n"
 msgstr ""
 
-#: src/elflint.c:4034
+#: src/elflint.c:4036
 #, c-format
 msgid "section [%2zu] '%s' must be of type NOBITS in debuginfo files\n"
 msgstr ""
 
-#: src/elflint.c:4041
+#: src/elflint.c:4043
 #, c-format
 msgid "section [%2zu] '%s' is both executable and writable\n"
 msgstr ""
 
-#: src/elflint.c:4072
+#: src/elflint.c:4074
 #, c-format
 msgid ""
 "section [%2zu] '%s' not fully contained in segment of program header entry "
 "%d\n"
 msgstr ""
 
-#: src/elflint.c:4082
+#: src/elflint.c:4084
 #, c-format
 msgid ""
 "section [%2zu] '%s' has type NOBITS but is read from the file in segment of "
 "program header entry %d\n"
 msgstr ""
 
-#: src/elflint.c:4108
+#: src/elflint.c:4110
 #, c-format
 msgid ""
 "section [%2zu] '%s' has type NOBITS but is read from the file in segment of "
 "program header entry %d and file contents is non-zero\n"
 msgstr ""
 
-#: src/elflint.c:4119
+#: src/elflint.c:4121
 #, c-format
 msgid ""
 "section [%2zu] '%s' has not type NOBITS but is not read from the file in "
 "segment of program header entry %d\n"
 msgstr ""
 
-#: src/elflint.c:4130
+#: src/elflint.c:4132
 #, c-format
 msgid "section [%2zu] '%s' is executable in nonexecutable segment %d\n"
 msgstr ""
 
-#: src/elflint.c:4140
+#: src/elflint.c:4142
 #, c-format
 msgid "section [%2zu] '%s' is writable in unwritable segment %d\n"
 msgstr ""
 
-#: src/elflint.c:4150
+#: src/elflint.c:4152
 #, c-format
 msgid ""
 "section [%2zu] '%s': alloc flag set but section not in any loaded segment\n"
 msgstr ""
 
-#: src/elflint.c:4156
+#: src/elflint.c:4158
 #, c-format
 msgid ""
 "section [%2zu] '%s': ELF header says this is the section header string table "
 "but type is not SHT_TYPE\n"
 msgstr ""
 
-#: src/elflint.c:4164
+#: src/elflint.c:4166
 #, c-format
 msgid ""
 "section [%2zu] '%s': relocatable files cannot have dynamic symbol tables\n"
 msgstr ""
 
-#: src/elflint.c:4215
+#: src/elflint.c:4217
 #, c-format
 msgid "more than one version symbol table present\n"
 msgstr ""
 
-#: src/elflint.c:4238
+#: src/elflint.c:4240
 #, c-format
 msgid "INTERP program header entry but no .interp section\n"
 msgstr ""
 
-#: src/elflint.c:4249
+#: src/elflint.c:4251
 #, c-format
 msgid ""
 "loadable segment [%u] is executable but contains no executable sections\n"
 msgstr ""
 
-#: src/elflint.c:4255
+#: src/elflint.c:4257
 #, c-format
 msgid "loadable segment [%u] is writable but contains no writable sections\n"
 msgstr ""
 
-#: src/elflint.c:4266
+#: src/elflint.c:4268
 #, c-format
 msgid ""
 "no .gnu.versym section present but .gnu.versym_d or .gnu.versym_r section "
 "exist\n"
 msgstr ""
 
-#: src/elflint.c:4279
+#: src/elflint.c:4281
 #, c-format
 msgid "duplicate version index %d\n"
 msgstr ""
 
-#: src/elflint.c:4293
+#: src/elflint.c:4295
 #, c-format
 msgid ".gnu.versym section present without .gnu.versym_d or .gnu.versym_r\n"
 msgstr ""
 
-#: src/elflint.c:4342
+#: src/elflint.c:4344
 #, c-format
 msgid "phdr[%d]: unknown core file note type %<PRIu32> at offset %<PRIu64>\n"
 msgstr ""
 
-#: src/elflint.c:4346
+#: src/elflint.c:4348
 #, c-format
 msgid ""
 "section [%2d] '%s': unknown core file note type %<PRIu32> at offset %zu\n"
 msgstr ""
 
-#: src/elflint.c:4395
+#: src/elflint.c:4397
 #, c-format
 msgid ""
 "phdr[%d]: unknown object file note type %<PRIu32> with owner name '%s' at "
 "offset %zu\n"
 msgstr ""
 
-#: src/elflint.c:4400
+#: src/elflint.c:4402
 #, c-format
 msgid ""
 "section [%2d] '%s': unknown object file note type %<PRIu32> with owner name "
 "'%s' at offset %zu\n"
 msgstr ""
 
-#: src/elflint.c:4419
+#: src/elflint.c:4421
 #, c-format
 msgid "phdr[%d]: no note entries defined for the type of file\n"
 msgstr ""
 
-#: src/elflint.c:4439
+#: src/elflint.c:4441
 #, c-format
 msgid "phdr[%d]: cannot get content of note section: %s\n"
 msgstr ""
 
-#: src/elflint.c:4442
+#: src/elflint.c:4444
 #, c-format
 msgid "phdr[%d]: extra %<PRIu64> bytes after last note\n"
 msgstr ""
 
-#: src/elflint.c:4463
+#: src/elflint.c:4465
 #, c-format
 msgid "section [%2d] '%s': no note entries defined for the type of file\n"
 msgstr ""
 
-#: src/elflint.c:4470
+#: src/elflint.c:4472
 #, c-format
 msgid "section [%2d] '%s': cannot get content of note section\n"
 msgstr ""
 
-#: src/elflint.c:4473
+#: src/elflint.c:4475
 #, c-format
 msgid "section [%2d] '%s': extra %<PRIu64> bytes after last note\n"
 msgstr ""
 
-#: src/elflint.c:4491
+#: src/elflint.c:4493
 #, c-format
 msgid ""
 "only executables, shared objects, and core files can have program headers\n"
 msgstr ""
 
-#: src/elflint.c:4506
+#: src/elflint.c:4508
 #, c-format
 msgid "cannot get program header entry %d: %s\n"
 msgstr ""
 
-#: src/elflint.c:4516
+#: src/elflint.c:4518
 #, c-format
 msgid "program header entry %d: unknown program header entry type %#<PRIx64>\n"
 msgstr ""
 
-#: src/elflint.c:4527
+#: src/elflint.c:4529
 #, c-format
 msgid "more than one INTERP entry in program header\n"
 msgstr ""
 
-#: src/elflint.c:4535
+#: src/elflint.c:4537
 #, c-format
 msgid "more than one TLS entry in program header\n"
 msgstr ""
 
-#: src/elflint.c:4542
+#: src/elflint.c:4544
 #, c-format
 msgid "static executable cannot have dynamic sections\n"
 msgstr ""
 
-#: src/elflint.c:4556
+#: src/elflint.c:4558
 #, c-format
 msgid "dynamic section reference in program header has wrong offset\n"
 msgstr ""
 
-#: src/elflint.c:4559
+#: src/elflint.c:4561
 #, c-format
 msgid "dynamic section size mismatch in program and section header\n"
 msgstr ""
 
-#: src/elflint.c:4569
+#: src/elflint.c:4571
 #, c-format
 msgid "more than one GNU_RELRO entry in program header\n"
 msgstr ""
 
-#: src/elflint.c:4590
+#: src/elflint.c:4592
 #, c-format
 msgid "loadable segment GNU_RELRO applies to is not writable\n"
 msgstr ""
 
-#: src/elflint.c:4601
+#: src/elflint.c:4603
 #, c-format
 msgid "loadable segment [%u] flags do not match GNU_RELRO [%u] flags\n"
 msgstr ""
 
-#: src/elflint.c:4608
+#: src/elflint.c:4610
 #, c-format
 msgid ""
 "GNU_RELRO [%u] flags are not a subset of the loadable segment [%u] flags\n"
 msgstr ""
 
-#: src/elflint.c:4617 src/elflint.c:4640
+#: src/elflint.c:4619 src/elflint.c:4642
 #, c-format
 msgid "%s segment not contained in a loaded segment\n"
 msgstr ""
 
-#: src/elflint.c:4646
+#: src/elflint.c:4648
 #, c-format
 msgid "program header offset in ELF header and PHDR entry do not match"
 msgstr ""
 
-#: src/elflint.c:4673
+#: src/elflint.c:4675
 #, c-format
 msgid "call frame search table reference in program header has wrong offset\n"
 msgstr ""
 
-#: src/elflint.c:4676
+#: src/elflint.c:4678
 #, c-format
 msgid "call frame search table size mismatch in program and section header\n"
 msgstr ""
 
-#: src/elflint.c:4689
+#: src/elflint.c:4691
 #, c-format
 msgid "PT_GNU_EH_FRAME present but no .eh_frame_hdr section\n"
 msgstr ""
 
-#: src/elflint.c:4697
+#: src/elflint.c:4699
 #, c-format
 msgid "call frame search table must be allocated\n"
 msgstr ""
 
-#: src/elflint.c:4700
+#: src/elflint.c:4702
 #, c-format
 msgid "section [%2zu] '%s' must be allocated\n"
 msgstr ""
 
-#: src/elflint.c:4704
+#: src/elflint.c:4706
 #, c-format
 msgid "call frame search table must not be writable\n"
 msgstr ""
 
-#: src/elflint.c:4707
+#: src/elflint.c:4709
 #, c-format
 msgid "section [%2zu] '%s' must not be writable\n"
 msgstr ""
 
-#: src/elflint.c:4712
+#: src/elflint.c:4714
 #, c-format
 msgid "call frame search table must not be executable\n"
 msgstr ""
 
-#: src/elflint.c:4715
+#: src/elflint.c:4717
 #, c-format
 msgid "section [%2zu] '%s' must not be executable\n"
 msgstr ""
 
-#: src/elflint.c:4726
+#: src/elflint.c:4728
 #, c-format
 msgid "program header entry %d: file size greater than memory size\n"
 msgstr ""
 
-#: src/elflint.c:4733
+#: src/elflint.c:4735
 #, c-format
 msgid "program header entry %d: alignment not a power of 2\n"
 msgstr ""
 
-#: src/elflint.c:4736
+#: src/elflint.c:4738
 #, c-format
 msgid ""
 "program header entry %d: file offset and virtual address not module of "
 "alignment\n"
 msgstr ""
 
-#: src/elflint.c:4749
+#: src/elflint.c:4751
 #, c-format
 msgid ""
 "executable/DSO with .eh_frame_hdr section does not have a PT_GNU_EH_FRAME "
 "program header entry"
 msgstr ""
 
-#: src/elflint.c:4783
+#: src/elflint.c:4785
 #, c-format
 msgid "cannot read ELF header: %s\n"
 msgstr ""
 
-#: src/elflint.c:4795
+#: src/elflint.c:4797
 #, fuzzy, c-format
 msgid "cannot create backend for ELF file\n"
 msgstr "新しいファイルを生成できません"
 
-#: src/elflint.c:4816
+#: src/elflint.c:4818
 #, c-format
 msgid "text relocation flag set but not needed\n"
 msgstr ""
 
-#: src/findtextrel.c:60
-msgid "Input Selection:"
-msgstr ""
-
 #: src/findtextrel.c:61
-msgid "Prepend PATH to all file names"
-msgstr ""
+msgid "Input Selection:"
+msgstr "入力選択:"
 
-#: src/findtextrel.c:63
+#: src/findtextrel.c:62
+msgid "Prepend PATH to all file names"
+msgstr "全ての ファイル名に対して PATH を先頭に 付け加える"
+
+#: src/findtextrel.c:64
 msgid "Use PATH as root of debuginfo hierarchy"
-msgstr ""
+msgstr "debuginfo 階層の ルートとして PATH を使用する"
 
 #. Short description of program.
-#: src/findtextrel.c:70
+#: src/findtextrel.c:71
 msgid "Locate source of text relocations in FILEs (a.out by default)."
 msgstr ""
+"FILE (デフォルトでは a.out)の テキスト リロケーションの ソースを 検索する"
 
 #. Strings for arguments in help texts.
-#: src/findtextrel.c:74 src/nm.c:108 src/objdump.c:71 src/size.c:80
+#: src/findtextrel.c:75 src/nm.c:108 src/objdump.c:71 src/size.c:80
 #: src/strings.c:87 src/strip.c:101
 msgid "[FILE...]"
-msgstr "[ふぁいる...]"
+msgstr ""
 
-#: src/findtextrel.c:222
+#: src/findtextrel.c:224
 #, c-format
 msgid "cannot get ELF header '%s': %s"
-msgstr ""
+msgstr "ELF ヘッダー '%s' を取得できません: %s"
 
-#: src/findtextrel.c:233
+#: src/findtextrel.c:235
 #, c-format
 msgid "'%s' is not a DSO or PIE"
-msgstr ""
+msgstr "'%s' は DSO または PIE ではありません"
 
-#: src/findtextrel.c:253
+#: src/findtextrel.c:255
 #, c-format
 msgid "getting get section header of section %zu: %s"
 msgstr ""
 
-#: src/findtextrel.c:277
+#: src/findtextrel.c:279
 #, c-format
 msgid "cannot read dynamic section: %s"
-msgstr ""
+msgstr "dynamic セクションを読み込めません: %s"
 
-#: src/findtextrel.c:298
+#: src/findtextrel.c:300
 #, c-format
 msgid "no text relocations reported in '%s'"
 msgstr ""
 
-#: src/findtextrel.c:310
+#: src/findtextrel.c:311
 #, c-format
 msgid "while reading ELF file"
-msgstr ""
+msgstr "ELF ファイルの読み込み中"
 
-#: src/findtextrel.c:314
-#, fuzzy, c-format
+#: src/findtextrel.c:315
+#, c-format
 msgid "cannot get program header count: %s"
-msgstr "プログラムヘッダーを得られません: %s"
+msgstr "プログラムヘッダー数を取得できません: %s"
 
-#: src/findtextrel.c:325 src/findtextrel.c:342
-#, fuzzy, c-format
+#: src/findtextrel.c:326 src/findtextrel.c:341
+#, c-format
 msgid "cannot get program header index at offset %zd: %s"
-msgstr "プログラムヘッダーを得られません: %s"
+msgstr "オフセット %zd に位置するプログラムヘッダー索引を取得できません: %s"
 
-#: src/findtextrel.c:406
+#: src/findtextrel.c:397
 #, c-format
 msgid "cannot get symbol table section %zu in '%s': %s"
 msgstr ""
 
-#: src/findtextrel.c:427 src/findtextrel.c:450
+#: src/findtextrel.c:418 src/findtextrel.c:441
 #, c-format
 msgid "cannot get relocation at index %d in section %zu in '%s': %s"
 msgstr ""
 
-#: src/findtextrel.c:516
+#: src/findtextrel.c:507
 #, c-format
 msgid "%s not compiled with -fpic/-fPIC\n"
-msgstr ""
+msgstr "%s は -fpic/-fPIC 付きでコンパイルされていません\n"
 
-#: src/findtextrel.c:570
+#: src/findtextrel.c:561
 #, c-format
 msgid ""
 "the file containing the function '%s' is not compiled with -fpic/-fPIC\n"
 msgstr ""
+"関数 '%s' を含むファイルは -fpic/-fPIC 付きでコンパイルされていません\n"
 
-#: src/findtextrel.c:577 src/findtextrel.c:597
+#: src/findtextrel.c:568 src/findtextrel.c:588
 #, c-format
 msgid ""
 "the file containing the function '%s' might not be compiled with -fpic/-"
 "fPIC\n"
 msgstr ""
+"関数 '%s' を含むファイルは -fpic/-fPIC 付きでコンパイルされていないかもしれま"
+"せん\n"
 
-#: src/findtextrel.c:585
+#: src/findtextrel.c:576
 #, c-format
 msgid ""
 "either the file containing the function '%s' or the file containing the "
 "function '%s' is not compiled with -fpic/-fPIC\n"
 msgstr ""
+"関数 '%s' を含むファイル または 関数 '%s' を含むファイルは -fpic/-fPIC 付きで"
+"コンパイルされていません\n"
 
-#: src/findtextrel.c:605
+#: src/findtextrel.c:596
 #, c-format
 msgid ""
 "a relocation modifies memory at offset %llu in a write-protected segment\n"
 msgstr ""
+"リロケーションは 書き込み禁止セグメントの オフセット %llu に位置するメモリを "
+"修正します\n"
 
 #: src/nm.c:66 src/strip.c:70
 msgid "Output selection:"
-msgstr "出力選択:"
+msgstr "出力選択:"
 
 #: src/nm.c:67
 msgid "Display debugger-only symbols"
-msgstr "デバッガー専用シンボルを表示"
+msgstr "デバッガ専用シンボルを表示"
 
 #: src/nm.c:68
 msgid "Display only defined symbols"
-msgstr "定義されたシンボルのみを表示"
+msgstr "定義済みシンボルのみを表示"
 
 #: src/nm.c:71
 msgid "Display dynamic symbols instead of normal symbols"
-msgstr "通常シンボルの代わりに動的シンボルを表示"
+msgstr "通常シンボルの 代わりに 動的シンボルを 表示"
 
 #: src/nm.c:72
 msgid "Display only external symbols"
@@ -3452,23 +3656,23 @@
 
 #: src/nm.c:75
 msgid "Include index for symbols from archive members"
-msgstr "アーカイブメンバーからのシンボルの索引を含める"
+msgstr "アーカイブメンバからの シンボルの 索引を 含める"
 
 #: src/nm.c:77 src/size.c:54
 msgid "Output format:"
-msgstr "出力形式:"
+msgstr "出力形式:"
 
 #: src/nm.c:79
 msgid "Print name of the input file before every symbol"
-msgstr "全てのシンボルの前に入力ファイル名を印刷"
+msgstr "各シンボルの 前に 入力ファイル名を 表示"
 
 #: src/nm.c:82
 msgid ""
 "Use the output format FORMAT.  FORMAT can be `bsd', `sysv' or `posix'.  The "
 "default is `sysv'"
 msgstr ""
-"出力形式として FORMATを使う。FORMAT は `bsd'か、`sysv'、`posix' のどれか。省"
-"略値は `sysv'"
+"出力形式として FORMAT を使う。 FORMAT は `bsd'、`sysv'、`posix' のいずれか。"
+"デフォルトは `sysv'"
 
 #: src/nm.c:84
 msgid "Same as --format=bsd"
@@ -3480,24 +3684,23 @@
 
 #: src/nm.c:86 src/size.c:60
 msgid "Use RADIX for printing symbol values"
-msgstr "シンボル値を印刷するために RADIX を使う"
+msgstr "シンボル値の 表示に RADIX を使う"
 
 #: src/nm.c:87
-#, fuzzy
 msgid "Mark special symbols"
-msgstr "弱いシンボルに印を点ける"
+msgstr "特別なシンボルに印を点ける"
 
 #: src/nm.c:89
 msgid "Print size of defined symbols"
-msgstr "定義されたシンボルの印刷サイズ"
+msgstr "定義済みシンボルのサイズを表示"
 
 #: src/nm.c:91 src/size.c:68 src/strip.c:75 src/unstrip.c:69
 msgid "Output options:"
-msgstr "出力オプション:"
+msgstr "出力オプション:"
 
 #: src/nm.c:92
 msgid "Sort symbols numerically by address"
-msgstr "シンボルをアドレスにより数値的に並べ替える"
+msgstr "シンボルを アドレスにより 数値的に 並べ替える"
 
 #: src/nm.c:94
 msgid "Do not sort the symbols"
@@ -3509,17 +3712,16 @@
 
 #: src/nm.c:98
 msgid "Decode low-level symbol names into source code names"
-msgstr ""
+msgstr "低水準の シンボル名を ソースコード上の 名前に デコードする"
 
 #. Short description of program.
 #: src/nm.c:105
 msgid "List symbols from FILEs (a.out by default)."
-msgstr "ふぁいる からシンボルを表示 (デフォルトではa.out)。"
+msgstr "FILE のシンボルを一覧表示 (デフォルトではa.out)。"
 
 #: src/nm.c:116 src/objdump.c:79
-#, fuzzy
 msgid "Output formatting"
-msgstr "出力形式:"
+msgstr "出力形式:"
 
 #: src/nm.c:140 src/objdump.c:103 src/size.c:105 src/strip.c:133
 #, fuzzy, c-format
@@ -3527,12 +3729,12 @@
 msgstr "%s: 内部エラー %d (%s-%s): %s"
 
 #: src/nm.c:381 src/nm.c:393 src/size.c:288 src/size.c:297 src/size.c:308
-#: src/strip.c:2763
+#: src/strip.c:2767
 #, c-format
 msgid "while closing '%s'"
 msgstr "'%s' を閉じている最中"
 
-#: src/nm.c:403 src/objdump.c:280 src/strip.c:818
+#: src/nm.c:403 src/objdump.c:280 src/strip.c:822
 #, c-format
 msgid "%s: File format not recognized"
 msgstr "%s: ファイル形式を認識できませんでした"
@@ -3567,24 +3769,24 @@
 msgid "%s%s%s: file format not recognized"
 msgstr "%s%s%s: ファイル形式を認識できません"
 
-#: src/nm.c:705
+#: src/nm.c:704
 #, c-format
 msgid "cannot create search tree"
 msgstr "検索ツリーを生成できません"
 
-#: src/nm.c:746 src/nm.c:1239 src/objdump.c:782 src/readelf.c:637
+#: src/nm.c:745 src/nm.c:1238 src/objdump.c:781 src/readelf.c:637
 #: src/readelf.c:1451 src/readelf.c:1602 src/readelf.c:1803 src/readelf.c:2009
-#: src/readelf.c:2199 src/readelf.c:2377 src/readelf.c:2453 src/readelf.c:2711
-#: src/readelf.c:2787 src/readelf.c:2874 src/readelf.c:3472 src/readelf.c:3522
-#: src/readelf.c:3592 src/readelf.c:11328 src/readelf.c:12523
-#: src/readelf.c:12734 src/readelf.c:12803 src/size.c:398 src/size.c:470
-#: src/strip.c:1084
+#: src/readelf.c:2199 src/readelf.c:2377 src/readelf.c:2453 src/readelf.c:2719
+#: src/readelf.c:2795 src/readelf.c:2882 src/readelf.c:3478 src/readelf.c:3528
+#: src/readelf.c:3598 src/readelf.c:11409 src/readelf.c:12603
+#: src/readelf.c:12814 src/readelf.c:12883 src/size.c:398 src/size.c:470
+#: src/strip.c:1089
 #, c-format
 msgid "cannot get section header string table index"
 msgstr "セクションヘッダー文字列テーブル索引が得られません"
 
 #. We always print this prolog.
-#: src/nm.c:771
+#: src/nm.c:770
 #, c-format
 msgid ""
 "\n"
@@ -3598,7 +3800,7 @@
 "\n"
 
 #. The header line.
-#: src/nm.c:774
+#: src/nm.c:773
 #, c-format
 msgid ""
 "%*s%-*s %-*s Class  Type     %-*s %*s Section\n"
@@ -3607,61 +3809,83 @@
 "%*s%-*s %-*s クラス タイプ   %-*s %*s セクション\n"
 "\n"
 
-#: src/nm.c:1250
+#: src/nm.c:775
+msgctxt "sysv"
+msgid "Name"
+msgstr ""
+
+#. TRANS: the "sysv|" parts makes the string unique.
+#: src/nm.c:777
+msgctxt "sysv"
+msgid "Value"
+msgstr ""
+
+#. TRANS: the "sysv|" parts makes the string unique.
+#: src/nm.c:779
+msgctxt "sysv"
+msgid "Size"
+msgstr ""
+
+#. TRANS: the "sysv|" parts makes the string unique.
+#: src/nm.c:781
+msgctxt "sysv"
+msgid "Line"
+msgstr ""
+
+#: src/nm.c:1249
 #, fuzzy, c-format
 msgid "%s: entry size in section %zd `%s' is not what we expect"
 msgstr "%s: セクションの項目の大きさ `%s' は予期したものとは異なります"
 
-#: src/nm.c:1255
+#: src/nm.c:1254
 #, fuzzy, c-format
 msgid "%s: size of section %zd `%s' is not multiple of entry size"
 msgstr "%s: セクション `%s' の大きさは項目の大きさの整数倍ではありません"
 
-#: src/nm.c:1334
+#: src/nm.c:1335
 #, fuzzy, c-format
 msgid "%s: entries (%zd) in section %zd `%s' is too large"
 msgstr "%s: セクションの項目の大きさ `%s' は予期したものとは異なります"
 
 #. XXX Add machine specific object file types.
-#: src/nm.c:1570
+#: src/nm.c:1571
 #, c-format
 msgid "%s%s%s%s: Invalid operation"
 msgstr "%s%s%s%s: 不当な操作"
 
-#: src/nm.c:1620
+#: src/nm.c:1621
 #, c-format
 msgid "%s%s%s: no symbols"
 msgstr "%s%s%s: シンボルがありません"
 
 #: src/objdump.c:52
 msgid "Mode selection:"
-msgstr ""
+msgstr "モード選択:"
 
 #: src/objdump.c:53
 msgid "Display relocation information."
-msgstr ""
+msgstr "リロケーション 情報の 表示"
 
 #: src/objdump.c:55
 msgid "Display the full contents of all sections requested"
-msgstr ""
+msgstr "要求された 全ての セクションの 最大限の 内容を 表示"
 
 #: src/objdump.c:57
 msgid "Display assembler code of executable sections"
-msgstr ""
+msgstr "実行可能 セクションの アセンブラコードを 表示"
 
 #: src/objdump.c:59
-#, fuzzy
 msgid "Output content selection:"
-msgstr "出力選択:"
+msgstr "出力内容選択:"
 
 #: src/objdump.c:61
 msgid "Only display information for section NAME."
-msgstr ""
+msgstr "NAME セクションの情報のみを表示"
 
 #. Short description of program.
 #: src/objdump.c:67
 msgid "Show information from FILEs (a.out by default)."
-msgstr ""
+msgstr "FILE から情報を表示する (デフォルトでは a.out)"
 
 #: src/objdump.c:218 src/readelf.c:582
 msgid "No operation specified.\n"
@@ -3700,17 +3924,17 @@
 #: src/objdump.c:687
 #, c-format
 msgid "cannot disassemble"
-msgstr ""
+msgstr "逆アセンブルできません"
 
-#: src/objdump.c:760
-#, fuzzy, c-format
+#: src/objdump.c:759
+#, c-format
 msgid "cannot create backend for elf file"
-msgstr "新しいファイルを生成できません"
+msgstr "elf ファイル用にバックエンドを作成できません"
 
 #. Short description of program.
 #: src/ranlib.c:63
 msgid "Generate an index to speed access to archives."
-msgstr ""
+msgstr "アーカイブへのアクセス加速のための索引生成"
 
 #. Strings for arguments in help texts.
 #: src/ranlib.c:66
@@ -3720,12 +3944,12 @@
 #: src/ranlib.c:102
 #, c-format
 msgid "Archive name required"
-msgstr ""
+msgstr "アーカイブ名が必要です"
 
 #: src/ranlib.c:166
 #, c-format
 msgid "'%s' is no archive"
-msgstr ""
+msgstr "'%s' はアーカイブではありません"
 
 #: src/ranlib.c:201
 #, c-format
@@ -3733,14 +3957,14 @@
 msgstr ""
 
 #: src/readelf.c:97
-#, fuzzy
 msgid "ELF input selection:"
-msgstr "出力選択:"
+msgstr "ELF入力選択:"
 
 #: src/readelf.c:99
 msgid ""
 "Use the named SECTION (default .gnu_debugdata) as (compressed) ELF input data"
 msgstr ""
+"ELF 入力データとして SECTION (デフォルトでは .gnu_debugdata) を使用する"
 
 #: src/readelf.c:102
 msgid ""
@@ -3749,9 +3973,8 @@
 msgstr ""
 
 #: src/readelf.c:104
-#, fuzzy
 msgid "ELF output selection:"
-msgstr "出力選択:"
+msgstr "ELF出力選択:"
 
 #: src/readelf.c:106
 msgid "All these plus -p .strtab -p .dynstr -p .comment"
@@ -3767,7 +3990,7 @@
 
 #: src/readelf.c:110
 msgid "Display histogram of bucket list lengths"
-msgstr "バケットリスト長の柱状図を表示"
+msgstr "バケットリスト長のヒストグラムを表示"
 
 #: src/readelf.c:111
 msgid "Display the program headers"
@@ -3778,47 +4001,40 @@
 msgstr "リロケーションを表示"
 
 #: src/readelf.c:114
-#, fuzzy
 msgid "Display the section groups"
-msgstr "セクションのヘッダーを表示"
+msgstr "セクショングループを表示"
 
 #: src/readelf.c:115
-#, fuzzy
 msgid "Display the sections' headers"
-msgstr "セクションのヘッダーを表示"
+msgstr "セクションヘッダーを表示"
 
 #: src/readelf.c:118
-#, fuzzy
 msgid "Display the symbol table sections"
-msgstr "シンボルテーブルを表示"
+msgstr "シンボルテーブルセクションを表示"
 
 #: src/readelf.c:120
-#, fuzzy
 msgid "Display (only) the dynamic symbol table"
-msgstr "外部シンボルのみを表示"
+msgstr "動的シンボルテーブル(のみ)を表示"
 
 #: src/readelf.c:121
 msgid "Display versioning information"
-msgstr "バージョニング情報の表示"
+msgstr "バージョニング情報を表示"
 
 #: src/readelf.c:122
-#, fuzzy
 msgid "Display the ELF notes"
-msgstr "コアノートを表示"
+msgstr "ELF notes を表示"
 
 #: src/readelf.c:124
-#, fuzzy
 msgid "Display architecture specific information, if any"
 msgstr "(もしあれば)アーキテクチャー固有の情報を表示"
 
 #: src/readelf.c:126
 msgid "Display sections for exception handling"
-msgstr "例外を取り扱うためのセクションを表示"
+msgstr "例外ハンドリングのセクションを表示"
 
 #: src/readelf.c:128
-#, fuzzy
 msgid "Additional output selection:"
-msgstr "出力選択:"
+msgstr "追加の出力選択:"
 
 #: src/readelf.c:130
 #, fuzzy
@@ -3832,11 +4048,11 @@
 
 #: src/readelf.c:134
 msgid "Dump the uninterpreted contents of SECTION, by number or name"
-msgstr "数字か名前で解釈できないセクションの内容をダンプする"
+msgstr "SECTION の 未解釈の 内容を ダンプする。 番号 または 名前で指定する"
 
 #: src/readelf.c:136
 msgid "Print string contents of sections"
-msgstr "セクションの文字列内容を印刷する"
+msgstr "セクションの文字列内容を表示"
 
 #: src/readelf.c:139
 msgid "Display the symbol index of an archive"
@@ -3844,7 +4060,7 @@
 
 #: src/readelf.c:141
 msgid "Output control:"
-msgstr "出力制御:"
+msgstr "出力制御:"
 
 #: src/readelf.c:143
 msgid "Do not find symbol names for addresses in DWARF data"
@@ -3869,7 +4085,7 @@
 #. Short description of program.
 #: src/readelf.c:154
 msgid "Print information from ELF file in human-readable form."
-msgstr "ELF ファイルから人間が読める形で情報を印刷する。"
+msgstr "ELF ファイルから人間が読める形で情報を表示する。"
 
 #. Look up once.
 #: src/readelf.c:350
@@ -3890,7 +4106,7 @@
 msgid "cannot generate Elf descriptor: %s"
 msgstr "Elf 記述子を生成できません: %s"
 
-#: src/readelf.c:628 src/readelf.c:955 src/strip.c:1179
+#: src/readelf.c:628 src/readelf.c:955 src/strip.c:1184
 #, c-format
 msgid "cannot determine number of sections: %s"
 msgstr "セクション数を決定できません: %s"
@@ -3898,37 +4114,37 @@
 #: src/readelf.c:646 src/readelf.c:1265 src/readelf.c:1475
 #, c-format
 msgid "cannot get section: %s"
-msgstr "セクションを得られません: %s"
+msgstr "セクションを取得できません: %s"
 
-#: src/readelf.c:655 src/readelf.c:1272 src/readelf.c:1483 src/readelf.c:12754
-#: src/unstrip.c:397 src/unstrip.c:428 src/unstrip.c:487 src/unstrip.c:608
-#: src/unstrip.c:629 src/unstrip.c:669 src/unstrip.c:885 src/unstrip.c:1216
-#: src/unstrip.c:1343 src/unstrip.c:1367 src/unstrip.c:1423 src/unstrip.c:1487
-#: src/unstrip.c:1662 src/unstrip.c:1813 src/unstrip.c:1956 src/unstrip.c:2055
+#: src/readelf.c:655 src/readelf.c:1272 src/readelf.c:1483 src/readelf.c:12834
+#: src/unstrip.c:397 src/unstrip.c:428 src/unstrip.c:491 src/unstrip.c:612
+#: src/unstrip.c:633 src/unstrip.c:673 src/unstrip.c:889 src/unstrip.c:1224
+#: src/unstrip.c:1351 src/unstrip.c:1375 src/unstrip.c:1431 src/unstrip.c:1472
+#: src/unstrip.c:1665 src/unstrip.c:1816 src/unstrip.c:1959 src/unstrip.c:2058
 #, c-format
 msgid "cannot get section header: %s"
-msgstr "セクションヘッダーを得られません: %s"
+msgstr "セクションヘッダーを取得できません: %s"
 
 #: src/readelf.c:663
-#, fuzzy, c-format
+#, c-format
 msgid "cannot get section name"
-msgstr "セクションを得られません: %s"
+msgstr "セクション名を取得できません"
 
-#: src/readelf.c:672 src/readelf.c:6628 src/readelf.c:10600 src/readelf.c:10702
-#: src/readelf.c:10880
+#: src/readelf.c:672 src/readelf.c:6634 src/readelf.c:10681 src/readelf.c:10783
+#: src/readelf.c:10961
 #, c-format
 msgid "cannot get %s content: %s"
-msgstr "%s の内容を得られません: %s"
+msgstr "%s の内容を取得できません: %s"
 
 #: src/readelf.c:688
-#, fuzzy, c-format
+#, c-format
 msgid "cannot create temp file '%s'"
-msgstr "新しいファイル '%s' を生成できません: %s"
+msgstr "一時ファイル '%s' を作成できません"
 
 #: src/readelf.c:697
-#, fuzzy, c-format
+#, c-format
 msgid "cannot write section data"
-msgstr "セクションデータを割り当てられません: %s"
+msgstr "セクションデータを書き込みできません"
 
 #: src/readelf.c:703 src/readelf.c:720 src/readelf.c:749
 #, c-format
@@ -3936,14 +4152,14 @@
 msgstr "Elf 記述子を閉じている時にエラー: %s"
 
 #: src/readelf.c:710
-#, fuzzy, c-format
+#, c-format
 msgid "error while rewinding file descriptor"
-msgstr "Elf 記述子を閉じている時にエラー: %s"
+msgstr "ファイル記述子を巻き戻している時にエラー"
 
 #: src/readelf.c:744
 #, c-format
 msgid "'%s' is not an archive, cannot print archive index"
-msgstr "'%s' はアーカイブではなく、アーカイブ索引を印刷できません"
+msgstr "'%s' はアーカイブではなく、アーカイブ索引を表示できません"
 
 #: src/readelf.c:848
 #, c-format
@@ -3968,22 +4184,22 @@
 #: src/readelf.c:940
 #, c-format
 msgid "cannot read ELF header: %s"
-msgstr "ELF ヘッダーが読めません: %s"
+msgstr "ELF ヘッダーを読み込めません: %s"
 
 #: src/readelf.c:948
 #, c-format
 msgid "cannot create EBL handle"
-msgstr "EBL ヘッダーを生成できません"
+msgstr "EBL ハンドルを作成できません"
 
 #: src/readelf.c:961
-#, fuzzy, c-format
+#, c-format
 msgid "cannot determine number of program headers: %s"
-msgstr "セクション数を決定できません: %s"
+msgstr "プログラムヘッダの数を決定できません: %s"
 
 #: src/readelf.c:993
-#, fuzzy, c-format
+#, c-format
 msgid "cannot read ELF: %s"
-msgstr "%s を読みません: %s"
+msgstr "ELFを読み込めません: %s"
 
 #: src/readelf.c:1054
 msgid "NONE (None)"
@@ -4257,7 +4473,7 @@
 " セクションからセグメントへのマッビング:\n"
 "  セグメント セクション..."
 
-#: src/readelf.c:1464 src/unstrip.c:2114 src/unstrip.c:2156 src/unstrip.c:2163
+#: src/readelf.c:1464 src/unstrip.c:2117 src/unstrip.c:2159 src/unstrip.c:2166
 #, c-format
 msgid "cannot get program header: %s"
 msgstr "プログラムヘッダーを得られません: %s"
@@ -4296,18 +4512,18 @@
 msgid "<INVALID SECTION>"
 msgstr "<不当なセクション>"
 
-#: src/readelf.c:1660 src/readelf.c:2387 src/readelf.c:3488 src/readelf.c:12625
-#: src/readelf.c:12632 src/readelf.c:12676 src/readelf.c:12683
+#: src/readelf.c:1660 src/readelf.c:2387 src/readelf.c:3494 src/readelf.c:12705
+#: src/readelf.c:12712 src/readelf.c:12756 src/readelf.c:12763
 msgid "Couldn't uncompress section"
 msgstr ""
 
-#: src/readelf.c:1665 src/readelf.c:2392 src/readelf.c:3493
+#: src/readelf.c:1665 src/readelf.c:2392 src/readelf.c:3499
 #, fuzzy, c-format
 msgid "cannot get section [%zd] header: %s"
 msgstr "セクションヘッダーを得られません: %s"
 
-#: src/readelf.c:1809 src/readelf.c:2459 src/readelf.c:2717 src/readelf.c:2793
-#: src/readelf.c:3097 src/readelf.c:3171 src/readelf.c:5401
+#: src/readelf.c:1809 src/readelf.c:2459 src/readelf.c:2725 src/readelf.c:2801
+#: src/readelf.c:3105 src/readelf.c:3179 src/readelf.c:5407
 #, fuzzy, c-format
 msgid "invalid sh_link value in section %zu"
 msgstr "不当な .debug_line セクション"
@@ -4453,20 +4669,20 @@
 msgid "%5u: %0*<PRIx64> %6<PRId64> %-7s %-6s %-9s %6s %s"
 msgstr "%5u: %0*<PRIx64> %6<PRId64> %-7s %-6s %-9s %6s %s"
 
-#: src/readelf.c:2590
+#: src/readelf.c:2595
 #, c-format
 msgid "bad dynamic symbol"
 msgstr "不正な動的シンボル"
 
-#: src/readelf.c:2672
+#: src/readelf.c:2680
 msgid "none"
 msgstr "なし"
 
-#: src/readelf.c:2689
+#: src/readelf.c:2697
 msgid "| <unknown>"
 msgstr "| <不明>"
 
-#: src/readelf.c:2720
+#: src/readelf.c:2728
 #, c-format
 msgid ""
 "\n"
@@ -4482,17 +4698,17 @@
 " アドレス: %#0*<PRIx64>  オフセット: %#08<PRIx64>  セクションへのリンク: "
 "[%2u] '%s'\n"
 
-#: src/readelf.c:2741
+#: src/readelf.c:2749
 #, c-format
 msgid "  %#06x: Version: %hu  File: %s  Cnt: %hu\n"
 msgstr "  %#06x: バージョン: %hu  ファイル: %s  数: %hu\n"
 
-#: src/readelf.c:2754
+#: src/readelf.c:2762
 #, c-format
 msgid "  %#06x: Name: %s  Flags: %s  Version: %hu\n"
 msgstr "  %#06x: 名前: %s  フラグ: %s  バージョン: %hu\n"
 
-#: src/readelf.c:2797
+#: src/readelf.c:2805
 #, c-format
 msgid ""
 "\n"
@@ -4508,18 +4724,18 @@
 " アドレス: %#0*<PRIx64>  オフセット: %#08<PRIx64>  セクションへのリンク: "
 "[%2u] '%s'\n"
 
-#: src/readelf.c:2825
+#: src/readelf.c:2833
 #, c-format
 msgid "  %#06x: Version: %hd  Flags: %s  Index: %hd  Cnt: %hd  Name: %s\n"
 msgstr "  %#06x: バージョン: %hd  フラグ: %s  索引: %hd  数: %hd  名前: %s\n"
 
-#: src/readelf.c:2840
+#: src/readelf.c:2848
 #, c-format
 msgid "  %#06x: Parent %d: %s\n"
 msgstr "  %#06x: 親 %d: %s\n"
 
 #. Print the header.
-#: src/readelf.c:3101
+#: src/readelf.c:3109
 #, c-format
 msgid ""
 "\n"
@@ -4535,15 +4751,15 @@
 " アドレス: %#0*<PRIx64>  オフセット: %#08<PRIx64>  セクションへのリンク: "
 "[%2u] '%s'"
 
-#: src/readelf.c:3129
+#: src/readelf.c:3137
 msgid "   0 *local*                     "
 msgstr "   0 *ローカル*                  "
 
-#: src/readelf.c:3134
+#: src/readelf.c:3142
 msgid "   1 *global*                    "
 msgstr "   1 *グローバル*                "
 
-#: src/readelf.c:3176
+#: src/readelf.c:3184
 #, c-format
 msgid ""
 "\n"
@@ -4561,22 +4777,22 @@
 " アドレス: %#0*<PRIx64>  オフセット: %#08<PRIx64>  セクションへのリンク: "
 "[%2u] '%s'\n"
 
-#: src/readelf.c:3198
+#: src/readelf.c:3206
 #, fuzzy, no-c-format
 msgid " Length  Number  % of total  Coverage\n"
 msgstr " 長さ    数      全体の%     範囲    \n"
 
-#: src/readelf.c:3200
+#: src/readelf.c:3208
 #, c-format
 msgid "      0  %6<PRIu32>      %5.1f%%\n"
 msgstr "      0  %6<PRIu32>      %5.1f%%\n"
 
-#: src/readelf.c:3207
+#: src/readelf.c:3215
 #, c-format
 msgid "%7d  %6<PRIu32>      %5.1f%%    %5.1f%%\n"
 msgstr "%7d  %6<PRIu32>      %5.1f%%    %5.1f%%\n"
 
-#: src/readelf.c:3220
+#: src/readelf.c:3228
 #, fuzzy, c-format
 msgid ""
 " Average number of tests:   successful lookup: %f\n"
@@ -4585,37 +4801,37 @@
 " テストの平均数: 検索成功: %f\n"
 "                 検索失敗: %f\n"
 
-#: src/readelf.c:3238 src/readelf.c:3302 src/readelf.c:3368
+#: src/readelf.c:3246 src/readelf.c:3310 src/readelf.c:3376
 #, c-format
 msgid "cannot get data for section %d: %s"
 msgstr "セクションからデータを得られません %d: %s"
 
-#: src/readelf.c:3246
+#: src/readelf.c:3254
 #, fuzzy, c-format
 msgid "invalid data in sysv.hash section %d"
 msgstr "セクション [%zu] '%s' の不当なデータ"
 
-#: src/readelf.c:3275
+#: src/readelf.c:3283
 #, fuzzy, c-format
 msgid "invalid chain in sysv.hash section %d"
 msgstr "セクション [%zu] '%s' の不当なデータ"
 
-#: src/readelf.c:3310
+#: src/readelf.c:3318
 #, fuzzy, c-format
 msgid "invalid data in sysv.hash64 section %d"
 msgstr "セクション [%zu] '%s' の不当なデータ"
 
-#: src/readelf.c:3341
+#: src/readelf.c:3349
 #, fuzzy, c-format
 msgid "invalid chain in sysv.hash64 section %d"
 msgstr "セクション [%zu] '%s' の不当なデータ"
 
-#: src/readelf.c:3377
+#: src/readelf.c:3385
 #, fuzzy, c-format
 msgid "invalid data in gnu.hash section %d"
 msgstr "セクション [%zu] '%s' の不当なデータ"
 
-#: src/readelf.c:3444
+#: src/readelf.c:3451
 #, c-format
 msgid ""
 " Symbol Bias: %u\n"
@@ -4625,7 +4841,7 @@
 " ビットマスクの大きさ: %zu バイト  %<PRIuFAST32>%% ビット設定 第2ハッシュシフ"
 "ト: %u\n"
 
-#: src/readelf.c:3533
+#: src/readelf.c:3539
 #, c-format
 msgid ""
 "\n"
@@ -4638,7 +4854,7 @@
 "オフセット %3$#0<PRIx64> のライブラリー一覧セクション [%1$2zu] '%2$s' には "
 "%4$d 個の項目があります:\n"
 
-#: src/readelf.c:3547
+#: src/readelf.c:3553
 msgid ""
 "       Library                       Time Stamp          Checksum Version "
 "Flags"
@@ -4646,7 +4862,7 @@
 "       ライブラリー                  タイムスタンプ      チェックサム バー"
 "ジョン フラグ"
 
-#: src/readelf.c:3606
+#: src/readelf.c:3612
 #, c-format
 msgid ""
 "\n"
@@ -4657,102 +4873,102 @@
 "オフセット %4$#0<PRIx64> の %3$<PRIu64> バイトのオブジェクト属性セクション "
 "[%1$2zu] '%2$s':\n"
 
-#: src/readelf.c:3623
+#: src/readelf.c:3629
 msgid "  Owner          Size\n"
 msgstr "  所有者         大きさ\n"
 
-#: src/readelf.c:3647
+#: src/readelf.c:3653
 #, c-format
 msgid "  %-13s  %4<PRIu32>\n"
 msgstr "  %-13s  %4<PRIu32>\n"
 
 #. Unknown subsection, print and skip.
-#: src/readelf.c:3686
+#: src/readelf.c:3692
 #, c-format
 msgid "    %-4u %12<PRIu32>\n"
 msgstr "    %-4u %12<PRIu32>\n"
 
 #. Tag_File
-#: src/readelf.c:3691
+#: src/readelf.c:3697
 #, c-format
 msgid "    File: %11<PRIu32>\n"
 msgstr "    ファイル: %11<PRIu32>\n"
 
-#: src/readelf.c:3740
+#: src/readelf.c:3746
 #, c-format
 msgid "      %s: %<PRId64>, %s\n"
 msgstr "      %s: %<PRId64>、%s\n"
 
-#: src/readelf.c:3743
+#: src/readelf.c:3749
 #, c-format
 msgid "      %s: %<PRId64>\n"
 msgstr "      %s: %<PRId64>\n"
 
-#: src/readelf.c:3746
+#: src/readelf.c:3752
 #, c-format
 msgid "      %s: %s\n"
 msgstr "      %s: %s\n"
 
-#: src/readelf.c:3756
+#: src/readelf.c:3762
 #, c-format
 msgid "      %u: %<PRId64>\n"
 msgstr "      %u: %<PRId64>\n"
 
-#: src/readelf.c:3759
+#: src/readelf.c:3765
 #, c-format
 msgid "      %u: %s\n"
 msgstr "      %u: %s\n"
 
-#: src/readelf.c:3829
+#: src/readelf.c:3835
 #, c-format
 msgid "sprintf failure"
 msgstr ""
 
-#: src/readelf.c:4311
+#: src/readelf.c:4317
 msgid "empty block"
 msgstr "空ブロック"
 
-#: src/readelf.c:4314
+#: src/readelf.c:4320
 #, c-format
 msgid "%zu byte block:"
 msgstr "%zu バイトのブロック:"
 
-#: src/readelf.c:4792
+#: src/readelf.c:4798
 #, fuzzy, c-format
 msgid "%*s[%2<PRIuMAX>] %s  <TRUNCATED>\n"
 msgstr "%*s[%4<PRIuMAX>] %s  <TRUNCATED>\n"
 
-#: src/readelf.c:4859
+#: src/readelf.c:4865
 #, c-format
 msgid "%s %#<PRIx64> used with different address sizes"
 msgstr ""
 
-#: src/readelf.c:4866
+#: src/readelf.c:4872
 #, c-format
 msgid "%s %#<PRIx64> used with different offset sizes"
 msgstr ""
 
-#: src/readelf.c:4873
+#: src/readelf.c:4879
 #, c-format
 msgid "%s %#<PRIx64> used with different base addresses"
 msgstr ""
 
-#: src/readelf.c:4880
+#: src/readelf.c:4886
 #, c-format
 msgid "%s %#<PRIx64> used with different attribute %s and %s"
 msgstr ""
 
-#: src/readelf.c:4980
+#: src/readelf.c:4986
 #, c-format
 msgid " [%6tx]  <UNUSED GARBAGE IN REST OF SECTION>\n"
 msgstr ""
 
-#: src/readelf.c:4988
+#: src/readelf.c:4994
 #, c-format
 msgid " [%6tx]  <UNUSED GARBAGE> ... %<PRIu64> bytes ...\n"
 msgstr ""
 
-#: src/readelf.c:5091
+#: src/readelf.c:5097
 #, c-format
 msgid ""
 "\n"
@@ -4763,7 +4979,7 @@
 "オフセット %3$#<PRIx64> の DWARF セクション [%1$2zu] '%2$s':\n"
 " [ コード]\n"
 
-#: src/readelf.c:5099
+#: src/readelf.c:5105
 #, c-format
 msgid ""
 "\n"
@@ -4772,20 +4988,20 @@
 "\n"
 "オフセット %<PRIu64> の略語セクション:\n"
 
-#: src/readelf.c:5112
+#: src/readelf.c:5118
 #, c-format
 msgid " *** error while reading abbreviation: %s\n"
 msgstr " *** 略語を読んでいる間にエラー: %s\n"
 
-#: src/readelf.c:5128
+#: src/readelf.c:5134
 #, c-format
 msgid " [%5u] offset: %<PRId64>, children: %s, tag: %s\n"
 msgstr " [%5u] オフセット: %<PRId64>、子: %s、タグ: %s\n"
 
-#: src/readelf.c:5161 src/readelf.c:5470 src/readelf.c:5637 src/readelf.c:6022
-#: src/readelf.c:6638 src/readelf.c:8375 src/readelf.c:9064 src/readelf.c:9537
-#: src/readelf.c:9788 src/readelf.c:9954 src/readelf.c:10341
-#: src/readelf.c:10401
+#: src/readelf.c:5167 src/readelf.c:5476 src/readelf.c:5643 src/readelf.c:6028
+#: src/readelf.c:6644 src/readelf.c:8399 src/readelf.c:9145 src/readelf.c:9618
+#: src/readelf.c:9869 src/readelf.c:10035 src/readelf.c:10422
+#: src/readelf.c:10482
 #, c-format
 msgid ""
 "\n"
@@ -4794,52 +5010,52 @@
 "\n"
 "オフセット %3$#<PRIx64> の DWARF セクション [%1$2zu] '%2$s':\n"
 
-#: src/readelf.c:5174
+#: src/readelf.c:5180
 #, fuzzy, c-format
 msgid "cannot get .debug_addr section data: %s"
 msgstr "セクションデータを割り当てられません: %s"
 
-#: src/readelf.c:5274 src/readelf.c:5298 src/readelf.c:5682 src/readelf.c:9109
+#: src/readelf.c:5280 src/readelf.c:5304 src/readelf.c:5688 src/readelf.c:9190
 #, fuzzy, c-format
 msgid " Length:         %8<PRIu64>\n"
 msgstr " (オフセット: %#<PRIx64>)"
 
-#: src/readelf.c:5276 src/readelf.c:5313 src/readelf.c:5695 src/readelf.c:9122
+#: src/readelf.c:5282 src/readelf.c:5319 src/readelf.c:5701 src/readelf.c:9203
 #, fuzzy, c-format
 msgid " DWARF version:  %8<PRIu16>\n"
 msgstr "      %s: %<PRId64>\n"
 
-#: src/readelf.c:5277 src/readelf.c:5322 src/readelf.c:5704 src/readelf.c:9131
+#: src/readelf.c:5283 src/readelf.c:5328 src/readelf.c:5710 src/readelf.c:9212
 #, fuzzy, c-format
 msgid " Address size:   %8<PRIu64>\n"
 msgstr " (終了オフセット: %#<PRIx64>)"
 
-#: src/readelf.c:5279 src/readelf.c:5332 src/readelf.c:5714 src/readelf.c:9141
+#: src/readelf.c:5285 src/readelf.c:5338 src/readelf.c:5720 src/readelf.c:9222
 #, fuzzy, c-format
 msgid " Segment size:   %8<PRIu64>\n"
 msgstr " ファイルを %<PRIu64> に設定する\n"
 
-#: src/readelf.c:5317 src/readelf.c:5699 src/readelf.c:9126 src/readelf.c:10533
+#: src/readelf.c:5323 src/readelf.c:5705 src/readelf.c:9207 src/readelf.c:10614
 #, fuzzy, c-format
 msgid "Unknown version"
 msgstr "不明なバージョン"
 
-#: src/readelf.c:5327 src/readelf.c:5540 src/readelf.c:5709 src/readelf.c:9136
+#: src/readelf.c:5333 src/readelf.c:5546 src/readelf.c:5715 src/readelf.c:9217
 #, fuzzy, c-format
 msgid "unsupported address size"
 msgstr "アドレス値ではありません"
 
-#: src/readelf.c:5338 src/readelf.c:5551 src/readelf.c:5719 src/readelf.c:9146
+#: src/readelf.c:5344 src/readelf.c:5557 src/readelf.c:5725 src/readelf.c:9227
 #, c-format
 msgid "unsupported segment size"
 msgstr ""
 
-#: src/readelf.c:5391 src/readelf.c:5465
+#: src/readelf.c:5397 src/readelf.c:5471
 #, c-format
 msgid "cannot get .debug_aranges content: %s"
 msgstr ".debug_aragnes の内容を得られません: %s"
 
-#: src/readelf.c:5406
+#: src/readelf.c:5412
 #, c-format
 msgid ""
 "\n"
@@ -4852,19 +5068,19 @@
 "オフセット %3$#<PRIx64> の DWARF セクション [%1$2zu] '%2$s' には %4$zu 個の項"
 "目があります:\n"
 
-#: src/readelf.c:5437
+#: src/readelf.c:5443
 #, c-format
 msgid " [%*zu] ???\n"
 msgstr " [%*zu] ???\n"
 
-#: src/readelf.c:5439
+#: src/readelf.c:5445
 #, c-format
 msgid ""
 " [%*zu] start: %0#*<PRIx64>, length: %5<PRIu64>, CU DIE offset: %6<PRId64>\n"
 msgstr ""
 " [%*zu] 開始: %0#*<PRIx64>、長さ: %5<PRIu64>、CU DIE オフセット: %6<PRId64>\n"
 
-#: src/readelf.c:5483 src/readelf.c:8402
+#: src/readelf.c:5489 src/readelf.c:8426
 #, fuzzy, c-format
 msgid ""
 "\n"
@@ -4873,152 +5089,152 @@
 "\n"
 "オフセット %Zu のテーブル:\n"
 
-#: src/readelf.c:5487 src/readelf.c:5663 src/readelf.c:6662 src/readelf.c:8413
-#: src/readelf.c:9090
+#: src/readelf.c:5493 src/readelf.c:5669 src/readelf.c:6668 src/readelf.c:8437
+#: src/readelf.c:9171
 #, c-format
 msgid "invalid data in section [%zu] '%s'"
 msgstr "セクション [%zu] '%s' の不当なデータ"
 
-#: src/readelf.c:5503
+#: src/readelf.c:5509
 #, fuzzy, c-format
 msgid ""
 "\n"
 " Length:        %6<PRIu64>\n"
 msgstr " (オフセット: %#<PRIx64>)"
 
-#: src/readelf.c:5515
+#: src/readelf.c:5521
 #, fuzzy, c-format
 msgid " DWARF version: %6<PRIuFAST16>\n"
 msgstr "      %s: %<PRId64>\n"
 
-#: src/readelf.c:5519
+#: src/readelf.c:5525
 #, c-format
 msgid "unsupported aranges version"
 msgstr ""
 
-#: src/readelf.c:5530
+#: src/readelf.c:5536
 #, fuzzy, c-format
 msgid " CU offset:     %6<PRIx64>\n"
 msgstr " (オフセット: %#<PRIx64>)"
 
-#: src/readelf.c:5536
+#: src/readelf.c:5542
 #, fuzzy, c-format
 msgid " Address size:  %6<PRIu64>\n"
 msgstr " (終了オフセット: %#<PRIx64>)"
 
-#: src/readelf.c:5547
+#: src/readelf.c:5553
 #, fuzzy, c-format
 msgid ""
 " Segment size:  %6<PRIu64>\n"
 "\n"
 msgstr " ファイルを %<PRIu64> に設定する\n"
 
-#: src/readelf.c:5602
+#: src/readelf.c:5608
 #, c-format
 msgid "   %zu padding bytes\n"
 msgstr ""
 
-#: src/readelf.c:5646
+#: src/readelf.c:5652
 #, fuzzy, c-format
 msgid "cannot get .debug_rnglists content: %s"
 msgstr ".degub_ranges の内容を得られません: %s"
 
-#: src/readelf.c:5669 src/readelf.c:9096
+#: src/readelf.c:5675 src/readelf.c:9177
 #, fuzzy, c-format
 msgid ""
 "Table at Offset 0x%<PRIx64>:\n"
 "\n"
 msgstr " (終了オフセット: %#<PRIx64>)"
 
-#: src/readelf.c:5724 src/readelf.c:9151
+#: src/readelf.c:5730 src/readelf.c:9232
 #, fuzzy, c-format
 msgid " Offset entries: %8<PRIu64>\n"
 msgstr " (オフセット: %#<PRIx64>)"
 
-#: src/readelf.c:5740 src/readelf.c:9167
+#: src/readelf.c:5746 src/readelf.c:9248
 #, c-format
 msgid " Unknown CU base: "
 msgstr ""
 
-#: src/readelf.c:5742 src/readelf.c:9169
+#: src/readelf.c:5748 src/readelf.c:9250
 #, c-format
 msgid " CU [%6<PRIx64>] base: "
 msgstr ""
 
-#: src/readelf.c:5748 src/readelf.c:9175
+#: src/readelf.c:5754 src/readelf.c:9256
 #, c-format
 msgid " Not associated with a CU.\n"
 msgstr ""
 
-#: src/readelf.c:5759 src/readelf.c:9186
+#: src/readelf.c:5765 src/readelf.c:9267
 #, c-format
 msgid "too many offset entries for unit length"
 msgstr ""
 
-#: src/readelf.c:5763 src/readelf.c:9190
+#: src/readelf.c:5769 src/readelf.c:9271
 #, fuzzy, c-format
 msgid "  Offsets starting at 0x%<PRIx64>:\n"
 msgstr "  所有者         大きさ\n"
 
-#: src/readelf.c:5815
+#: src/readelf.c:5821
 #, fuzzy, c-format
 msgid "invalid range list data"
 msgstr "不当なデータ"
 
-#: src/readelf.c:6000 src/readelf.c:9515
+#: src/readelf.c:6006 src/readelf.c:9596
 #, c-format
 msgid ""
 "   %zu padding bytes\n"
 "\n"
 msgstr ""
 
-#: src/readelf.c:6017
+#: src/readelf.c:6023
 #, c-format
 msgid "cannot get .debug_ranges content: %s"
 msgstr ".degub_ranges の内容を得られません: %s"
 
-#: src/readelf.c:6053 src/readelf.c:9570
+#: src/readelf.c:6059 src/readelf.c:9651
 #, c-format
 msgid ""
 "\n"
 " Unknown CU base: "
 msgstr ""
 
-#: src/readelf.c:6055 src/readelf.c:9572
+#: src/readelf.c:6061 src/readelf.c:9653
 #, c-format
 msgid ""
 "\n"
 " CU [%6<PRIx64>] base: "
 msgstr ""
 
-#: src/readelf.c:6064 src/readelf.c:9598 src/readelf.c:9624
+#: src/readelf.c:6070 src/readelf.c:9679 src/readelf.c:9705
 #, c-format
 msgid " [%6tx]  <INVALID DATA>\n"
 msgstr " [%6tx]  <不当なデータ>\n"
 
-#: src/readelf.c:6089 src/readelf.c:9708
+#: src/readelf.c:6095 src/readelf.c:9789
 #, fuzzy
 msgid "base address"
 msgstr "アドレスを %s に設定する\n"
 
-#: src/readelf.c:6099 src/readelf.c:9718
+#: src/readelf.c:6105 src/readelf.c:9799
 #, fuzzy, c-format
 msgid " [%6tx] empty list\n"
 msgstr ""
 "\n"
 " [%6tx] ゼロ終端\n"
 
-#: src/readelf.c:6359
+#: src/readelf.c:6365
 #, fuzzy
 msgid "         <INVALID DATA>\n"
 msgstr " [%6tx]  <不当なデータ>\n"
 
-#: src/readelf.c:6616
+#: src/readelf.c:6622
 #, fuzzy, c-format
 msgid "cannot get ELF: %s"
 msgstr "次の DIE を得られません: %s"
 
-#: src/readelf.c:6634
+#: src/readelf.c:6640
 #, c-format
 msgid ""
 "\n"
@@ -5027,7 +5243,7 @@
 "\n"
 "オフセット %3$#<PRIx64> の フレーム情報呼出しセクション [%1$2zu] '%2$s':\n"
 
-#: src/readelf.c:6684
+#: src/readelf.c:6690
 #, c-format
 msgid ""
 "\n"
@@ -5036,65 +5252,65 @@
 "\n"
 " [%6tx] ゼロ終端\n"
 
-#: src/readelf.c:6785 src/readelf.c:6939
+#: src/readelf.c:6791 src/readelf.c:6945
 #, fuzzy, c-format
 msgid "invalid augmentation length"
 msgstr "不当な拡大エンコード"
 
-#: src/readelf.c:6800
+#: src/readelf.c:6806
 msgid "FDE address encoding: "
 msgstr "FDE アドレスエンコード"
 
-#: src/readelf.c:6806
+#: src/readelf.c:6812
 msgid "LSDA pointer encoding: "
 msgstr "LSDA ポインターエンコード:"
 
-#: src/readelf.c:6916
+#: src/readelf.c:6922
 #, c-format
 msgid " (offset: %#<PRIx64>)"
 msgstr " (オフセット: %#<PRIx64>)"
 
-#: src/readelf.c:6923
+#: src/readelf.c:6929
 #, c-format
 msgid " (end offset: %#<PRIx64>)"
 msgstr " (終了オフセット: %#<PRIx64>)"
 
-#: src/readelf.c:6960
+#: src/readelf.c:6966
 #, c-format
 msgid "   %-26sLSDA pointer: %#<PRIx64>\n"
 msgstr "   %-26sLSDA ポインター: %#<PRIx64>\n"
 
-#: src/readelf.c:7045
+#: src/readelf.c:7051
 #, fuzzy, c-format
 msgid "DIE [%<PRIx64>] cannot get attribute code: %s"
 msgstr "属性コードを得られません: %s"
 
-#: src/readelf.c:7055
+#: src/readelf.c:7061
 #, fuzzy, c-format
 msgid "DIE [%<PRIx64>] cannot get attribute form: %s"
 msgstr "属性様式を得られません: %s"
 
-#: src/readelf.c:7077
+#: src/readelf.c:7083
 #, fuzzy, c-format
 msgid "DIE [%<PRIx64>] cannot get attribute '%s' (%s) value: %s"
 msgstr "属性値を得られません: %s"
 
-#: src/readelf.c:7407
+#: src/readelf.c:7413
 #, fuzzy, c-format
 msgid "invalid file (%<PRId64>): %s"
 msgstr "不当なファイル"
 
-#: src/readelf.c:7411
+#: src/readelf.c:7417
 #, fuzzy, c-format
 msgid "no srcfiles for CU [%<PRIx64>]"
 msgstr " ファイルを %<PRIu64> に設定する\n"
 
-#: src/readelf.c:7415
+#: src/readelf.c:7421
 #, fuzzy, c-format
 msgid "couldn't get DWARF CU: %s"
 msgstr "次の DIE を得られません: %s"
 
-#: src/readelf.c:7728
+#: src/readelf.c:7736
 #, c-format
 msgid ""
 "\n"
@@ -5105,12 +5321,12 @@
 "オフセット %3$#<PRIx64> の DWARF セクション [%1$2zu] '%2$s':\n"
 " [オフセット]\n"
 
-#: src/readelf.c:7778
+#: src/readelf.c:7786
 #, fuzzy, c-format
 msgid "cannot get next unit: %s"
 msgstr "次の DIE を得られません: %s"
 
-#: src/readelf.c:7797
+#: src/readelf.c:7806
 #, fuzzy, c-format
 msgid ""
 " Type unit at offset %<PRIu64>:\n"
@@ -5122,7 +5338,7 @@
 " バージョン: %2$<PRIu16>、略語セクションオフセット: %3$<PRIu64>、アドレスの大"
 "きさ: %4$<PRIu8>、オフセットの大きさ: %5$<PRIu8>\n"
 
-#: src/readelf.c:7809
+#: src/readelf.c:7818
 #, c-format
 msgid ""
 " Compilation unit at offset %<PRIu64>:\n"
@@ -5133,39 +5349,39 @@
 " バージョン: %2$<PRIu16>、略語セクションオフセット: %3$<PRIu64>、アドレスの大"
 "きさ: %4$<PRIu8>、オフセットの大きさ: %5$<PRIu8>\n"
 
-#: src/readelf.c:7819 src/readelf.c:7982
+#: src/readelf.c:7828 src/readelf.c:7989
 #, c-format
 msgid " Unit type: %s (%<PRIu8>)"
 msgstr ""
 
-#: src/readelf.c:7846
+#: src/readelf.c:7855
 #, c-format
 msgid "unknown version (%d) or unit type (%d)"
 msgstr ""
 
-#: src/readelf.c:7875
+#: src/readelf.c:7884
 #, c-format
 msgid "cannot get DIE offset: %s"
 msgstr "DIE オフセットを得られません: %s"
 
-#: src/readelf.c:7884
+#: src/readelf.c:7893
 #, fuzzy, c-format
 msgid "cannot get tag of DIE at offset [%<PRIx64>] in section '%s': %s"
 msgstr ""
 "セクション '%2$s' 中のオフセット %1$<PRIu64> の DIE のタグを得られません: "
 "%3$s"
 
-#: src/readelf.c:7922
+#: src/readelf.c:7929
 #, c-format
 msgid "cannot get next DIE: %s\n"
 msgstr "次の DIE を得られません: %s\n"
 
-#: src/readelf.c:7930
+#: src/readelf.c:7937
 #, c-format
 msgid "cannot get next DIE: %s"
 msgstr "次の DIE を得られません: %s"
 
-#: src/readelf.c:7974
+#: src/readelf.c:7981
 #, fuzzy, c-format
 msgid ""
 " Split compilation unit at offset %<PRIu64>:\n"
@@ -5176,7 +5392,7 @@
 " バージョン: %2$<PRIu16>、略語セクションオフセット: %3$<PRIu64>、アドレスの大"
 "きさ: %4$<PRIu8>、オフセットの大きさ: %5$<PRIu8>\n"
 
-#: src/readelf.c:8026
+#: src/readelf.c:8033
 #, fuzzy, c-format
 msgid ""
 "\n"
@@ -5186,18 +5402,18 @@
 "\n"
 "オフセット %3$#<PRIx64> の DWARF セクション [%1$2zu] '%2$s':\n"
 
-#: src/readelf.c:8358
+#: src/readelf.c:8365
 #, fuzzy, c-format
 msgid "unknown form: %s"
 msgstr "不明な様式 %<PRIx64>"
 
-#: src/readelf.c:8389
+#: src/readelf.c:8413
 #, c-format
 msgid "cannot get line data section data: %s"
 msgstr "ラインデータセクションデータを得られません: %s"
 
 #. Print what we got so far.
-#: src/readelf.c:8491
+#: src/readelf.c:8517
 #, fuzzy, c-format
 msgid ""
 "\n"
@@ -5227,33 +5443,33 @@
 "\n"
 "命令コード:\n"
 
-#: src/readelf.c:8513
-#, fuzzy, c-format
-msgid "cannot handle .debug_line version: %u\n"
-msgstr ".degub_ranges の内容を得られません: %s"
-
-#: src/readelf.c:8521
-#, fuzzy, c-format
-msgid "cannot handle address size: %u\n"
-msgstr "アドレス値ではありません"
-
-#: src/readelf.c:8529
-#, fuzzy, c-format
-msgid "cannot handle segment selector size: %u\n"
-msgstr "セクションを得られません: %s"
-
 #: src/readelf.c:8539
 #, c-format
+msgid "cannot handle .debug_line version: %u\n"
+msgstr ".debug_line バージョンを扱えません: %u\n"
+
+#: src/readelf.c:8547
+#, c-format
+msgid "cannot handle address size: %u\n"
+msgstr "アドレスサイズを扱えません: %u\n"
+
+#: src/readelf.c:8555
+#, c-format
+msgid "cannot handle segment selector size: %u\n"
+msgstr "セグメントセレクタサイズを扱えません: %u\n"
+
+#: src/readelf.c:8565
+#, c-format
 msgid "invalid data at offset %tu in section [%zu] '%s'"
 msgstr "セクション [%2$zu] '%3$s' 中のオフセット %1$tu に不当なデータ"
 
-#: src/readelf.c:8554
+#: src/readelf.c:8580
 #, c-format
 msgid "  [%*<PRIuFAST8>]  %hhu argument\n"
 msgid_plural "  [%*<PRIuFAST8>]  %hhu arguments\n"
 msgstr[0] "  [%*<PRIuFAST8>]  %hhu パラメーター\n"
 
-#: src/readelf.c:8565
+#: src/readelf.c:8591
 msgid ""
 "\n"
 "Directory table:"
@@ -5261,12 +5477,12 @@
 "\n"
 "ディレクトリーテーブル:"
 
-#: src/readelf.c:8571 src/readelf.c:8648
+#: src/readelf.c:8597 src/readelf.c:8674
 #, fuzzy, c-format
 msgid "      ["
 msgstr "      %s: %s\n"
 
-#: src/readelf.c:8642
+#: src/readelf.c:8668
 #, fuzzy
 msgid ""
 "\n"
@@ -5275,7 +5491,7 @@
 "\n"
 " 呼出しサイトテーブル:"
 
-#: src/readelf.c:8703
+#: src/readelf.c:8729
 #, fuzzy
 msgid " Entry Dir   Time      Size      Name"
 msgstr ""
@@ -5283,7 +5499,7 @@
 "ファイル名テーブル:\n"
 " Entry Dir   時刻     大きさ    名前"
 
-#: src/readelf.c:8742
+#: src/readelf.c:8775
 #, fuzzy
 msgid ""
 "\n"
@@ -5292,7 +5508,7 @@
 "\n"
 "行   番号   文:"
 
-#: src/readelf.c:8746
+#: src/readelf.c:8779
 msgid ""
 "\n"
 "Line number statements:"
@@ -5300,119 +5516,129 @@
 "\n"
 "行   番号   文:"
 
-#: src/readelf.c:8766
+#: src/readelf.c:8794
 #, c-format
 msgid "invalid maximum operations per instruction is zero"
 msgstr ""
 
-#: src/readelf.c:8800
+#: src/readelf.c:8828
 #, fuzzy, c-format
 msgid " special opcode %u: address+%u = "
 msgstr " 特殊命令コード %u: アドレス+%u = %s, 行%+d = %zu\n"
 
-#: src/readelf.c:8804
+#: src/readelf.c:8832
 #, fuzzy, c-format
 msgid ", op_index = %u, line%+d = %zu\n"
 msgstr " 特殊命令コード %u: アドレス+%u = %s, 行%+d = %zu\n"
 
-#: src/readelf.c:8807
+#: src/readelf.c:8835
 #, c-format
 msgid ", line%+d = %zu\n"
 msgstr ""
 
-#: src/readelf.c:8825
+#: src/readelf.c:8853
 #, c-format
 msgid " extended opcode %u: "
 msgstr " 拡張命令コード %u: "
 
-#: src/readelf.c:8830
+#: src/readelf.c:8858
 #, fuzzy
 msgid " end of sequence"
 msgstr "列の終わり"
 
-#: src/readelf.c:8848
+#: src/readelf.c:8876
 #, fuzzy, c-format
 msgid " set address to "
 msgstr "アドレスを %s に設定する\n"
 
-#: src/readelf.c:8876
+#: src/readelf.c:8904
 #, fuzzy, c-format
 msgid " define new file: dir=%u, mtime=%<PRIu64>, length=%<PRIu64>, name=%s\n"
 msgstr ""
 "新ファイルを定義する: dir=%u、mtime=%<PRIu64>、長さh=%<PRIu64>、名前=%s\n"
 
-#: src/readelf.c:8890
+#: src/readelf.c:8918
 #, fuzzy, c-format
 msgid " set discriminator to %u\n"
 msgstr "カラムを %<PRIu64> に設定する\n"
 
+#: src/readelf.c:8945
+#, c-format
+msgid " set inlined context %u, function name %s (0x%x)\n"
+msgstr ""
+
+#: src/readelf.c:8969
+#, fuzzy, c-format
+#| msgid "Also show function names"
+msgid " set function name %s (0x%x)\n"
+msgstr "関数名も表示"
+
 #. Unknown, ignore it.
-#: src/readelf.c:8895
-#, fuzzy
+#: src/readelf.c:8976
 msgid " unknown opcode"
-msgstr "不明な命令コード"
+msgstr "不明なオペコード"
 
 #. Takes no argument.
-#: src/readelf.c:8907
+#: src/readelf.c:8988
 msgid " copy"
 msgstr "複写"
 
-#: src/readelf.c:8918
+#: src/readelf.c:8999
 #, fuzzy, c-format
 msgid " advance address by %u to "
 msgstr "アドレスを %u だけ進めて %s にする\n"
 
-#: src/readelf.c:8922 src/readelf.c:8983
+#: src/readelf.c:9003 src/readelf.c:9064
 #, c-format
 msgid ", op_index to %u"
 msgstr ""
 
-#: src/readelf.c:8934
+#: src/readelf.c:9015
 #, c-format
 msgid " advance line by constant %d to %<PRId64>\n"
 msgstr "行を定数 %d だけ進めて %<PRId64> にする\n"
 
-#: src/readelf.c:8944
+#: src/readelf.c:9025
 #, c-format
 msgid " set file to %<PRIu64>\n"
 msgstr " ファイルを %<PRIu64> に設定する\n"
 
-#: src/readelf.c:8955
+#: src/readelf.c:9036
 #, c-format
 msgid " set column to %<PRIu64>\n"
 msgstr "カラムを %<PRIu64> に設定する\n"
 
-#: src/readelf.c:8962
+#: src/readelf.c:9043
 #, c-format
 msgid " set '%s' to %<PRIuFAST8>\n"
 msgstr " '%s' を %<PRIuFAST8> に設定する\n"
 
 #. Takes no argument.
-#: src/readelf.c:8968
+#: src/readelf.c:9049
 msgid " set basic block flag"
 msgstr "基本ブロックフラグを設定する"
 
-#: src/readelf.c:8979
+#: src/readelf.c:9060
 #, fuzzy, c-format
 msgid " advance address by constant %u to "
 msgstr "アドレスを定数 %u だけ済めて %s にする\n"
 
-#: src/readelf.c:8999
+#: src/readelf.c:9080
 #, fuzzy, c-format
 msgid " advance address by fixed value %u to \n"
 msgstr "アドレスを固定値 %u だけ進めて %s にする\n"
 
 #. Takes no argument.
-#: src/readelf.c:9009
+#: src/readelf.c:9090
 msgid " set prologue end flag"
 msgstr "プロローグ終了フラグを設定する"
 
 #. Takes no argument.
-#: src/readelf.c:9014
+#: src/readelf.c:9095
 msgid " set epilogue begin flag"
 msgstr "エピローグ開始フラグを設定する"
 
-#: src/readelf.c:9024
+#: src/readelf.c:9105
 #, fuzzy, c-format
 msgid " set isa to %u\n"
 msgstr " ファイルを %<PRIu64> に設定する\n"
@@ -5420,103 +5646,103 @@
 #. This is a new opcode the generator but not we know about.
 #. Read the parameters associated with it but then discard
 #. everything.  Read all the parameters for this opcode.
-#: src/readelf.c:9033
+#: src/readelf.c:9114
 #, c-format
 msgid " unknown opcode with %<PRIu8> parameter:"
 msgid_plural " unknown opcode with %<PRIu8> parameters:"
 msgstr[0] " %<PRIu8> 個のパラメーターのある不明な命令コード:"
 
-#: src/readelf.c:9073
-#, fuzzy, c-format
+#: src/readelf.c:9154
+#, c-format
 msgid "cannot get .debug_loclists content: %s"
-msgstr ".debug_loc の内容を得られません: %s"
+msgstr ".debug_loclists の内容を取得できません: %s"
 
-#: src/readelf.c:9239
+#: src/readelf.c:9320
 #, fuzzy, c-format
 msgid "    <INVALID DATA>\n"
 msgstr " [%6tx]  <不当なデータ>\n"
 
-#: src/readelf.c:9279
+#: src/readelf.c:9360
 #, fuzzy, c-format
 msgid "invalid loclists data"
 msgstr "不当なデータ"
 
-#: src/readelf.c:9532
+#: src/readelf.c:9613
 #, c-format
 msgid "cannot get .debug_loc content: %s"
 msgstr ".debug_loc の内容を得られません: %s"
 
-#: src/readelf.c:9745 src/readelf.c:10789
+#: src/readelf.c:9826 src/readelf.c:10870
 #, fuzzy
 msgid "   <INVALID DATA>\n"
 msgstr " [%6tx]  <不当なデータ>\n"
 
-#: src/readelf.c:9800 src/readelf.c:9963
+#: src/readelf.c:9881 src/readelf.c:10044
 #, c-format
 msgid "cannot get macro information section data: %s"
 msgstr "マクロ情報セクションのデータを得られません: %s"
 
-#: src/readelf.c:9880
+#: src/readelf.c:9961
 #, c-format
 msgid "%*s*** non-terminated string at end of section"
 msgstr "%*s*** 最後のセクションの終端していない文字列"
 
-#: src/readelf.c:9903
+#: src/readelf.c:9984
 #, fuzzy, c-format
 msgid "%*s*** missing DW_MACINFO_start_file argument at end of section"
 msgstr "%*s*** 最後のセクションの終端していない文字列"
 
-#: src/readelf.c:10004
+#: src/readelf.c:10085
 #, fuzzy, c-format
 msgid " Offset:             0x%<PRIx64>\n"
 msgstr "  所有者         大きさ\n"
 
-#: src/readelf.c:10016
+#: src/readelf.c:10097
 #, fuzzy, c-format
 msgid " Version:            %<PRIu16>\n"
 msgstr "      %s: %<PRId64>\n"
 
-#: src/readelf.c:10022 src/readelf.c:10909
+#: src/readelf.c:10103 src/readelf.c:10990
 #, c-format
 msgid "  unknown version, cannot parse section\n"
 msgstr ""
 
-#: src/readelf.c:10029
+#: src/readelf.c:10110
 #, fuzzy, c-format
 msgid " Flag:               0x%<PRIx8>"
 msgstr "  入口点アドレス     :               %#<PRIx64>\n"
 
-#: src/readelf.c:10058
+#: src/readelf.c:10139
 #, fuzzy, c-format
 msgid " Offset length:      %<PRIu8>\n"
 msgstr " (オフセット: %#<PRIx64>)"
 
-#: src/readelf.c:10066
+#: src/readelf.c:10147
 #, fuzzy, c-format
 msgid " .debug_line offset: 0x%<PRIx64>\n"
 msgstr " (終了オフセット: %#<PRIx64>)"
 
-#: src/readelf.c:10091
+#: src/readelf.c:10172
 #, fuzzy, c-format
 msgid "  extension opcode table, %<PRIu8> items:\n"
 msgstr " %<PRIu8> 個のパラメーターのある不明な命令コード:"
 
-#: src/readelf.c:10098
+#: src/readelf.c:10179
 #, c-format
 msgid "    [%<PRIx8>]"
 msgstr ""
 
-#: src/readelf.c:10110
+#: src/readelf.c:10191
 #, fuzzy, c-format
 msgid " %<PRIu8> arguments:"
 msgstr "  [%*<PRIuFAST8>]  %hhu パラメーター\n"
 
-#: src/readelf.c:10125
+#: src/readelf.c:10206
 #, c-format
 msgid " no arguments."
 msgstr ""
 
-#: src/readelf.c:10326
+#: src/readelf.c:10407
 #, c-format
 msgid " [%5d] DIE offset: %6<PRId64>, CU DIE offset: %6<PRId64>, name: %s\n"
 msgstr ""
@@ -5524,7 +5750,7 @@
 
 # # "オフセット %3$#<PRIx64> の DWARF セクション [%1$2zu] '%2$s':\n"
 # # " %4$*s  文字列\n" がエラーになるのは何故? 取り敢えず fuzzy扱い
-#: src/readelf.c:10370
+#: src/readelf.c:10451
 #, fuzzy, c-format
 msgid ""
 "\n"
@@ -5535,37 +5761,43 @@
 "オフセット %3$#<PRIx64> の DWARF セクション [%1$2zu] '%2$s':\n"
 " %4$*s  文字列\n"
 
-#: src/readelf.c:10385
+#. TRANS: the debugstr| prefix makes the string unique.
+#: src/readelf.c:10456
+msgctxt "debugstr"
+msgid "Offset"
+msgstr ""
+
+#: src/readelf.c:10466
 #, fuzzy, c-format
 msgid " *** error, missing string terminator\n"
 msgstr " *** 文字列の読込み中にエラー: %s\n"
 
-#: src/readelf.c:10414
+#: src/readelf.c:10495
 #, fuzzy, c-format
 msgid "cannot get .debug_str_offsets section data: %s"
 msgstr ".degub_ranges の内容を得られません: %s"
 
-#: src/readelf.c:10513
+#: src/readelf.c:10594
 #, fuzzy, c-format
 msgid " Length:        %8<PRIu64>\n"
 msgstr " (オフセット: %#<PRIx64>)"
 
-#: src/readelf.c:10515
+#: src/readelf.c:10596
 #, fuzzy, c-format
 msgid " Offset size:   %8<PRIu8>\n"
 msgstr " (オフセット: %#<PRIx64>)"
 
-#: src/readelf.c:10529
+#: src/readelf.c:10610
 #, fuzzy, c-format
 msgid " DWARF version: %8<PRIu16>\n"
 msgstr "      %s: %<PRId64>\n"
 
-#: src/readelf.c:10538
+#: src/readelf.c:10619
 #, fuzzy, c-format
 msgid " Padding:       %8<PRIx16>\n"
 msgstr " (オフセット: %#<PRIx64>)"
 
-#: src/readelf.c:10592
+#: src/readelf.c:10673
 #, c-format
 msgid ""
 "\n"
@@ -5574,7 +5806,7 @@
 "\n"
 "呼出しフレーム検索テーブルセクション [%2zu] '.eh_frame_hdr':\n"
 
-#: src/readelf.c:10694
+#: src/readelf.c:10775
 #, c-format
 msgid ""
 "\n"
@@ -5583,22 +5815,22 @@
 "\n"
 "例外取扱いテーブルセクション [%2zu] '.gcc_except_table':\n"
 
-#: src/readelf.c:10717
+#: src/readelf.c:10798
 #, c-format
 msgid " LPStart encoding:    %#x "
 msgstr " LPStart コード化:    %#x "
 
-#: src/readelf.c:10729
+#: src/readelf.c:10810
 #, c-format
 msgid " TType encoding:      %#x "
 msgstr "TType コード化:       %#x "
 
-#: src/readelf.c:10744
+#: src/readelf.c:10825
 #, c-format
 msgid " Call site encoding:  %#x "
 msgstr "呼出しサイトコード化: %#x "
 
-#: src/readelf.c:10757
+#: src/readelf.c:10838
 msgid ""
 "\n"
 " Call site table:"
@@ -5606,7 +5838,7 @@
 "\n"
 " 呼出しサイトテーブル:"
 
-#: src/readelf.c:10771
+#: src/readelf.c:10852
 #, c-format
 msgid ""
 " [%4u] Call site start:   %#<PRIx64>\n"
@@ -5619,12 +5851,12 @@
 "        離着陸場:           %#<PRIx64>\n"
 "        行動:               %u\n"
 
-#: src/readelf.c:10844
+#: src/readelf.c:10925
 #, c-format
 msgid "invalid TType encoding"
 msgstr "不当な TType コード化"
 
-#: src/readelf.c:10871
+#: src/readelf.c:10952
 #, fuzzy, c-format
 msgid ""
 "\n"
@@ -5634,37 +5866,37 @@
 "オフセット %3$#<PRIx64> の DWARF セクション [%1$2zu] '%2$s' には %4$zu 個の項"
 "目があります:\n"
 
-#: src/readelf.c:10900
+#: src/readelf.c:10981
 #, fuzzy, c-format
 msgid " Version:         %<PRId32>\n"
 msgstr "      %s: %<PRId64>\n"
 
-#: src/readelf.c:10918
+#: src/readelf.c:10999
 #, fuzzy, c-format
 msgid " CU offset:       %#<PRIx32>\n"
 msgstr " (オフセット: %#<PRIx64>)"
 
-#: src/readelf.c:10925
+#: src/readelf.c:11006
 #, fuzzy, c-format
 msgid " TU offset:       %#<PRIx32>\n"
 msgstr " (オフセット: %#<PRIx64>)"
 
-#: src/readelf.c:10932
+#: src/readelf.c:11013
 #, fuzzy, c-format
 msgid " address offset:  %#<PRIx32>\n"
 msgstr " (終了オフセット: %#<PRIx64>)"
 
-#: src/readelf.c:10939
+#: src/readelf.c:11020
 #, fuzzy, c-format
 msgid " symbol offset:   %#<PRIx32>\n"
 msgstr " (オフセット: %#<PRIx64>)"
 
-#: src/readelf.c:10946
+#: src/readelf.c:11027
 #, fuzzy, c-format
 msgid " constant offset: %#<PRIx32>\n"
 msgstr " (終了オフセット: %#<PRIx64>)"
 
-#: src/readelf.c:10960
+#: src/readelf.c:11041
 #, fuzzy, c-format
 msgid ""
 "\n"
@@ -5674,7 +5906,7 @@
 "オフセット %3$#<PRIx64> の DWARF セクション [%1$2zu] '%2$s' には %4$zu 個の項"
 "目があります:\n"
 
-#: src/readelf.c:10985
+#: src/readelf.c:11066
 #, fuzzy, c-format
 msgid ""
 "\n"
@@ -5684,7 +5916,7 @@
 "オフセット %3$#<PRIx64> の DWARF セクション [%1$2zu] '%2$s' には %4$zu 個の項"
 "目があります:\n"
 
-#: src/readelf.c:11014
+#: src/readelf.c:11095
 #, fuzzy, c-format
 msgid ""
 "\n"
@@ -5694,7 +5926,7 @@
 "オフセット %3$#<PRIx64> の DWARF セクション [%1$2zu] '%2$s' には %4$zu 個の項"
 "目があります:\n"
 
-#: src/readelf.c:11046
+#: src/readelf.c:11127
 #, fuzzy, c-format
 msgid ""
 "\n"
@@ -5703,18 +5935,18 @@
 "\n"
 "オフセット %#0<PRIx64> に不当なシンボルテーブル\n"
 
-#: src/readelf.c:11184
+#: src/readelf.c:11265
 #, c-format
 msgid "cannot get debug context descriptor: %s"
 msgstr "デバッグ内容記述子を得られません: %s"
 
-#: src/readelf.c:11552 src/readelf.c:12179 src/readelf.c:12290
-#: src/readelf.c:12348
+#: src/readelf.c:11633 src/readelf.c:12260 src/readelf.c:12371
+#: src/readelf.c:12429
 #, c-format
 msgid "cannot convert core note data: %s"
 msgstr "コアノートデータの変換ができません: %s"
 
-#: src/readelf.c:11915
+#: src/readelf.c:11996
 #, c-format
 msgid ""
 "\n"
@@ -5723,21 +5955,21 @@
 "\n"
 "%*s... < %u 回の繰返し> ..."
 
-#: src/readelf.c:12427
+#: src/readelf.c:12508
 msgid "  Owner          Data size  Type\n"
 msgstr "  所有者         データ大きさタイプ\n"
 
-#: src/readelf.c:12456
+#: src/readelf.c:12536
 #, c-format
 msgid "  %-13.*s  %9<PRId32>  %s\n"
 msgstr "  %-13.*s  %9<PRId32>  %s\n"
 
-#: src/readelf.c:12508
-#, fuzzy, c-format
+#: src/readelf.c:12588
+#, c-format
 msgid "cannot get content of note: %s"
-msgstr "ノートセクションの内容を得られません: %s"
+msgstr "ノートセクションの内容を取得できません: %s"
 
-#: src/readelf.c:12542
+#: src/readelf.c:12622
 #, c-format
 msgid ""
 "\n"
@@ -5747,7 +5979,7 @@
 "オフセット %4$#0<PRIx64> の %3$<PRIu64> バイトのノートセクション [%1$2zu] "
 "'%2$s':\n"
 
-#: src/readelf.c:12565
+#: src/readelf.c:12645
 #, c-format
 msgid ""
 "\n"
@@ -5756,7 +5988,7 @@
 "\n"
 "オフセット %2$#0<PRIx64> の %1$<PRIu64> バイトのノートセグメント:\n"
 
-#: src/readelf.c:12612
+#: src/readelf.c:12692
 #, fuzzy, c-format
 msgid ""
 "\n"
@@ -5765,12 +5997,12 @@
 "\n"
 "セクション [%Zu] '%s' にはダンプすべきデータがありません。\n"
 
-#: src/readelf.c:12639 src/readelf.c:12690
+#: src/readelf.c:12719 src/readelf.c:12770
 #, fuzzy, c-format
 msgid "cannot get data for section [%zu] '%s': %s"
 msgstr "セクション [%Zu] '%s' からデータが得られません: %s"
 
-#: src/readelf.c:12644
+#: src/readelf.c:12724
 #, fuzzy, c-format
 msgid ""
 "\n"
@@ -5780,7 +6012,7 @@
 "オフセット %4$#0<PRIx64> のセクション [%1$Zu] '%2$s' の16進ダン"
 "プ、%3$<PRIu64> バイト:\n"
 
-#: src/readelf.c:12649
+#: src/readelf.c:12729
 #, fuzzy, c-format
 msgid ""
 "\n"
@@ -5791,7 +6023,7 @@
 "オフセット %4$#0<PRIx64> のセクション [%1$Zu] '%2$s' の16進ダン"
 "プ、%3$<PRIu64> バイト:\n"
 
-#: src/readelf.c:12663
+#: src/readelf.c:12743
 #, fuzzy, c-format
 msgid ""
 "\n"
@@ -5800,7 +6032,7 @@
 "\n"
 "セクション [%Zu] '%s' にはダンプすべきデータがありません。\n"
 
-#: src/readelf.c:12695
+#: src/readelf.c:12775
 #, fuzzy, c-format
 msgid ""
 "\n"
@@ -5810,7 +6042,7 @@
 "オフセット %4$#0<PRIx64> 文字列セクション [%1$Zu] '%2$s' には %3$<PRIu64> バ"
 "イトあります:\n"
 
-#: src/readelf.c:12700
+#: src/readelf.c:12780
 #, fuzzy, c-format
 msgid ""
 "\n"
@@ -5821,7 +6053,7 @@
 "オフセット %4$#0<PRIx64> 文字列セクション [%1$Zu] '%2$s' には %3$<PRIu64> バ"
 "イトあります:\n"
 
-#: src/readelf.c:12749
+#: src/readelf.c:12829
 #, c-format
 msgid ""
 "\n"
@@ -5830,7 +6062,7 @@
 "\n"
 "セクション [%lu] がありません"
 
-#: src/readelf.c:12779
+#: src/readelf.c:12859
 #, c-format
 msgid ""
 "\n"
@@ -5839,12 +6071,12 @@
 "\n"
 "セクション '%s' がありません"
 
-#: src/readelf.c:12836
+#: src/readelf.c:12916
 #, c-format
 msgid "cannot get symbol index of archive '%s': %s"
 msgstr "アーカイブのシンボル索引 '%s' を得られません: %s"
 
-#: src/readelf.c:12839
+#: src/readelf.c:12919
 #, c-format
 msgid ""
 "\n"
@@ -5853,21 +6085,21 @@
 "\n"
 "アーカイブ '%s' にはシンボル索引がありません\n"
 
-#: src/readelf.c:12843
-#, fuzzy, c-format
+#: src/readelf.c:12923
+#, c-format
 msgid ""
 "\n"
 "Index of archive '%s' has %zu entries:\n"
 msgstr ""
 "\n"
-"アーカイブ '%s' の索引には %Zu 項目あります:\n"
+"アーカイブ '%s' の索引は %zu 個の項目を持ちます:\n"
 
-#: src/readelf.c:12861
-#, fuzzy, c-format
+#: src/readelf.c:12941
+#, c-format
 msgid "cannot extract member at offset %zu in '%s': %s"
-msgstr "'%2$s' の オフセット %1$Zu のメンバーを抽出できません: %3$s"
+msgstr "'%2$s' の オフセット %1$zu のメンバーを抽出できません: %3$s"
 
-#: src/readelf.c:12866
+#: src/readelf.c:12946
 #, c-format
 msgid "Archive member '%s' contains:\n"
 msgstr "アーカイブメンバー '%s' には以下があります:\n"
@@ -5877,8 +6109,8 @@
 "Use the output format FORMAT.  FORMAT can be `bsd' or `sysv'.  The default "
 "is `bsd'"
 msgstr ""
-"出力形式として FORMAT を使ってください。FORMAT は `bsd'か、`sysv' のどちらか"
-"です。省略値は `bsd'です"
+"出力形式として FORMAT を使ってください。 FORMAT は `bsd'、 `sysv' のどちらか"
+"です。 デフォルトは `bsd'です"
 
 #: src/size.c:58
 msgid "Same as `--format=sysv'"
@@ -5902,11 +6134,11 @@
 
 #: src/size.c:66
 msgid "Similar to `--format=sysv' output but in one line"
-msgstr "`--format=sysv' の出力と似ていますが、1行です"
+msgstr "`--format=sysv' の出力と 似ていますが、 1行です"
 
 #: src/size.c:70
 msgid "Print size and permission flags for loadable segments"
-msgstr "ロード可能セグメントのための印刷の大きさと許可フラグ"
+msgstr "ロード可能セグメント の大きさと 許可フラグの 表示"
 
 #: src/size.c:71
 msgid "Display the total sizes (bsd only)"
@@ -5915,7 +6147,7 @@
 #. Short description of program.
 #: src/size.c:76
 msgid "List section sizes of FILEs (a.out by default)."
-msgstr "ふぁいる のセクションの大きさの一覧 (省略値は a.out)"
+msgstr "FILE のセクションの 大きさの 一覧表示 (デフォルトでは a.out)"
 
 #: src/size.c:240
 #, c-format
@@ -5932,15 +6164,65 @@
 msgid "%s: file format not recognized"
 msgstr "%s: ファイル形式を認識できません"
 
+#: src/size.c:328
+msgctxt "bsd"
+msgid "text"
+msgstr ""
+
+#: src/size.c:329
+msgctxt "bsd"
+msgid "data"
+msgstr ""
+
+#: src/size.c:330
+msgctxt "bsd"
+msgid "bss"
+msgstr ""
+
+#: src/size.c:331
+msgctxt "bsd"
+msgid "dec"
+msgstr ""
+
+#: src/size.c:332
+msgctxt "bsd"
+msgid "hex"
+msgstr ""
+
+#: src/size.c:333
+msgctxt "bsd"
+msgid "filename"
+msgstr ""
+
 #: src/size.c:418 src/size.c:560
 #, c-format
 msgid " (ex %s)"
 msgstr " (ex %s)"
 
+#: src/size.c:420
+msgctxt "sysv"
+msgid "section"
+msgstr ""
+
+#: src/size.c:421
+msgctxt "sysv"
+msgid "size"
+msgstr ""
+
+#: src/size.c:422
+msgctxt "sysv"
+msgid "addr"
+msgstr ""
+
+#: src/size.c:451 src/size.c:454 src/size.c:457
+msgctxt "sysv"
+msgid "Total"
+msgstr ""
+
 #: src/size.c:482
-#, fuzzy, c-format
+#, c-format
 msgid "cannot get section header"
-msgstr "セクションヘッダーを得られません: %s"
+msgstr "セクションヘッダーを取得できません"
 
 #: src/size.c:585
 msgid "(TOTALS)\n"
@@ -5952,9 +6234,9 @@
 msgstr ""
 
 #: src/stack.c:493
-#, fuzzy, c-format
+#, c-format
 msgid "Cannot open core file '%s'"
-msgstr "アーカイブ '%s' を開くことができません"
+msgstr "コアファイル'%s' を開くことができません"
 
 #: src/stack.c:553
 #, c-format
@@ -5977,68 +6259,67 @@
 msgstr ""
 
 #: src/stack.c:645
-#, fuzzy
 msgid "Show stack of process PID"
-msgstr "検索ツリーを生成できません"
+msgstr "process PID のスタックを表示"
 
 #: src/stack.c:647
 msgid "Show stack found in COREFILE"
-msgstr ""
+msgstr "COREFILE で見つかったスタックを表示"
 
 #: src/stack.c:648
 msgid "(optional) EXECUTABLE that produced COREFILE"
-msgstr ""
+msgstr "(optional) COREFILE を生成した EXECUTABLE"
 
 #: src/stack.c:652
-#, fuzzy
 msgid "Output selection options:"
-msgstr "選択オプションを入力してください:"
+msgstr "出力選択オプション:"
 
 #: src/stack.c:654
-#, fuzzy
 msgid "Additionally show frame activation"
-msgstr "出力選択:"
+msgstr "frame activation を さらに 表示"
 
 #: src/stack.c:656
 msgid "Additionally try to lookup DWARF debuginfo name for frame address"
-msgstr ""
+msgstr "フレーム アドレスに 対する DWARF debuginfo name の検索を さらに試みる"
 
 #: src/stack.c:659
 msgid ""
 "Additionally show inlined function frames using DWARF debuginfo if available "
 "(implies -d)"
 msgstr ""
+"可能であれば DWARF debuginfo を使って インライン 関数の フレームを表示 (暗黙"
+"的に -d を伴う)"
 
 #: src/stack.c:661
 msgid "Additionally show module file information"
-msgstr ""
+msgstr "モジュール ファイル情報を さらに 表示"
 
 #: src/stack.c:663
-#, fuzzy
 msgid "Additionally show source file information"
-msgstr "出力選択:"
+msgstr "ソース ファイル情報を さらに 表示"
 
 #: src/stack.c:665
 msgid ""
 "Show all additional information (activation, debugname, inlines, module and "
 "source)"
 msgstr ""
+"全ての 追加情報を 表示 (activation, debugname, inlines, module, source)"
 
 #: src/stack.c:667
 msgid "Do not resolve address to function symbol name"
-msgstr ""
+msgstr "アドレスを 関数シンボル名に 解決しない"
 
 #: src/stack.c:669
 msgid "Show raw function symbol names, do not try to demangle names"
-msgstr ""
+msgstr "生の 関数シンボル名を 表示し、 デマングルを 試みない"
 
 #: src/stack.c:671
 msgid "Show module build-id, load address and pc offset"
-msgstr ""
+msgstr "モジュールの ビルド ID、ロードアドレスと PC オフセット を表示"
 
 #: src/stack.c:673
 msgid "Show the backtrace of only one thread"
-msgstr ""
+msgstr "1つのスレッドだけのバックトレースを表示"
 
 #: src/stack.c:675
 msgid "Show at most MAXFRAMES per thread (default 256, use 0 for unlimited)"
@@ -6047,6 +6328,8 @@
 #: src/stack.c:677
 msgid "Show module memory map with build-id, elf and debug files detected"
 msgstr ""
+"検出された ビルド ID、 elf、 debug ファイル付きで モジュールの メモリマップ"
+"を 表示"
 
 #: src/stack.c:685
 msgid ""
@@ -6063,42 +6346,44 @@
 #: src/stack.c:760
 #, c-format
 msgid "Couldn't show any frames."
-msgstr ""
+msgstr "フレームを表示できません"
 
 #: src/strings.c:65
 msgid "Output Selection:"
-msgstr ""
+msgstr "出力選択:"
 
 #: src/strings.c:66
 msgid "Scan entire file, not only loaded sections"
-msgstr ""
+msgstr "ロードされる セクションだけ でなく ファイル全体を スキャンする"
 
 #: src/strings.c:68
 msgid "Only NUL-terminated sequences of MIN-LEN characters or more are printed"
-msgstr ""
+msgstr "ヌル終端された MIN-LEN 文字以上の シーケンス のみを 表示"
 
 #: src/strings.c:69
 msgid ""
 "Select character size and endianness: s = 7-bit, S = 8-bit, {b,l} = 16-bit, "
 "{B,L} = 32-bit"
 msgstr ""
+"文字サイズと エンディアンを 選択: s = 7-bit, S = 8-bit, {b,l} = 16-bit, {B,"
+"L} = 32-bit"
 
 #: src/strings.c:73
 msgid "Print name of the file before each string."
-msgstr ""
+msgstr "各文字列の 前に ファイル名を表示"
 
 #: src/strings.c:75
 msgid "Print location of the string in base 8, 10, or 16 respectively."
-msgstr ""
+msgstr "文字列の 位置を 基数 8、 10、 16 で 各々表示"
 
 #: src/strings.c:76
 msgid "Alias for --radix=o"
-msgstr ""
+msgstr "--radix=o と同じ"
 
 #. Short description of program.
 #: src/strings.c:83
 msgid "Print the strings of printable characters in files."
-msgstr ""
+msgstr "ファイル中の表示可能文字からなる文字列を表示する。"
 
 #: src/strings.c:256 src/strings.c:291
 #, c-format
@@ -6132,27 +6417,27 @@
 
 #: src/strip.c:71
 msgid "Place stripped output into FILE"
-msgstr "はぎ取った出力を ふぁいる に置く"
+msgstr "ストリップした 出力を FILE に置く"
 
 #: src/strip.c:72
 msgid "Extract the removed sections into FILE"
-msgstr "抽出した取り除いたセクションを ふぁいる に置く"
+msgstr "抽出して 取り除いた セクションを FILE に置く"
 
 #: src/strip.c:73
 msgid "Embed name FILE instead of -f argument"
-msgstr "-f パラメーターの代わりに 名前 ふぁいる を有効にする"
+msgstr "-f 引数の 代わりに 名前 FILE を有効にする"
 
 #: src/strip.c:77
 msgid "Remove all debugging symbols"
-msgstr "デバッグ用のシンボルを全て取り除く"
+msgstr "デバッグ用 シンボルを 全て 取り除く"
 
 #: src/strip.c:81
 msgid "Remove section headers (not recommended)"
-msgstr ""
+msgstr "セクションヘッダーを 取り除く (非推奨)"
 
 #: src/strip.c:83
 msgid "Copy modified/access timestamps to the output"
-msgstr "修正/アクセスタイムスタンプを出力へ複写する"
+msgstr "修正/アクセス タイムスタンプを 出力へ 複製する"
 
 #: src/strip.c:85
 msgid ""
@@ -6178,17 +6463,22 @@
 "Remove the named section.  SECTION is an extended wildcard pattern.  May be "
 "given more than once.  Only non-allocated sections can be removed."
 msgstr ""
+"指定された セクションを 取り除く。 SECTION は 拡張 ワイルド カード パター"
+"ン。 2回以上 与え られても よい。割り当て されない セクション のみ 取り除け"
+"る。"
 
 #: src/strip.c:91
 msgid ""
 "Keep the named section.  SECTION is an extended wildcard pattern.  May be "
 "given more than once."
 msgstr ""
+"指定された セクションを 保持する。 SECTION は 拡張 ワイルド カード パター"
+"ン。 2回以上 与え られても よい。"
 
 #. Short description of program.
 #: src/strip.c:98
 msgid "Discard symbols from object files."
-msgstr "オブジェクトファイルからシンボルを破棄する"
+msgstr "オブジェクトファイルからシンボルを捨て去る"
 
 #: src/strip.c:247
 #, c-format
@@ -6218,26 +6508,26 @@
 msgstr "-F オプションが 2 回指定されています"
 
 #: src/strip.c:362
-#, fuzzy, c-format
+#, c-format
 msgid "cannot both keep and remove .comment section"
-msgstr ".comment セクションを取り除く"
+msgstr ".comment セクションを保持しつつ取り除くことはできません"
 
 #: src/strip.c:481
-#, fuzzy, c-format
+#, c-format
 msgid "bad relocation"
-msgstr "リロケーションを表示"
+msgstr ""
 
-#: src/strip.c:747 src/strip.c:771
+#: src/strip.c:751 src/strip.c:775
 #, c-format
 msgid "cannot stat input file '%s'"
 msgstr "入力ファイル '%s' を stat できません"
 
-#: src/strip.c:761
+#: src/strip.c:765
 #, c-format
 msgid "while opening '%s'"
 msgstr "'%s' を開いている間"
 
-#: src/strip.c:799
+#: src/strip.c:803
 #, c-format
 msgid "%s: cannot use -o or -f when stripping archive"
 msgstr "%s: アーカイブから抜き出している時は -o や -f は使えません"
@@ -6248,171 +6538,173 @@
 #. result = handle_ar (fd, elf, NULL, fname,
 #. preserve_dates ? tv : NULL);
 #.
-#: src/strip.c:811
-#, fuzzy, c-format
+#: src/strip.c:815
+#, c-format
 msgid "%s: no support for stripping archive"
-msgstr "%s: アーカイブから抜き出している時は -o や -f は使えません"
+msgstr "%s: アーカイブのストリップには対応していません"
 
-#: src/strip.c:1047
+#: src/strip.c:1052
 #, c-format
 msgid "cannot open EBL backend"
 msgstr "EBL バックエンドを開けません"
 
-#: src/strip.c:1092
-#, fuzzy, c-format
+#: src/strip.c:1097
+#, c-format
 msgid "cannot get number of phdrs"
-msgstr "セクション数を決定できません: %s"
+msgstr "phdrs の数を取得できません"
 
-#: src/strip.c:1106 src/strip.c:1149
-#, fuzzy, c-format
+#: src/strip.c:1111 src/strip.c:1154
+#, c-format
 msgid "cannot create new ehdr for file '%s': %s"
-msgstr "新しいファイル '%s' を生成できません: %s"
+msgstr "ファイル '%s' の新しい ehdr を作成できません: %s"
 
-#: src/strip.c:1116 src/strip.c:1159
-#, fuzzy, c-format
+#: src/strip.c:1121 src/strip.c:1164
+#, c-format
 msgid "cannot create new phdr for file '%s': %s"
-msgstr "新しいファイル '%s' を生成できません: %s"
+msgstr "ファイル '%s' の新しい phdr を作成できません: %s"
 
-#: src/strip.c:1240
+#: src/strip.c:1244
 #, c-format
 msgid "illformed file '%s'"
 msgstr "不適格なファイル '%s'"
 
-#: src/strip.c:1250
-#, fuzzy, c-format
+#: src/strip.c:1254
+#, c-format
 msgid "Cannot remove allocated section '%s'"
-msgstr "PLT セクションを割り当てられません: %s"
+msgstr "割り当てされるセクション '%s' は取り除けません"
 
-#: src/strip.c:1259
-#, fuzzy, c-format
+#: src/strip.c:1263
+#, c-format
 msgid "Cannot both keep and remove section '%s'"
-msgstr "0番目のセクションのヘッダーを得られません: %s"
+msgstr "セクション '%s' を保持しつつ取り除くことはできません"
 
-#: src/strip.c:1624 src/strip.c:1739
+#: src/strip.c:1628 src/strip.c:1743
 #, c-format
 msgid "while generating output file: %s"
 msgstr "出力ファイルを生成している間: %s"
 
-#: src/strip.c:1688
-#, fuzzy, c-format
+#: src/strip.c:1692
+#, c-format
 msgid "%s: error while updating ELF header: %s"
-msgstr "%s: ELF ヘッダーを生成している間にエラー: %s"
+msgstr "%s: ELF ヘッダーの更新中にエラー: %s"
 
-#: src/strip.c:1697
-#, fuzzy, c-format
+#: src/strip.c:1701
+#, c-format
 msgid "%s: error while getting shdrstrndx: %s"
-msgstr "%s: ELF ヘッダーを生成している間にエラー: %s"
+msgstr "%s: shdrstrndx の取得中にエラー: %s"
 
-#: src/strip.c:1705 src/strip.c:2550
-#, fuzzy, c-format
+#: src/strip.c:1709 src/strip.c:2554
+#, c-format
 msgid "%s: error updating shdrstrndx: %s"
-msgstr "%s: ELF ヘッダーを生成している間にエラー: %s"
+msgstr "%s: shdrstrndx の更新中にエラー: %s"
 
-#: src/strip.c:1722
+#: src/strip.c:1726
 #, c-format
 msgid "while preparing output for '%s'"
 msgstr "'%s' のための出力を準備している間"
 
-#: src/strip.c:1784 src/strip.c:1847
+#: src/strip.c:1788 src/strip.c:1851
 #, c-format
 msgid "while create section header section: %s"
 msgstr "セクションヘッダーセクションを生成している間: %s"
 
-#: src/strip.c:1793
+#: src/strip.c:1797
 #, c-format
 msgid "cannot allocate section data: %s"
 msgstr "セクションデータを割り当てられません: %s"
 
-#: src/strip.c:1859
+#: src/strip.c:1863
 #, c-format
 msgid "while create section header string table: %s"
 msgstr "セクションヘッダー文字列テーブルを生成中: %s"
 
-#: src/strip.c:1866
-#, fuzzy, c-format
+#: src/strip.c:1870
+#, c-format
 msgid "no memory to create section header string table"
-msgstr "セクションヘッダー文字列テーブルを生成中: %s"
+msgstr "セクションヘッダー文字列テーブルを作成するメモリがありません"
 
-#: src/strip.c:2079
+#: src/strip.c:2083
 #, c-format
 msgid "Cannot remove symbol [%zd] from allocated symbol table [%zd]"
 msgstr ""
 
-#: src/strip.c:2466 src/strip.c:2574
+#: src/strip.c:2470 src/strip.c:2578
 #, c-format
 msgid "while writing '%s': %s"
 msgstr "'%s' を書込み中: %s"
 
-#: src/strip.c:2477
+#: src/strip.c:2481
 #, c-format
 msgid "while creating '%s'"
 msgstr "'%s' を生成中"
 
-#: src/strip.c:2500
+#: src/strip.c:2504
 #, c-format
 msgid "while computing checksum for debug information"
 msgstr "デバッグ情報のチェックサムを計算中"
 
-#: src/strip.c:2541
+#: src/strip.c:2545
 #, c-format
 msgid "%s: error while creating ELF header: %s"
 msgstr "%s: ELF ヘッダーを生成している間にエラー: %s"
 
-#: src/strip.c:2559
+#: src/strip.c:2563
 #, c-format
 msgid "%s: error while reading the file: %s"
 msgstr "%s: ファイルを読込み中にエラー: %s"
 
-#: src/strip.c:2599 src/strip.c:2619
-#, fuzzy, c-format
+#: src/strip.c:2603 src/strip.c:2623
+#, c-format
 msgid "while writing '%s'"
-msgstr "'%s' を書込み中: %s"
+msgstr "書き込み中 '%s'"
 
-#: src/strip.c:2656 src/strip.c:2663
+#: src/strip.c:2660 src/strip.c:2667
 #, c-format
 msgid "error while finishing '%s': %s"
 msgstr "'%s' の終了中にエラー: %s"
 
-#: src/strip.c:2680 src/strip.c:2756
+#: src/strip.c:2684 src/strip.c:2760
 #, c-format
 msgid "cannot set access and modification date of '%s'"
 msgstr "'%s' のアクセスと変更日付を設定できません"
 
 #: src/unstrip.c:66
 msgid "Match MODULE against file names, not module names"
-msgstr ""
+msgstr "モジュール名ではなく ファイル名で MODULE を一致させる"
 
 #: src/unstrip.c:67
 msgid "Silently skip unfindable files"
-msgstr ""
+msgstr "見つからない ファイルを 静かに スキップ"
 
 #: src/unstrip.c:70
 msgid "Place output into FILE"
-msgstr ""
+msgstr "出力を FILE に置く"
 
 #: src/unstrip.c:72
 msgid "Create multiple output files under DIRECTORY"
-msgstr ""
+msgstr "複数の 出力ファイルを DIRECTORY の下に 作成"
 
 #: src/unstrip.c:73
 msgid "Use module rather than file names"
-msgstr ""
+msgstr "ファイル名ではなく モジュール名を 使用"
 
 #: src/unstrip.c:75
 msgid "Create output for modules that have no separate debug information"
-msgstr ""
+msgstr "分離された デバッグ情報を 持たない モジュール用に 出力を 作成"
 
 #: src/unstrip.c:78
 msgid "Apply relocations to section contents in ET_REL files"
-msgstr ""
+msgstr "ET_REL ファイルの セクション内容に リロケーションを 適用"
 
 #: src/unstrip.c:80
 msgid "Only list module and file names, build IDs"
-msgstr ""
+msgstr "モジュール名、 ファイル名、 ビルドIDの リスト表示のみ"
 
 #: src/unstrip.c:82
 msgid "Force combining files even if some ELF headers don't seem to match"
 msgstr ""
+"いくつかの ELF ヘッダー が 一致しない ように 見えた としても ファイルの 結合"
+"を 強制"
 
 #: src/unstrip.c:126
 #, c-format
@@ -6432,342 +6724,353 @@
 #: src/unstrip.c:185
 #, c-format
 msgid "output directory '%s'"
-msgstr ""
+msgstr "出力ディレクトリ '%s'"
 
 #: src/unstrip.c:194
 #, c-format
 msgid "exactly two file arguments are required"
-msgstr ""
+msgstr "ちょうど2つの引数が必要です"
 
 #: src/unstrip.c:200
 #, c-format
 msgid "-m, -a, -R, and -i options not allowed with explicit files"
 msgstr ""
+"明示的なファイルを使用する際は -m, -a, -R, -i オプションは認められていません"
 
 #: src/unstrip.c:213
 #, c-format
 msgid "-o or -d is required when using implicit files"
-msgstr ""
+msgstr "暗黙的なファイルを使用する際は -o または -d が必要です"
 
 #: src/unstrip.c:236
 #, c-format
 msgid "cannot create ELF header: %s"
-msgstr ""
+msgstr "ELF ヘッダーを作成できません: %s"
 
 #: src/unstrip.c:240
-#, fuzzy, c-format
+#, c-format
 msgid "cannot get shdrstrndx:%s"
-msgstr "セクションを得られません: %s"
+msgstr "shdrstrndx を取得できません: %s"
 
-#: src/unstrip.c:244 src/unstrip.c:2085
+#: src/unstrip.c:244 src/unstrip.c:2088
 #, c-format
 msgid "cannot get ELF header: %s"
-msgstr ""
+msgstr "ELF ヘッダーを取得できません: %s"
 
 #: src/unstrip.c:254
-#, fuzzy, c-format
+#, c-format
 msgid "cannot get new zero section: %s"
-msgstr "セクションを得られません: %s"
+msgstr "新しい zero セクションを取得できません: %s"
 
 #: src/unstrip.c:257
-#, fuzzy, c-format
+#, c-format
 msgid "cannot update new zero section: %s"
-msgstr "セクション数を決定できません: %s"
+msgstr "新しい zero セクションを更新できません: %s"
 
 #: src/unstrip.c:261
 #, c-format
 msgid "cannot copy ELF header: %s"
-msgstr ""
+msgstr "ELF ヘッダーを複製できません: %s"
 
-#: src/unstrip.c:265 src/unstrip.c:2103 src/unstrip.c:2146
-#, fuzzy, c-format
+#: src/unstrip.c:265 src/unstrip.c:2106 src/unstrip.c:2149
+#, c-format
 msgid "cannot get number of program headers: %s"
-msgstr "セクション数を決定できません: %s"
+msgstr "プログラムヘッダ数を取得できません: %s"
 
-#: src/unstrip.c:270 src/unstrip.c:2107
+#: src/unstrip.c:270 src/unstrip.c:2110
 #, c-format
 msgid "cannot create program headers: %s"
-msgstr ""
+msgstr "プログラムヘッダーを作成できません: %s"
 
 #: src/unstrip.c:276
 #, c-format
 msgid "cannot copy program header: %s"
-msgstr ""
+msgstr "プログラムヘッダーを複製できません: %s"
 
 #: src/unstrip.c:286
 #, c-format
 msgid "cannot copy section header: %s"
-msgstr ""
+msgstr "セクションヘッダーを複製できません: %s"
 
-#: src/unstrip.c:289 src/unstrip.c:1707
+#: src/unstrip.c:289 src/unstrip.c:1710
 #, c-format
 msgid "cannot get section data: %s"
-msgstr ""
+msgstr "セクションデータを取得できません: %s"
 
-#: src/unstrip.c:291 src/unstrip.c:1709
+#: src/unstrip.c:291 src/unstrip.c:1712
 #, c-format
 msgid "cannot copy section data: %s"
-msgstr ""
+msgstr "セクションデータを複製できません: %s"
 
 #: src/unstrip.c:319
 #, c-format
 msgid "cannot create directory '%s'"
-msgstr ""
+msgstr "ディレクトリ '%s' を作成できません"
 
-#: src/unstrip.c:393 src/unstrip.c:655 src/unstrip.c:689 src/unstrip.c:857
-#: src/unstrip.c:1749
+#: src/unstrip.c:393 src/unstrip.c:659 src/unstrip.c:693 src/unstrip.c:861
+#: src/unstrip.c:1752
 #, c-format
 msgid "cannot get symbol table entry: %s"
-msgstr ""
+msgstr "シンボルテーブル項目を取得できません: %s"
 
-#: src/unstrip.c:409 src/unstrip.c:658 src/unstrip.c:679 src/unstrip.c:692
-#: src/unstrip.c:1770 src/unstrip.c:1965 src/unstrip.c:1989
+#: src/unstrip.c:409 src/unstrip.c:662 src/unstrip.c:683 src/unstrip.c:696
+#: src/unstrip.c:1773 src/unstrip.c:1968 src/unstrip.c:1992
 #, c-format
 msgid "cannot update symbol table: %s"
-msgstr ""
+msgstr "シンボルテーブルを更新できません: %s"
 
 #: src/unstrip.c:419
 #, c-format
 msgid "cannot update section header: %s"
+msgstr "セクションヘッダーを更新できません: %s"
+
+#: src/unstrip.c:465
+#, c-format
+msgid "gelf_getrel failed: %s"
 msgstr ""
 
-#: src/unstrip.c:465 src/unstrip.c:479
+#: src/unstrip.c:468 src/unstrip.c:483
 #, c-format
 msgid "cannot update relocation: %s"
+msgstr "リロケーションを更新できません: %s"
+
+#: src/unstrip.c:480
+#, c-format
+msgid "gelf_getrela failed: %s"
 msgstr ""
 
-#: src/unstrip.c:578
+#: src/unstrip.c:582
 #, c-format
 msgid "cannot get symbol version: %s"
-msgstr ""
+msgstr "シンボルバージョンを取得できません: %s"
 
-#: src/unstrip.c:591
+#: src/unstrip.c:595
 #, c-format
 msgid "unexpected section type in [%zu] with sh_link to symtab"
 msgstr ""
 
-#: src/unstrip.c:846
-#, fuzzy, c-format
+#: src/unstrip.c:850
+#, c-format
 msgid "cannot get symbol section data: %s"
-msgstr "ラインデータセクションデータを得られません: %s"
+msgstr "シンボルセクションデータを取得できません: %s"
 
-#: src/unstrip.c:848
-#, fuzzy, c-format
+#: src/unstrip.c:852
+#, c-format
 msgid "cannot get string section data: %s"
-msgstr "ラインデータセクションデータを得られません: %s"
+msgstr "文字列セクションデータを取得できません: %s"
 
-#: src/unstrip.c:865
-#, fuzzy, c-format
+#: src/unstrip.c:869
+#, c-format
 msgid "invalid string offset in symbol [%zu]"
-msgstr "シンボル %2$sの不正なオフセット %1$zu "
+msgstr "シンボル [%zu] の中に不当な文字列オフセットがあります"
 
-#: src/unstrip.c:1023 src/unstrip.c:1427
-#, fuzzy, c-format
+#: src/unstrip.c:1027 src/unstrip.c:1435
+#, c-format
 msgid "cannot read section [%zu] name: %s"
-msgstr "セクションデータを割り当てられません: %s"
+msgstr "セクション [%zu] の名前を読み込めません: %s"
 
-#: src/unstrip.c:1038
-#, fuzzy, c-format
+#: src/unstrip.c:1042
+#, c-format
 msgid "bad sh_link for group section: %s"
-msgstr "不当な .debug_line セクション"
+msgstr "グループセクションに対する誤った sh_link です: %s"
 
-#: src/unstrip.c:1044
-#, fuzzy, c-format
+#: src/unstrip.c:1048
+#, c-format
 msgid "couldn't get shdr for group section: %s"
-msgstr "セクションからデータを得られません %d: %s"
+msgstr "グループセクションに対する shdr を取得できませんでした: %s"
 
-#: src/unstrip.c:1049
-#, fuzzy, c-format
+#: src/unstrip.c:1053
+#, c-format
 msgid "bad data for group symbol section: %s"
-msgstr "セクションからデータを得られません %d: %s"
+msgstr "グループシンボルセクションに対する誤ったデータです: %s"
 
-#: src/unstrip.c:1055
-#, fuzzy, c-format
+#: src/unstrip.c:1059
+#, c-format
 msgid "couldn't get symbol for group section: %s"
-msgstr "セクション数を決定できません: %s"
+msgstr "グループセクションに対するシンボルを取得できませんでした: %s"
 
-#: src/unstrip.c:1060
-#, fuzzy, c-format
+#: src/unstrip.c:1064
+#, c-format
 msgid "bad symbol name for group section: %s"
-msgstr "セクションヘッダー文字列セクションを生成できません: %s"
+msgstr "グループセクションに対する誤ったシンボル名です: %s"
 
-#: src/unstrip.c:1102 src/unstrip.c:1121 src/unstrip.c:1159
-#, c-format
-msgid "cannot read '.gnu.prelink_undo' section: %s"
-msgstr ""
-
-#: src/unstrip.c:1139
-#, c-format
-msgid "overflow with shnum = %zu in '%s' section"
-msgstr ""
-
-#: src/unstrip.c:1150
-#, c-format
-msgid "invalid contents in '%s' section"
-msgstr ""
-
-#: src/unstrip.c:1206 src/unstrip.c:1553
+#: src/unstrip.c:1075 src/unstrip.c:1556
 #, fuzzy, c-format
 msgid "cannot find matching section for [%zu] '%s'"
 msgstr "セクション [%zu] '%s' の不当なデータ"
 
-#: src/unstrip.c:1331 src/unstrip.c:1347 src/unstrip.c:1633 src/unstrip.c:1924
+#: src/unstrip.c:1120 src/unstrip.c:1139 src/unstrip.c:1177
+#, c-format
+msgid "cannot read '.gnu.prelink_undo' section: %s"
+msgstr ""
+
+#: src/unstrip.c:1157
+#, c-format
+msgid "overflow with shnum = %zu in '%s' section"
+msgstr ""
+
+#: src/unstrip.c:1168
+#, c-format
+msgid "invalid contents in '%s' section"
+msgstr ""
+
+#: src/unstrip.c:1339 src/unstrip.c:1355 src/unstrip.c:1636 src/unstrip.c:1927
 #, c-format
 msgid "cannot add section name to string table: %s"
 msgstr ""
 
-#: src/unstrip.c:1356
+#: src/unstrip.c:1364
 #, c-format
 msgid "cannot update section header string table data: %s"
 msgstr ""
 
-#: src/unstrip.c:1385 src/unstrip.c:1389
+#: src/unstrip.c:1393 src/unstrip.c:1397
 #, c-format
 msgid "cannot get section header string table section index: %s"
 msgstr ""
 
-#: src/unstrip.c:1393 src/unstrip.c:1397 src/unstrip.c:1648
+#: src/unstrip.c:1401 src/unstrip.c:1405 src/unstrip.c:1651
 #, c-format
 msgid "cannot get section count: %s"
 msgstr ""
 
-#: src/unstrip.c:1400
+#: src/unstrip.c:1408
 #, c-format
 msgid "more sections in stripped file than debug file -- arguments reversed?"
 msgstr ""
 
-#: src/unstrip.c:1404
+#: src/unstrip.c:1412
 #, c-format
 msgid "no sections in stripped file"
 msgstr ""
 
-#: src/unstrip.c:1475 src/unstrip.c:1568
+#: src/unstrip.c:1460 src/unstrip.c:1571
 #, c-format
 msgid "cannot read section header string table: %s"
 msgstr ""
 
-#: src/unstrip.c:1627
+#: src/unstrip.c:1630
 #, c-format
 msgid "cannot add new section: %s"
 msgstr ""
 
-#: src/unstrip.c:1757
-#, fuzzy, c-format
+#: src/unstrip.c:1760
+#, c-format
 msgid "symbol [%zu] has invalid section index"
-msgstr "不当なセクション索引"
+msgstr "シンボル [%zu] が不当なセクション索引を持っています"
 
-#: src/unstrip.c:1789
-#, fuzzy, c-format
+#: src/unstrip.c:1792
+#, c-format
 msgid "group has invalid section index [%zd]"
-msgstr "不当なセクション索引"
+msgstr "グループが不当なセクション索引 [%zd] を持っています"
 
-#: src/unstrip.c:2064
-#, fuzzy, c-format
+#: src/unstrip.c:2067
+#, c-format
 msgid "cannot read section data: %s"
-msgstr "セクションデータを割り当てられません: %s"
+msgstr "セクションデータを読み込めません: %s"
 
-#: src/unstrip.c:2093
+#: src/unstrip.c:2096
 #, c-format
 msgid "cannot update ELF header: %s"
 msgstr "ELF ヘッダーを更新できません: %s"
 
-#: src/unstrip.c:2117
+#: src/unstrip.c:2120
 #, c-format
 msgid "cannot update program header: %s"
 msgstr ""
 
-#: src/unstrip.c:2122 src/unstrip.c:2205
+#: src/unstrip.c:2125 src/unstrip.c:2208
 #, c-format
 msgid "cannot write output file: %s"
 msgstr ""
 
-#: src/unstrip.c:2173
+#: src/unstrip.c:2176
 #, c-format
 msgid "DWARF data not adjusted for prelinking bias; consider prelink -u"
 msgstr ""
 
-#: src/unstrip.c:2176
+#: src/unstrip.c:2179
 #, c-format
 msgid ""
 "DWARF data in '%s' not adjusted for prelinking bias; consider prelink -u"
 msgstr ""
 
-#: src/unstrip.c:2196 src/unstrip.c:2247 src/unstrip.c:2259 src/unstrip.c:2345
+#: src/unstrip.c:2199 src/unstrip.c:2251 src/unstrip.c:2263 src/unstrip.c:2353
 #, c-format
 msgid "cannot create ELF descriptor: %s"
 msgstr ""
 
-#: src/unstrip.c:2238
+#: src/unstrip.c:2237
 msgid "WARNING: "
 msgstr ""
 
-#: src/unstrip.c:2240
+#: src/unstrip.c:2239
 msgid ", use --force"
 msgstr ""
 
-#: src/unstrip.c:2263
+#: src/unstrip.c:2267
 msgid "ELF header identification (e_ident) different"
 msgstr ""
 
-#: src/unstrip.c:2266
+#: src/unstrip.c:2271
 msgid "ELF header type (e_type) different"
 msgstr ""
 
-#: src/unstrip.c:2269
+#: src/unstrip.c:2275
 msgid "ELF header machine type (e_machine) different"
 msgstr ""
 
-#: src/unstrip.c:2272
+#: src/unstrip.c:2279
 msgid "stripped program header (e_phnum) smaller than unstripped"
 msgstr ""
 
-#: src/unstrip.c:2302
+#: src/unstrip.c:2310
 #, c-format
 msgid "cannot find stripped file for module '%s': %s"
 msgstr ""
 
-#: src/unstrip.c:2306
+#: src/unstrip.c:2314
 #, c-format
 msgid "cannot open stripped file '%s' for module '%s': %s"
 msgstr ""
 
-#: src/unstrip.c:2321
+#: src/unstrip.c:2329
 #, c-format
 msgid "cannot find debug file for module '%s': %s"
 msgstr ""
 
-#: src/unstrip.c:2325
+#: src/unstrip.c:2333
 #, c-format
 msgid "cannot open debug file '%s' for module '%s': %s"
 msgstr ""
 
-#: src/unstrip.c:2338
+#: src/unstrip.c:2346
 #, c-format
 msgid "module '%s' file '%s' is not stripped"
 msgstr ""
 
-#: src/unstrip.c:2369
+#: src/unstrip.c:2377
 #, c-format
 msgid "cannot cache section addresses for module '%s': %s"
 msgstr ""
 
-#: src/unstrip.c:2501
+#: src/unstrip.c:2505
 #, c-format
 msgid "no matching modules found"
 msgstr ""
 
-#: src/unstrip.c:2510
+#: src/unstrip.c:2515
 #, c-format
 msgid "matched more than one module"
 msgstr ""
 
-#: src/unstrip.c:2554
+#: src/unstrip.c:2560
 msgid ""
 "STRIPPED-FILE DEBUG-FILE\n"
 "[MODULE...]"
 msgstr ""
 
-#: src/unstrip.c:2555
+#: src/unstrip.c:2561
 msgid ""
 "Combine stripped files with separate symbols and debug information.\n"
 "\n"
@@ -6795,18 +7098,36 @@
 "was found, or . if FILE contains the debug information."
 msgstr ""
 
-#: tests/backtrace.c:436
+#. Short description of program.
+#: debuginfod/debuginfod-find.c:42
+msgid "Request debuginfo-related content from debuginfods listed in $"
+msgstr ""
+
+#. Strings for arguments in help texts.
+#: debuginfod/debuginfod-find.c:46
+msgid ""
+"debuginfo BUILDID\n"
+"debuginfo PATH\n"
+"executable BUILDID\n"
+"executable PATH\n"
+"source BUILDID /FILENAME\n"
+"source PATH /FILENAME\n"
+msgstr ""
+
+#: tests/backtrace.c:483
 msgid "Run executable"
 msgstr ""
 
 #: tests/dwflmodtest.c:209
-#, fuzzy
 msgid "Additionally show function names"
-msgstr "出力選択:"
+msgstr "関数名を さらに 表示"
 
 #: tests/dwflmodtest.c:210
 msgid "Show instances of inlined functions"
-msgstr ""
+msgstr "インライン関数の実体を表示"
+
+#~ msgid "cannot allocate memory"
+#~ msgstr "メモリーを割り当てられません"
 
 #, fuzzy
 #~ msgid ""
@@ -7109,18 +7430,12 @@
 #~ msgid "unknown option `-%c %s'"
 #~ msgstr "不明なオプション `%c %s'"
 
-#~ msgid "invalid page size value '%s': ignored"
-#~ msgstr "不当なページサイズ値 '%s': 無視しました"
-
 #~ msgid "invalid hash style '%s'"
 #~ msgstr "不当なハッシュスタイル '%s'"
 
 #~ msgid "invalid build-ID style '%s'"
 #~ msgstr "不当なビルド-ID スタイル '%s'"
 
-#~ msgid "More than one output file name given."
-#~ msgstr "ひとつを越える出力ファイル名が与えられました。"
-
 #~ msgid "Invalid optimization level `%s'"
 #~ msgstr "不当な最適化レベル `%s'"
 
@@ -7341,9 +7656,6 @@
 #~ msgid "while reading version script '%s': %s at line %d"
 #~ msgstr "バージョンスクリプト '%1$s' 読込み中: %3$d 行目の %2$s"
 
-#~ msgid "while reading linker script '%s': %s at line %d"
-#~ msgstr "リンカースクリプト '%1$s' 読込み中: %3$d 行目の %2$s"
-
 #, fuzzy
 #~ msgid ""
 #~ "symbol '%s' is declared both local and global for unnamed version '%s'"
diff --git a/po/pl.po b/po/pl.po
index 260955a..f50b9f8 100644
--- a/po/pl.po
+++ b/po/pl.po
@@ -1,15 +1,15 @@
 # Polish translation for elfutils.
-# Copyright © 2003-2016 the elfutils authors.
+# Copyright © 2003-2021 the elfutils authors.
 # This file is distributed under the same license as the elfutils package.
 # Jakub Bogusz <qboosh@pld-linux.org>, 2003-2007.
-# Piotr Drąg <piotrdrag@gmail.com>, 2010-2016.
+# Piotr Drąg <piotrdrag@gmail.com>, 2010-2021.
 #
 msgid ""
 msgstr ""
 "Project-Id-Version: elfutils\n"
 "Report-Msgid-Bugs-To: https://sourceware.org/bugzilla/\n"
-"POT-Creation-Date: 2021-02-05 21:10+0100\n"
-"PO-Revision-Date: 2016-12-29 17:48+0100\n"
+"POT-Creation-Date: 2021-11-10 16:21+0100\n"
+"PO-Revision-Date: 2021-02-22 16:25+0100\n"
 "Last-Translator: Piotr Drąg <piotrdrag@gmail.com>\n"
 "Language-Team: Polish <trans-pl@lists.fedoraproject.org>\n"
 "Language: pl\n"
@@ -41,11 +41,6 @@
 "  • „never”, „no”, „none”\n"
 "  • „auto”, „tty”, „if-tty”\n"
 
-#: lib/color.c:194 src/objdump.c:728
-#, c-format
-msgid "cannot allocate memory"
-msgstr "nie można przydzielić pamięci"
-
 #: lib/printversion.c:40
 #, c-format
 msgid ""
@@ -59,8 +54,8 @@
 "BEZ JAKIEJKOLWIEK GWARANCJI, nawet domyślnej gwarancji PRZYDATNOŚCI\n"
 "HANDLOWEJ albo PRZYDATNOŚCI DO OKREŚLONYCH ZASTOSOWAŃ.\n"
 
-#: lib/xmalloc.c:48 lib/xmalloc.c:61 lib/xmalloc.c:73 src/readelf.c:3453
-#: src/readelf.c:11501 src/unstrip.c:312 src/unstrip.c:2398 src/unstrip.c:2603
+#: lib/xmalloc.c:48 lib/xmalloc.c:61 lib/xmalloc.c:73 src/readelf.c:11582
+#: src/unstrip.c:312
 #, c-format
 msgid "memory exhausted"
 msgstr "pamięć wyczerpana"
@@ -112,6 +107,21 @@
 msgid "unknown error"
 msgstr "nieznany błąd"
 
+#: libcpu/i386_lex.l:122
+#, c-format
+msgid "invalid character '%c' at line %d; ignored"
+msgstr "nieprawidłowy znak „%c” w %d. wierszu; zignorowano"
+
+#: libcpu/i386_lex.l:123
+#, c-format
+msgid "invalid character '\\%o' at line %d; ignored"
+msgstr "nieprawidłowy znak „\\%o” w %d. wierszu; zignorowano"
+
+#: libcpu/i386_parse.y:554
+#, c-format
+msgid "while reading i386 CPU description: %s at line %d"
+msgstr "podczas odczytywania opisu procesora i386: %s w %d. wierszu"
+
 #: libdw/dwarf_error.c:59
 msgid "invalid access"
 msgstr "nieprawidłowy dostęp"
@@ -173,19 +183,16 @@
 msgstr "brak danych w postaci ciągu"
 
 #: libdw/dwarf_error.c:75
-#, fuzzy
 msgid ".debug_str section missing"
-msgstr "brak sekcji .debug_ranges"
+msgstr "brak sekcji .debug_str"
 
 #: libdw/dwarf_error.c:76
-#, fuzzy
 msgid ".debug_line_str section missing"
-msgstr "brak sekcji .debug_line"
+msgstr "brak sekcji .debug_line_str"
 
 #: libdw/dwarf_error.c:77
-#, fuzzy
 msgid ".debug_str_offsets section missing"
-msgstr "brak sekcji .debug_ranges"
+msgstr "brak sekcji .debug_str_offsets"
 
 #: libdw/dwarf_error.c:78
 msgid "no address value"
@@ -228,19 +235,16 @@
 msgstr "adres jest spoza zakresu"
 
 #: libdw/dwarf_error.c:88
-#, fuzzy
 msgid ".debug_loc section missing"
-msgstr "brak sekcji .debug_line"
+msgstr "brak sekcji .debug_loc"
 
 #: libdw/dwarf_error.c:89
-#, fuzzy
 msgid ".debug_loclists section missing"
-msgstr "brak sekcji .debug_line"
+msgstr "brak sekcji .debug_loclists"
 
 #: libdw/dwarf_error.c:90
-#, fuzzy
 msgid "not a location list value"
-msgstr "brak wartości listy położeń"
+msgstr "nie jest wartością listy położeń"
 
 #: libdw/dwarf_error.c:91
 msgid "no block data"
@@ -271,9 +275,8 @@
 msgstr "brak sekcji .debug_ranges"
 
 #: libdw/dwarf_error.c:98
-#, fuzzy
 msgid ".debug_rnglists section missing"
-msgstr "brak sekcji .debug_ranges"
+msgstr "brak sekcji .debug_rnglists"
 
 #: libdw/dwarf_error.c:99
 msgid "invalid CFI section"
@@ -292,16 +295,14 @@
 msgstr "nie jest CU (jednostką) DIE"
 
 #: libdw/dwarf_error.c:103
-#, fuzzy
 msgid "unknown language code"
-msgstr " nieznana instrukcja"
+msgstr "nieznany kod języka"
 
 #: libdw/dwarf_error.c:104
-#, fuzzy
 msgid ".debug_addr section missing"
-msgstr "brak sekcji .debug_ranges"
+msgstr "brak sekcji .debug_addr"
 
-#: libdwfl/argp-std.c:47 src/stack.c:643 src/unstrip.c:2544
+#: libdwfl/argp-std.c:47 src/stack.c:643 src/unstrip.c:2550
 msgid "Input selection options:"
 msgstr "Opcje wyboru wejścia:"
 
@@ -311,7 +312,7 @@
 
 #: libdwfl/argp-std.c:50
 msgid "Find addresses from signatures found in COREFILE"
-msgstr "Wyszukuje adresy z podpisów odnalezionych w PLIKU_CORE"
+msgstr "Wyszukuje adresy z podpisów odnalezionych w PLIKU-CORE"
 
 #: libdwfl/argp-std.c:52
 msgid "Find addresses in files mapped into process PID"
@@ -396,9 +397,8 @@
 msgstr "dekompresja LZMA się nie powiodła"
 
 #: libdwfl/libdwflP.h:61
-#, fuzzy
 msgid "zstd decompression failed"
-msgstr "dekompresja gzip się nie powiodła"
+msgstr "dekompresja zstd się nie powiodła"
 
 #: libdwfl/libdwflP.h:62
 msgid "no support library found for machine"
@@ -528,8 +528,8 @@
 msgid "No backend"
 msgstr "Brak zaplecza"
 
-#: libebl/eblcorenotetypename.c:100 libebl/eblobjnotetypename.c:77
-#: libebl/eblobjnotetypename.c:109 libebl/eblobjnotetypename.c:130
+#: libebl/eblcorenotetypename.c:100 libebl/eblobjnotetypename.c:79
+#: libebl/eblobjnotetypename.c:110 libebl/eblobjnotetypename.c:131
 #: libebl/eblosabiname.c:73 libebl/eblsectionname.c:83
 #: libebl/eblsectiontypename.c:115 libebl/eblsegmenttypename.c:81
 msgid "<unknown>"
@@ -619,13 +619,13 @@
 
 #: libelf/elf_error.c:79
 msgid "invalid size of source operand"
-msgstr "nieprawidłowy rozmiar operanda źródłowego"
+msgstr "nieprawidłowy rozmiar operandu źródłowego"
 
 #: libelf/elf_error.c:83
 msgid "invalid size of destination operand"
-msgstr "nieprawidłowy rozmiar operanda docelowego"
+msgstr "nieprawidłowy rozmiar operandu docelowego"
 
-#: libelf/elf_error.c:87 src/readelf.c:6209
+#: libelf/elf_error.c:87 src/readelf.c:6215
 #, c-format
 msgid "invalid encoding"
 msgstr "nieprawidłowe kodowanie"
@@ -635,9 +635,8 @@
 msgstr "nieprawidłowy deskryptor pliku"
 
 #: libelf/elf_error.c:99
-#, fuzzy
 msgid "invalid ELF file data"
-msgstr "nieprawidłowy plik ELF"
+msgstr "nieprawidłowe dane pliku ELF"
 
 #: libelf/elf_error.c:103
 msgid "invalid operation"
@@ -711,8 +710,8 @@
 msgid "invalid section header"
 msgstr "nieprawidłowy nagłówek sekcji"
 
-#: libelf/elf_error.c:191 src/readelf.c:10012 src/readelf.c:10612
-#: src/readelf.c:10713 src/readelf.c:10895
+#: libelf/elf_error.c:191 src/readelf.c:10093 src/readelf.c:10693
+#: src/readelf.c:10794 src/readelf.c:10976
 #, c-format
 msgid "invalid data"
 msgstr "nieprawidłowe dane"
@@ -841,7 +840,7 @@
 msgid "Print all information on one line, and indent inlines"
 msgstr "Wyświetla wszystkie informacje w jednym wierszy i wyrównuje wstawki"
 
-#: src/addr2line.c:78 src/elfcmp.c:70 src/findtextrel.c:65 src/nm.c:100
+#: src/addr2line.c:78 src/elfcmp.c:70 src/findtextrel.c:66 src/nm.c:100
 #: src/strings.c:78
 msgid "Miscellaneous:"
 msgstr "Różne:"
@@ -1129,29 +1128,29 @@
 msgstr "nie można odczytać %s: %s"
 
 #: src/ar.c:1483
-#, fuzzy, c-format
+#, c-format
 msgid "cannot represent ar_date"
-msgstr "nie można dekompresować danych"
+msgstr "nie można przedstawić ar_date"
 
 #: src/ar.c:1489
-#, fuzzy, c-format
+#, c-format
 msgid "cannot represent ar_uid"
-msgstr "nie można dekompresować danych"
+msgstr "nie można przedstawić ar_uid"
 
 #: src/ar.c:1495
-#, fuzzy, c-format
+#, c-format
 msgid "cannot represent ar_gid"
-msgstr "nie można dekompresować danych"
+msgstr "nie można przedstawić ar_gid"
 
 #: src/ar.c:1501
-#, fuzzy, c-format
+#, c-format
 msgid "cannot represent ar_mode"
-msgstr "nie można uzyskać nazwy sekcji"
+msgstr "nie można przedstawić ar_mode"
 
 #: src/ar.c:1507
-#, fuzzy, c-format
+#, c-format
 msgid "cannot represent ar_size"
-msgstr "nie można otworzyć %s"
+msgstr "nie można przedstawić ar_size"
 
 #: src/arlib-argp.c:32
 msgid "Use zero for uid, gid, and date in archive members."
@@ -1177,6 +1176,266 @@
 msgid "cannot read ELF header of %s(%s): %s"
 msgstr "nie można odczytać nagłówka ELF %s(%s): %s"
 
+#: src/elfclassify.c:91
+msgid "opening"
+msgstr "otwieranie"
+
+#: src/elfclassify.c:98
+msgid "reading"
+msgstr "odczytywanie"
+
+#: src/elfclassify.c:244
+msgid "ELF header"
+msgstr "nagłówek ELF"
+
+#: src/elfclassify.c:255
+msgid "program headers"
+msgstr "nagłówki programu"
+
+#: src/elfclassify.c:264
+msgid "program header"
+msgstr "nagłówek programu"
+
+#: src/elfclassify.c:284
+msgid "section headers"
+msgstr "nagłówki sekcji"
+
+#: src/elfclassify.c:295
+msgid "section header string table index"
+msgstr "sekcja nagłówek ciąg tabela indeks"
+
+#: src/elfclassify.c:309
+msgid "could not obtain section header"
+msgstr "nie można uzyskać nagłówka sekcji"
+
+#: src/elfclassify.c:315
+msgid "could not obtain section name"
+msgstr "nie można uzyskać nazwy sekcji"
+
+#: src/elfclassify.c:828
+msgid "writing to standard output"
+msgstr "zapisywanie do standardowego wyjścia"
+
+#: src/elfclassify.c:855
+msgid "reading from standard input"
+msgstr "odczytywanie ze standardowego wejścia"
+
+#: src/elfclassify.c:876
+msgid "Classification options"
+msgstr "Opcje klasyfikacji"
+
+#: src/elfclassify.c:878
+msgid "File looks like an ELF object or archive/static library (default)"
+msgstr ""
+"Plik wygląda jak obiekt ELF lub archiwum/biblioteka statyczna (domyślnie)"
+
+#: src/elfclassify.c:881
+msgid "File is an regular ELF object (not an archive/static library)"
+msgstr ""
+"Plik jest zwykłym obiektem ELF (nie jest archiwum/biblioteką statyczną)"
+
+#: src/elfclassify.c:884
+msgid "File is an ELF archive or static library"
+msgstr "Plik jest archiwum lub biblioteką statyczną ELF"
+
+#: src/elfclassify.c:887
+msgid "File is an ELF core dump file"
+msgstr "Plik jest plikiem zrzutu core ELF"
+
+#: src/elfclassify.c:890
+msgid ""
+"File is an ELF file with symbol table or .debug_* sections and can be "
+"stripped further"
+msgstr ""
+"Plik jest plikiem ELF z tabelą symboli lub sekcjami .debug_* i może być "
+"dalej okrojony"
+
+#: src/elfclassify.c:893
+msgid "File is (primarily) an ELF program executable (not primarily a DSO)"
+msgstr "Plik jest (głównie) wykonywalnym programem ELF (nie jest głównie DSO)"
+
+#: src/elfclassify.c:896
+msgid "File is an ELF program executable (might also be a DSO)"
+msgstr "Plik jest wykonywalnym programem ELF (może być także DSO)"
+
+#: src/elfclassify.c:899
+msgid ""
+"File is (primarily) an ELF shared object (DSO) (not primarily an executable)"
+msgstr ""
+"Plik jest (głównie) obiektem współdzielonym ELF (DSO) (nie jest głównie "
+"plikiem wykonywalnym)"
+
+#: src/elfclassify.c:902
+msgid "File is an ELF shared object (DSO) (might also be an executable)"
+msgstr ""
+"Plik jest obiektem współdzielonym ELF (DSO) (może być także plikiem "
+"wykonywalnym)"
+
+#: src/elfclassify.c:906
+msgid "File is a linux kernel module"
+msgstr "Plik jest modułem jądra Linux"
+
+#: src/elfclassify.c:908
+msgid "File is a debug only ELF file (separate .debug, .dwo or dwz multi-file)"
+msgstr ""
+"Plik jest wyłącznie plikiem debugowania ELF (oddzielne .debug, .dwo lub "
+"wieloplikowe dwz)"
+
+#: src/elfclassify.c:911
+msgid "File is a loadable ELF object (program or shared object)"
+msgstr ""
+"Plik jest wczytywalnym obiektem ELF (programem lub obiektem współdzielonym)"
+
+#: src/elfclassify.c:940
+msgid "Input flags"
+msgstr "Flagi wejścia"
+
+#: src/elfclassify.c:942
+msgid "Only classify regular (not symlink nor special device) files"
+msgstr ""
+"Klasyfikuje tylko zwykłe (niebędące dowiązaniami symbolicznymi lub "
+"urządzeniami specjalnymi) pliki"
+
+#: src/elfclassify.c:944
+msgid ""
+"Also read file names to process from standard input, separated by newlines"
+msgstr ""
+"Odczytuje także nazwy plików do przetworzenia ze standardowego wejścia, "
+"rozdzielone znakami nowego wiersza"
+
+#: src/elfclassify.c:947
+msgid ""
+"Also read file names to process from standard input, separated by ASCII NUL "
+"bytes"
+msgstr ""
+"Odczytuje także nazwy plików do przetworzenia ze standardowego wejścia, "
+"rozdzielone bajtami NUL ASCII"
+
+#: src/elfclassify.c:950
+msgid "Do not read files from standard input (default)"
+msgstr "Bez odczytywania plików ze standardowego wejścia (domyślnie)"
+
+#: src/elfclassify.c:952
+msgid "Try to open compressed files or embedded (kernel) ELF images"
+msgstr "Próbuje otwierać skompresowane pliki lub osadzone obrazy ELF (jądra)"
+
+#: src/elfclassify.c:955
+msgid "Output flags"
+msgstr "Flagi wyjścia"
+
+#: src/elfclassify.c:957
+msgid "Output names of files, separated by newline"
+msgstr "Wyświetla nazwy plików, rozdzielone znakami nowego wiersza"
+
+#: src/elfclassify.c:959
+msgid "Output names of files, separated by ASCII NUL"
+msgstr "Wyświetla nazwy plików, rozdzielone znakami NUL ASCII"
+
+#: src/elfclassify.c:961
+msgid "Do not output file names"
+msgstr "Bez wyświetlania nazw plików"
+
+#: src/elfclassify.c:963
+msgid "If printing file names, print matching files (default)"
+msgstr "Podczas wyświetlana nazw plików wyświetla pasujące pliki (domyślnie)"
+
+#: src/elfclassify.c:965
+msgid "If printing file names, print files that do not match"
+msgstr "Podczas wyświetlania nazw plików wyświetla niepasujące pliki"
+
+#: src/elfclassify.c:967
+msgid "Additional flags"
+msgstr "Dodatkowe flagi"
+
+#: src/elfclassify.c:969
+msgid "Output additional information (can be specified multiple times)"
+msgstr "Wyświetla dodatkowe informacje (można podać wiele razy)"
+
+#: src/elfclassify.c:971
+msgid "Suppress some error output (counterpart to --verbose)"
+msgstr "Zmniejsza wyjście błędów (odpowiednik opcji --verbose)"
+
+#. Strings for arguments in help texts.
+#: src/elfclassify.c:979 src/elfcompress.c:1334 src/elflint.c:77
+#: src/readelf.c:158
+msgid "FILE..."
+msgstr "PLIK…"
+
+#: src/elfclassify.c:980
+msgid ""
+"Determine the type of an ELF file.\n"
+"\n"
+"All of the classification options must apply at the same time to a "
+"particular file.  Classification options can be negated using a \"--not-\" "
+"prefix.\n"
+"\n"
+"Since modern ELF does not clearly distinguish between programs and dynamic "
+"shared objects, you should normally use either --executable or --shared to "
+"identify the primary purpose of a file.  Only one of the --shared and --"
+"executable checks can pass for a file.\n"
+"\n"
+"If you want to know whether an ELF object might a program or a shared "
+"library (but could be both), then use --program or --library. Some ELF files "
+"will classify as both a program and a library.\n"
+"\n"
+"If you just want to know whether an ELF file is loadable (as program or "
+"library) use --loadable.  Note that files that only contain (separate) debug "
+"information (--debug-only) are never --loadable (even though they might "
+"contain program headers).  Linux kernel modules are also not --loadable (in "
+"the normal sense).\n"
+"\n"
+"Without any of the --print options, the program exits with status 0 if the "
+"requested checks pass for all input files, with 1 if a check fails for any "
+"file, and 2 if there is an environmental issue (such as a file read error or "
+"a memory allocation error).\n"
+"\n"
+"When printing file names, the program exits with status 0 even if no file "
+"names are printed, and exits with status 2 if there is an environmental "
+"issue.\n"
+"\n"
+"On usage error (e.g. a bad option was given), the program exits with a "
+"status code larger than 2.\n"
+"\n"
+"The --quiet or -q option suppresses some error warning output, but doesn't "
+"change the exit status."
+msgstr ""
+"Ustala typ pliku ELF.\n"
+"\n"
+"Wszystkie opcje klasyfikacji muszą być zastosowane w tym samym czasie do "
+"konkretnego pliku. Opcje klasyfikacji mogą zostać zaprzeczone za pomocą "
+"przedrostka „--not-”.\n"
+"\n"
+"Ponieważ nowoczesny format ELF nie rozróżnia jasno między programami "
+"a dynamicznymi obiektami współdzielonymi, należy zwykle użyć --executable "
+"lub --shared do identyfikacji głównego zastosowania pliku. Jeden plik może "
+"pasować tylko do jednego z testów --shared lub --executable.\n"
+"\n"
+"Aby poznać, czy obiekt ELF może być programem lub biblioteką współdzieloną "
+"(ale może być obydwoma), należy użyć opcji --program lub --library. Niektóre "
+"pliki ELF będą klasyfikowane jako program oraz biblioteka jednocześnie.\n"
+"\n"
+"Aby poznać tylko, czy plik ELF jest wczytywalny (jako program lub "
+"biblioteka), należy użyć opcji --loadable. Proszę zauważyć, że pliki "
+"zawierające tylko (oddzielne) informacje debugowania (--debug-only) nigdy "
+"nie są --loadable (nawet jeśli mogą zawierać nagłówki programu). Moduły "
+"jądra Linux także nie są --loadable (w zwyczajowym sensie).\n"
+"\n"
+"Bez podania żadnej z opcji --print program kończy działanie ze stanem 0, "
+"jeśli żądane testy zgadzają się dla wszystkich plików wejściowych, ze stanem "
+"1, jeśli test się nie powiedzie dla któregoś z plików, a ze stanem 2, jeśli "
+"jest problem środowiskowy (taki jak błąd odczytu pliku lub błąd przydziału "
+"pamięci).\n"
+"\n"
+"Podczas wyświetlania nazw plików program kończy działanie ze stanem 0, nawet "
+"jeśli żadne nazwy plików nie zostały wyświetlone, a ze stanem 2, jeśli jest "
+"problem środowiskowy.\n"
+"\n"
+"Przy błędnym użyciu (np. podaniu błędnej opcji) program kończy działanie "
+"z kodem stanu wyższym niż 2.\n"
+"\n"
+"Opcje --quiet i -q zmniejszają wyjście błędów i ostrzeżeń, ale nie zmieniają "
+"stanów zakończenia."
+
 #: src/elfcmp.c:60
 msgid "Control options:"
 msgstr "Opcje sterujące:"
@@ -1250,14 +1509,14 @@
 msgstr "%s %s różnią się: licznik nagłówka programu"
 
 #: src/elfcmp.c:241 src/elfcmp.c:244
-#, fuzzy, c-format
+#, c-format
 msgid "cannot get hdrstrndx of '%s': %s"
-msgstr "nie można uzyskać nagłówka ELF „%s”: %s"
+msgstr "nie można uzyskać hdrstrndx „%s”: %s"
 
 #: src/elfcmp.c:249
-#, fuzzy, c-format
+#, c-format
 msgid "%s %s diff: shdr string index"
-msgstr "%s %s różnią się: licznik sekcji"
+msgstr "%s %s różnią się: indeks ciągu shdr"
 
 #: src/elfcmp.c:307
 #, c-format
@@ -1369,14 +1628,14 @@
 msgid "Invalid value '%s' for --gaps parameter."
 msgstr "Nieprawidłowa wartość „%s” dla parametru --gaps."
 
-#: src/elfcmp.c:734 src/findtextrel.c:205 src/nm.c:364 src/ranlib.c:141
-#: src/size.c:272 src/strings.c:185 src/strip.c:1030 src/strip.c:1067
-#: src/unstrip.c:2194 src/unstrip.c:2223
+#: src/elfcmp.c:734 src/findtextrel.c:195 src/nm.c:364 src/ranlib.c:141
+#: src/size.c:272 src/strings.c:185 src/strip.c:1035 src/strip.c:1072
+#: src/unstrip.c:2197 src/unstrip.c:2226
 #, c-format
 msgid "cannot open '%s'"
 msgstr "nie można otworzyć „%s”"
 
-#: src/elfcmp.c:738 src/findtextrel.c:212 src/ranlib.c:158
+#: src/elfcmp.c:738 src/findtextrel.c:214 src/ranlib.c:158
 #, c-format
 msgid "cannot create ELF descriptor for '%s': %s"
 msgstr "nie można utworzyć deskryptora ELF dla „%s”: %s"
@@ -1386,7 +1645,7 @@
 msgid "cannot create EBL descriptor for '%s'"
 msgstr "nie można utworzyć deskryptora EBL dla „%s”"
 
-#: src/elfcmp.c:761 src/findtextrel.c:394
+#: src/elfcmp.c:761 src/findtextrel.c:385
 #, c-format
 msgid "cannot get section header of section %zu: %s"
 msgstr "nie można uzyskać nagłówka sekcji dla sekcji %zu: %s"
@@ -1401,37 +1660,37 @@
 msgid "cannot get relocation: %s"
 msgstr "nie można uzyskać relokacji: %s"
 
-#: src/elfcompress.c:115 src/strip.c:308 src/unstrip.c:117
+#: src/elfcompress.c:117 src/strip.c:308 src/unstrip.c:117
 #, c-format
 msgid "-o option specified twice"
 msgstr "Opcję -o podano dwukrotnie"
 
-#: src/elfcompress.c:122
+#: src/elfcompress.c:124
 #, c-format
 msgid "-t option specified twice"
 msgstr "Opcję -t podano dwukrotnie"
 
-#: src/elfcompress.c:131
+#: src/elfcompress.c:133
 #, c-format
 msgid "unknown compression type '%s'"
 msgstr "nieznany typ kompresji „%s”"
 
 #. We need at least one input file.
-#: src/elfcompress.c:143 src/elfcompress.c:1347
+#: src/elfcompress.c:145 src/elfcompress.c:1345
 #, c-format
 msgid "No input file given"
 msgstr "Nie podano pliku wejściowego"
 
-#: src/elfcompress.c:149 src/elfcompress.c:1352
+#: src/elfcompress.c:151 src/elfcompress.c:1350
 #, c-format
 msgid "Only one input file allowed together with '-o'"
 msgstr "Tylko jeden plik wejściowy jest dozwolony z „-o”"
 
-#: src/elfcompress.c:1309
+#: src/elfcompress.c:1307
 msgid "Place (de)compressed output into FILE"
 msgstr "Umieszcza zdekompresowane wyjście w PLIKU"
 
-#: src/elfcompress.c:1312
+#: src/elfcompress.c:1310
 msgid ""
 "What type of compression to apply. TYPE can be 'none' (decompress), "
 "'zlib' (ELF ZLIB compression, the default, 'zlib-gabi' is an alias) or 'zlib-"
@@ -1441,7 +1700,7 @@
 "„zlib” (kompresja zlib ELF, domyślna, „zlib-gabi” to alias) lub „zlib-"
 "gnu” (kompresja .zdebug w stylu GNU, „gnu” to alias)"
 
-#: src/elfcompress.c:1315
+#: src/elfcompress.c:1313
 msgid ""
 "SECTION name to (de)compress, SECTION is an extended wildcard pattern "
 "(defaults to '.?(z)debug*')"
@@ -1449,31 +1708,28 @@
 "Nazwa SEKCJI do (de)kompresowania, SEKCJA jest rozszerzonym wzorem "
 "(domyślnie „.?(z)debug*”)"
 
-#: src/elfcompress.c:1318
+#: src/elfcompress.c:1316
 msgid "Print a message for each section being (de)compressed"
 msgstr "Wyświetla komunikat dla każdej (de)kompresowanej sekcji"
 
-#: src/elfcompress.c:1321
-#, fuzzy
+#: src/elfcompress.c:1319
 msgid ""
 "Force compression of section even if it would become larger or update/"
 "rewrite the file even if no section would be (de)compressed"
-msgstr "Wymusza kompresję sekcji nawet, jeśli spowodowałoby to jej zwiększenie"
+msgstr ""
+"Wymusza kompresję sekcji, nawet jeśli spowodowałoby to jej zwiększenie lub "
+"zaktualizowanie/przepisanie pliku, nawet jeśli żadna sekcja nie zostałaby "
+"(zde)kompresowana"
 
-#: src/elfcompress.c:1324 src/strip.c:93
+#: src/elfcompress.c:1322 src/strip.c:93
 msgid "Relax a few rules to handle slightly broken ELF files"
 msgstr "Łagodzi kilka reguł, aby obsłużyć lekko uszkodzone pliki ELF"
 
-#: src/elfcompress.c:1327
+#: src/elfcompress.c:1325
 msgid "Be silent when a section cannot be compressed"
 msgstr "Bez zgłaszania, kiedy nie można zdekompresować sekcji"
 
-#. Strings for arguments in help texts.
-#: src/elfcompress.c:1336 src/elflint.c:77 src/readelf.c:158
-msgid "FILE..."
-msgstr "PLIK…"
-
-#: src/elfcompress.c:1337
+#: src/elfcompress.c:1335
 msgid "Compress or decompress sections in an ELF file."
 msgstr "Kompresuje lub dekompresuje sekcje w pliku ELF."
 
@@ -1504,14 +1760,14 @@
 "Szczegółowe sprawdzanie zgodności plików ELF ze specyfikacją gABI/psABI."
 
 #: src/elflint.c:154 src/readelf.c:368
-#, fuzzy, c-format
+#, c-format
 msgid "cannot open input file '%s'"
-msgstr "nie można otworzyć pliku wejściowego"
+msgstr "nie można otworzyć pliku wejściowego „%s”"
 
 #: src/elflint.c:161
-#, fuzzy, c-format
+#, c-format
 msgid "cannot generate Elf descriptor for '%s': %s\n"
-msgstr "nie można utworzyć deskryptora ELF: %s\n"
+msgstr "nie można utworzyć deskryptora ELF dla „%s”: %s\n"
 
 #: src/elflint.c:180
 #, c-format
@@ -1558,7 +1814,7 @@
 msgstr "nieobsługiwane ABI systemu operacyjnego e_ident[%d] == „%s”\n"
 
 #: src/elflint.c:380
-#, fuzzy, c-format
+#, c-format
 msgid "unsupported ABI version e_ident[%d] == %d\n"
 msgstr "nieobsługiwana wersja ABI e_ident[%d] == %d\n"
 
@@ -1621,7 +1877,7 @@
 #: src/elflint.c:473
 #, c-format
 msgid "Can only check %u headers, shnum was %u\n"
-msgstr ""
+msgstr "Można sprawdzić tylko nagłówki %u, shnum wynosiło %u\n"
 
 #: src/elflint.c:487
 #, c-format
@@ -1631,7 +1887,7 @@
 #: src/elflint.c:504
 #, c-format
 msgid "Can only check %u headers, phnum was %u\n"
-msgstr ""
+msgstr "Można sprawdzić tylko nagłówki %u, phnum wynosiło %u\n"
 
 #: src/elflint.c:509
 #, c-format
@@ -1680,7 +1936,7 @@
 
 #: src/elflint.c:610 src/elflint.c:1498 src/elflint.c:1549 src/elflint.c:1655
 #: src/elflint.c:1991 src/elflint.c:2317 src/elflint.c:2943 src/elflint.c:3106
-#: src/elflint.c:3254 src/elflint.c:3444 src/elflint.c:4456
+#: src/elflint.c:3254 src/elflint.c:3456 src/elflint.c:4458
 #, c-format
 msgid "section [%2d] '%s': cannot get section data\n"
 msgstr "sekcja [%2d] „%s”: nie można uzyskać danych sekcji\n"
@@ -1709,11 +1965,13 @@
 msgstr "sekcja [%2u] „%s”: rozmiar wpisu nie zgadza się z ElfXX_Sym\n"
 
 #: src/elflint.c:662
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "section [%2u] '%s': number of local entries in 'st_info' larger than table "
 "size\n"
-msgstr "sekcja [%2d] „%s”: brak określonych wpisów notatek dla typu pliku\n"
+msgstr ""
+"sekcja [%2u] „%s”: liczba lokalnych wpisów w „st_info” jest większa niż "
+"rozmiar tabeli\n"
 
 #: src/elflint.c:671
 #, c-format
@@ -1742,146 +2000,149 @@
 msgstr "sekcja [%2d] „%s”: symbol %zu: nieprawidłowa wartość nazwy\n"
 
 #: src/elflint.c:728
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu (%s): too large section index but no extended "
 "section index section\n"
 msgstr ""
-"sekcja [%2d] „%s”: symbol %zu: za duży indeks sekcji, ale nie ma sekcji "
+"sekcja [%2d] „%s”: symbol %zu (%s): za duży indeks sekcji, ale nie ma sekcji "
 "rozszerzonych indeksów sekcji\n"
 
 #: src/elflint.c:734
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu (%s): XINDEX used for index which would fit "
 "in st_shndx (%<PRIu32>)\n"
 msgstr ""
-"sekcja [%2d] „%s”: symbol %zu: XINDEX użyty dla indeksu, który zmieściłby "
-"się w st_shndx (%<PRIu32>)\n"
+"sekcja [%2d] „%s”: symbol %zu (%s): XINDEX użyty dla indeksu, który "
+"zmieściłby się w st_shndx (%<PRIu32>)\n"
 
 #. || sym->st_shndx > SHN_HIRESERVE  always false
 #: src/elflint.c:746
-#, fuzzy, c-format
+#, c-format
 msgid "section [%2d] '%s': symbol %zu (%s): invalid section index\n"
-msgstr "sekcja [%2d] „%s”: symbol %zu: nieprawidłowy indeks sekcji\n"
+msgstr "sekcja [%2d] „%s”: symbol %zu (%s): nieprawidłowy indeks sekcji\n"
 
 #: src/elflint.c:754
-#, fuzzy, c-format
+#, c-format
 msgid "section [%2d] '%s': symbol %zu (%s): unknown type\n"
-msgstr "sekcja [%2d] „%s”: symbol %zu: nieznany typ\n"
+msgstr "sekcja [%2d] „%s”: symbol %zu (%s): nieznany typ\n"
 
 #: src/elflint.c:760
-#, fuzzy, c-format
+#, c-format
 msgid "section [%2d] '%s': symbol %zu (%s): unknown symbol binding\n"
-msgstr "sekcja [%2d] „%s”: symbol %zu: nieznane dowiązanie symbolu\n"
+msgstr "sekcja [%2d] „%s”: symbol %zu (%s): nieznane dowiązanie symbolu\n"
 
 #: src/elflint.c:765
-#, fuzzy, c-format
+#, c-format
 msgid "section [%2d] '%s': symbol %zu (%s): unique symbol not of object type\n"
 msgstr ""
-"sekcja [%2d] „%s”: symbol %zu: unikalny symbol nie jest typem obiektu\n"
+"sekcja [%2d] „%s”: symbol %zu (%s): unikalny symbol nie jest typem obiektu\n"
 
 #: src/elflint.c:773
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu (%s): COMMON only allowed in relocatable "
 "files\n"
 msgstr ""
-"sekcja [%2d] „%s”: symbol %zu: COMMON jest dozwolone tylko w plikach "
+"sekcja [%2d] „%s”: symbol %zu (%s): COMMON jest dozwolone tylko w plikach "
 "relokowalnych\n"
 
 #: src/elflint.c:777
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu (%s): local COMMON symbols are nonsense\n"
-msgstr "sekcja [%2d] „%s”: symbol %zu: lokalne symbole COMMON to nonsens\n"
+msgstr ""
+"sekcja [%2d] „%s”: symbol %zu (%s): lokalne symbole COMMON to nonsens\n"
 
 #: src/elflint.c:781
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu (%s): function in COMMON section is nonsense\n"
-msgstr "sekcja [%2d] „%s”: symbol %zu: funkcja w sekcji COMMON to nonsens\n"
+msgstr ""
+"sekcja [%2d] „%s”: symbol %zu (%s): funkcja w sekcji COMMON to nonsens\n"
 
 #: src/elflint.c:832
-#, fuzzy, c-format
+#, c-format
 msgid "section [%2d] '%s': symbol %zu (%s): st_value out of bounds\n"
-msgstr "sekcja [%2d] „%s”: symbol %zu: st_value spoza zakresu\n"
+msgstr "sekcja [%2d] „%s”: symbol %zu (%s): st_value spoza zakresu\n"
 
 #: src/elflint.c:838 src/elflint.c:863 src/elflint.c:912
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu (%s) does not fit completely in referenced "
 "section [%2d] '%s'\n"
 msgstr ""
-"sekcja [%2d] „%s”: symbol %zu nie mieści się w całości we wskazywanej sekcji "
-"[%2d] „%s”\n"
+"sekcja [%2d] „%s”: symbol %zu (%s) nie mieści się w całości we wskazywanej "
+"sekcji [%2d] „%s”\n"
 
 #: src/elflint.c:847
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu (%s): referenced section [%2d] '%s' does not "
 "have SHF_TLS flag set\n"
 msgstr ""
-"sekcja [%2d] „%s”: symbol %zu: wskazywana sekcja [%2d] „%s” nie ma "
+"sekcja [%2d] „%s”: symbol %zu (%s): wskazywana sekcja [%2d] „%s” nie ma "
 "ustawionej flagi SHF_TLS\n"
 
 #: src/elflint.c:857 src/elflint.c:905
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu (%s): st_value out of bounds of referenced "
 "section [%2d] '%s'\n"
 msgstr ""
-"sekcja [%2d] „%s”: symbol %zu: st_value spoza zakresu wskazywanej sekcji "
-"[%2d] „%s”\n"
+"sekcja [%2d] „%s”: symbol %zu (%s): st_value spoza zakresu wskazywanej "
+"sekcji [%2d] „%s”\n"
 
 #: src/elflint.c:884
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu (%s): TLS symbol but no TLS program header "
 "entry\n"
 msgstr ""
-"sekcja [%2d] „%s”: symbol %zu: symbol TLS, ale brak wpisu TLS nagłówka "
+"sekcja [%2d] „%s”: symbol %zu (%s): symbol TLS, ale brak wpisu TLS nagłówka "
 "programu\n"
 
 #: src/elflint.c:890
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu (%s): TLS symbol but couldn't get TLS program "
 "header entry\n"
 msgstr ""
-"sekcja [%2d] „%s”: symbol %zu: symbol TLS, ale nie można uzyskać wpisu TLS "
-"nagłówka programu\n"
+"sekcja [%2d] „%s”: symbol %zu (%s): symbol TLS, ale nie można uzyskać wpisu "
+"TLS nagłówka programu\n"
 
 #: src/elflint.c:898
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu (%s): st_value short of referenced section "
 "[%2d] '%s'\n"
 msgstr ""
-"sekcja [%2d] „%s”: symbol %zu: st_value pomija wskazywaną sekcję [%2d] „%s”\n"
+"sekcja [%2d] „%s”: symbol %zu (%s): st_value pomija wskazywaną sekcję [%2d] "
+"„%s”\n"
 
 #: src/elflint.c:925
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu (%s): local symbol outside range described in "
 "sh_info\n"
 msgstr ""
-"sekcja [%2d] „%s”: symbol %zu: lokalny symbol spoza zakresu określonego "
+"sekcja [%2d] „%s”: symbol %zu (%s): lokalny symbol spoza zakresu określonego "
 "w sh_info\n"
 
 #: src/elflint.c:932
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu (%s): non-local symbol outside range "
 "described in sh_info\n"
 msgstr ""
-"sekcja [%2d] „%s”: symbol %zu: nielokalny symbol spoza zakresu określonego "
-"w sh_info\n"
+"sekcja [%2d] „%s”: symbol %zu (%s): nielokalny symbol spoza zakresu "
+"określonego w sh_info\n"
 
 #: src/elflint.c:939
-#, fuzzy, c-format
+#, c-format
 msgid "section [%2d] '%s': symbol %zu (%s): non-local section symbol\n"
-msgstr "sekcja [%2d] „%s”: symbol %zu: nielokalny symbol sekcji\n"
+msgstr "sekcja [%2d] „%s”: symbol %zu (%s): nielokalny symbol sekcji\n"
 
 #: src/elflint.c:989
 #, c-format
@@ -1950,18 +2211,19 @@
 "rozmiaru segmentu dynamicznego %<PRIu64>\n"
 
 #: src/elflint.c:1063
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu (%s): symbol in dynamic symbol table with non-"
 "default visibility\n"
 msgstr ""
-"sekcja [%2d] „%s”: symbol %zu: symbol w dynamicznej tabeli symboli "
+"sekcja [%2d] „%s”: symbol %zu (%s): symbol w dynamicznej tabeli symboli "
 "z niedomyślną widocznością\n"
 
 #: src/elflint.c:1067
-#, fuzzy, c-format
+#, c-format
 msgid "section [%2d] '%s': symbol %zu (%s): unknown bit set in st_other\n"
-msgstr "sekcja [%2d] „%s”: symbol %zu: ustawiono nieznany bit w st_other\n"
+msgstr ""
+"sekcja [%2d] „%s”: symbol %zu (%s): ustawiono nieznany bit w st_other\n"
 
 #: src/elflint.c:1105
 #, c-format
@@ -2014,7 +2276,7 @@
 #: src/elflint.c:1278
 #, c-format
 msgid "section [%2d] '%s': sh_info should be zero\n"
-msgstr "sekcja [%2d] „%s”: sh_info powinno wynosić zero\n"
+msgstr "sekcja [%2d] „%s”: sh_info musi wynosić zero\n"
 
 #: src/elflint.c:1286
 #, c-format
@@ -2271,7 +2533,7 @@
 #: src/elflint.c:1998
 #, c-format
 msgid "symbol 0 should have zero extended section index\n"
-msgstr "symbol 0 powinien mieć zerowy rozszerzony indeks sekcji\n"
+msgstr "symbol 0 musi mieć zerowy rozszerzony indeks sekcji\n"
 
 #: src/elflint.c:2010
 #, c-format
@@ -2802,35 +3064,35 @@
 msgid "section [%2d] '%s': unknown parent version '%s'\n"
 msgstr "sekcja [%2d] „%s”: nieznana wersja rodzica „%s”\n"
 
-#: src/elflint.c:3436
+#: src/elflint.c:3448
 #, c-format
 msgid "section [%2d] '%s': empty object attributes section\n"
 msgstr "sekcja [%2d] „%s”: pusta sekcja atrybutów obiektu\n"
 
-#: src/elflint.c:3457
+#: src/elflint.c:3464
 #, c-format
 msgid "section [%2d] '%s': unrecognized attribute format\n"
 msgstr "sekcja [%2d] „%s”: nierozpoznany format atrybutu\n"
 
-#: src/elflint.c:3473
+#: src/elflint.c:3475
 #, c-format
 msgid ""
 "section [%2d] '%s': offset %zu: zero length field in attribute section\n"
 msgstr ""
 "sekcja [%2d] „%s”: offset %zu: pole o zerowej długości w sekcji atrybutów\n"
 
-#: src/elflint.c:3482
+#: src/elflint.c:3484
 #, c-format
 msgid "section [%2d] '%s': offset %zu: invalid length in attribute section\n"
 msgstr ""
 "sekcja [%2d] „%s”: offset %zu: nieprawidłowa długość w sekcji atrybutów\n"
 
-#: src/elflint.c:3494
+#: src/elflint.c:3496
 #, c-format
 msgid "section [%2d] '%s': offset %zu: unterminated vendor name string\n"
 msgstr "sekcja [%2d] „%s”: offset %zu: niezakończony ciąg nazwy producenta\n"
 
-#: src/elflint.c:3511
+#: src/elflint.c:3513
 #, c-format
 msgid ""
 "section [%2d] '%s': offset %zu: endless ULEB128 in attribute subsection tag\n"
@@ -2838,19 +3100,19 @@
 "sekcja [%2d] „%s”: offset %zu: niekończące się ULEB128 w znaczniku podsekcji "
 "atrybutów\n"
 
-#: src/elflint.c:3520
+#: src/elflint.c:3522
 #, c-format
 msgid "section [%2d] '%s': offset %zu: truncated attribute section\n"
 msgstr "sekcja [%2d] „%s”: offset %zu: skrócona sekcja atrybutów\n"
 
-#: src/elflint.c:3529
+#: src/elflint.c:3531
 #, c-format
 msgid ""
 "section [%2d] '%s': offset %zu: zero length field in attribute subsection\n"
 msgstr ""
 "sekcja [%2d] „%s”: offset %zu: zerowej długości pole w podsekcji atrybutów\n"
 
-#: src/elflint.c:3544
+#: src/elflint.c:3546
 #, c-format
 msgid ""
 "section [%2d] '%s': offset %zu: invalid length in attribute subsection\n"
@@ -2858,7 +3120,7 @@
 "sekcja [%2d] „%s”: offset %zu: nieprawidłowa długość w podsekcji atrybutów\n"
 
 #. Tag_File
-#: src/elflint.c:3555
+#: src/elflint.c:3557
 #, c-format
 msgid ""
 "section [%2d] '%s': offset %zu: attribute subsection has unexpected tag %u\n"
@@ -2866,23 +3128,23 @@
 "sekcja [%2d] „%s”: offset %zu: podsekcja atrybutów ma nieoczekiwany znacznik "
 "%u\n"
 
-#: src/elflint.c:3573
+#: src/elflint.c:3575
 #, c-format
 msgid "section [%2d] '%s': offset %zu: endless ULEB128 in attribute tag\n"
 msgstr ""
 "sekcja [%2d] „%s”: offset %zu: niekończące się ULEB128 w znaczniku atrybutu\n"
 
-#: src/elflint.c:3584
+#: src/elflint.c:3586
 #, c-format
 msgid "section [%2d] '%s': offset %zu: unterminated string in attribute\n"
 msgstr "sekcja [%2d] „%s”: offset %zu: niezakończony ciąg w atrybucie\n"
 
-#: src/elflint.c:3597
+#: src/elflint.c:3599
 #, c-format
 msgid "section [%2d] '%s': offset %zu: unrecognized attribute tag %u\n"
 msgstr "sekcja [%2d] „%s”: offset %zu: nierozpoznany znacznik atrybutu %u\n"
 
-#: src/elflint.c:3601
+#: src/elflint.c:3603
 #, c-format
 msgid ""
 "section [%2d] '%s': offset %zu: unrecognized %s attribute value %<PRIu64>\n"
@@ -2890,12 +3152,12 @@
 "sekcja [%2d] „%s”: offset %zu: atrybut %s ma nierozpoznaną wartość "
 "%<PRIu64>\n"
 
-#: src/elflint.c:3611
+#: src/elflint.c:3613
 #, c-format
 msgid "section [%2d] '%s': offset %zu: vendor '%s' unknown\n"
 msgstr "sekcja [%2d] „%s”: offset %zu: producent „%s” jest nieznany\n"
 
-#: src/elflint.c:3617
+#: src/elflint.c:3619
 #, c-format
 msgid ""
 "section [%2d] '%s': offset %zu: extra bytes after last attribute section\n"
@@ -2903,47 +3165,47 @@
 "sekcja [%2d] „%s”: offset %zu: dodatkowe bajty po ostatniej sekcji "
 "atrybutów\n"
 
-#: src/elflint.c:3714
+#: src/elflint.c:3716
 #, c-format
 msgid "cannot get section header of zeroth section\n"
 msgstr "nie można uzyskać nagłówka sekcji zerowej\n"
 
-#: src/elflint.c:3718
+#: src/elflint.c:3720
 #, c-format
 msgid "zeroth section has nonzero name\n"
 msgstr "sekcja zerowa ma niezerową nazwę\n"
 
-#: src/elflint.c:3720
+#: src/elflint.c:3722
 #, c-format
 msgid "zeroth section has nonzero type\n"
 msgstr "sekcja zerowa ma niezerowy typ\n"
 
-#: src/elflint.c:3722
+#: src/elflint.c:3724
 #, c-format
 msgid "zeroth section has nonzero flags\n"
 msgstr "sekcja zerowa ma niezerowe flagi\n"
 
-#: src/elflint.c:3724
+#: src/elflint.c:3726
 #, c-format
 msgid "zeroth section has nonzero address\n"
 msgstr "sekcja zerowa ma niezerowy adres\n"
 
-#: src/elflint.c:3726
+#: src/elflint.c:3728
 #, c-format
 msgid "zeroth section has nonzero offset\n"
 msgstr "sekcja zerowa ma niezerowy offset\n"
 
-#: src/elflint.c:3728
+#: src/elflint.c:3730
 #, c-format
 msgid "zeroth section has nonzero align value\n"
 msgstr "sekcja zerowa ma niezerową wartość wyrównania\n"
 
-#: src/elflint.c:3730
+#: src/elflint.c:3732
 #, c-format
 msgid "zeroth section has nonzero entry size value\n"
 msgstr "sekcja zerowa ma niezerową wartość rozmiaru wpisu\n"
 
-#: src/elflint.c:3733
+#: src/elflint.c:3735
 #, c-format
 msgid ""
 "zeroth section has nonzero size value while ELF header has nonzero shnum "
@@ -2952,7 +3214,7 @@
 "sekcja zerowa ma niezerową wartość rozmiaru, a nagłówek ELF ma niezerową "
 "wartość shnum\n"
 
-#: src/elflint.c:3737
+#: src/elflint.c:3739
 #, c-format
 msgid ""
 "zeroth section has nonzero link value while ELF header does not signal "
@@ -2961,7 +3223,7 @@
 "sekcja zerowa ma niezerową wartość dowiązań, a nagłówek ELF nie wskazuje "
 "przepełnienia w shstrndx\n"
 
-#: src/elflint.c:3741
+#: src/elflint.c:3743
 #, c-format
 msgid ""
 "zeroth section has nonzero link value while ELF header does not signal "
@@ -2970,46 +3232,46 @@
 "sekcja zerowa ma niezerową wartość dowiązań, a nagłówek ELF nie wskazuje "
 "przepełnienia w phnum\n"
 
-#: src/elflint.c:3759
+#: src/elflint.c:3761
 #, c-format
 msgid "cannot get section header for section [%2zu] '%s': %s\n"
 msgstr "nie można uzyskać nagłówka sekcji dla sekcji [%2zu] „%s”: %s\n"
 
-#: src/elflint.c:3768
+#: src/elflint.c:3770
 #, c-format
 msgid "section [%2zu]: invalid name\n"
 msgstr "sekcja [%2zu]: nieprawidłowa nazwa\n"
 
-#: src/elflint.c:3795
+#: src/elflint.c:3797
 #, c-format
 msgid "section [%2d] '%s' has wrong type: expected %s, is %s\n"
 msgstr "sekcja [%2d] „%s” ma błędny typ: oczekiwano %s, jest %s\n"
 
-#: src/elflint.c:3812
+#: src/elflint.c:3814
 #, c-format
 msgid "section [%2zu] '%s' has wrong flags: expected %s, is %s\n"
 msgstr "sekcja [%2zu] „%s” ma błędne flagi: oczekiwano %s, jest %s\n"
 
-#: src/elflint.c:3830
+#: src/elflint.c:3832
 #, c-format
 msgid ""
 "section [%2zu] '%s' has wrong flags: expected %s and possibly %s, is %s\n"
 msgstr ""
 "sekcja [%2zu] „%s” ma błędne flagi: oczekiwano %s i być może %s, jest %s\n"
 
-#: src/elflint.c:3847
+#: src/elflint.c:3849
 #, c-format
 msgid "section [%2zu] '%s' present in object file\n"
 msgstr "sekcja [%2zu] „%s” jest obecna w pliku obiektu\n"
 
-#: src/elflint.c:3853 src/elflint.c:3885
+#: src/elflint.c:3855 src/elflint.c:3887
 #, c-format
 msgid ""
 "section [%2zu] '%s' has SHF_ALLOC flag set but there is no loadable segment\n"
 msgstr ""
 "sekcja [%2zu] „%s” ma flagę SHF_ALLOC, ale nie ma segmentu wczytywalnego\n"
 
-#: src/elflint.c:3858 src/elflint.c:3890
+#: src/elflint.c:3860 src/elflint.c:3892
 #, c-format
 msgid ""
 "section [%2zu] '%s' has SHF_ALLOC flag not set but there are loadable "
@@ -3017,7 +3279,7 @@
 msgstr ""
 "sekcja [%2zu] „%s” nie ma flagi SHF_ALLOC, ale są segmenty wczytywalne\n"
 
-#: src/elflint.c:3866
+#: src/elflint.c:3868
 #, c-format
 msgid ""
 "section [%2zu] '%s' is extension section index table in non-object file\n"
@@ -3025,22 +3287,22 @@
 "sekcja [%2zu] „%s” jest tabelą indeksów sekcji rozszerzeń w pliku "
 "nieobiektowym\n"
 
-#: src/elflint.c:3909
+#: src/elflint.c:3911
 #, c-format
 msgid "section [%2zu] '%s': size not multiple of entry size\n"
 msgstr "sekcja [%2zu] „%s”: rozmiar nie jest wielokrotnością rozmiaru wpisu\n"
 
-#: src/elflint.c:3914
+#: src/elflint.c:3916
 #, c-format
 msgid "cannot get section header\n"
 msgstr "nie można uzyskać nagłówka sekcji\n"
 
-#: src/elflint.c:3924
+#: src/elflint.c:3926
 #, c-format
 msgid "section [%2zu] '%s' has unsupported type %d\n"
 msgstr "sekcja [%2zu] „%s” ma nieobsługiwany typ %d\n"
 
-#: src/elflint.c:3944
+#: src/elflint.c:3946
 #, c-format
 msgid ""
 "section [%2zu] '%s' contains invalid processor-specific flag(s) %#<PRIx64>\n"
@@ -3048,74 +3310,74 @@
 "sekcja [%2zu] „%s” zawiera nieprawidłowe flagi dla konkretnego procesora "
 "%#<PRIx64>\n"
 
-#: src/elflint.c:3954
+#: src/elflint.c:3956
 #, c-format
 msgid "section [%2zu] '%s' contains unknown flag(s) %#<PRIx64>\n"
 msgstr "sekcja [%2zu] „%s” zawiera nieznane flagi %#<PRIx64>\n"
 
-#: src/elflint.c:3962
+#: src/elflint.c:3964
 #, c-format
 msgid "section [%2zu] '%s': thread-local data sections address not zero\n"
 msgstr ""
 "sekcja [%2zu] „%s”: adres sekcji danych lokalnych dla wątków nie jest zerem\n"
 
-#: src/elflint.c:3972
+#: src/elflint.c:3974
 #, c-format
 msgid "section [%2zu] '%s': allocated section cannot be compressed\n"
 msgstr "sekcja [%2zu] „%s”: nie można skompresować przydzielonej sekcji\n"
 
-#: src/elflint.c:3977
+#: src/elflint.c:3979
 #, c-format
 msgid "section [%2zu] '%s': nobits section cannot be compressed\n"
 msgstr "sekcja [%2zu] „%s”: nie można skompresować sekcji „nobits”\n"
 
-#: src/elflint.c:3983
+#: src/elflint.c:3985
 #, c-format
 msgid ""
 "section [%2zu] '%s': compressed section with no compression header: %s\n"
 msgstr "sekcja [%2zu] „%s”: skompresowana sekcja bez nagłówka kompresji: %s\n"
 
-#: src/elflint.c:3989
+#: src/elflint.c:3991
 #, c-format
 msgid "section [%2zu] '%s': invalid section reference in link value\n"
 msgstr ""
 "sekcja [%2zu] „%s”: nieprawidłowe odwołanie do sekcji w wartości dowiązania\n"
 
-#: src/elflint.c:3994
+#: src/elflint.c:3996
 #, c-format
 msgid "section [%2zu] '%s': invalid section reference in info value\n"
 msgstr ""
 "sekcja [%2zu] „%s”: nieprawidłowe odwołanie do sekcji w wartości "
 "informacyjnej\n"
 
-#: src/elflint.c:4001
+#: src/elflint.c:4003
 #, c-format
 msgid "section [%2zu] '%s': strings flag set without merge flag\n"
 msgstr "sekcja [%2zu] „%s”: flaga ciągów jest ustawiona bez flagi merge\n"
 
-#: src/elflint.c:4006
+#: src/elflint.c:4008
 #, c-format
 msgid "section [%2zu] '%s': merge flag set but entry size is zero\n"
 msgstr ""
 "sekcja [%2zu] „%s”: flaga merge jest ustawiona, ale rozmiar wpisu jest "
 "zerowy\n"
 
-#: src/elflint.c:4025
+#: src/elflint.c:4027
 #, c-format
 msgid "section [%2zu] '%s' has unexpected type %d for an executable section\n"
 msgstr "sekcja [%2zu] „%s” ma nieoczekiwany typ %d dla sekcji wykonywalnej\n"
 
-#: src/elflint.c:4034
+#: src/elflint.c:4036
 #, c-format
 msgid "section [%2zu] '%s' must be of type NOBITS in debuginfo files\n"
 msgstr "sekcja [%2zu] „%s” musi być typu NOBITS w plikach debuginfo\n"
 
-#: src/elflint.c:4041
+#: src/elflint.c:4043
 #, c-format
 msgid "section [%2zu] '%s' is both executable and writable\n"
 msgstr "sekcja [%2zu] „%s” jest wykonywalne i zapisywalne\n"
 
-#: src/elflint.c:4072
+#: src/elflint.c:4074
 #, c-format
 msgid ""
 "section [%2zu] '%s' not fully contained in segment of program header entry "
@@ -3124,7 +3386,7 @@
 "sekcja [%2zu] „%s” nie jest w całości zawarta w segmencie wpisu %d nagłówka "
 "programu\n"
 
-#: src/elflint.c:4082
+#: src/elflint.c:4084
 #, c-format
 msgid ""
 "section [%2zu] '%s' has type NOBITS but is read from the file in segment of "
@@ -3133,7 +3395,7 @@
 "sekcja [%2zu] „%s” ma typ NOBITS, a jest odczytywana z pliku w segmencie "
 "wpisu %d nagłówka programu\n"
 
-#: src/elflint.c:4108
+#: src/elflint.c:4110
 #, c-format
 msgid ""
 "section [%2zu] '%s' has type NOBITS but is read from the file in segment of "
@@ -3142,7 +3404,7 @@
 "sekcja [%2zu] „%s” ma typ NOBITS, ale jest odczytywana z pliku w segmencie "
 "wpisu %d nagłówka programu, a zawartość pliku jest niezerowa\n"
 
-#: src/elflint.c:4119
+#: src/elflint.c:4121
 #, c-format
 msgid ""
 "section [%2zu] '%s' has not type NOBITS but is not read from the file in "
@@ -3151,17 +3413,17 @@
 "sekcja [%2zu] „%s” nie ma typu NOBITS, a nie jest odczytywana z pliku "
 "w segmencie wpisu %d nagłówka programu\n"
 
-#: src/elflint.c:4130
+#: src/elflint.c:4132
 #, c-format
 msgid "section [%2zu] '%s' is executable in nonexecutable segment %d\n"
 msgstr "sekcja [%2zu] „%s” jest wykonywalne w segmencie niewykonywalnym %d\n"
 
-#: src/elflint.c:4140
+#: src/elflint.c:4142
 #, c-format
 msgid "section [%2zu] '%s' is writable in unwritable segment %d\n"
 msgstr "sekcja [%2zu] „%s” jest zapisywalne w niezapisywalnym segmencie %d\n"
 
-#: src/elflint.c:4150
+#: src/elflint.c:4152
 #, c-format
 msgid ""
 "section [%2zu] '%s': alloc flag set but section not in any loaded segment\n"
@@ -3169,7 +3431,7 @@
 "sekcja [%2zu] „%s”: ma flagę alloc, ale sekcja nie jest w żadnym segmencie "
 "wczytywalnym\n"
 
-#: src/elflint.c:4156
+#: src/elflint.c:4158
 #, c-format
 msgid ""
 "section [%2zu] '%s': ELF header says this is the section header string table "
@@ -3178,7 +3440,7 @@
 "sekcja [%2zu] „%s”: według nagłówka ELF to jest tabela ciągów nagłówków "
 "sekcji, ale typ nie jest SHT_TYPE\n"
 
-#: src/elflint.c:4164
+#: src/elflint.c:4166
 #, c-format
 msgid ""
 "section [%2zu] '%s': relocatable files cannot have dynamic symbol tables\n"
@@ -3186,17 +3448,17 @@
 "sekcja [%2zu] „%s”: pliki relokowalne nie mogą mieć tabeli symboli "
 "dynamicznych\n"
 
-#: src/elflint.c:4215
+#: src/elflint.c:4217
 #, c-format
 msgid "more than one version symbol table present\n"
 msgstr "obecna jest więcej niż jedna tabela symboli wersji\n"
 
-#: src/elflint.c:4238
+#: src/elflint.c:4240
 #, c-format
 msgid "INTERP program header entry but no .interp section\n"
 msgstr "jest wpis nagłówka programu INTERP, ale nie ma sekcji .interp\n"
 
-#: src/elflint.c:4249
+#: src/elflint.c:4251
 #, c-format
 msgid ""
 "loadable segment [%u] is executable but contains no executable sections\n"
@@ -3204,14 +3466,14 @@
 "wczytywalny segment [%u] jest wykonywalny, ale nie zawiera wykonywalnych "
 "sekcji\n"
 
-#: src/elflint.c:4255
+#: src/elflint.c:4257
 #, c-format
 msgid "loadable segment [%u] is writable but contains no writable sections\n"
 msgstr ""
 "wczytywalny segment [%u] jest zapisywalny, ale nie zawiera zapisywalnych "
 "sekcji\n"
 
-#: src/elflint.c:4266
+#: src/elflint.c:4268
 #, c-format
 msgid ""
 "no .gnu.versym section present but .gnu.versym_d or .gnu.versym_r section "
@@ -3220,23 +3482,23 @@
 "brak sekcji .gnu.versym, ale istnieje sekcja .gnu.versym_d lub .gnu."
 "versym_r\n"
 
-#: src/elflint.c:4279
+#: src/elflint.c:4281
 #, c-format
 msgid "duplicate version index %d\n"
 msgstr "powtórzony indeks wersji %d\n"
 
-#: src/elflint.c:4293
+#: src/elflint.c:4295
 #, c-format
 msgid ".gnu.versym section present without .gnu.versym_d or .gnu.versym_r\n"
 msgstr "sekcja .gnu.versym istnieje bez .gnu.versym_d lub .gnu.versym_r\n"
 
-#: src/elflint.c:4342
+#: src/elflint.c:4344
 #, c-format
 msgid "phdr[%d]: unknown core file note type %<PRIu32> at offset %<PRIu64>\n"
 msgstr ""
 "phdr[%d]: nieznany typ notatki pliku core %<PRIu32> pod offsetem %<PRIu64>\n"
 
-#: src/elflint.c:4346
+#: src/elflint.c:4348
 #, c-format
 msgid ""
 "section [%2d] '%s': unknown core file note type %<PRIu32> at offset %zu\n"
@@ -3244,54 +3506,55 @@
 "sekcja [%2d]: „%s”: nieznany typ notatki pliku core %<PRIu32> pod offsetem "
 "%zu\n"
 
-#: src/elflint.c:4395
-#, fuzzy, c-format
+#: src/elflint.c:4397
+#, c-format
 msgid ""
 "phdr[%d]: unknown object file note type %<PRIu32> with owner name '%s' at "
 "offset %zu\n"
 msgstr ""
-"phdr[%d]: nieznany typ notatki pliku obiektu %<PRIu32> pod offsetem %zu\n"
+"phdr[%d]: nieznany typ notatki pliku obiektu %<PRIu32> o nazwie właściciela "
+"„%s” pod offsetem %zu\n"
 
-#: src/elflint.c:4400
-#, fuzzy, c-format
+#: src/elflint.c:4402
+#, c-format
 msgid ""
 "section [%2d] '%s': unknown object file note type %<PRIu32> with owner name "
 "'%s' at offset %zu\n"
 msgstr ""
-"sekcja [%2d] „%s”: nieznany typ notatki pliku obiektu %<PRIu32> pod offsetem "
-"%zu\n"
+"sekcja [%2d] „%s”: nieznany typ notatki pliku obiektu %<PRIu32> o nazwie "
+"właściciela „%s” pod offsetem %zu\n"
 
-#: src/elflint.c:4419
+#: src/elflint.c:4421
 #, c-format
 msgid "phdr[%d]: no note entries defined for the type of file\n"
 msgstr "phdr[%d]: brak określonych wpisów notatek dla typu pliku\n"
 
-#: src/elflint.c:4439
+#: src/elflint.c:4441
 #, c-format
 msgid "phdr[%d]: cannot get content of note section: %s\n"
 msgstr "phdr[%d]: nie można uzyskać zawartości sekcji notatki: %s\n"
 
-#: src/elflint.c:4442
+#: src/elflint.c:4444
 #, c-format
 msgid "phdr[%d]: extra %<PRIu64> bytes after last note\n"
-msgstr "phdr[%d]: dodatkowe %<PRIu64> bajtów po ostatniej notatce\n"
+msgstr "phdr[%d]: dodatkowe %<PRIu64> B po ostatniej notatce\n"
 
-#: src/elflint.c:4463
+#: src/elflint.c:4465
 #, c-format
 msgid "section [%2d] '%s': no note entries defined for the type of file\n"
 msgstr "sekcja [%2d] „%s”: brak określonych wpisów notatek dla typu pliku\n"
 
-#: src/elflint.c:4470
+#: src/elflint.c:4472
 #, c-format
 msgid "section [%2d] '%s': cannot get content of note section\n"
 msgstr "sekcja [%2d] „%s”: nie można uzyskać zawartości sekcji notatek\n"
 
-#: src/elflint.c:4473
+#: src/elflint.c:4475
 #, c-format
 msgid "section [%2d] '%s': extra %<PRIu64> bytes after last note\n"
-msgstr "sekcja [%2d] „%s”: dodatkowe %<PRIu64> bajtów po ostatniej notatce\n"
+msgstr "sekcja [%2d] „%s”: dodatkowe %<PRIu64> B po ostatniej notatce\n"
 
-#: src/elflint.c:4491
+#: src/elflint.c:4493
 #, c-format
 msgid ""
 "only executables, shared objects, and core files can have program headers\n"
@@ -3299,135 +3562,135 @@
 "tylko pliki wykonywalne, obiekty współdzielone i pliki core mogą mieć "
 "nagłówki programu\n"
 
-#: src/elflint.c:4506
+#: src/elflint.c:4508
 #, c-format
 msgid "cannot get program header entry %d: %s\n"
 msgstr "nie można uzyskać wpisu nagłówka programu %d: %s\n"
 
-#: src/elflint.c:4516
+#: src/elflint.c:4518
 #, c-format
 msgid "program header entry %d: unknown program header entry type %#<PRIx64>\n"
 msgstr ""
 "wpis nagłówka programu %d: nieznany typ wpisu nagłówka programu %#<PRIx64>\n"
 
-#: src/elflint.c:4527
+#: src/elflint.c:4529
 #, c-format
 msgid "more than one INTERP entry in program header\n"
 msgstr "więcej niż jeden wpis INTERP w nagłówku programu\n"
 
-#: src/elflint.c:4535
+#: src/elflint.c:4537
 #, c-format
 msgid "more than one TLS entry in program header\n"
 msgstr "więcej niż jeden wpis TLS w nagłówku programu\n"
 
-#: src/elflint.c:4542
+#: src/elflint.c:4544
 #, c-format
 msgid "static executable cannot have dynamic sections\n"
 msgstr "statyczny plik wykonywalny nie może mieć sekcji dynamicznych\n"
 
-#: src/elflint.c:4556
+#: src/elflint.c:4558
 #, c-format
 msgid "dynamic section reference in program header has wrong offset\n"
 msgstr "odniesienie sekcji dynamicznej w nagłówku programu ma błędny offset\n"
 
-#: src/elflint.c:4559
+#: src/elflint.c:4561
 #, c-format
 msgid "dynamic section size mismatch in program and section header\n"
 msgstr "różne rozmiary sekcji dynamicznej w nagłówku programu i sekcji\n"
 
-#: src/elflint.c:4569
+#: src/elflint.c:4571
 #, c-format
 msgid "more than one GNU_RELRO entry in program header\n"
 msgstr "więcej niż jeden wpis GNU_RELRO w nagłówku programu\n"
 
-#: src/elflint.c:4590
+#: src/elflint.c:4592
 #, c-format
 msgid "loadable segment GNU_RELRO applies to is not writable\n"
 msgstr "wczytywalny segment wskazywany przez GNU_RELRO nie jest zapisywalny\n"
 
-#: src/elflint.c:4601
+#: src/elflint.c:4603
 #, c-format
 msgid "loadable segment [%u] flags do not match GNU_RELRO [%u] flags\n"
 msgstr "flagi wczytywalnego segmentu [%u] nie pasują do flag GNU_RELRO [%u]\n"
 
-#: src/elflint.c:4608
+#: src/elflint.c:4610
 #, c-format
 msgid ""
 "GNU_RELRO [%u] flags are not a subset of the loadable segment [%u] flags\n"
 msgstr ""
 "flagi GNU_RELRO [%u] nie są podzbiorem flag wczytywalnego segmentu [%u]\n"
 
-#: src/elflint.c:4617 src/elflint.c:4640
+#: src/elflint.c:4619 src/elflint.c:4642
 #, c-format
 msgid "%s segment not contained in a loaded segment\n"
 msgstr "segment %s nie zawiera się we wczytywalnym segmencie\n"
 
-#: src/elflint.c:4646
+#: src/elflint.c:4648
 #, c-format
 msgid "program header offset in ELF header and PHDR entry do not match"
 msgstr ""
 "offsety nagłówka programu w nagłówku ELF i wpisie PHDR nie zgadzają się"
 
-#: src/elflint.c:4673
+#: src/elflint.c:4675
 #, c-format
 msgid "call frame search table reference in program header has wrong offset\n"
 msgstr ""
 "odniesienie tabeli wyszukiwania ramki wywołania w nagłówku programu ma "
 "błędny offset\n"
 
-#: src/elflint.c:4676
+#: src/elflint.c:4678
 #, c-format
 msgid "call frame search table size mismatch in program and section header\n"
 msgstr ""
 "różne rozmiary tabel wyszukiwania ramki wywołania w nagłówku programu "
 "i sekcji\n"
 
-#: src/elflint.c:4689
+#: src/elflint.c:4691
 #, c-format
 msgid "PT_GNU_EH_FRAME present but no .eh_frame_hdr section\n"
 msgstr "PT_GNU_EH_FRAME jest obecne, ale brak sekcji .eh_frame_hdr\n"
 
-#: src/elflint.c:4697
+#: src/elflint.c:4699
 #, c-format
 msgid "call frame search table must be allocated\n"
 msgstr "tabela wyszukiwania ramki wywołania musi być przydzielona\n"
 
-#: src/elflint.c:4700
+#: src/elflint.c:4702
 #, c-format
 msgid "section [%2zu] '%s' must be allocated\n"
 msgstr "sekcja [%2zu] „%s”: musi być przydzielona\n"
 
-#: src/elflint.c:4704
+#: src/elflint.c:4706
 #, c-format
 msgid "call frame search table must not be writable\n"
 msgstr "tabela wyszukiwania ramki wywołania nie może być zapisywalna\n"
 
-#: src/elflint.c:4707
+#: src/elflint.c:4709
 #, c-format
 msgid "section [%2zu] '%s' must not be writable\n"
 msgstr "sekcja [%2zu] „%s” nie może być zapisywalna\n"
 
-#: src/elflint.c:4712
+#: src/elflint.c:4714
 #, c-format
 msgid "call frame search table must not be executable\n"
 msgstr "tabela wyszukiwania ramki wywołania nie może być wykonywalna\n"
 
-#: src/elflint.c:4715
+#: src/elflint.c:4717
 #, c-format
 msgid "section [%2zu] '%s' must not be executable\n"
 msgstr "sekcja [%2zu] „%s” nie może być wykonywalna\n"
 
-#: src/elflint.c:4726
+#: src/elflint.c:4728
 #, c-format
 msgid "program header entry %d: file size greater than memory size\n"
 msgstr "wpis nagłówka programu %d: rozmiar pliku większy niż rozmiar pamięci\n"
 
-#: src/elflint.c:4733
+#: src/elflint.c:4735
 #, c-format
 msgid "program header entry %d: alignment not a power of 2\n"
 msgstr "wpis nagłówka programu %d: wyrównanie nie jest potęgą 2\n"
 
-#: src/elflint.c:4736
+#: src/elflint.c:4738
 #, c-format
 msgid ""
 "program header entry %d: file offset and virtual address not module of "
@@ -3436,7 +3699,7 @@
 "wpis nagłówka programu %d: offset w pliku i adres wirtualny nie są "
 "wielokrotnością wyrównania\n"
 
-#: src/elflint.c:4749
+#: src/elflint.c:4751
 #, c-format
 msgid ""
 "executable/DSO with .eh_frame_hdr section does not have a PT_GNU_EH_FRAME "
@@ -3445,106 +3708,106 @@
 "plik wykonywalny/DSO z sekcją .eh_frame_hdr nie ma wpisu nagłówka programu "
 "PT_GNU_EH_FRAME"
 
-#: src/elflint.c:4783
+#: src/elflint.c:4785
 #, c-format
 msgid "cannot read ELF header: %s\n"
 msgstr "nie można odczytać nagłówka ELF: %s\n"
 
-#: src/elflint.c:4795
-#, fuzzy, c-format
+#: src/elflint.c:4797
+#, c-format
 msgid "cannot create backend for ELF file\n"
-msgstr "nie można utworzyć nowego pliku"
+msgstr "nie można utworzyć zaplecza dla pliku ELF\n"
 
-#: src/elflint.c:4816
+#: src/elflint.c:4818
 #, c-format
 msgid "text relocation flag set but not needed\n"
 msgstr "flaga relokacji tekstu jest ustawiona, ale niepotrzebna\n"
 
-#: src/findtextrel.c:60
+#: src/findtextrel.c:61
 msgid "Input Selection:"
 msgstr "Wybór wejścia:"
 
-#: src/findtextrel.c:61
+#: src/findtextrel.c:62
 msgid "Prepend PATH to all file names"
 msgstr "Dołącza ŚCIEŻKĘ do wszystkich nazw plików"
 
-#: src/findtextrel.c:63
+#: src/findtextrel.c:64
 msgid "Use PATH as root of debuginfo hierarchy"
 msgstr "Używa ŚCIEŻKI jako korzenia dla hierarchii debuginfo"
 
 #. Short description of program.
-#: src/findtextrel.c:70
+#: src/findtextrel.c:71
 msgid "Locate source of text relocations in FILEs (a.out by default)."
 msgstr "Odnajduje źródło relokacji tekstu w PLIKACH (domyślnie a.out)."
 
 #. Strings for arguments in help texts.
-#: src/findtextrel.c:74 src/nm.c:108 src/objdump.c:71 src/size.c:80
+#: src/findtextrel.c:75 src/nm.c:108 src/objdump.c:71 src/size.c:80
 #: src/strings.c:87 src/strip.c:101
 msgid "[FILE...]"
 msgstr "[PLIK…]"
 
-#: src/findtextrel.c:222
+#: src/findtextrel.c:224
 #, c-format
 msgid "cannot get ELF header '%s': %s"
 msgstr "nie można uzyskać nagłówka ELF „%s”: %s"
 
-#: src/findtextrel.c:233
+#: src/findtextrel.c:235
 #, c-format
 msgid "'%s' is not a DSO or PIE"
 msgstr "„%s” nie jest DSO ani PIE"
 
-#: src/findtextrel.c:253
+#: src/findtextrel.c:255
 #, c-format
 msgid "getting get section header of section %zu: %s"
 msgstr "uzyskiwanie nagłówka sekcji dla sekcji %zu: %s"
 
-#: src/findtextrel.c:277
+#: src/findtextrel.c:279
 #, c-format
 msgid "cannot read dynamic section: %s"
 msgstr "nie można odczytać sekcji dynamicznej: %s"
 
-#: src/findtextrel.c:298
+#: src/findtextrel.c:300
 #, c-format
 msgid "no text relocations reported in '%s'"
 msgstr "brak relokacji tekstu w „%s”"
 
-#: src/findtextrel.c:310
+#: src/findtextrel.c:311
 #, c-format
 msgid "while reading ELF file"
 msgstr "podczas odczytywania pliku ELF"
 
-#: src/findtextrel.c:314
+#: src/findtextrel.c:315
 #, c-format
 msgid "cannot get program header count: %s"
 msgstr "nie można uzyskać liczby nagłówków programu: %s"
 
-#: src/findtextrel.c:325 src/findtextrel.c:342
+#: src/findtextrel.c:326 src/findtextrel.c:341
 #, c-format
 msgid "cannot get program header index at offset %zd: %s"
 msgstr "nie można uzyskać indeksu nagłówka programu pod offsetem %zd: %s"
 
-#: src/findtextrel.c:406
+#: src/findtextrel.c:397
 #, c-format
 msgid "cannot get symbol table section %zu in '%s': %s"
 msgstr "nie można uzyskać sekcji tabeli symboli %zu w „%s”: %s"
 
-#: src/findtextrel.c:427 src/findtextrel.c:450
+#: src/findtextrel.c:418 src/findtextrel.c:441
 #, c-format
 msgid "cannot get relocation at index %d in section %zu in '%s': %s"
 msgstr "nie można uzyskać relokacji pod indeksem %d w sekcji %zu w „%s”: %s"
 
-#: src/findtextrel.c:516
+#: src/findtextrel.c:507
 #, c-format
 msgid "%s not compiled with -fpic/-fPIC\n"
 msgstr "%s nie został skompilowany z -fpic/-fPIC\n"
 
-#: src/findtextrel.c:570
+#: src/findtextrel.c:561
 #, c-format
 msgid ""
 "the file containing the function '%s' is not compiled with -fpic/-fPIC\n"
 msgstr "plik zawierający funkcję „%s” nie został skompilowany z -fpic/-fPIC\n"
 
-#: src/findtextrel.c:577 src/findtextrel.c:597
+#: src/findtextrel.c:568 src/findtextrel.c:588
 #, c-format
 msgid ""
 "the file containing the function '%s' might not be compiled with -fpic/-"
@@ -3552,7 +3815,7 @@
 msgstr ""
 "plik zawierający funkcję „%s” mógł nie zostać skompilowany z -fpic/-fPIC\n"
 
-#: src/findtextrel.c:585
+#: src/findtextrel.c:576
 #, c-format
 msgid ""
 "either the file containing the function '%s' or the file containing the "
@@ -3561,7 +3824,7 @@
 "plik zawierający funkcję „%s” lub plik zawierający funkcję „%s” nie został "
 "skompilowany z -fpic/-fPIC\n"
 
-#: src/findtextrel.c:605
+#: src/findtextrel.c:596
 #, c-format
 msgid ""
 "a relocation modifies memory at offset %llu in a write-protected segment\n"
@@ -3668,12 +3931,12 @@
 msgstr "%s: BŁĄD WEWNĘTRZNY %d (%s): %s"
 
 #: src/nm.c:381 src/nm.c:393 src/size.c:288 src/size.c:297 src/size.c:308
-#: src/strip.c:2763
+#: src/strip.c:2767
 #, c-format
 msgid "while closing '%s'"
 msgstr "podczas zamykania „%s”"
 
-#: src/nm.c:403 src/objdump.c:280 src/strip.c:818
+#: src/nm.c:403 src/objdump.c:280 src/strip.c:822
 #, c-format
 msgid "%s: File format not recognized"
 msgstr "%s: nie rozpoznano formatu pliku"
@@ -3707,24 +3970,24 @@
 msgid "%s%s%s: file format not recognized"
 msgstr "%s%s%s: nie rozpoznano formatu pliku"
 
-#: src/nm.c:705
+#: src/nm.c:704
 #, c-format
 msgid "cannot create search tree"
 msgstr "nie można utworzyć drzewa wyszukiwania"
 
-#: src/nm.c:746 src/nm.c:1239 src/objdump.c:782 src/readelf.c:637
+#: src/nm.c:745 src/nm.c:1238 src/objdump.c:781 src/readelf.c:637
 #: src/readelf.c:1451 src/readelf.c:1602 src/readelf.c:1803 src/readelf.c:2009
-#: src/readelf.c:2199 src/readelf.c:2377 src/readelf.c:2453 src/readelf.c:2711
-#: src/readelf.c:2787 src/readelf.c:2874 src/readelf.c:3472 src/readelf.c:3522
-#: src/readelf.c:3592 src/readelf.c:11328 src/readelf.c:12523
-#: src/readelf.c:12734 src/readelf.c:12803 src/size.c:398 src/size.c:470
-#: src/strip.c:1084
+#: src/readelf.c:2199 src/readelf.c:2377 src/readelf.c:2453 src/readelf.c:2719
+#: src/readelf.c:2795 src/readelf.c:2882 src/readelf.c:3478 src/readelf.c:3528
+#: src/readelf.c:3598 src/readelf.c:11409 src/readelf.c:12603
+#: src/readelf.c:12814 src/readelf.c:12883 src/size.c:398 src/size.c:470
+#: src/strip.c:1089
 #, c-format
 msgid "cannot get section header string table index"
 msgstr "nie można uzyskać indeksu tabeli ciągów nagłówków sekcji"
 
 #. We always print this prolog.
-#: src/nm.c:771
+#: src/nm.c:770
 #, c-format
 msgid ""
 "\n"
@@ -3738,7 +4001,7 @@
 "\n"
 
 #. The header line.
-#: src/nm.c:774
+#: src/nm.c:773
 #, c-format
 msgid ""
 "%*s%-*s %-*s Class  Type     %-*s %*s Section\n"
@@ -3747,28 +4010,53 @@
 "%*s%-*s %-*s Klasa  Typ      %-*s %*s Sekcja\n"
 "\n"
 
-#: src/nm.c:1250
+#: src/nm.c:775
+#, fuzzy
+#| msgid " Name: "
+msgctxt "sysv"
+msgid "Name"
+msgstr " Nazwa: "
+
+#. TRANS: the "sysv|" parts makes the string unique.
+#: src/nm.c:777
+msgctxt "sysv"
+msgid "Value"
+msgstr ""
+
+#. TRANS: the "sysv|" parts makes the string unique.
+#: src/nm.c:779
+msgctxt "sysv"
+msgid "Size"
+msgstr ""
+
+#. TRANS: the "sysv|" parts makes the string unique.
+#: src/nm.c:781
+msgctxt "sysv"
+msgid "Line"
+msgstr ""
+
+#: src/nm.c:1249
 #, c-format
 msgid "%s: entry size in section %zd `%s' is not what we expect"
 msgstr "%s: rozmiar wpisu w sekcji %zd „%s” nie jest tym, czego oczekiwano"
 
-#: src/nm.c:1255
+#: src/nm.c:1254
 #, c-format
 msgid "%s: size of section %zd `%s' is not multiple of entry size"
 msgstr "%s: rozmiar sekcji %zd „%s” nie jest wielokrotnością rozmiaru wpisu"
 
-#: src/nm.c:1334
+#: src/nm.c:1335
 #, c-format
 msgid "%s: entries (%zd) in section %zd `%s' is too large"
 msgstr "%s: wpisy (%zd) w sekcji %zd „%s” są za duże"
 
 #. XXX Add machine specific object file types.
-#: src/nm.c:1570
+#: src/nm.c:1571
 #, c-format
 msgid "%s%s%s%s: Invalid operation"
 msgstr "%s%s%s%s: nieprawidłowe działanie"
 
-#: src/nm.c:1620
+#: src/nm.c:1621
 #, c-format
 msgid "%s%s%s: no symbols"
 msgstr "%s%s%s: brak symboli"
@@ -3844,10 +4132,10 @@
 msgid "cannot disassemble"
 msgstr "nie można deasemblować"
 
-#: src/objdump.c:760
-#, fuzzy, c-format
+#: src/objdump.c:759
+#, c-format
 msgid "cannot create backend for elf file"
-msgstr "nie można utworzyć nowego pliku"
+msgstr "nie można utworzyć zaplecza dla pliku ELF"
 
 #. Short description of program.
 #: src/ranlib.c:63
@@ -3890,6 +4178,8 @@
 "Used with -w to find the skeleton Compile Units in FILE associated with the "
 "Split Compile units in a .dwo input file"
 msgstr ""
+"Używane z opcją -w do wyszukiwania szkieletów jednostek kompilacji w PLIKU "
+"powiązanych z jednostkami podzielonej kompilacji w pliku wejściowym .dwo"
 
 #: src/readelf.c:104
 msgid "ELF output selection:"
@@ -3920,9 +4210,8 @@
 msgstr "Wyświetla relokacje"
 
 #: src/readelf.c:114
-#, fuzzy
 msgid "Display the section groups"
-msgstr "Wyświetla nagłówki sekcji"
+msgstr "Wyświetla grupy sekcji"
 
 #: src/readelf.c:115
 msgid "Display the sections' headers"
@@ -3933,9 +4222,8 @@
 msgstr "Wyświetla sekcje tabeli symboli"
 
 #: src/readelf.c:120
-#, fuzzy
 msgid "Display (only) the dynamic symbol table"
-msgstr "Wyświetla tylko symbole zewnętrzne"
+msgstr "Wyświetla (tylko) tabelę symboli dynamicznych"
 
 #: src/readelf.c:121
 msgid "Display versioning information"
@@ -3958,15 +4246,14 @@
 msgstr "Dodatkowy wybór wyjścia:"
 
 #: src/readelf.c:130
-#, fuzzy
 msgid ""
 "Display DWARF section content.  SECTION can be one of abbrev, addr, aranges, "
 "decodedaranges, frame, gdb_index, info, info+, loc, line, decodedline, "
 "ranges, pubnames, str, macinfo, macro or exception"
 msgstr ""
-"Wyświetla zawartość sekcji DWARF. SEKCJA może być jednym z abbrev, aranges, "
-"decodedaranges, frame, gdb_index, info, loc, line, decodedline, ranges, "
-"pubnames, str, macinfo, macro lub exception"
+"Wyświetla zawartość sekcji DWARF. SEKCJA może być jednym z abbrev, addr, "
+"aranges, decodedaranges, frame, gdb_index, info, info+, loc, line, "
+"decodedline, ranges, pubnames, str, macinfo, macro lub exception"
 
 #: src/readelf.c:134
 msgid "Dump the uninterpreted contents of SECTION, by number or name"
@@ -4032,7 +4319,7 @@
 msgid "cannot generate Elf descriptor: %s"
 msgstr "nie można utworzyć deskryptora ELF: %s"
 
-#: src/readelf.c:628 src/readelf.c:955 src/strip.c:1179
+#: src/readelf.c:628 src/readelf.c:955 src/strip.c:1184
 #, c-format
 msgid "cannot determine number of sections: %s"
 msgstr "nie można określić liczby sekcji: %s"
@@ -4042,11 +4329,11 @@
 msgid "cannot get section: %s"
 msgstr "nie można uzyskać sekcji: %s"
 
-#: src/readelf.c:655 src/readelf.c:1272 src/readelf.c:1483 src/readelf.c:12754
-#: src/unstrip.c:397 src/unstrip.c:428 src/unstrip.c:487 src/unstrip.c:608
-#: src/unstrip.c:629 src/unstrip.c:669 src/unstrip.c:885 src/unstrip.c:1216
-#: src/unstrip.c:1343 src/unstrip.c:1367 src/unstrip.c:1423 src/unstrip.c:1487
-#: src/unstrip.c:1662 src/unstrip.c:1813 src/unstrip.c:1956 src/unstrip.c:2055
+#: src/readelf.c:655 src/readelf.c:1272 src/readelf.c:1483 src/readelf.c:12834
+#: src/unstrip.c:397 src/unstrip.c:428 src/unstrip.c:491 src/unstrip.c:612
+#: src/unstrip.c:633 src/unstrip.c:673 src/unstrip.c:889 src/unstrip.c:1224
+#: src/unstrip.c:1351 src/unstrip.c:1375 src/unstrip.c:1431 src/unstrip.c:1472
+#: src/unstrip.c:1665 src/unstrip.c:1816 src/unstrip.c:1959 src/unstrip.c:2058
 #, c-format
 msgid "cannot get section header: %s"
 msgstr "nie można uzyskać nagłówka sekcji: %s"
@@ -4056,8 +4343,8 @@
 msgid "cannot get section name"
 msgstr "nie można uzyskać nazwy sekcji"
 
-#: src/readelf.c:672 src/readelf.c:6628 src/readelf.c:10600 src/readelf.c:10702
-#: src/readelf.c:10880
+#: src/readelf.c:672 src/readelf.c:6634 src/readelf.c:10681 src/readelf.c:10783
+#: src/readelf.c:10961
 #, c-format
 msgid "cannot get %s content: %s"
 msgstr "nie można uzyskać zwartości %s: %s"
@@ -4123,9 +4410,9 @@
 msgstr "nie można określić liczby nagłówków programu: %s"
 
 #: src/readelf.c:993
-#, fuzzy, c-format
+#, c-format
 msgid "cannot read ELF: %s"
-msgstr "nie można odczytać %s: %s"
+msgstr "nie można odczytać danych ELF: %s"
 
 #: src/readelf.c:1054
 msgid "NONE (None)"
@@ -4209,9 +4496,9 @@
 msgstr "  Komputer:                          %s\n"
 
 #: src/readelf.c:1109
-#, fuzzy, c-format
+#, c-format
 msgid "  Machine:                           <unknown>: 0x%x\n"
-msgstr "  Komputer:                          %s\n"
+msgstr "  Komputer:                          <nieznany>: 0x%x\n"
 
 #: src/readelf.c:1112
 #, c-format
@@ -4310,23 +4597,23 @@
 "\n"
 
 #: src/readelf.c:1230 src/readelf.c:1440
-#, fuzzy, c-format
+#, c-format
 msgid "cannot get number of sections: %s"
-msgstr "nie można określić liczby sekcji: %s"
+msgstr "nie można uzyskać liczby sekcji: %s"
 
 #: src/readelf.c:1233
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "There are %zd section headers, starting at offset %#<PRIx64>:\n"
 "\n"
 msgstr ""
-"Jest %d nagłówków sekcji, rozpoczynających się od offsetu %#<PRIx64>:\n"
+"Liczba nagłówków sekcji: %zd, rozpoczynających się od offsetu %#<PRIx64>:\n"
 "\n"
 
 #: src/readelf.c:1242
-#, fuzzy, c-format
+#, c-format
 msgid "cannot get section header string table index: %s"
-msgstr "nie można uzyskać indeksu tabeli ciągów nagłówków sekcji"
+msgstr "nie można uzyskać indeksu tabeli ciągów nagłówków sekcji: %s"
 
 #: src/readelf.c:1245
 msgid "Section Headers:"
@@ -4400,7 +4687,7 @@
 " Mapowanie sekcji do segmentów:\n"
 "  Segment sekcji…"
 
-#: src/readelf.c:1464 src/unstrip.c:2114 src/unstrip.c:2156 src/unstrip.c:2163
+#: src/readelf.c:1464 src/unstrip.c:2117 src/unstrip.c:2159 src/unstrip.c:2166
 #, c-format
 msgid "cannot get program header: %s"
 msgstr "nie można uzyskać nagłówka programu: %s"
@@ -4449,18 +4736,18 @@
 msgid "<INVALID SECTION>"
 msgstr "<NIEPRAWIDŁOWY SEKCJA>"
 
-#: src/readelf.c:1660 src/readelf.c:2387 src/readelf.c:3488 src/readelf.c:12625
-#: src/readelf.c:12632 src/readelf.c:12676 src/readelf.c:12683
+#: src/readelf.c:1660 src/readelf.c:2387 src/readelf.c:3494 src/readelf.c:12705
+#: src/readelf.c:12712 src/readelf.c:12756 src/readelf.c:12763
 msgid "Couldn't uncompress section"
 msgstr "Nie można dekompresować sekcji"
 
-#: src/readelf.c:1665 src/readelf.c:2392 src/readelf.c:3493
+#: src/readelf.c:1665 src/readelf.c:2392 src/readelf.c:3499
 #, c-format
 msgid "cannot get section [%zd] header: %s"
 msgstr "nie można uzyskać nagłówka sekcji [%zd]: %s"
 
-#: src/readelf.c:1809 src/readelf.c:2459 src/readelf.c:2717 src/readelf.c:2793
-#: src/readelf.c:3097 src/readelf.c:3171 src/readelf.c:5401
+#: src/readelf.c:1809 src/readelf.c:2459 src/readelf.c:2725 src/readelf.c:2801
+#: src/readelf.c:3105 src/readelf.c:3179 src/readelf.c:5407
 #, c-format
 msgid "invalid sh_link value in section %zu"
 msgstr "nieprawidłowa wartość sh_link w sekcji %zu"
@@ -4638,20 +4925,20 @@
 msgid "%5u: %0*<PRIx64> %6<PRId64> %-7s %-6s %-9s %6s %s"
 msgstr "%5u: %0*<PRIx64> %6<PRId64> %-7s %-6s %-9s %6s %s"
 
-#: src/readelf.c:2590
+#: src/readelf.c:2595
 #, c-format
 msgid "bad dynamic symbol"
 msgstr "błędny symbol dynamiczny"
 
-#: src/readelf.c:2672
+#: src/readelf.c:2680
 msgid "none"
 msgstr "brak"
 
-#: src/readelf.c:2689
+#: src/readelf.c:2697
 msgid "| <unknown>"
 msgstr "| <nieznany>"
 
-#: src/readelf.c:2720
+#: src/readelf.c:2728
 #, c-format
 msgid ""
 "\n"
@@ -4677,17 +4964,17 @@
 " Adres: %#0*<PRIx64>  Offset: %#08<PRIx64>  Dowiązanie do sekcji: [%2u] "
 "„%s”\n"
 
-#: src/readelf.c:2741
+#: src/readelf.c:2749
 #, c-format
 msgid "  %#06x: Version: %hu  File: %s  Cnt: %hu\n"
 msgstr "  %#06x: Wersja: %hu  Plik: %s  Licznik: %hu\n"
 
-#: src/readelf.c:2754
+#: src/readelf.c:2762
 #, c-format
 msgid "  %#06x: Name: %s  Flags: %s  Version: %hu\n"
 msgstr "  %#06x: Nazwa: %s  Flagi: %s  Wersja: %hu\n"
 
-#: src/readelf.c:2797
+#: src/readelf.c:2805
 #, c-format
 msgid ""
 "\n"
@@ -4713,19 +5000,19 @@
 " Adres: %#0*<PRIx64>  Offset: %#08<PRIx64>  Dowiązanie do sekcji: [%2u] "
 "„%s”\n"
 
-#: src/readelf.c:2825
+#: src/readelf.c:2833
 #, c-format
 msgid "  %#06x: Version: %hd  Flags: %s  Index: %hd  Cnt: %hd  Name: %s\n"
 msgstr ""
 "  %#06x: Wersja: %hd  Flagi: %s  Indeks: %hd  Licznik: %hd  Nazwa: %s\n"
 
-#: src/readelf.c:2840
+#: src/readelf.c:2848
 #, c-format
 msgid "  %#06x: Parent %d: %s\n"
 msgstr "  %#06x: Rodzic %d: %s\n"
 
 #. Print the header.
-#: src/readelf.c:3101
+#: src/readelf.c:3109
 #, c-format
 msgid ""
 "\n"
@@ -4748,15 +5035,15 @@
 "Sekcja symboli wersji [%2u] „%s” zawiera %d wpisów:\n"
 " Adres: %#0*<PRIx64>  Offset: %#08<PRIx64>  Dowiązanie do sekcji: [%2u] „%s”"
 
-#: src/readelf.c:3129
+#: src/readelf.c:3137
 msgid "   0 *local*                     "
 msgstr "   0 *lokalny*                   "
 
-#: src/readelf.c:3134
+#: src/readelf.c:3142
 msgid "   1 *global*                    "
 msgstr "   1 *globalny*                  "
 
-#: src/readelf.c:3176
+#: src/readelf.c:3184
 #, c-format
 msgid ""
 "\n"
@@ -4787,22 +5074,22 @@
 " Adres: %#0*<PRIx64>  Offset: %#08<PRIx64>  Dowiązanie do sekcji: [%2u] "
 "„%s”\n"
 
-#: src/readelf.c:3198
+#: src/readelf.c:3206
 #, no-c-format
 msgid " Length  Number  % of total  Coverage\n"
 msgstr " Długość Liczba  % całości   Pokrycie\n"
 
-#: src/readelf.c:3200
+#: src/readelf.c:3208
 #, c-format
 msgid "      0  %6<PRIu32>      %5.1f%%\n"
 msgstr "      0  %6<PRIu32>      %5.1f%%\n"
 
-#: src/readelf.c:3207
+#: src/readelf.c:3215
 #, c-format
 msgid "%7d  %6<PRIu32>      %5.1f%%    %5.1f%%\n"
 msgstr "%7d  %6<PRIu32>      %5.1f%%    %5.1f%%\n"
 
-#: src/readelf.c:3220
+#: src/readelf.c:3228
 #, c-format
 msgid ""
 " Average number of tests:   successful lookup: %f\n"
@@ -4811,47 +5098,47 @@
 " Średnia liczba testów:   udane wyszukania: %f\n"
 "\t\t\t  nieudane wyszukania: %f\n"
 
-#: src/readelf.c:3238 src/readelf.c:3302 src/readelf.c:3368
+#: src/readelf.c:3246 src/readelf.c:3310 src/readelf.c:3376
 #, c-format
 msgid "cannot get data for section %d: %s"
 msgstr "nie można uzyskać danych dla sekcji %d: %s"
 
-#: src/readelf.c:3246
+#: src/readelf.c:3254
 #, c-format
 msgid "invalid data in sysv.hash section %d"
 msgstr "nieprawidłowe dane w sekcji sysv.hash %d"
 
-#: src/readelf.c:3275
-#, fuzzy, c-format
+#: src/readelf.c:3283
+#, c-format
 msgid "invalid chain in sysv.hash section %d"
-msgstr "nieprawidłowe dane w sekcji sysv.hash %d"
+msgstr "nieprawidłowy łańcuch w sekcji sysv.hash %d"
 
-#: src/readelf.c:3310
+#: src/readelf.c:3318
 #, c-format
 msgid "invalid data in sysv.hash64 section %d"
 msgstr "nieprawidłowe dane w sekcji sysv.hash64 %d"
 
-#: src/readelf.c:3341
-#, fuzzy, c-format
+#: src/readelf.c:3349
+#, c-format
 msgid "invalid chain in sysv.hash64 section %d"
-msgstr "nieprawidłowe dane w sekcji sysv.hash64 %d"
+msgstr "nieprawidłowy łańcuch w sekcji sysv.hash64 %d"
 
-#: src/readelf.c:3377
+#: src/readelf.c:3385
 #, c-format
 msgid "invalid data in gnu.hash section %d"
 msgstr "nieprawidłowe dane w sekcji gnu.hash %d"
 
-#: src/readelf.c:3444
+#: src/readelf.c:3451
 #, c-format
 msgid ""
 " Symbol Bias: %u\n"
 " Bitmask Size: %zu bytes  %<PRIuFAST32>%% bits set  2nd hash shift: %u\n"
 msgstr ""
 " Przesunięcie symboli: %u\n"
-" Rozmiar maski bitowej: %zu bajtów  %<PRIuFAST32>%% bitów ustawionych  "
-"drugie przesunięcie skrótu: %u\n"
+" Rozmiar maski bitowej: %zu B  %<PRIuFAST32>%% b ustawionych  drugie "
+"przesunięcie skrótu: %u\n"
 
-#: src/readelf.c:3533
+#: src/readelf.c:3539
 #, c-format
 msgid ""
 "\n"
@@ -4872,15 +5159,15 @@
 "Sekcja listy bibliotek [%2zu] „%s” pod offsetem %#0<PRIx64> zawiera %d "
 "wpisów:\n"
 
-#: src/readelf.c:3547
+#: src/readelf.c:3553
 msgid ""
 "       Library                       Time Stamp          Checksum Version "
 "Flags"
 msgstr ""
-"       Biblioteka                    Oznaczenie czasu    Suma k.  Wersja  "
+"       Biblioteka                    Czas                Suma k.  Wersja  "
 "Flagi"
 
-#: src/readelf.c:3606
+#: src/readelf.c:3612
 #, c-format
 msgid ""
 "\n"
@@ -4888,105 +5175,104 @@
 "%#0<PRIx64>:\n"
 msgstr ""
 "\n"
-"Sekcja atrybutów obiektu [%2zu] „%s” %<PRIu64> bajtów pod offsetem "
-"%#0<PRIx64>:\n"
+"Sekcja atrybutów obiektu [%2zu] „%s” %<PRIu64> B pod offsetem %#0<PRIx64>:\n"
 
-#: src/readelf.c:3623
+#: src/readelf.c:3629
 msgid "  Owner          Size\n"
 msgstr "  Właściciel          Rozmiar\n"
 
-#: src/readelf.c:3647
+#: src/readelf.c:3653
 #, c-format
 msgid "  %-13s  %4<PRIu32>\n"
 msgstr "  %-13s  %4<PRIu32>\n"
 
 #. Unknown subsection, print and skip.
-#: src/readelf.c:3686
+#: src/readelf.c:3692
 #, c-format
 msgid "    %-4u %12<PRIu32>\n"
 msgstr "    %-4u %12<PRIu32>\n"
 
 #. Tag_File
-#: src/readelf.c:3691
+#: src/readelf.c:3697
 #, c-format
 msgid "    File: %11<PRIu32>\n"
 msgstr "    Plik: %11<PRIu32>\n"
 
-#: src/readelf.c:3740
+#: src/readelf.c:3746
 #, c-format
 msgid "      %s: %<PRId64>, %s\n"
 msgstr "      %s: %<PRId64>, %s\n"
 
-#: src/readelf.c:3743
+#: src/readelf.c:3749
 #, c-format
 msgid "      %s: %<PRId64>\n"
 msgstr "      %s: %<PRId64>\n"
 
-#: src/readelf.c:3746
+#: src/readelf.c:3752
 #, c-format
 msgid "      %s: %s\n"
 msgstr "      %s: %s\n"
 
-#: src/readelf.c:3756
+#: src/readelf.c:3762
 #, c-format
 msgid "      %u: %<PRId64>\n"
 msgstr "      %u: %<PRId64>\n"
 
-#: src/readelf.c:3759
+#: src/readelf.c:3765
 #, c-format
 msgid "      %u: %s\n"
 msgstr "      %u: %s\n"
 
-#: src/readelf.c:3829
-#, fuzzy, c-format
+#: src/readelf.c:3835
+#, c-format
 msgid "sprintf failure"
-msgstr "mprotect się nie powiodło"
+msgstr "sprintf się nie powiodło"
 
-#: src/readelf.c:4311
+#: src/readelf.c:4317
 msgid "empty block"
 msgstr "pusty blok"
 
-#: src/readelf.c:4314
+#: src/readelf.c:4320
 #, c-format
 msgid "%zu byte block:"
-msgstr "%zu bajtowy blok:"
+msgstr "blok o %zu B:"
 
-#: src/readelf.c:4792
-#, fuzzy, c-format
+#: src/readelf.c:4798
+#, c-format
 msgid "%*s[%2<PRIuMAX>] %s  <TRUNCATED>\n"
-msgstr "%*s[%4<PRIuMAX>] %s  <SKRÓCONE>\n"
+msgstr "%*s[%2<PRIuMAX>] %s  <SKRÓCONE>\n"
 
-#: src/readelf.c:4859
+#: src/readelf.c:4865
 #, c-format
 msgid "%s %#<PRIx64> used with different address sizes"
 msgstr "%s %#<PRIx64> zostało użyte z różnymi rozmiarami adresu"
 
-#: src/readelf.c:4866
+#: src/readelf.c:4872
 #, c-format
 msgid "%s %#<PRIx64> used with different offset sizes"
 msgstr "%s %#<PRIx64> zostało użyte z różnymi rozmiarami offsetu"
 
-#: src/readelf.c:4873
+#: src/readelf.c:4879
 #, c-format
 msgid "%s %#<PRIx64> used with different base addresses"
 msgstr "%s %#<PRIx64> zostało użyte z różnymi adresami podstawowymi"
 
-#: src/readelf.c:4880
-#, fuzzy, c-format
+#: src/readelf.c:4886
+#, c-format
 msgid "%s %#<PRIx64> used with different attribute %s and %s"
-msgstr "%s %#<PRIx64> zostało użyte z różnymi rozmiarami adresu"
+msgstr "%s %#<PRIx64> zostało użyte z różnymi atrybutami %s i %s"
 
-#: src/readelf.c:4980
+#: src/readelf.c:4986
 #, c-format
 msgid " [%6tx]  <UNUSED GARBAGE IN REST OF SECTION>\n"
 msgstr " [%6tx]  <NIEUŻYWANE ŚMIECIE W RESZCIE SEKCJI>\n"
 
-#: src/readelf.c:4988
+#: src/readelf.c:4994
 #, c-format
 msgid " [%6tx]  <UNUSED GARBAGE> ... %<PRIu64> bytes ...\n"
-msgstr " [%6tx]  <NIEUŻYWANE ŚMIECIE>… %<PRIu64> bajtów…\n"
+msgstr " [%6tx]  <NIEUŻYWANE ŚMIECIE>… %<PRIu64> B…\n"
 
-#: src/readelf.c:5091
+#: src/readelf.c:5097
 #, c-format
 msgid ""
 "\n"
@@ -4997,7 +5283,7 @@
 "Sekcja DWARF [%2zu] „%s” pod offsetem %#<PRIx64>:\n"
 " [ Kod]\n"
 
-#: src/readelf.c:5099
+#: src/readelf.c:5105
 #, c-format
 msgid ""
 "\n"
@@ -5006,20 +5292,20 @@
 "\n"
 "Sekcja skrótów pod offsetem %<PRIu64>:\n"
 
-#: src/readelf.c:5112
+#: src/readelf.c:5118
 #, c-format
 msgid " *** error while reading abbreviation: %s\n"
 msgstr " *** błąd podczas odczytywania skrótu: %s\n"
 
-#: src/readelf.c:5128
+#: src/readelf.c:5134
 #, c-format
 msgid " [%5u] offset: %<PRId64>, children: %s, tag: %s\n"
 msgstr " [%5u] offset: %<PRId64>, potomek: %s, znacznik: %s\n"
 
-#: src/readelf.c:5161 src/readelf.c:5470 src/readelf.c:5637 src/readelf.c:6022
-#: src/readelf.c:6638 src/readelf.c:8375 src/readelf.c:9064 src/readelf.c:9537
-#: src/readelf.c:9788 src/readelf.c:9954 src/readelf.c:10341
-#: src/readelf.c:10401
+#: src/readelf.c:5167 src/readelf.c:5476 src/readelf.c:5643 src/readelf.c:6028
+#: src/readelf.c:6644 src/readelf.c:8399 src/readelf.c:9145 src/readelf.c:9618
+#: src/readelf.c:9869 src/readelf.c:10035 src/readelf.c:10422
+#: src/readelf.c:10482
 #, c-format
 msgid ""
 "\n"
@@ -5028,56 +5314,52 @@
 "\n"
 "Sekcja DWARF [%2zu] „%s” pod offsetem %#<PRIx64>:\n"
 
-#: src/readelf.c:5174
-#, fuzzy, c-format
+#: src/readelf.c:5180
+#, c-format
 msgid "cannot get .debug_addr section data: %s"
-msgstr "nie można uzyskać danych sekcji: %s"
+msgstr "nie można uzyskać danych sekcji .debug_addr: %s"
 
-#: src/readelf.c:5274 src/readelf.c:5298 src/readelf.c:5682 src/readelf.c:9109
-#, fuzzy, c-format
+#: src/readelf.c:5280 src/readelf.c:5304 src/readelf.c:5688 src/readelf.c:9190
+#, c-format
 msgid " Length:         %8<PRIu64>\n"
-msgstr ""
-"\n"
-" Długość:        %6<PRIu64>\n"
+msgstr " Długość:          %8<PRIu64>\n"
 
-#: src/readelf.c:5276 src/readelf.c:5313 src/readelf.c:5695 src/readelf.c:9122
-#, fuzzy, c-format
+#: src/readelf.c:5282 src/readelf.c:5319 src/readelf.c:5701 src/readelf.c:9203
+#, c-format
 msgid " DWARF version:  %8<PRIu16>\n"
-msgstr " Wersja DWARF: %6<PRIuFAST16>\n"
+msgstr " Wersja DWARF:     %8<PRIu16>\n"
 
-#: src/readelf.c:5277 src/readelf.c:5322 src/readelf.c:5704 src/readelf.c:9131
-#, fuzzy, c-format
+#: src/readelf.c:5283 src/readelf.c:5328 src/readelf.c:5710 src/readelf.c:9212
+#, c-format
 msgid " Address size:   %8<PRIu64>\n"
-msgstr " Offset adresu:  %6<PRIu64>\n"
+msgstr " Rozmiar adresu:   %8<PRIu64>\n"
 
-#: src/readelf.c:5279 src/readelf.c:5332 src/readelf.c:5714 src/readelf.c:9141
-#, fuzzy, c-format
+#: src/readelf.c:5285 src/readelf.c:5338 src/readelf.c:5720 src/readelf.c:9222
+#, c-format
 msgid " Segment size:   %8<PRIu64>\n"
-msgstr ""
-" Rozmiar segmentu:  %6<PRIu64>\n"
-"\n"
+msgstr " Rozmiar segmentu: %8<PRIu64>\n"
 
-#: src/readelf.c:5317 src/readelf.c:5699 src/readelf.c:9126 src/readelf.c:10533
-#, fuzzy, c-format
+#: src/readelf.c:5323 src/readelf.c:5705 src/readelf.c:9207 src/readelf.c:10614
+#, c-format
 msgid "Unknown version"
-msgstr "nieznana wersja"
+msgstr "Nieznana wersja"
 
-#: src/readelf.c:5327 src/readelf.c:5540 src/readelf.c:5709 src/readelf.c:9136
+#: src/readelf.c:5333 src/readelf.c:5546 src/readelf.c:5715 src/readelf.c:9217
 #, c-format
 msgid "unsupported address size"
 msgstr "nieobsługiwany rozmiar adresu"
 
-#: src/readelf.c:5338 src/readelf.c:5551 src/readelf.c:5719 src/readelf.c:9146
+#: src/readelf.c:5344 src/readelf.c:5557 src/readelf.c:5725 src/readelf.c:9227
 #, c-format
 msgid "unsupported segment size"
 msgstr "nieobsługiwany rozmiar segmentu"
 
-#: src/readelf.c:5391 src/readelf.c:5465
+#: src/readelf.c:5397 src/readelf.c:5471
 #, c-format
 msgid "cannot get .debug_aranges content: %s"
 msgstr "nie można uzyskać zawartości .debug_aranges: %s"
 
-#: src/readelf.c:5406
+#: src/readelf.c:5412
 #, c-format
 msgid ""
 "\n"
@@ -5095,12 +5377,12 @@
 "\n"
 "Sekcja DWARF [%2zu] „%s” pod offsetem %#<PRIx64> zawiera %zu wpisów:\n"
 
-#: src/readelf.c:5437
+#: src/readelf.c:5443
 #, c-format
 msgid " [%*zu] ???\n"
 msgstr " [%*zu] ???\n"
 
-#: src/readelf.c:5439
+#: src/readelf.c:5445
 #, c-format
 msgid ""
 " [%*zu] start: %0#*<PRIx64>, length: %5<PRIu64>, CU DIE offset: %6<PRId64>\n"
@@ -5108,7 +5390,7 @@
 " [%*zu] początek: %0#*<PRIx64>, długość: %5<PRIu64>, offset CU DIE: "
 "%6<PRId64>\n"
 
-#: src/readelf.c:5483 src/readelf.c:8402
+#: src/readelf.c:5489 src/readelf.c:8426
 #, c-format
 msgid ""
 "\n"
@@ -5117,13 +5399,13 @@
 "\n"
 "Tabela pod offsetem %zu:\n"
 
-#: src/readelf.c:5487 src/readelf.c:5663 src/readelf.c:6662 src/readelf.c:8413
-#: src/readelf.c:9090
+#: src/readelf.c:5493 src/readelf.c:5669 src/readelf.c:6668 src/readelf.c:8437
+#: src/readelf.c:9171
 #, c-format
 msgid "invalid data in section [%zu] '%s'"
 msgstr "nieprawidłowe dane w sekcji [%zu] „%s”"
 
-#: src/readelf.c:5503
+#: src/readelf.c:5509
 #, c-format
 msgid ""
 "\n"
@@ -5132,27 +5414,27 @@
 "\n"
 " Długość:        %6<PRIu64>\n"
 
-#: src/readelf.c:5515
+#: src/readelf.c:5521
 #, c-format
 msgid " DWARF version: %6<PRIuFAST16>\n"
 msgstr " Wersja DWARF: %6<PRIuFAST16>\n"
 
-#: src/readelf.c:5519
+#: src/readelf.c:5525
 #, c-format
 msgid "unsupported aranges version"
 msgstr "nieobsługiwana wersja aranges"
 
-#: src/readelf.c:5530
+#: src/readelf.c:5536
 #, c-format
 msgid " CU offset:     %6<PRIx64>\n"
 msgstr " Offset CU:     %6<PRIx64>\n"
 
-#: src/readelf.c:5536
+#: src/readelf.c:5542
 #, c-format
 msgid " Address size:  %6<PRIu64>\n"
 msgstr " Offset adresu:  %6<PRIu64>\n"
 
-#: src/readelf.c:5547
+#: src/readelf.c:5553
 #, c-format
 msgid ""
 " Segment size:  %6<PRIu64>\n"
@@ -5161,109 +5443,116 @@
 " Rozmiar segmentu:  %6<PRIu64>\n"
 "\n"
 
-#: src/readelf.c:5602
+#: src/readelf.c:5608
 #, c-format
 msgid "   %zu padding bytes\n"
-msgstr "   bajty wypełnienia: %zu\n"
+msgstr "   %zu B wypełnienia\n"
 
-#: src/readelf.c:5646
-#, fuzzy, c-format
+#: src/readelf.c:5652
+#, c-format
 msgid "cannot get .debug_rnglists content: %s"
-msgstr "nie można uzyskać zawartości .debug_ranges: %s"
+msgstr "nie można uzyskać zawartości .debug_rnglists: %s"
 
-#: src/readelf.c:5669 src/readelf.c:9096
-#, fuzzy, c-format
+#: src/readelf.c:5675 src/readelf.c:9177
+#, c-format
 msgid ""
 "Table at Offset 0x%<PRIx64>:\n"
 "\n"
-msgstr " Offset .debug_line: 0x%<PRIx64>\n"
+msgstr ""
+"Tabela pod offsetem 0x%<PRIx64>:\n"
+"\n"
 
-#: src/readelf.c:5724 src/readelf.c:9151
-#, fuzzy, c-format
+#: src/readelf.c:5730 src/readelf.c:9232
+#, c-format
 msgid " Offset entries: %8<PRIu64>\n"
-msgstr " Długość offsetu:    %<PRIu8>\n"
+msgstr " Wpisy offsetu: %8<PRIu64>\n"
 
-#: src/readelf.c:5740 src/readelf.c:9167
+#: src/readelf.c:5746 src/readelf.c:9248
 #, c-format
 msgid " Unknown CU base: "
-msgstr ""
+msgstr " Nieznana podstawa CU: "
 
-#: src/readelf.c:5742 src/readelf.c:9169
+#: src/readelf.c:5748 src/readelf.c:9250
 #, c-format
 msgid " CU [%6<PRIx64>] base: "
-msgstr ""
+msgstr " Podstawa CU [%6<PRIx64>]: "
 
-#: src/readelf.c:5748 src/readelf.c:9175
+#: src/readelf.c:5754 src/readelf.c:9256
 #, c-format
 msgid " Not associated with a CU.\n"
-msgstr ""
+msgstr " Brak powiązania z CU.\n"
 
-#: src/readelf.c:5759 src/readelf.c:9186
+#: src/readelf.c:5765 src/readelf.c:9267
 #, c-format
 msgid "too many offset entries for unit length"
-msgstr ""
+msgstr "za dużo wpisów offsetu dla długości jednostki"
 
-#: src/readelf.c:5763 src/readelf.c:9190
-#, fuzzy, c-format
+#: src/readelf.c:5769 src/readelf.c:9271
+#, c-format
 msgid "  Offsets starting at 0x%<PRIx64>:\n"
-msgstr " Offset:             0x%<PRIx64>\n"
+msgstr "  Offsety zaczynające się w 0x%<PRIx64>:\n"
 
-#: src/readelf.c:5815
-#, fuzzy, c-format
+#: src/readelf.c:5821
+#, c-format
 msgid "invalid range list data"
-msgstr "nieprawidłowe dane"
+msgstr "nieprawidłowe dane listy zakresów"
 
-#: src/readelf.c:6000 src/readelf.c:9515
-#, fuzzy, c-format
+#: src/readelf.c:6006 src/readelf.c:9596
+#, c-format
 msgid ""
 "   %zu padding bytes\n"
 "\n"
-msgstr "   bajty wypełnienia: %zu\n"
+msgstr ""
+"   %zu B wypełnienia\n"
+"\n"
 
-#: src/readelf.c:6017
+#: src/readelf.c:6023
 #, c-format
 msgid "cannot get .debug_ranges content: %s"
 msgstr "nie można uzyskać zawartości .debug_ranges: %s"
 
-#: src/readelf.c:6053 src/readelf.c:9570
+#: src/readelf.c:6059 src/readelf.c:9651
 #, c-format
 msgid ""
 "\n"
 " Unknown CU base: "
 msgstr ""
+"\n"
+" Nieznana podstawa CU: "
 
-#: src/readelf.c:6055 src/readelf.c:9572
+#: src/readelf.c:6061 src/readelf.c:9653
 #, c-format
 msgid ""
 "\n"
 " CU [%6<PRIx64>] base: "
 msgstr ""
+"\n"
+" Podstawa CU [%6<PRIx64>]: "
 
-#: src/readelf.c:6064 src/readelf.c:9598 src/readelf.c:9624
+#: src/readelf.c:6070 src/readelf.c:9679 src/readelf.c:9705
 #, c-format
 msgid " [%6tx]  <INVALID DATA>\n"
 msgstr " [%6tx]  <NIEPRAWIDŁOWE DANE>\n"
 
-#: src/readelf.c:6089 src/readelf.c:9708
-#, fuzzy
+#: src/readelf.c:6095 src/readelf.c:9789
 msgid "base address"
-msgstr " ustawienie adresu na %s\n"
+msgstr "adres podstawowy"
 
-#: src/readelf.c:6099 src/readelf.c:9718
-#, fuzzy, c-format
+#: src/readelf.c:6105 src/readelf.c:9799
+#, c-format
 msgid " [%6tx] empty list\n"
-msgstr " [%6tx]  pusta lista\n"
+msgstr " [%6tx] pusta lista\n"
 
-#: src/readelf.c:6359
+#: src/readelf.c:6365
 msgid "         <INVALID DATA>\n"
 msgstr "         <NIEPRAWIDŁOWE DANE>\n"
 
-#: src/readelf.c:6616
+#: src/readelf.c:6622
 #, c-format
 msgid "cannot get ELF: %s"
 msgstr "nie można uzyskać ELF: %s"
 
-#: src/readelf.c:6634
+#: src/readelf.c:6640
 #, c-format
 msgid ""
 "\n"
@@ -5272,7 +5561,7 @@
 "\n"
 "Sekcja informacji o ramce wywołania [%2zu] „%s” pod offsetem %#<PRIx64>:\n"
 
-#: src/readelf.c:6684
+#: src/readelf.c:6690
 #, c-format
 msgid ""
 "\n"
@@ -5281,65 +5570,65 @@
 "\n"
 " [%6tx] Zerowy koniec\n"
 
-#: src/readelf.c:6785 src/readelf.c:6939
+#: src/readelf.c:6791 src/readelf.c:6945
 #, c-format
 msgid "invalid augmentation length"
 msgstr "nieprawidłowa długość powiększenia"
 
-#: src/readelf.c:6800
+#: src/readelf.c:6806
 msgid "FDE address encoding: "
 msgstr "Kodowanie adresu FDE: "
 
-#: src/readelf.c:6806
+#: src/readelf.c:6812
 msgid "LSDA pointer encoding: "
 msgstr "Kodowanie wskaźnika LSDA: "
 
-#: src/readelf.c:6916
+#: src/readelf.c:6922
 #, c-format
 msgid " (offset: %#<PRIx64>)"
 msgstr " (offset: %#<PRIx64>)"
 
-#: src/readelf.c:6923
+#: src/readelf.c:6929
 #, c-format
 msgid " (end offset: %#<PRIx64>)"
 msgstr " (kończący offset: %#<PRIx64>)"
 
-#: src/readelf.c:6960
+#: src/readelf.c:6966
 #, c-format
 msgid "   %-26sLSDA pointer: %#<PRIx64>\n"
 msgstr "   %-26sWskaźnik LSDA: %#<PRIx64>\n"
 
-#: src/readelf.c:7045
-#, fuzzy, c-format
+#: src/readelf.c:7051
+#, c-format
 msgid "DIE [%<PRIx64>] cannot get attribute code: %s"
-msgstr "nie można uzyskać kodu atrybutu: %s"
+msgstr "DIE [%<PRIx64>] nie można uzyskać kodu atrybutu: %s"
 
-#: src/readelf.c:7055
-#, fuzzy, c-format
+#: src/readelf.c:7061
+#, c-format
 msgid "DIE [%<PRIx64>] cannot get attribute form: %s"
-msgstr "nie można uzyskać formy atrybutu: %s"
+msgstr "DIE [%<PRIx64>] nie można uzyskać formy atrybutu: %s"
 
-#: src/readelf.c:7077
-#, fuzzy, c-format
+#: src/readelf.c:7083
+#, c-format
 msgid "DIE [%<PRIx64>] cannot get attribute '%s' (%s) value: %s"
-msgstr "nie można uzyskać wartości atrybutu: %s"
+msgstr "DIE [%<PRIx64>] nie można uzyskać wartości atrybutu „%s” (%s): %s"
 
-#: src/readelf.c:7407
-#, fuzzy, c-format
+#: src/readelf.c:7413
+#, c-format
 msgid "invalid file (%<PRId64>): %s"
-msgstr "nieprawidłowy plik"
+msgstr "nieprawidłowy plik (%<PRId64>): %s"
 
-#: src/readelf.c:7411
-#, fuzzy, c-format
+#: src/readelf.c:7417
+#, c-format
 msgid "no srcfiles for CU [%<PRIx64>]"
-msgstr " ustawienie pliku na %<PRIu64>\n"
+msgstr "brak plików źródłowych dla CU [%<PRIx64>]"
 
-#: src/readelf.c:7415
-#, fuzzy, c-format
+#: src/readelf.c:7421
+#, c-format
 msgid "couldn't get DWARF CU: %s"
-msgstr "nie można uzyskać ELF: %s"
+msgstr "nie można uzyskać CU DWARF: %s"
 
-#: src/readelf.c:7728
+#: src/readelf.c:7736
 #, c-format
 msgid ""
 "\n"
@@ -5350,13 +5639,13 @@
 "Sekcja DWARF [%2zu] „%s” pod offsetem %#<PRIx64>:\n"
 " [Offset]\n"
 
-#: src/readelf.c:7778
-#, fuzzy, c-format
+#: src/readelf.c:7786
+#, c-format
 msgid "cannot get next unit: %s"
-msgstr "nie można uzyskać następnego DIE: %s"
+msgstr "nie można uzyskać następnej jednostki: %s"
 
-#: src/readelf.c:7797
-#, fuzzy, c-format
+#: src/readelf.c:7806
+#, c-format
 msgid ""
 " Type unit at offset %<PRIu64>:\n"
 " Version: %<PRIu16>, Abbreviation section offset: %<PRIu64>, Address size: "
@@ -5366,9 +5655,9 @@
 " Jednostka typu pod offsetem %<PRIu64>:\n"
 " Wersja: %<PRIu16>, offset sekcji skrótów: %<PRIu64>, rozmiar adresu: "
 "%<PRIu8>, rozmiar offsetu: %<PRIu8>\n"
-" Podpis typu: %#<PRIx64>, offset typu: %#<PRIx64>\n"
+" Podpis typu: %#<PRIx64>, offset typu: %#<PRIx64> [%<PRIx64>]\n"
 
-#: src/readelf.c:7809
+#: src/readelf.c:7818
 #, c-format
 msgid ""
 " Compilation unit at offset %<PRIu64>:\n"
@@ -5379,49 +5668,49 @@
 " Wersja: %<PRIu16>, offset sekcji skrótów: %<PRIu64>, rozmiar adresu: "
 "%<PRIu8>, rozmiar offsetu: %<PRIu8>\n"
 
-#: src/readelf.c:7819 src/readelf.c:7982
+#: src/readelf.c:7828 src/readelf.c:7989
 #, c-format
 msgid " Unit type: %s (%<PRIu8>)"
-msgstr ""
+msgstr " Typ jednostki: %s (%<PRIu8>)"
 
-#: src/readelf.c:7846
+#: src/readelf.c:7855
 #, c-format
 msgid "unknown version (%d) or unit type (%d)"
-msgstr ""
+msgstr "nieznana wersja (%d) lub typ jednostki (%d)"
 
-#: src/readelf.c:7875
+#: src/readelf.c:7884
 #, c-format
 msgid "cannot get DIE offset: %s"
 msgstr "nie można uzyskać offsetu DIE: %s"
 
-#: src/readelf.c:7884
-#, fuzzy, c-format
+#: src/readelf.c:7893
+#, c-format
 msgid "cannot get tag of DIE at offset [%<PRIx64>] in section '%s': %s"
 msgstr ""
-"nie można uzyskać znacznika DIE pod offsetem %<PRIu64> w sekcji „%s”: %s"
+"nie można uzyskać znacznika DIE pod offsetem [%<PRIx64>] w sekcji „%s”: %s"
 
-#: src/readelf.c:7922
+#: src/readelf.c:7929
 #, c-format
 msgid "cannot get next DIE: %s\n"
 msgstr "nie można uzyskać następnego DIE: %s\n"
 
-#: src/readelf.c:7930
+#: src/readelf.c:7937
 #, c-format
 msgid "cannot get next DIE: %s"
 msgstr "nie można uzyskać następnego DIE: %s"
 
-#: src/readelf.c:7974
-#, fuzzy, c-format
+#: src/readelf.c:7981
+#, c-format
 msgid ""
 " Split compilation unit at offset %<PRIu64>:\n"
 " Version: %<PRIu16>, Abbreviation section offset: %<PRIu64>, Address size: "
 "%<PRIu8>, Offset size: %<PRIu8>\n"
 msgstr ""
-" Jednostka kompilacji pod offsetem %<PRIu64>:\n"
+" Jednostka podzielonej kompilacji pod offsetem %<PRIu64>:\n"
 " Wersja: %<PRIu16>, offset sekcji skrótów: %<PRIu64>, rozmiar adresu: "
 "%<PRIu8>, rozmiar offsetu: %<PRIu8>\n"
 
-#: src/readelf.c:8026
+#: src/readelf.c:8033
 #, c-format
 msgid ""
 "\n"
@@ -5432,19 +5721,19 @@
 "Sekcja DWARF [%2zu] „%s” pod offsetem %#<PRIx64>:\n"
 "\n"
 
-#: src/readelf.c:8358
-#, fuzzy, c-format
+#: src/readelf.c:8365
+#, c-format
 msgid "unknown form: %s"
-msgstr "nieznany błąd"
+msgstr "nieznana forma: %s"
 
-#: src/readelf.c:8389
+#: src/readelf.c:8413
 #, c-format
 msgid "cannot get line data section data: %s"
 msgstr "nie można uzyskać danych sekcji danych wiersza: %s"
 
 #. Print what we got so far.
-#: src/readelf.c:8491
-#, fuzzy, c-format
+#: src/readelf.c:8517
+#, c-format
 msgid ""
 "\n"
 " Length:                         %<PRIu64>\n"
@@ -5462,39 +5751,41 @@
 "Opcodes:\n"
 msgstr ""
 "\n"
-" Długość:                      %<PRIu64>\n"
-" Wersja DWARF:                 %<PRIuFAST16>\n"
-" Długość prologu:              %<PRIu64>\n"
-" Minimalna długość instrukcji: %<PRIuFAST8>\n"
-" Maksymalna liczba działań na instrukcję: %<PRIuFAST8>\n"
-" Początkowa wartość „%s”:      %<PRIuFAST8>\n"
-" Początek wiersza:             %<PRIdFAST8>\n"
-" Przedział wiersza:            %<PRIuFAST8>\n"
-" Początek instrukcji:          %<PRIuFAST8>\n"
+" Długość:                             %<PRIu64>\n"
+" Wersja DWARF:                        %<PRIuFAST16>\n"
+" Długość prologu:                     %<PRIu64>\n"
+" Rozmiar adresu:                      %zd\n"
+" Rozmiar selektora segmentu:          %zd\n"
+" Minimalna długość instrukcji:        %<PRIuFAST8>\n"
+" Maks. liczba działań na instrukcję:  %<PRIuFAST8>\n"
+" Wartość początkowa, jeśli „is_stmt”: %<PRIuFAST8>\n"
+" Podstawa wiersza:                    %<PRIdFAST8>\n"
+" Zakres wiersza:                      %<PRIuFAST8>\n"
+" Podstawa instrukcji:                 %<PRIuFAST8>\n"
 "\n"
 "Instrukcje:\n"
 
-#: src/readelf.c:8513
-#, fuzzy, c-format
-msgid "cannot handle .debug_line version: %u\n"
-msgstr "nie można uzyskać wersji symbolu: %s"
-
-#: src/readelf.c:8521
-#, fuzzy, c-format
-msgid "cannot handle address size: %u\n"
-msgstr "nieobsługiwany rozmiar adresu"
-
-#: src/readelf.c:8529
-#, fuzzy, c-format
-msgid "cannot handle segment selector size: %u\n"
-msgstr "nie można uzyskać sekcji: %s"
-
 #: src/readelf.c:8539
 #, c-format
+msgid "cannot handle .debug_line version: %u\n"
+msgstr "nie można obsłużyć wersji .debug_line: %u\n"
+
+#: src/readelf.c:8547
+#, c-format
+msgid "cannot handle address size: %u\n"
+msgstr "nie można obsłużyć rozmiaru adresu: %u\n"
+
+#: src/readelf.c:8555
+#, c-format
+msgid "cannot handle segment selector size: %u\n"
+msgstr "nie można obsłużyć rozmiaru selektora segmentu: %u\n"
+
+#: src/readelf.c:8565
+#, c-format
 msgid "invalid data at offset %tu in section [%zu] '%s'"
 msgstr "nieprawidłowe dane pod offsetem %tu w sekcji [%zu] „%s”"
 
-#: src/readelf.c:8554
+#: src/readelf.c:8580
 #, c-format
 msgid "  [%*<PRIuFAST8>]  %hhu argument\n"
 msgid_plural "  [%*<PRIuFAST8>]  %hhu arguments\n"
@@ -5502,7 +5793,7 @@
 msgstr[1] "  [%*<PRIuFAST8>]  %hhu parametry\n"
 msgstr[2] "  [%*<PRIuFAST8>]  %hhu parametrów\n"
 
-#: src/readelf.c:8565
+#: src/readelf.c:8591
 msgid ""
 "\n"
 "Directory table:"
@@ -5510,38 +5801,32 @@
 "\n"
 "Tabela katalogu:"
 
-#: src/readelf.c:8571 src/readelf.c:8648
-#, fuzzy, c-format
+#: src/readelf.c:8597 src/readelf.c:8674
+#, c-format
 msgid "      ["
-msgstr "    PC: "
+msgstr "      ["
 
-#: src/readelf.c:8642
-#, fuzzy
+#: src/readelf.c:8668
 msgid ""
 "\n"
 "File name table:"
 msgstr ""
 "\n"
-" Tabela strony wywołania:"
+"Tabela nazw plików:"
 
-#: src/readelf.c:8703
-#, fuzzy
+#: src/readelf.c:8729
 msgid " Entry Dir   Time      Size      Name"
-msgstr ""
-"\n"
-"Tabela nazw plików:\n"
-" Wpis Kat    Czas      Rozmiar   Nazwa"
+msgstr " Wpis  Kat   Czas      Rozmiar   Nazwa"
 
-#: src/readelf.c:8742
-#, fuzzy
+#: src/readelf.c:8775
 msgid ""
 "\n"
 "No line number statements."
 msgstr ""
 "\n"
-"Instrukcje numerów wierszy:"
+"Brak instrukcji numerów wierszy."
 
-#: src/readelf.c:8746
+#: src/readelf.c:8779
 msgid ""
 "\n"
 "Line number statements:"
@@ -5549,119 +5834,129 @@
 "\n"
 "Instrukcje numerów wierszy:"
 
-#: src/readelf.c:8766
+#: src/readelf.c:8794
 #, c-format
 msgid "invalid maximum operations per instruction is zero"
 msgstr "nieprawidłowe maksimum operacji na instrukcję wynosi zero"
 
-#: src/readelf.c:8800
-#, fuzzy, c-format
+#: src/readelf.c:8828
+#, c-format
 msgid " special opcode %u: address+%u = "
-msgstr " instrukcja specjalna %u: adres+%u = %s, wiersz%+d = %zu\n"
+msgstr " instrukcja specjalna %u: adres+%u = "
 
-#: src/readelf.c:8804
-#, fuzzy, c-format
+#: src/readelf.c:8832
+#, c-format
 msgid ", op_index = %u, line%+d = %zu\n"
-msgstr ""
-" instrukcja specjalna %u: adres+%u = %s, op_index = %u, wiersz%+d = %zu\n"
+msgstr ", op_index = %u, wiersz%+d = %zu\n"
 
-#: src/readelf.c:8807
+#: src/readelf.c:8835
 #, c-format
 msgid ", line%+d = %zu\n"
-msgstr ""
+msgstr ", wiersz%+d = %zu\n"
 
-#: src/readelf.c:8825
+#: src/readelf.c:8853
 #, c-format
 msgid " extended opcode %u: "
 msgstr " instrukcja rozszerzona %u: "
 
-#: src/readelf.c:8830
+#: src/readelf.c:8858
 msgid " end of sequence"
 msgstr " koniec sekwencji"
 
-#: src/readelf.c:8848
-#, fuzzy, c-format
-msgid " set address to "
-msgstr " ustawienie adresu na %s\n"
-
 #: src/readelf.c:8876
 #, c-format
+msgid " set address to "
+msgstr " ustawienie adresu na "
+
+#: src/readelf.c:8904
+#, c-format
 msgid " define new file: dir=%u, mtime=%<PRIu64>, length=%<PRIu64>, name=%s\n"
 msgstr ""
 " definicja nowego pliku: dir=%u, mtime=%<PRIu64>, długość=%<PRIu64>, nazwa="
 "%s\n"
 
-#: src/readelf.c:8890
+#: src/readelf.c:8918
 #, c-format
 msgid " set discriminator to %u\n"
 msgstr " ustawienie dyskryminatora na %u\n"
 
+#: src/readelf.c:8945
+#, c-format
+msgid " set inlined context %u, function name %s (0x%x)\n"
+msgstr ""
+
+#: src/readelf.c:8969
+#, fuzzy, c-format
+#| msgid "Also show function names"
+msgid " set function name %s (0x%x)\n"
+msgstr "Wyświetla także nazwy funkcji"
+
 #. Unknown, ignore it.
-#: src/readelf.c:8895
+#: src/readelf.c:8976
 msgid " unknown opcode"
 msgstr " nieznana instrukcja"
 
 #. Takes no argument.
-#: src/readelf.c:8907
+#: src/readelf.c:8988
 msgid " copy"
 msgstr " kopiowanie"
 
-#: src/readelf.c:8918
-#, fuzzy, c-format
+#: src/readelf.c:8999
+#, c-format
 msgid " advance address by %u to "
-msgstr " zwiększenie adresu o %u do %s\n"
+msgstr " zwiększenie adresu o %u do "
 
-#: src/readelf.c:8922 src/readelf.c:8983
+#: src/readelf.c:9003 src/readelf.c:9064
 #, c-format
 msgid ", op_index to %u"
-msgstr ""
+msgstr ", op_index do %u"
 
-#: src/readelf.c:8934
+#: src/readelf.c:9015
 #, c-format
 msgid " advance line by constant %d to %<PRId64>\n"
 msgstr " zwiększenie wiersza o stałą %d do %<PRId64>\n"
 
-#: src/readelf.c:8944
+#: src/readelf.c:9025
 #, c-format
 msgid " set file to %<PRIu64>\n"
 msgstr " ustawienie pliku na %<PRIu64>\n"
 
-#: src/readelf.c:8955
+#: src/readelf.c:9036
 #, c-format
 msgid " set column to %<PRIu64>\n"
 msgstr " ustawienie kolumny na %<PRIu64>\n"
 
-#: src/readelf.c:8962
+#: src/readelf.c:9043
 #, c-format
 msgid " set '%s' to %<PRIuFAST8>\n"
 msgstr " ustawienie „%s” na %<PRIuFAST8>\n"
 
 #. Takes no argument.
-#: src/readelf.c:8968
+#: src/readelf.c:9049
 msgid " set basic block flag"
 msgstr " ustawienie podstawowej flagi bloku"
 
-#: src/readelf.c:8979
-#, fuzzy, c-format
+#: src/readelf.c:9060
+#, c-format
 msgid " advance address by constant %u to "
-msgstr " zwiększenie adresu o stałą %u do %s\n"
+msgstr " zwiększenie adresu o stałą %u do "
 
-#: src/readelf.c:8999
-#, fuzzy, c-format
+#: src/readelf.c:9080
+#, c-format
 msgid " advance address by fixed value %u to \n"
-msgstr " zwiększenie adresu o stałą wartość %u do %s\n"
+msgstr " zwiększenie adresu o stałą wartość %u do \n"
 
 #. Takes no argument.
-#: src/readelf.c:9009
+#: src/readelf.c:9090
 msgid " set prologue end flag"
 msgstr " ustawienie flagi końca prologu"
 
 #. Takes no argument.
-#: src/readelf.c:9014
+#: src/readelf.c:9095
 msgid " set epilogue begin flag"
 msgstr " ustawienie flagi początku epilogu"
 
-#: src/readelf.c:9024
+#: src/readelf.c:9105
 #, c-format
 msgid " set isa to %u\n"
 msgstr " ustawienie isa na %u\n"
@@ -5669,7 +5964,7 @@
 #. This is a new opcode the generator but not we know about.
 #. Read the parameters associated with it but then discard
 #. everything.  Read all the parameters for this opcode.
-#: src/readelf.c:9033
+#: src/readelf.c:9114
 #, c-format
 msgid " unknown opcode with %<PRIu8> parameter:"
 msgid_plural " unknown opcode with %<PRIu8> parameters:"
@@ -5677,101 +5972,101 @@
 msgstr[1] " nieznana instrukcja z %<PRIu8> parametrami:"
 msgstr[2] " nieznana instrukcja z %<PRIu8> parametrami:"
 
-#: src/readelf.c:9073
-#, fuzzy, c-format
+#: src/readelf.c:9154
+#, c-format
 msgid "cannot get .debug_loclists content: %s"
-msgstr "nie można uzyskać zawartości .debug_log: %s"
+msgstr "nie można uzyskać zawartości .debug_loclists: %s"
 
-#: src/readelf.c:9239
-#, fuzzy, c-format
+#: src/readelf.c:9320
+#, c-format
 msgid "    <INVALID DATA>\n"
-msgstr "   <NIEPRAWIDŁOWE DANE>\n"
+msgstr "    <NIEPRAWIDŁOWE DANE>\n"
 
-#: src/readelf.c:9279
-#, fuzzy, c-format
+#: src/readelf.c:9360
+#, c-format
 msgid "invalid loclists data"
-msgstr "nieprawidłowe dane"
+msgstr "nieprawidłowe dane loclists"
 
-#: src/readelf.c:9532
+#: src/readelf.c:9613
 #, c-format
 msgid "cannot get .debug_loc content: %s"
 msgstr "nie można uzyskać zawartości .debug_log: %s"
 
-#: src/readelf.c:9745 src/readelf.c:10789
+#: src/readelf.c:9826 src/readelf.c:10870
 msgid "   <INVALID DATA>\n"
 msgstr "   <NIEPRAWIDŁOWE DANE>\n"
 
-#: src/readelf.c:9800 src/readelf.c:9963
+#: src/readelf.c:9881 src/readelf.c:10044
 #, c-format
 msgid "cannot get macro information section data: %s"
 msgstr "nie można uzyskać danych sekcji informacji o makrach: %s"
 
-#: src/readelf.c:9880
+#: src/readelf.c:9961
 #, c-format
 msgid "%*s*** non-terminated string at end of section"
 msgstr "%*s*** niezakończony ciąg na końcu sekcji"
 
-#: src/readelf.c:9903
+#: src/readelf.c:9984
 #, c-format
 msgid "%*s*** missing DW_MACINFO_start_file argument at end of section"
 msgstr "%*s*** brak parametru DW_MACINFO_start_file na końcu sekcji"
 
-#: src/readelf.c:10004
+#: src/readelf.c:10085
 #, c-format
 msgid " Offset:             0x%<PRIx64>\n"
 msgstr " Offset:             0x%<PRIx64>\n"
 
-#: src/readelf.c:10016
+#: src/readelf.c:10097
 #, c-format
 msgid " Version:            %<PRIu16>\n"
 msgstr " Wersja:             %<PRIu16>\n"
 
-#: src/readelf.c:10022 src/readelf.c:10909
+#: src/readelf.c:10103 src/readelf.c:10990
 #, c-format
 msgid "  unknown version, cannot parse section\n"
 msgstr "  nieznana wersja, nie można przetworzyć sekcji\n"
 
-#: src/readelf.c:10029
-#, fuzzy, c-format
+#: src/readelf.c:10110
+#, c-format
 msgid " Flag:               0x%<PRIx8>"
-msgstr " Flaga:              0x%<PRIx8>\n"
+msgstr " Flaga:              0x%<PRIx8>"
 
-#: src/readelf.c:10058
+#: src/readelf.c:10139
 #, c-format
 msgid " Offset length:      %<PRIu8>\n"
 msgstr " Długość offsetu:    %<PRIu8>\n"
 
-#: src/readelf.c:10066
+#: src/readelf.c:10147
 #, c-format
 msgid " .debug_line offset: 0x%<PRIx64>\n"
 msgstr " Offset .debug_line: 0x%<PRIx64>\n"
 
-#: src/readelf.c:10091
+#: src/readelf.c:10172
 #, c-format
 msgid "  extension opcode table, %<PRIu8> items:\n"
 msgstr "  tabela instrukcji rozszerzenia, %<PRIu8> elementów:\n"
 
-#: src/readelf.c:10098
+#: src/readelf.c:10179
 #, c-format
 msgid "    [%<PRIx8>]"
 msgstr "    [%<PRIx8>]"
 
-#: src/readelf.c:10110
+#: src/readelf.c:10191
 #, c-format
 msgid " %<PRIu8> arguments:"
 msgstr " Parametry %<PRIu8>:"
 
-#: src/readelf.c:10125
+#: src/readelf.c:10206
 #, c-format
 msgid " no arguments."
 msgstr " brak parametrów."
 
-#: src/readelf.c:10326
+#: src/readelf.c:10407
 #, c-format
 msgid " [%5d] DIE offset: %6<PRId64>, CU DIE offset: %6<PRId64>, name: %s\n"
 msgstr " [%5d] offset DIE: %6<PRId64>, offset CU DIE: %6<PRId64>, nazwa: %s\n"
 
-#: src/readelf.c:10370
+#: src/readelf.c:10451
 #, c-format
 msgid ""
 "\n"
@@ -5782,41 +6077,43 @@
 "Sekcja DWARF [%2zu] „%s” pod offsetem %#<PRIx64>:\n"
 " %*s  Ciąg\n"
 
-#: src/readelf.c:10385
-#, fuzzy, c-format
+#. TRANS: the debugstr| prefix makes the string unique.
+#: src/readelf.c:10456
+msgctxt "debugstr"
+msgid "Offset"
+msgstr ""
+
+#: src/readelf.c:10466
+#, c-format
 msgid " *** error, missing string terminator\n"
-msgstr " *** błąd podczas odczytywania ciągów: %s\n"
+msgstr " *** błąd, brak znaku kończącego ciąg\n"
 
-#: src/readelf.c:10414
-#, fuzzy, c-format
+#: src/readelf.c:10495
+#, c-format
 msgid "cannot get .debug_str_offsets section data: %s"
-msgstr "nie można uzyskać danych sekcji: %s"
+msgstr "nie można uzyskać danych sekcji .debug_str_offsets: %s"
 
-#: src/readelf.c:10513
-#, fuzzy, c-format
+#: src/readelf.c:10594
+#, c-format
 msgid " Length:        %8<PRIu64>\n"
-msgstr ""
-"\n"
-" Długość:        %6<PRIu64>\n"
+msgstr " Długość:         %8<PRIu64>\n"
 
-#: src/readelf.c:10515
-#, fuzzy, c-format
+#: src/readelf.c:10596
+#, c-format
 msgid " Offset size:   %8<PRIu8>\n"
-msgstr " Długość offsetu:    %<PRIu8>\n"
+msgstr " Rozmiar offsetu: %8<PRIu8>\n"
 
-#: src/readelf.c:10529
-#, fuzzy, c-format
+#: src/readelf.c:10610
+#, c-format
 msgid " DWARF version: %8<PRIu16>\n"
-msgstr " Wersja DWARF: %6<PRIuFAST16>\n"
+msgstr " Wersja DWARF:    %8<PRIu16>\n"
 
-#: src/readelf.c:10538
-#, fuzzy, c-format
+#: src/readelf.c:10619
+#, c-format
 msgid " Padding:       %8<PRIx16>\n"
-msgstr ""
-"\n"
-" Długość:        %6<PRIu64>\n"
+msgstr " Wypełnienie:     %8<PRIx16>\n"
 
-#: src/readelf.c:10592
+#: src/readelf.c:10673
 #, c-format
 msgid ""
 "\n"
@@ -5825,7 +6122,7 @@
 "\n"
 "Sekcja tabeli wyszukiwania ramki wywołania [%2zu] „.eh_frame_hdr”:\n"
 
-#: src/readelf.c:10694
+#: src/readelf.c:10775
 #, c-format
 msgid ""
 "\n"
@@ -5834,22 +6131,22 @@
 "\n"
 "Sekcja tabeli obsługiwania wyjątków [%2zu] „.gcc_except_table”:\n"
 
-#: src/readelf.c:10717
+#: src/readelf.c:10798
 #, c-format
 msgid " LPStart encoding:    %#x "
 msgstr " Kodowanie LPStart:    %#x "
 
-#: src/readelf.c:10729
+#: src/readelf.c:10810
 #, c-format
 msgid " TType encoding:      %#x "
 msgstr " Kodowanie TType:      %#x "
 
-#: src/readelf.c:10744
+#: src/readelf.c:10825
 #, c-format
 msgid " Call site encoding:  %#x "
 msgstr " Kodowanie strony wywołania:  %#x "
 
-#: src/readelf.c:10757
+#: src/readelf.c:10838
 msgid ""
 "\n"
 " Call site table:"
@@ -5857,7 +6154,7 @@
 "\n"
 " Tabela strony wywołania:"
 
-#: src/readelf.c:10771
+#: src/readelf.c:10852
 #, c-format
 msgid ""
 " [%4u] Call site start:   %#<PRIx64>\n"
@@ -5870,51 +6167,51 @@
 "        Lądowisko:                 %#<PRIx64>\n"
 "        Działanie:                 %u\n"
 
-#: src/readelf.c:10844
+#: src/readelf.c:10925
 #, c-format
 msgid "invalid TType encoding"
 msgstr "nieprawidłowe kodowanie TType"
 
-#: src/readelf.c:10871
+#: src/readelf.c:10952
 #, c-format
 msgid ""
 "\n"
 "GDB section [%2zu] '%s' at offset %#<PRIx64> contains %<PRId64> bytes :\n"
 msgstr ""
 "\n"
-"Sekcja GDB [%2zu] „%s” pod offsetem %#<PRIx64> zawiera %<PRId64> bajtów:\n"
+"Sekcja GDB [%2zu] „%s” pod offsetem %#<PRIx64> zawiera %<PRId64> B:\n"
 
-#: src/readelf.c:10900
+#: src/readelf.c:10981
 #, c-format
 msgid " Version:         %<PRId32>\n"
 msgstr " Wersja:         %<PRId32>\n"
 
-#: src/readelf.c:10918
+#: src/readelf.c:10999
 #, c-format
 msgid " CU offset:       %#<PRIx32>\n"
 msgstr " offset CU:       %#<PRIx32>\n"
 
-#: src/readelf.c:10925
+#: src/readelf.c:11006
 #, c-format
 msgid " TU offset:       %#<PRIx32>\n"
 msgstr " offset TU:       %#<PRIx32>\n"
 
-#: src/readelf.c:10932
+#: src/readelf.c:11013
 #, c-format
 msgid " address offset:  %#<PRIx32>\n"
 msgstr " offset adresu:  %#<PRIx32>\n"
 
-#: src/readelf.c:10939
+#: src/readelf.c:11020
 #, c-format
 msgid " symbol offset:   %#<PRIx32>\n"
 msgstr " offset symbolu:   %#<PRIx32>\n"
 
-#: src/readelf.c:10946
+#: src/readelf.c:11027
 #, c-format
 msgid " constant offset: %#<PRIx32>\n"
 msgstr " offset stałej: %#<PRIx32>\n"
 
-#: src/readelf.c:10960
+#: src/readelf.c:11041
 #, c-format
 msgid ""
 "\n"
@@ -5923,7 +6220,7 @@
 "\n"
 " Lista CU pod offsetem %#<PRIx32> zawiera %zu wpisów:\n"
 
-#: src/readelf.c:10985
+#: src/readelf.c:11066
 #, c-format
 msgid ""
 "\n"
@@ -5932,7 +6229,7 @@
 "\n"
 " Lista TU pod offsetem %#<PRIx32> zawiera %zu wpisów:\n"
 
-#: src/readelf.c:11014
+#: src/readelf.c:11095
 #, c-format
 msgid ""
 "\n"
@@ -5941,7 +6238,7 @@
 "\n"
 " Lista adresów pod offsetem %#<PRIx32> zawiera %zu wpisów:\n"
 
-#: src/readelf.c:11046
+#: src/readelf.c:11127
 #, c-format
 msgid ""
 "\n"
@@ -5950,18 +6247,18 @@
 "\n"
 " Tabela symboli pod offsetem %#<PRIx32> zawiera %zu gniazd:\n"
 
-#: src/readelf.c:11184
+#: src/readelf.c:11265
 #, c-format
 msgid "cannot get debug context descriptor: %s"
 msgstr "nie można uzyskać deskryptora kontekstu debugowania: %s"
 
-#: src/readelf.c:11552 src/readelf.c:12179 src/readelf.c:12290
-#: src/readelf.c:12348
+#: src/readelf.c:11633 src/readelf.c:12260 src/readelf.c:12371
+#: src/readelf.c:12429
 #, c-format
 msgid "cannot convert core note data: %s"
 msgstr "nie można konwertować danych notatki core: %s"
 
-#: src/readelf.c:11915
+#: src/readelf.c:11996
 #, c-format
 msgid ""
 "\n"
@@ -5970,40 +6267,40 @@
 "\n"
 "%*s… <powtarza się jeszcze %u razy>…"
 
-#: src/readelf.c:12427
+#: src/readelf.c:12508
 msgid "  Owner          Data size  Type\n"
 msgstr "  Właściciel     Rozmiar danych  Typ\n"
 
-#: src/readelf.c:12456
+#: src/readelf.c:12536
 #, c-format
 msgid "  %-13.*s  %9<PRId32>  %s\n"
 msgstr "  %-13.*s  %9<PRId32>  %s\n"
 
-#: src/readelf.c:12508
-#, fuzzy, c-format
+#: src/readelf.c:12588
+#, c-format
 msgid "cannot get content of note: %s"
-msgstr "nie można uzyskać zawartości sekcji notatki: %s"
+msgstr "nie można uzyskać zawartości notatki: %s"
 
-#: src/readelf.c:12542
+#: src/readelf.c:12622
 #, c-format
 msgid ""
 "\n"
 "Note section [%2zu] '%s' of %<PRIu64> bytes at offset %#0<PRIx64>:\n"
 msgstr ""
 "\n"
-"Segment notatki [%2zu] „%s” o długości %<PRIu64> bajtów pod offsetem "
+"Segment notatki [%2zu] „%s” o długości %<PRIu64> B pod offsetem "
 "%#0<PRIx64>:\n"
 
-#: src/readelf.c:12565
+#: src/readelf.c:12645
 #, c-format
 msgid ""
 "\n"
 "Note segment of %<PRIu64> bytes at offset %#0<PRIx64>:\n"
 msgstr ""
 "\n"
-"Segment notatki o długości %<PRIu64> bajtów pod offsetem %#0<PRIx64>:\n"
+"Segment notatki o długości %<PRIu64> B pod offsetem %#0<PRIx64>:\n"
 
-#: src/readelf.c:12612
+#: src/readelf.c:12692
 #, c-format
 msgid ""
 "\n"
@@ -6012,22 +6309,22 @@
 "\n"
 "Sekcja [%zu] „%s” nie ma danych do zrzucenia.\n"
 
-#: src/readelf.c:12639 src/readelf.c:12690
+#: src/readelf.c:12719 src/readelf.c:12770
 #, c-format
 msgid "cannot get data for section [%zu] '%s': %s"
 msgstr "nie można uzyskać danych dla sekcji [%zu] „%s”: %s"
 
-#: src/readelf.c:12644
+#: src/readelf.c:12724
 #, c-format
 msgid ""
 "\n"
 "Hex dump of section [%zu] '%s', %<PRIu64> bytes at offset %#0<PRIx64>:\n"
 msgstr ""
 "\n"
-"Segment zrzutu szesnastkowego [%zu] „%s”, %<PRIu64> bajtów pod offsetem "
+"Segment zrzutu szesnastkowego [%zu] „%s”, %<PRIu64> B pod offsetem "
 "%#0<PRIx64>:\n"
 
-#: src/readelf.c:12649
+#: src/readelf.c:12729
 #, c-format
 msgid ""
 "\n"
@@ -6035,10 +6332,10 @@
 "%#0<PRIx64>:\n"
 msgstr ""
 "\n"
-"Zrzut szesnastkowy sekcji [%zu] „%s”, %<PRIu64> bajtów (%zd "
-"nieskompresowanych) pod offsetem %#0<PRIx64>:\n"
+"Zrzut szesnastkowy sekcji [%zu] „%s”, %<PRIu64> B (%zd nieskompresowanych) "
+"pod offsetem %#0<PRIx64>:\n"
 
-#: src/readelf.c:12663
+#: src/readelf.c:12743
 #, c-format
 msgid ""
 "\n"
@@ -6047,16 +6344,16 @@
 "\n"
 "Sekcja [%zu] „%s” nie ma ciągów do zrzucenia.\n"
 
-#: src/readelf.c:12695
+#: src/readelf.c:12775
 #, c-format
 msgid ""
 "\n"
 "String section [%zu] '%s' contains %<PRIu64> bytes at offset %#0<PRIx64>:\n"
 msgstr ""
 "\n"
-"Sekcja ciągów [%zu] „%s” zawiera %<PRIu64> bajtów pod offsetem %#0<PRIx64>:\n"
+"Sekcja ciągów [%zu] „%s” zawiera %<PRIu64> B pod offsetem %#0<PRIx64>:\n"
 
-#: src/readelf.c:12700
+#: src/readelf.c:12780
 #, c-format
 msgid ""
 "\n"
@@ -6064,10 +6361,10 @@
 "offset %#0<PRIx64>:\n"
 msgstr ""
 "\n"
-"Sekcja ciągów [%zu] „%s” zawiera %<PRIu64> bajtów (%zd nieskompresowanych) "
-"pod offsetem %#0<PRIx64>:\n"
+"Sekcja ciągów [%zu] „%s” zawiera %<PRIu64> B (%zd nieskompresowanych) pod "
+"offsetem %#0<PRIx64>:\n"
 
-#: src/readelf.c:12749
+#: src/readelf.c:12829
 #, c-format
 msgid ""
 "\n"
@@ -6076,7 +6373,7 @@
 "\n"
 "sekcja [%lu] nie istnieje"
 
-#: src/readelf.c:12779
+#: src/readelf.c:12859
 #, c-format
 msgid ""
 "\n"
@@ -6085,12 +6382,12 @@
 "\n"
 "sekcja „%s” nie istnieje"
 
-#: src/readelf.c:12836
+#: src/readelf.c:12916
 #, c-format
 msgid "cannot get symbol index of archive '%s': %s"
 msgstr "nie można uzyskać indeksu symboli archiwum „%s”: %s"
 
-#: src/readelf.c:12839
+#: src/readelf.c:12919
 #, c-format
 msgid ""
 "\n"
@@ -6099,7 +6396,7 @@
 "\n"
 "Archiwum „%s” nie ma indeksu symboli\n"
 
-#: src/readelf.c:12843
+#: src/readelf.c:12923
 #, c-format
 msgid ""
 "\n"
@@ -6108,12 +6405,12 @@
 "\n"
 "Indeks archiwum „%s” ma %zu wpisów:\n"
 
-#: src/readelf.c:12861
+#: src/readelf.c:12941
 #, c-format
 msgid "cannot extract member at offset %zu in '%s': %s"
 msgstr "nie można wydobyć elementów pod offsetem %zu w „%s”: %s"
 
-#: src/readelf.c:12866
+#: src/readelf.c:12946
 #, c-format
 msgid "Archive member '%s' contains:\n"
 msgstr "Element archiwum „%s” zawiera:\n"
@@ -6177,15 +6474,67 @@
 msgid "%s: file format not recognized"
 msgstr "%s: nie rozpoznano formatu pliku"
 
+#: src/size.c:328
+msgctxt "bsd"
+msgid "text"
+msgstr ""
+
+#: src/size.c:329
+msgctxt "bsd"
+msgid "data"
+msgstr ""
+
+#: src/size.c:330
+msgctxt "bsd"
+msgid "bss"
+msgstr ""
+
+#: src/size.c:331
+msgctxt "bsd"
+msgid "dec"
+msgstr ""
+
+#: src/size.c:332
+msgctxt "bsd"
+msgid "hex"
+msgstr ""
+
+#: src/size.c:333
+msgctxt "bsd"
+msgid "filename"
+msgstr ""
+
 #: src/size.c:418 src/size.c:560
 #, c-format
 msgid " (ex %s)"
 msgstr " (ex %s)"
 
+#: src/size.c:420
+#, fuzzy
+#| msgid "invalid section"
+msgctxt "sysv"
+msgid "section"
+msgstr "nieprawidłowa sekcja"
+
+#: src/size.c:421
+msgctxt "sysv"
+msgid "size"
+msgstr ""
+
+#: src/size.c:422
+msgctxt "sysv"
+msgid "addr"
+msgstr ""
+
+#: src/size.c:451 src/size.c:454 src/size.c:457
+msgctxt "sysv"
+msgid "Total"
+msgstr ""
+
 #: src/size.c:482
-#, fuzzy, c-format
+#, c-format
 msgid "cannot get section header"
-msgstr "nie można uzyskać nagłówka sekcji\n"
+msgstr "nie można uzyskać nagłówka sekcji"
 
 #: src/size.c:585
 msgid "(TOTALS)\n"
@@ -6194,7 +6543,7 @@
 #: src/stack.c:487
 #, c-format
 msgid "-p PID should be a positive process id."
-msgstr "-p PID powinien być dodatnim identyfikatorem procesu."
+msgstr "-p PID musi być dodatnim identyfikatorem procesu."
 
 #: src/stack.c:493
 #, c-format
@@ -6204,12 +6553,12 @@
 #: src/stack.c:553
 #, c-format
 msgid "-n MAXFRAMES should be 0 or higher."
-msgstr "-n MAKSYMALNA_LICZBA_RAMEK powinna wynosić 0 lub więcej."
+msgstr "-n MAKSYMALNA-LICZBA-RAMEK musi wynosić 0 lub więcej."
 
 #: src/stack.c:565
 #, c-format
 msgid "-e EXEC needs a core given by --core."
-msgstr "-e PLIK_WYKONYWALNY wymaga pliku core podanego za pomocą opcji --core."
+msgstr "-e PLIK-WYKONYWALNY wymaga pliku core podanego za pomocą opcji --core."
 
 #: src/stack.c:569
 #, c-format
@@ -6219,7 +6568,7 @@
 #: src/stack.c:573
 #, c-format
 msgid "One of -p PID or --core COREFILE should be given."
-msgstr "Tylko jedna z opcji -p PID lub --core PLIK_CORE powinna zostać podana."
+msgstr "Tylko jedna z opcji -p PID lub --core PLIK-CORE może zostać podana."
 
 #: src/stack.c:645
 msgid "Show stack of process PID"
@@ -6227,11 +6576,11 @@
 
 #: src/stack.c:647
 msgid "Show stack found in COREFILE"
-msgstr "Wyświetla stos odnaleziony w PLIKU_CORE"
+msgstr "Wyświetla stos odnaleziony w PLIKU-CORE"
 
 #: src/stack.c:648
 msgid "(optional) EXECUTABLE that produced COREFILE"
-msgstr "(opcjonalnie) PLIK_WYKONYWALNY, który utworzył PLIK_CORE"
+msgstr "(opcjonalnie) PLIK-WYKONYWALNY, który utworzył PLIK-CORE"
 
 #: src/stack.c:652
 msgid "Output selection options:"
@@ -6284,12 +6633,12 @@
 
 #: src/stack.c:673
 msgid "Show the backtrace of only one thread"
-msgstr "Wyświetla wyjątek, jeśli jest tylko jeden wątek"
+msgstr "Wyświetla ślad stosu, jeśli jest tylko jeden wątek"
 
 #: src/stack.c:675
 msgid "Show at most MAXFRAMES per thread (default 256, use 0 for unlimited)"
 msgstr ""
-"Wyświetla najwyżej MAKSYMALNĄ_LICZBĘ_KLATEK na wątek (domyślnie 256, 0 "
+"Wyświetla najwyżej MAKSYMALNĄ-LICZBĘ-KLATEK na wątek (domyślnie 256, 0 "
 "oznacza brak ograniczenia)"
 
 #: src/stack.c:677
@@ -6299,7 +6648,6 @@
 "i debug"
 
 #: src/stack.c:685
-#, fuzzy
 msgid ""
 "Print a stack for each thread in a process or core file.\n"
 "\n"
@@ -6314,8 +6662,8 @@
 "\n"
 "Program kończy działanie z kodem zwrotnym 0, jeśli wszystkie ramki zostały "
 "wyświetlone bez żadnych błędów. Jeśli niektóre ramki zostały wyświetlone, "
-"ale wystąpiły niekrytyczne błędy, które mogą spowodować niepełny wyjątek, to "
-"program kończy działanie z kodem zwrotnym 1. Jeśli żadne ramki nie mogły "
+"ale wystąpiły niekrytyczne błędy, które mogą spowodować niepełny ślad stosu, "
+"to program kończy działanie z kodem zwrotnym 1. Jeśli żadne ramki nie mogły "
 "zostać wyświetlone lub wystąpił krytyczny błąd, to program kończy działanie "
 "z kodem zwrotnym 2. Jeśli program został wywołany za pomocą błędnych lub "
 "brakujących parametrów, to zakończy on działanie z kodem zwrotnym 64."
@@ -6435,6 +6783,10 @@
 "is not reversible, incompatible with -f, -g, --remove-comment and --remove-"
 "section)"
 msgstr ""
+"Podobne do opcji --reloc-debug-sections, ale rozwiązuje wszystkie proste "
+"relokacje między sekcjami debugowania na miejscu. Żadne inne okrajanie nie "
+"jest wykonywane (działania nie jest odwracalne, nie jest zgodne z opcjami -"
+"f, -g, --remove-comment i --remove-section)"
 
 #: src/strip.c:89
 msgid "Remove .comment section"
@@ -6445,12 +6797,16 @@
 "Remove the named section.  SECTION is an extended wildcard pattern.  May be "
 "given more than once.  Only non-allocated sections can be removed."
 msgstr ""
+"Usuwa podaną sekcję. SEKCJA jest rozszerzonym wzorem. Może być podane więcej "
+"niż raz. Można usuwać tylko nieprzydzielone sekcje."
 
 #: src/strip.c:91
 msgid ""
 "Keep the named section.  SECTION is an extended wildcard pattern.  May be "
 "given more than once."
 msgstr ""
+"Zachowuje podaną sekcję. SEKCJA jest rozszerzonym wzorem. Może być podane "
+"więcej niż raz."
 
 #. Short description of program.
 #: src/strip.c:98
@@ -6468,6 +6824,8 @@
 "--reloc-debug-sections-only incompatible with -f, -g, --remove-comment and --"
 "remove-section"
 msgstr ""
+"Opcja --reloc-debug-sections-only jest niezgodna z -f, -g, --remove-comment "
+"i --remove-section"
 
 #: src/strip.c:267
 #, c-format
@@ -6485,26 +6843,26 @@
 msgstr "Opcję -F podano dwukrotnie"
 
 #: src/strip.c:362
-#, fuzzy, c-format
+#, c-format
 msgid "cannot both keep and remove .comment section"
-msgstr "Usuwa sekcję .comment"
+msgstr "nie można jednocześnie zachować i usunąć sekcji .comment"
 
 #: src/strip.c:481
 #, c-format
 msgid "bad relocation"
 msgstr "błędna relokacja"
 
-#: src/strip.c:747 src/strip.c:771
+#: src/strip.c:751 src/strip.c:775
 #, c-format
 msgid "cannot stat input file '%s'"
 msgstr "nie można wykonać stat na pliku wejściowym „%s”"
 
-#: src/strip.c:761
+#: src/strip.c:765
 #, c-format
 msgid "while opening '%s'"
 msgstr "podczas otwierania „%s”"
 
-#: src/strip.c:799
+#: src/strip.c:803
 #, c-format
 msgid "%s: cannot use -o or -f when stripping archive"
 msgstr "%s: nie można używać -o lub -f podczas okrajania archiwum"
@@ -6515,132 +6873,132 @@
 #. result = handle_ar (fd, elf, NULL, fname,
 #. preserve_dates ? tv : NULL);
 #.
-#: src/strip.c:811
+#: src/strip.c:815
 #, c-format
 msgid "%s: no support for stripping archive"
 msgstr "%s: brak obsługi okrajania archiwum"
 
-#: src/strip.c:1047
+#: src/strip.c:1052
 #, c-format
 msgid "cannot open EBL backend"
 msgstr "nie można otworzyć zaplecza EBL"
 
-#: src/strip.c:1092
+#: src/strip.c:1097
 #, c-format
 msgid "cannot get number of phdrs"
 msgstr "nie można uzyskać liczby phdr"
 
-#: src/strip.c:1106 src/strip.c:1149
-#, fuzzy, c-format
+#: src/strip.c:1111 src/strip.c:1154
+#, c-format
 msgid "cannot create new ehdr for file '%s': %s"
-msgstr "nie można utworzyć nowego pliku „%s”: %s"
+msgstr "nie można utworzyć nowego ehdr dla pliku „%s”: %s"
 
-#: src/strip.c:1116 src/strip.c:1159
-#, fuzzy, c-format
+#: src/strip.c:1121 src/strip.c:1164
+#, c-format
 msgid "cannot create new phdr for file '%s': %s"
-msgstr "nie można utworzyć nowego pliku „%s”: %s"
+msgstr "nie można utworzyć nowego phdr dla pliku „%s”: %s"
 
-#: src/strip.c:1240
+#: src/strip.c:1244
 #, c-format
 msgid "illformed file '%s'"
 msgstr "plik „%s” ma błędny format"
 
-#: src/strip.c:1250
-#, fuzzy, c-format
+#: src/strip.c:1254
+#, c-format
 msgid "Cannot remove allocated section '%s'"
-msgstr "nie można przydzielić danych sekcji: %s"
+msgstr "Nie można usunąć przydzielonej sekcji „%s”"
 
-#: src/strip.c:1259
-#, fuzzy, c-format
+#: src/strip.c:1263
+#, c-format
 msgid "Cannot both keep and remove section '%s'"
-msgstr "nie można dodać nowej sekcji: %s"
+msgstr "Nie można jednocześnie zachować i usunąć sekcji „%s”"
 
-#: src/strip.c:1624 src/strip.c:1739
+#: src/strip.c:1628 src/strip.c:1743
 #, c-format
 msgid "while generating output file: %s"
 msgstr "podczas tworzenia pliku wyjściowego: %s"
 
-#: src/strip.c:1688
-#, fuzzy, c-format
+#: src/strip.c:1692
+#, c-format
 msgid "%s: error while updating ELF header: %s"
-msgstr "%s: błąd podczas tworzenia nagłówka ELF: %s"
+msgstr "%s: błąd podczas aktualizowania nagłówka ELF: %s"
 
-#: src/strip.c:1697
-#, fuzzy, c-format
+#: src/strip.c:1701
+#, c-format
 msgid "%s: error while getting shdrstrndx: %s"
-msgstr "%s: błąd podczas tworzenia nagłówka ELF: %s"
+msgstr "%s: błąd podczas uzyskiwania shdrstrndx: %s"
 
-#: src/strip.c:1705 src/strip.c:2550
-#, fuzzy, c-format
+#: src/strip.c:1709 src/strip.c:2554
+#, c-format
 msgid "%s: error updating shdrstrndx: %s"
-msgstr "%s: błąd podczas tworzenia nagłówka ELF: %s"
+msgstr "%s: błąd podczas aktualizowania shdrstrndx: %s"
 
-#: src/strip.c:1722
+#: src/strip.c:1726
 #, c-format
 msgid "while preparing output for '%s'"
 msgstr "podczas przygotowywania wyjścia dla „%s”"
 
-#: src/strip.c:1784 src/strip.c:1847
+#: src/strip.c:1788 src/strip.c:1851
 #, c-format
 msgid "while create section header section: %s"
 msgstr "podczas tworzenia sekcji nagłówka sekcji: %s"
 
-#: src/strip.c:1793
+#: src/strip.c:1797
 #, c-format
 msgid "cannot allocate section data: %s"
 msgstr "nie można przydzielić danych sekcji: %s"
 
-#: src/strip.c:1859
+#: src/strip.c:1863
 #, c-format
 msgid "while create section header string table: %s"
 msgstr "podczas tworzenia tabeli ciągów nagłówka sekcji: %s"
 
-#: src/strip.c:1866
+#: src/strip.c:1870
 #, c-format
 msgid "no memory to create section header string table"
 msgstr "brak pamięci do utworzenia tabeli ciągów nagłówka sekcji"
 
-#: src/strip.c:2079
+#: src/strip.c:2083
 #, c-format
 msgid "Cannot remove symbol [%zd] from allocated symbol table [%zd]"
 msgstr "Nie można usunąć symbolu [%zd] z przydzielonej tabeli symboli [%zd]"
 
-#: src/strip.c:2466 src/strip.c:2574
+#: src/strip.c:2470 src/strip.c:2578
 #, c-format
 msgid "while writing '%s': %s"
 msgstr "podczas zapisywania „%s”: %s"
 
-#: src/strip.c:2477
+#: src/strip.c:2481
 #, c-format
 msgid "while creating '%s'"
 msgstr "podczas tworzenia „%s”"
 
-#: src/strip.c:2500
+#: src/strip.c:2504
 #, c-format
 msgid "while computing checksum for debug information"
 msgstr "podczas obliczania sumy kontrolnej dla informacji debugowania"
 
-#: src/strip.c:2541
+#: src/strip.c:2545
 #, c-format
 msgid "%s: error while creating ELF header: %s"
 msgstr "%s: błąd podczas tworzenia nagłówka ELF: %s"
 
-#: src/strip.c:2559
+#: src/strip.c:2563
 #, c-format
 msgid "%s: error while reading the file: %s"
 msgstr "%s: błąd podczas odczytywania pliku: %s"
 
-#: src/strip.c:2599 src/strip.c:2619
+#: src/strip.c:2603 src/strip.c:2623
 #, c-format
 msgid "while writing '%s'"
 msgstr "podczas zapisywania „%s”"
 
-#: src/strip.c:2656 src/strip.c:2663
+#: src/strip.c:2660 src/strip.c:2667
 #, c-format
 msgid "error while finishing '%s': %s"
 msgstr "błąd podczas kończenia „%s”: %s"
 
-#: src/strip.c:2680 src/strip.c:2756
+#: src/strip.c:2684 src/strip.c:2760
 #, c-format
 msgid "cannot set access and modification date of '%s'"
 msgstr "nie można ustawić czasu dostępu i modyfikacji „%s”"
@@ -6681,7 +7039,7 @@
 #: src/unstrip.c:82
 msgid "Force combining files even if some ELF headers don't seem to match"
 msgstr ""
-"Wymusza łączenie plików nawet, jeśli niektóre nagłówki ELF się nie zgadzają"
+"Wymusza łączenie plików, nawet jeśli niektóre nagłówki ELF się nie zgadzają"
 
 #: src/unstrip.c:126
 #, c-format
@@ -6724,36 +7082,36 @@
 msgstr "nie można utworzyć nagłówka ELF: %s"
 
 #: src/unstrip.c:240
-#, fuzzy, c-format
+#, c-format
 msgid "cannot get shdrstrndx:%s"
-msgstr "nie można uzyskać sekcji: %s"
+msgstr "nie można uzyskać shdrstrndx: %s"
 
-#: src/unstrip.c:244 src/unstrip.c:2085
+#: src/unstrip.c:244 src/unstrip.c:2088
 #, c-format
 msgid "cannot get ELF header: %s"
 msgstr "nie można uzyskać nagłówka ELF: %s"
 
 #: src/unstrip.c:254
-#, fuzzy, c-format
+#, c-format
 msgid "cannot get new zero section: %s"
-msgstr "nie można uzyskać sekcji: %s"
+msgstr "nie można uzyskać nowej sekcji zerowej: %s"
 
 #: src/unstrip.c:257
-#, fuzzy, c-format
+#, c-format
 msgid "cannot update new zero section: %s"
-msgstr "nie można zaktualizować relokacji: %s"
+msgstr "nie można zaktualizować nowej sekcji zerowej: %s"
 
 #: src/unstrip.c:261
 #, c-format
 msgid "cannot copy ELF header: %s"
 msgstr "nie można skopiować nagłówka ELF: %s"
 
-#: src/unstrip.c:265 src/unstrip.c:2103 src/unstrip.c:2146
+#: src/unstrip.c:265 src/unstrip.c:2106 src/unstrip.c:2149
 #, c-format
 msgid "cannot get number of program headers: %s"
 msgstr "nie można uzyskać liczby nagłówków programu: %s"
 
-#: src/unstrip.c:270 src/unstrip.c:2107
+#: src/unstrip.c:270 src/unstrip.c:2110
 #, c-format
 msgid "cannot create program headers: %s"
 msgstr "nie można utworzyć nagłówków programu: %s"
@@ -6768,12 +7126,12 @@
 msgid "cannot copy section header: %s"
 msgstr "nie można skopiować nagłówka sekcji: %s"
 
-#: src/unstrip.c:289 src/unstrip.c:1707
+#: src/unstrip.c:289 src/unstrip.c:1710
 #, c-format
 msgid "cannot get section data: %s"
 msgstr "nie można uzyskać danych sekcji: %s"
 
-#: src/unstrip.c:291 src/unstrip.c:1709
+#: src/unstrip.c:291 src/unstrip.c:1712
 #, c-format
 msgid "cannot copy section data: %s"
 msgstr "nie można skopiować danych sekcji: %s"
@@ -6783,14 +7141,14 @@
 msgid "cannot create directory '%s'"
 msgstr "nie można utworzyć katalogu „%s”"
 
-#: src/unstrip.c:393 src/unstrip.c:655 src/unstrip.c:689 src/unstrip.c:857
-#: src/unstrip.c:1749
+#: src/unstrip.c:393 src/unstrip.c:659 src/unstrip.c:693 src/unstrip.c:861
+#: src/unstrip.c:1752
 #, c-format
 msgid "cannot get symbol table entry: %s"
 msgstr "nie można uzyskać wpisu tabeli symboli: %s"
 
-#: src/unstrip.c:409 src/unstrip.c:658 src/unstrip.c:679 src/unstrip.c:692
-#: src/unstrip.c:1770 src/unstrip.c:1965 src/unstrip.c:1989
+#: src/unstrip.c:409 src/unstrip.c:662 src/unstrip.c:683 src/unstrip.c:696
+#: src/unstrip.c:1773 src/unstrip.c:1968 src/unstrip.c:1992
 #, c-format
 msgid "cannot update symbol table: %s"
 msgstr "nie można zaktualizować tabeli symboli: %s"
@@ -6800,166 +7158,176 @@
 msgid "cannot update section header: %s"
 msgstr "nie można zaktualizować nagłówka sekcji: %s"
 
-#: src/unstrip.c:465 src/unstrip.c:479
+#: src/unstrip.c:465
+#, c-format
+msgid "gelf_getrel failed: %s"
+msgstr ""
+
+#: src/unstrip.c:468 src/unstrip.c:483
 #, c-format
 msgid "cannot update relocation: %s"
 msgstr "nie można zaktualizować relokacji: %s"
 
-#: src/unstrip.c:578
+#: src/unstrip.c:480
+#, c-format
+msgid "gelf_getrela failed: %s"
+msgstr ""
+
+#: src/unstrip.c:582
 #, c-format
 msgid "cannot get symbol version: %s"
 msgstr "nie można uzyskać wersji symbolu: %s"
 
-#: src/unstrip.c:591
+#: src/unstrip.c:595
 #, c-format
 msgid "unexpected section type in [%zu] with sh_link to symtab"
 msgstr "nieoczekiwany typ sekcji w [%zu] z sh_link do tabeli symboli"
 
-#: src/unstrip.c:846
-#, fuzzy, c-format
+#: src/unstrip.c:850
+#, c-format
 msgid "cannot get symbol section data: %s"
-msgstr "nie można uzyskać danych sekcji: %s"
+msgstr "nie można uzyskać danych sekcji symboli: %s"
 
-#: src/unstrip.c:848
-#, fuzzy, c-format
+#: src/unstrip.c:852
+#, c-format
 msgid "cannot get string section data: %s"
-msgstr "nie można uzyskać danych sekcji: %s"
+msgstr "nie można uzyskać danych sekcji ciągów: %s"
 
-#: src/unstrip.c:865
+#: src/unstrip.c:869
 #, c-format
 msgid "invalid string offset in symbol [%zu]"
 msgstr "nieprawidłowy offset ciągu w symbolu [%zu]"
 
-#: src/unstrip.c:1023 src/unstrip.c:1427
+#: src/unstrip.c:1027 src/unstrip.c:1435
 #, c-format
 msgid "cannot read section [%zu] name: %s"
 msgstr "nie można odczytać nazwy sekcji [%zu]: %s"
 
-#: src/unstrip.c:1038
-#, fuzzy, c-format
+#: src/unstrip.c:1042
+#, c-format
 msgid "bad sh_link for group section: %s"
-msgstr "nieprawidłowa wartość sh_link w sekcji %zu"
+msgstr "błędne sh_link dla sekcji grupy: %s"
 
-#: src/unstrip.c:1044
-#, fuzzy, c-format
+#: src/unstrip.c:1048
+#, c-format
 msgid "couldn't get shdr for group section: %s"
-msgstr "nie można uzyskać danych dla sekcji %d: %s"
+msgstr "nie można uzyskać shdr dla sekcji grupy: %s"
 
-#: src/unstrip.c:1049
-#, fuzzy, c-format
+#: src/unstrip.c:1053
+#, c-format
 msgid "bad data for group symbol section: %s"
-msgstr "nie można uzyskać danych dla sekcji symboli\n"
+msgstr "błędne dane dla sekcji symboli grupy: %s"
 
-#: src/unstrip.c:1055
-#, fuzzy, c-format
+#: src/unstrip.c:1059
+#, c-format
 msgid "couldn't get symbol for group section: %s"
-msgstr "nie można uzyskać wersji symbolu: %s"
+msgstr "nie można uzyskać symbolu dla sekcji grupy: %s"
 
-#: src/unstrip.c:1060
-#, fuzzy, c-format
+#: src/unstrip.c:1064
+#, c-format
 msgid "bad symbol name for group section: %s"
-msgstr "błędny nagłówek kompresji dla sekcji %zd: %s"
+msgstr "błędna nazwa symbolu dla sekcji grupy: %s"
 
-#: src/unstrip.c:1102 src/unstrip.c:1121 src/unstrip.c:1159
-#, c-format
-msgid "cannot read '.gnu.prelink_undo' section: %s"
-msgstr "nie można odczytać sekcji „.gnu.prelink_undo”: %s"
-
-#: src/unstrip.c:1139
-#, c-format
-msgid "overflow with shnum = %zu in '%s' section"
-msgstr "przepełnienie z shnum = %zu w sekcji „%s”"
-
-#: src/unstrip.c:1150
-#, c-format
-msgid "invalid contents in '%s' section"
-msgstr "nieprawidłowa zawartość w sekcji „%s”"
-
-#: src/unstrip.c:1206 src/unstrip.c:1553
+#: src/unstrip.c:1075 src/unstrip.c:1556
 #, c-format
 msgid "cannot find matching section for [%zu] '%s'"
 msgstr "nie można odnaleźć pasującej sekcji dla [%zu] „%s”"
 
-#: src/unstrip.c:1331 src/unstrip.c:1347 src/unstrip.c:1633 src/unstrip.c:1924
+#: src/unstrip.c:1120 src/unstrip.c:1139 src/unstrip.c:1177
+#, c-format
+msgid "cannot read '.gnu.prelink_undo' section: %s"
+msgstr "nie można odczytać sekcji „.gnu.prelink_undo”: %s"
+
+#: src/unstrip.c:1157
+#, c-format
+msgid "overflow with shnum = %zu in '%s' section"
+msgstr "przepełnienie z shnum = %zu w sekcji „%s”"
+
+#: src/unstrip.c:1168
+#, c-format
+msgid "invalid contents in '%s' section"
+msgstr "nieprawidłowa zawartość w sekcji „%s”"
+
+#: src/unstrip.c:1339 src/unstrip.c:1355 src/unstrip.c:1636 src/unstrip.c:1927
 #, c-format
 msgid "cannot add section name to string table: %s"
 msgstr "nie można nazwy sekcji do tabeli ciągów: %s"
 
-#: src/unstrip.c:1356
+#: src/unstrip.c:1364
 #, c-format
 msgid "cannot update section header string table data: %s"
 msgstr "nie można zaktualizować danych tabeli ciągów nagłówków sekcji: %s"
 
-#: src/unstrip.c:1385 src/unstrip.c:1389
+#: src/unstrip.c:1393 src/unstrip.c:1397
 #, c-format
 msgid "cannot get section header string table section index: %s"
 msgstr "nie można uzyskać indeksu sekcji tabeli ciągów nagłówków sekcji: %s"
 
-#: src/unstrip.c:1393 src/unstrip.c:1397 src/unstrip.c:1648
+#: src/unstrip.c:1401 src/unstrip.c:1405 src/unstrip.c:1651
 #, c-format
 msgid "cannot get section count: %s"
 msgstr "nie można uzyskać licznika sekcji: %s"
 
-#: src/unstrip.c:1400
+#: src/unstrip.c:1408
 #, c-format
 msgid "more sections in stripped file than debug file -- arguments reversed?"
 msgstr ""
 "więcej sekcji w okrojonym pliku niż w pliku debugowania — odwrócono "
 "parametry?"
 
-#: src/unstrip.c:1404
+#: src/unstrip.c:1412
 #, c-format
 msgid "no sections in stripped file"
-msgstr ""
+msgstr "brak sekcji w okrojonym pliku"
 
-#: src/unstrip.c:1475 src/unstrip.c:1568
+#: src/unstrip.c:1460 src/unstrip.c:1571
 #, c-format
 msgid "cannot read section header string table: %s"
 msgstr "nie można odczytać tabeli ciągów nagłówków sekcji: %s"
 
-#: src/unstrip.c:1627
+#: src/unstrip.c:1630
 #, c-format
 msgid "cannot add new section: %s"
 msgstr "nie można dodać nowej sekcji: %s"
 
-#: src/unstrip.c:1757
+#: src/unstrip.c:1760
 #, c-format
 msgid "symbol [%zu] has invalid section index"
 msgstr "symbol [%zu] ma nieprawidłowy indeks sekcji"
 
-#: src/unstrip.c:1789
-#, fuzzy, c-format
+#: src/unstrip.c:1792
+#, c-format
 msgid "group has invalid section index [%zd]"
-msgstr "symbol [%zu] ma nieprawidłowy indeks sekcji"
+msgstr "grupa ma nieprawidłowy indeks sekcji [%zd]"
 
-#: src/unstrip.c:2064
+#: src/unstrip.c:2067
 #, c-format
 msgid "cannot read section data: %s"
 msgstr "nie można odczytać danych sekcji: %s"
 
-#: src/unstrip.c:2093
+#: src/unstrip.c:2096
 #, c-format
 msgid "cannot update ELF header: %s"
 msgstr "nie można zaktualizować nagłówka ELF: %s"
 
-#: src/unstrip.c:2117
+#: src/unstrip.c:2120
 #, c-format
 msgid "cannot update program header: %s"
 msgstr "nie można zaktualizować nagłówka programu: %s"
 
-#: src/unstrip.c:2122 src/unstrip.c:2205
+#: src/unstrip.c:2125 src/unstrip.c:2208
 #, c-format
 msgid "cannot write output file: %s"
 msgstr "nie można zapisać pliku wyjściowego: %s"
 
-#: src/unstrip.c:2173
+#: src/unstrip.c:2176
 #, c-format
 msgid "DWARF data not adjusted for prelinking bias; consider prelink -u"
 msgstr ""
 "Dane DWARF nie zostały dostosowane do przesunięcia wczesnego konsolidowania; "
 "proszę rozważyć polecenie prelink -u"
 
-#: src/unstrip.c:2176
+#: src/unstrip.c:2179
 #, c-format
 msgid ""
 "DWARF data in '%s' not adjusted for prelinking bias; consider prelink -u"
@@ -6967,77 +7335,77 @@
 "Dane DWARF w „%s” nie zostały dostosowane do przesunięcia wczesnego "
 "konsolidowania; proszę rozważyć polecenie prelink -u"
 
-#: src/unstrip.c:2196 src/unstrip.c:2247 src/unstrip.c:2259 src/unstrip.c:2345
+#: src/unstrip.c:2199 src/unstrip.c:2251 src/unstrip.c:2263 src/unstrip.c:2353
 #, c-format
 msgid "cannot create ELF descriptor: %s"
 msgstr "nie można utworzyć deskryptora ELF: %s"
 
-#: src/unstrip.c:2238
+#: src/unstrip.c:2237
 msgid "WARNING: "
 msgstr "OSTRZEŻENIE: "
 
-#: src/unstrip.c:2240
+#: src/unstrip.c:2239
 msgid ", use --force"
 msgstr ", należy użyć opcji --force"
 
-#: src/unstrip.c:2263
+#: src/unstrip.c:2267
 msgid "ELF header identification (e_ident) different"
 msgstr "Różna identyfikacja nagłówka ELF (e_ident)"
 
-#: src/unstrip.c:2266
+#: src/unstrip.c:2271
 msgid "ELF header type (e_type) different"
 msgstr "Różne typy nagłówka ELF (e_type)"
 
-#: src/unstrip.c:2269
+#: src/unstrip.c:2275
 msgid "ELF header machine type (e_machine) different"
 msgstr "Różne typy maszyny nagłówka ELF (e_machine)"
 
-#: src/unstrip.c:2272
+#: src/unstrip.c:2279
 msgid "stripped program header (e_phnum) smaller than unstripped"
 msgstr "okrojony nagłówek programu (e_phnum) jest mniejszy niż nieokrojony"
 
-#: src/unstrip.c:2302
+#: src/unstrip.c:2310
 #, c-format
 msgid "cannot find stripped file for module '%s': %s"
 msgstr "nie można odnaleźć okrojonego pliku dla modułu „%s”: %s"
 
-#: src/unstrip.c:2306
+#: src/unstrip.c:2314
 #, c-format
 msgid "cannot open stripped file '%s' for module '%s': %s"
 msgstr "nie można otworzyć okrojonego pliku „%s” dla modułu „%s”: %s"
 
-#: src/unstrip.c:2321
+#: src/unstrip.c:2329
 #, c-format
 msgid "cannot find debug file for module '%s': %s"
 msgstr "nie można odnaleźć pliku debugowania dla modułu „%s”: %s"
 
-#: src/unstrip.c:2325
+#: src/unstrip.c:2333
 #, c-format
 msgid "cannot open debug file '%s' for module '%s': %s"
 msgstr "nie można otworzyć pliku debugowania „%s” dla modułu „%s”: %s"
 
-#: src/unstrip.c:2338
+#: src/unstrip.c:2346
 #, c-format
 msgid "module '%s' file '%s' is not stripped"
 msgstr "moduł „%s” pliku „%s” nie został okrojony"
 
-#: src/unstrip.c:2369
+#: src/unstrip.c:2377
 #, c-format
 msgid "cannot cache section addresses for module '%s': %s"
 msgstr ""
 "nie można utworzyć pamięci podręcznej adresów sekcji dla modułu „%s”: %s"
 
-#: src/unstrip.c:2501
+#: src/unstrip.c:2505
 #, c-format
 msgid "no matching modules found"
 msgstr "nie odnaleziono pasujących modułów"
 
-#: src/unstrip.c:2510
+#: src/unstrip.c:2515
 #, c-format
 msgid "matched more than one module"
 msgstr "pasuje więcej niż jeden moduł"
 
-#: src/unstrip.c:2554
+#: src/unstrip.c:2560
 msgid ""
 "STRIPPED-FILE DEBUG-FILE\n"
 "[MODULE...]"
@@ -7045,8 +7413,7 @@
 "OKROJONY-PLIK PLIK-DEBUGOWANIA\n"
 "[MODUŁ…]"
 
-#: src/unstrip.c:2555
-#, fuzzy
+#: src/unstrip.c:2561
 msgid ""
 "Combine stripped files with separate symbols and debug information.\n"
 "\n"
@@ -7078,15 +7445,15 @@
 "Pierwsza forma umieszcza wynik w PLIKU-DEBUGOWANIA, jeśli nie podano opcji -"
 "o.\n"
 "\n"
-"Parametr MODUŁ podaje wzorce nazw plików dopasowujące moduły do procesów.\n"
+"Parametry MODUŁ podają wzorce nazw plików dopasowujące moduły do procesów.\n"
 "Za pomocą opcji -f dopasowuje nazwę głównego (okrojonego) pliku (ukośniki "
 "nigdy nie są specjalne), w innym przypadku dopasowują proste nazwy modułów. "
 "Jeśli nie podano parametrów, przetwarza wszystkie odnalezione moduły.\n"
 "\n"
 "Wiele modułów zostaje zapisanych do plików w KATALOGU-WYJŚCIOWYM, tworząc "
-"podkatalogi, jeśli są wymagane. Używając opcji -m te pliki mające proste "
-"nazwy modułów, w innym przypadku mają nazwy głównego pliku uzupełnione "
-"katalogiem w KATALOGU-WYJŚCIOWYM.\n"
+"podkatalogi, jeśli są wymagane. Używając opcji -m te pliki mają proste nazwy "
+"modułów, w innym przypadku mają nazwy głównego pliku uzupełnione katalogiem "
+"w KATALOGU-WYJŚCIOWYM.\n"
 "\n"
 "Używając opcji -n żadne pliki nie zostają zapisane, a jeden wiersz do "
 "standardowego wyjścia dla każdego modułu:\n"
@@ -7101,7 +7468,29 @@
 "jest nazwą oddzielnego pliku debuginfo lub „-”, jeśli nie odnaleziono "
 "debuginfo lub „.”, jeśli PLIK zawiera informacje debugowania."
 
-#: tests/backtrace.c:436
+#. Short description of program.
+#: debuginfod/debuginfod-find.c:42
+msgid "Request debuginfo-related content from debuginfods listed in $"
+msgstr "Żąda zawartość powiązaną z debuginfo z debuginfod wymienionych w $"
+
+#. Strings for arguments in help texts.
+#: debuginfod/debuginfod-find.c:46
+msgid ""
+"debuginfo BUILDID\n"
+"debuginfo PATH\n"
+"executable BUILDID\n"
+"executable PATH\n"
+"source BUILDID /FILENAME\n"
+"source PATH /FILENAME\n"
+msgstr ""
+"debuginfo IDENTYFIKATOR-KOPII\n"
+"debuginfo ŚCIEŻKA\n"
+"executable IDENTYFIKATOR-KOPII\n"
+"executable ŚCIEŻKA\n"
+"source IDENTYFIKATOR-KOPII /NAZWA-PLIKU\n"
+"source ŚCIEŻKA /NAZWA-PLIKU\n"
+
+#: tests/backtrace.c:483
 msgid "Run executable"
 msgstr "Uruchamia plik wykonywalny"
 
@@ -7113,79 +7502,6 @@
 msgid "Show instances of inlined functions"
 msgstr "Wyświetla wystąpienia wstawionych funkcji"
 
-#, fuzzy
-#~ msgid ""
-#~ " [%6tx] base address\n"
-#~ "          "
-#~ msgstr " [%6tx]  adres podstawowy %s\n"
-
-#, fuzzy
-#~ msgid "%s: error getting zero section: %s"
-#~ msgstr "%s: błąd podczas odczytywania pliku: %s"
-
-#, fuzzy
-#~ msgid "%s: error while updating zero section: %s"
-#~ msgstr "%s: błąd podczas odczytywania pliku: %s"
-
-#~ msgid "%s+%#<PRIx64> <%s+%#<PRIx64>>"
-#~ msgstr "%s+%#<PRIx64> <%s+%#<PRIx64>>"
-
-#~ msgid "%s+%#0*<PRIx64> <%s+%#<PRIx64>>"
-#~ msgstr "%s+%#0*<PRIx64> <%s+%#<PRIx64>>"
-
-#~ msgid "%#<PRIx64> <%s+%#<PRIx64>>"
-#~ msgstr "%#<PRIx64> <%s+%#<PRIx64>>"
-
-#~ msgid "%#0*<PRIx64> <%s+%#<PRIx64>>"
-#~ msgstr "%#0*<PRIx64> <%s+%#<PRIx64>>"
-
-#~ msgid "%s+%#<PRIx64> <%s>"
-#~ msgstr "%s+%#<PRIx64> <%s>"
-
-#~ msgid "%s+%#0*<PRIx64> <%s>"
-#~ msgstr "%s+%#0*<PRIx64> <%s>"
-
-#~ msgid "%#<PRIx64> <%s>"
-#~ msgstr "%#<PRIx64> <%s>"
-
-#~ msgid "%#0*<PRIx64> <%s>"
-#~ msgstr "%#0*<PRIx64> <%s>"
-
-#~ msgid "%s+%#<PRIx64>"
-#~ msgstr "%s+%#<PRIx64>"
-
-#~ msgid "%s+%#0*<PRIx64>"
-#~ msgstr "%s+%#0*<PRIx64>"
-
-#~ msgid "   %s..%s (%<PRIx64>)\n"
-#~ msgstr "   %s..%s (%<PRIx64>)\n"
-
-#~ msgid "   %s..%s\n"
-#~ msgstr "   %s..%s\n"
-
-#~ msgid " advance address by %u to %s, op_index to %u\n"
-#~ msgstr " zwiększenie adresu o %u do %s, op_index do %u\n"
-
-#~ msgid " advance address by constant %u to %s, op_index to %u\n"
-#~ msgstr " zwiększenie adresu o stałą %u do %s, op_index do %u\n"
-
-#~ msgid " [%6tx]  %s..%s\n"
-#~ msgstr " [%6tx]  %s…%s\n"
-
-#~ msgid "           %s..%s\n"
-#~ msgstr "           %s…%s\n"
-
-#~ msgid "cannot get DIE at offset %<PRIu64> in section '%s': %s"
-#~ msgstr "nie można uzyskać DIE pod offsetem %<PRIu64> w sekcji „%s”: %s"
-
-#~ msgid " [%6tx]  %s..%s"
-#~ msgstr " [%6tx]  %s…%s"
-
-#~ msgid "           %s..%s"
-#~ msgstr "           %s…%s"
-
-#~ msgid "vendor opcode not verified?"
-#~ msgstr "instrukcja producenta nie została sprawdzona?"
-
-#~ msgid "-R option supports only .comment section"
-#~ msgstr "Opcja -R obsługuje tylko sekcję .comment"
+#, c-format
+#~ msgid "cannot allocate memory"
+#~ msgstr "nie można przydzielić pamięci"
diff --git a/po/uk.po b/po/uk.po
index 53d2898..cac761e 100644
--- a/po/uk.po
+++ b/po/uk.po
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: https://sourceware.org/bugzilla/\n"
-"POT-Creation-Date: 2021-02-05 21:10+0100\n"
+"POT-Creation-Date: 2021-11-10 16:21+0100\n"
 "PO-Revision-Date: 2020-03-28 14:59+0200\n"
 "Last-Translator: Yuri Chornoivan <yurchor@ukr.net>\n"
 "Language-Team: Ukrainian <kde-i18n-uk@kde.org>\n"
@@ -41,11 +41,6 @@
 "  - «never», «no», «none»\n"
 "  - «auto», «tty», «if-tty»\n"
 
-#: lib/color.c:194 src/objdump.c:728
-#, c-format
-msgid "cannot allocate memory"
-msgstr "не вдалося розподілити пам’ять"
-
 #: lib/printversion.c:40
 #, c-format
 msgid ""
@@ -58,8 +53,8 @@
 "початкових кодах. Умовами ліцензування програми НЕ передбачено жодних "
 "гарантій, зокрема гарантій працездатності або придатності для певної мети.\n"
 
-#: lib/xmalloc.c:48 lib/xmalloc.c:61 lib/xmalloc.c:73 src/readelf.c:3453
-#: src/readelf.c:11501 src/unstrip.c:312 src/unstrip.c:2398 src/unstrip.c:2603
+#: lib/xmalloc.c:48 lib/xmalloc.c:61 lib/xmalloc.c:73 src/readelf.c:11582
+#: src/unstrip.c:312
 #, c-format
 msgid "memory exhausted"
 msgstr "пам’ять вичерпано"
@@ -111,6 +106,24 @@
 msgid "unknown error"
 msgstr "невідома помилка"
 
+#: libcpu/i386_lex.l:122
+#, fuzzy, c-format
+#| msgid "invalid page size value '%s': ignored"
+msgid "invalid character '%c' at line %d; ignored"
+msgstr "некоректне значення розміру сторінки «%s»: проігноровано"
+
+#: libcpu/i386_lex.l:123
+#, fuzzy, c-format
+#| msgid "invalid page size value '%s': ignored"
+msgid "invalid character '\\%o' at line %d; ignored"
+msgstr "некоректне значення розміру сторінки «%s»: проігноровано"
+
+#: libcpu/i386_parse.y:554
+#, fuzzy, c-format
+#| msgid "while reading linker script '%s': %s at line %d"
+msgid "while reading i386 CPU description: %s at line %d"
+msgstr "під час читання скрипту компонування «%s»: %s у рядку %d"
+
 #: libdw/dwarf_error.c:59
 msgid "invalid access"
 msgstr "некоректний доступ"
@@ -291,7 +304,7 @@
 msgid ".debug_addr section missing"
 msgstr "пропущено розділ .debug_addr"
 
-#: libdwfl/argp-std.c:47 src/stack.c:643 src/unstrip.c:2544
+#: libdwfl/argp-std.c:47 src/stack.c:643 src/unstrip.c:2550
 msgid "Input selection options:"
 msgstr "Вибір параметрів виведення даних:"
 
@@ -519,8 +532,8 @@
 msgid "No backend"
 msgstr "Немає сервера"
 
-#: libebl/eblcorenotetypename.c:100 libebl/eblobjnotetypename.c:77
-#: libebl/eblobjnotetypename.c:109 libebl/eblobjnotetypename.c:130
+#: libebl/eblcorenotetypename.c:100 libebl/eblobjnotetypename.c:79
+#: libebl/eblobjnotetypename.c:110 libebl/eblobjnotetypename.c:131
 #: libebl/eblosabiname.c:73 libebl/eblsectionname.c:83
 #: libebl/eblsectiontypename.c:115 libebl/eblsegmenttypename.c:81
 msgid "<unknown>"
@@ -616,7 +629,7 @@
 msgid "invalid size of destination operand"
 msgstr "некоректна розмірність вихідного параметра"
 
-#: libelf/elf_error.c:87 src/readelf.c:6209
+#: libelf/elf_error.c:87 src/readelf.c:6215
 #, c-format
 msgid "invalid encoding"
 msgstr "некоректне кодування"
@@ -701,8 +714,8 @@
 msgid "invalid section header"
 msgstr "некоректний заголовок розділу"
 
-#: libelf/elf_error.c:191 src/readelf.c:10012 src/readelf.c:10612
-#: src/readelf.c:10713 src/readelf.c:10895
+#: libelf/elf_error.c:191 src/readelf.c:10093 src/readelf.c:10693
+#: src/readelf.c:10794 src/readelf.c:10976
 #, c-format
 msgid "invalid data"
 msgstr "некоректні дані"
@@ -830,7 +843,7 @@
 msgid "Print all information on one line, and indent inlines"
 msgstr "Вивести усі дані у один рядок і додати відступи до перенесених рядків"
 
-#: src/addr2line.c:78 src/elfcmp.c:70 src/findtextrel.c:65 src/nm.c:100
+#: src/addr2line.c:78 src/elfcmp.c:70 src/findtextrel.c:66 src/nm.c:100
 #: src/strings.c:78
 msgid "Miscellaneous:"
 msgstr "Інше:"
@@ -1169,6 +1182,235 @@
 msgid "cannot read ELF header of %s(%s): %s"
 msgstr "не вдалося прочитати заголовок ELF з %s(%s): %s"
 
+#: src/elfclassify.c:91
+msgid "opening"
+msgstr ""
+
+#: src/elfclassify.c:98
+msgid "reading"
+msgstr ""
+
+#: src/elfclassify.c:244
+#, fuzzy
+#| msgid "cannot get ELF header"
+msgid "ELF header"
+msgstr "не вдалося отримати заголовок ELF"
+
+#: src/elfclassify.c:255
+#, fuzzy
+#| msgid "Program Headers:"
+msgid "program headers"
+msgstr "Заголовки програми:"
+
+#: src/elfclassify.c:264
+#, fuzzy
+#| msgid "Program Headers:"
+msgid "program header"
+msgstr "Заголовки програми:"
+
+#: src/elfclassify.c:284
+#, fuzzy
+#| msgid "Section Headers:"
+msgid "section headers"
+msgstr "Заголовки розділів:"
+
+#: src/elfclassify.c:295
+#, fuzzy
+#| msgid "cannot get section header string table index"
+msgid "section header string table index"
+msgstr "не вдалося визначити індекс заголовка розділу у таблиці рядків"
+
+#: src/elfclassify.c:309
+#, fuzzy
+#| msgid "cannot get section header"
+msgid "could not obtain section header"
+msgstr "не вдалося отримати заголовок розділу"
+
+#: src/elfclassify.c:315
+#, fuzzy
+#| msgid "cannot get section name"
+msgid "could not obtain section name"
+msgstr "не вдалося отримати назву розділу"
+
+#: src/elfclassify.c:828
+msgid "writing to standard output"
+msgstr ""
+
+#: src/elfclassify.c:855
+msgid "reading from standard input"
+msgstr ""
+
+#: src/elfclassify.c:876
+#, fuzzy
+#| msgid "Input selection options:"
+msgid "Classification options"
+msgstr "Вибір параметрів виведення даних:"
+
+#: src/elfclassify.c:878
+msgid "File looks like an ELF object or archive/static library (default)"
+msgstr ""
+
+#: src/elfclassify.c:881
+msgid "File is an regular ELF object (not an archive/static library)"
+msgstr ""
+
+#: src/elfclassify.c:884
+msgid "File is an ELF archive or static library"
+msgstr ""
+
+#: src/elfclassify.c:887
+msgid "File is an ELF core dump file"
+msgstr ""
+
+#: src/elfclassify.c:890
+msgid ""
+"File is an ELF file with symbol table or .debug_* sections and can be "
+"stripped further"
+msgstr ""
+
+#: src/elfclassify.c:893
+msgid "File is (primarily) an ELF program executable (not primarily a DSO)"
+msgstr ""
+
+#: src/elfclassify.c:896
+msgid "File is an ELF program executable (might also be a DSO)"
+msgstr ""
+
+#: src/elfclassify.c:899
+msgid ""
+"File is (primarily) an ELF shared object (DSO) (not primarily an executable)"
+msgstr ""
+
+#: src/elfclassify.c:902
+msgid "File is an ELF shared object (DSO) (might also be an executable)"
+msgstr ""
+
+#: src/elfclassify.c:906
+#, fuzzy
+#| msgid "cannot find kernel modules"
+msgid "File is a linux kernel module"
+msgstr "не вдалося виявити модулі ядра"
+
+#: src/elfclassify.c:908
+msgid "File is a debug only ELF file (separate .debug, .dwo or dwz multi-file)"
+msgstr ""
+
+#: src/elfclassify.c:911
+msgid "File is a loadable ELF object (program or shared object)"
+msgstr ""
+
+#: src/elfclassify.c:940
+msgid "Input flags"
+msgstr ""
+
+#: src/elfclassify.c:942
+msgid "Only classify regular (not symlink nor special device) files"
+msgstr ""
+
+#: src/elfclassify.c:944
+msgid ""
+"Also read file names to process from standard input, separated by newlines"
+msgstr ""
+
+#: src/elfclassify.c:947
+msgid ""
+"Also read file names to process from standard input, separated by ASCII NUL "
+"bytes"
+msgstr ""
+
+#: src/elfclassify.c:950
+msgid "Do not read files from standard input (default)"
+msgstr ""
+
+#: src/elfclassify.c:952
+msgid "Try to open compressed files or embedded (kernel) ELF images"
+msgstr ""
+
+#: src/elfclassify.c:955
+#, fuzzy
+#| msgid "Output format:"
+msgid "Output flags"
+msgstr "Формат виводу:"
+
+#: src/elfclassify.c:957
+msgid "Output names of files, separated by newline"
+msgstr ""
+
+#: src/elfclassify.c:959
+msgid "Output names of files, separated by ASCII NUL"
+msgstr ""
+
+#: src/elfclassify.c:961
+#, fuzzy
+#| msgid "More than one output file name given."
+msgid "Do not output file names"
+msgstr "Вказано декілька назв файлів виведення даних."
+
+#: src/elfclassify.c:963
+msgid "If printing file names, print matching files (default)"
+msgstr ""
+
+#: src/elfclassify.c:965
+msgid "If printing file names, print files that do not match"
+msgstr ""
+
+#: src/elfclassify.c:967
+msgid "Additional flags"
+msgstr ""
+
+#: src/elfclassify.c:969
+msgid "Output additional information (can be specified multiple times)"
+msgstr ""
+
+#: src/elfclassify.c:971
+msgid "Suppress some error output (counterpart to --verbose)"
+msgstr ""
+
+#. Strings for arguments in help texts.
+#: src/elfclassify.c:979 src/elfcompress.c:1334 src/elflint.c:77
+#: src/readelf.c:158
+msgid "FILE..."
+msgstr "ФАЙЛ..."
+
+#: src/elfclassify.c:980
+msgid ""
+"Determine the type of an ELF file.\n"
+"\n"
+"All of the classification options must apply at the same time to a "
+"particular file.  Classification options can be negated using a \"--not-\" "
+"prefix.\n"
+"\n"
+"Since modern ELF does not clearly distinguish between programs and dynamic "
+"shared objects, you should normally use either --executable or --shared to "
+"identify the primary purpose of a file.  Only one of the --shared and --"
+"executable checks can pass for a file.\n"
+"\n"
+"If you want to know whether an ELF object might a program or a shared "
+"library (but could be both), then use --program or --library. Some ELF files "
+"will classify as both a program and a library.\n"
+"\n"
+"If you just want to know whether an ELF file is loadable (as program or "
+"library) use --loadable.  Note that files that only contain (separate) debug "
+"information (--debug-only) are never --loadable (even though they might "
+"contain program headers).  Linux kernel modules are also not --loadable (in "
+"the normal sense).\n"
+"\n"
+"Without any of the --print options, the program exits with status 0 if the "
+"requested checks pass for all input files, with 1 if a check fails for any "
+"file, and 2 if there is an environmental issue (such as a file read error or "
+"a memory allocation error).\n"
+"\n"
+"When printing file names, the program exits with status 0 even if no file "
+"names are printed, and exits with status 2 if there is an environmental "
+"issue.\n"
+"\n"
+"On usage error (e.g. a bad option was given), the program exits with a "
+"status code larger than 2.\n"
+"\n"
+"The --quiet or -q option suppresses some error warning output, but doesn't "
+"change the exit status."
+msgstr ""
+
 #: src/elfcmp.c:60
 msgid "Control options:"
 msgstr "Параметри керування:"
@@ -1362,14 +1604,14 @@
 msgid "Invalid value '%s' for --gaps parameter."
 msgstr "Некоректне значення «%s» параметра --gaps."
 
-#: src/elfcmp.c:734 src/findtextrel.c:205 src/nm.c:364 src/ranlib.c:141
-#: src/size.c:272 src/strings.c:185 src/strip.c:1030 src/strip.c:1067
-#: src/unstrip.c:2194 src/unstrip.c:2223
+#: src/elfcmp.c:734 src/findtextrel.c:195 src/nm.c:364 src/ranlib.c:141
+#: src/size.c:272 src/strings.c:185 src/strip.c:1035 src/strip.c:1072
+#: src/unstrip.c:2197 src/unstrip.c:2226
 #, c-format
 msgid "cannot open '%s'"
 msgstr "не вдалося відкрити «%s»"
 
-#: src/elfcmp.c:738 src/findtextrel.c:212 src/ranlib.c:158
+#: src/elfcmp.c:738 src/findtextrel.c:214 src/ranlib.c:158
 #, c-format
 msgid "cannot create ELF descriptor for '%s': %s"
 msgstr "не вдалося створити дескриптор ELF для «%s»: %s"
@@ -1379,7 +1621,7 @@
 msgid "cannot create EBL descriptor for '%s'"
 msgstr "не вдалося створити дескриптор EBL для «%s»"
 
-#: src/elfcmp.c:761 src/findtextrel.c:394
+#: src/elfcmp.c:761 src/findtextrel.c:385
 #, c-format
 msgid "cannot get section header of section %zu: %s"
 msgstr "не вдалося отримати заголовок розділу %zu: %s"
@@ -1394,37 +1636,37 @@
 msgid "cannot get relocation: %s"
 msgstr "не вдалося отримати пересування: %s"
 
-#: src/elfcompress.c:115 src/strip.c:308 src/unstrip.c:117
+#: src/elfcompress.c:117 src/strip.c:308 src/unstrip.c:117
 #, c-format
 msgid "-o option specified twice"
 msgstr "параметр -o вказано двічі"
 
-#: src/elfcompress.c:122
+#: src/elfcompress.c:124
 #, c-format
 msgid "-t option specified twice"
 msgstr "параметр -t вказано двічі"
 
-#: src/elfcompress.c:131
+#: src/elfcompress.c:133
 #, c-format
 msgid "unknown compression type '%s'"
 msgstr "невідомий тип стиснення «%s»"
 
 #. We need at least one input file.
-#: src/elfcompress.c:143 src/elfcompress.c:1347
+#: src/elfcompress.c:145 src/elfcompress.c:1345
 #, c-format
 msgid "No input file given"
 msgstr "Не надано файла вхідних даних"
 
-#: src/elfcompress.c:149 src/elfcompress.c:1352
+#: src/elfcompress.c:151 src/elfcompress.c:1350
 #, c-format
 msgid "Only one input file allowed together with '-o'"
 msgstr "З параметром «-o» можна використовувати лише один файл вхідних даних"
 
-#: src/elfcompress.c:1309
+#: src/elfcompress.c:1307
 msgid "Place (de)compressed output into FILE"
 msgstr "Помістити результати розпакування або стискання до ФАЙЛа"
 
-#: src/elfcompress.c:1312
+#: src/elfcompress.c:1310
 msgid ""
 "What type of compression to apply. TYPE can be 'none' (decompress), "
 "'zlib' (ELF ZLIB compression, the default, 'zlib-gabi' is an alias) or 'zlib-"
@@ -1435,7 +1677,7 @@
 "назва — «zlib-gabi») або «zlib-gnu» (стискання у стилі GNU .zdebug, інша "
 "назва — «gnu»)"
 
-#: src/elfcompress.c:1315
+#: src/elfcompress.c:1313
 msgid ""
 "SECTION name to (de)compress, SECTION is an extended wildcard pattern "
 "(defaults to '.?(z)debug*')"
@@ -1443,12 +1685,12 @@
 "назва РОЗДІЛу для розпакування або стискання, РОЗДІЛ є розширеним взірцем із "
 "замінниками (типове значення -- «.?(z)debug*»)"
 
-#: src/elfcompress.c:1318
+#: src/elfcompress.c:1316
 msgid "Print a message for each section being (de)compressed"
 msgstr ""
 "Вивести повідомлення для кожного розділу, який розпаковується чи стискається"
 
-#: src/elfcompress.c:1321
+#: src/elfcompress.c:1319
 msgid ""
 "Force compression of section even if it would become larger or update/"
 "rewrite the file even if no section would be (de)compressed"
@@ -1456,21 +1698,16 @@
 "Примусове стискання розділу, навіть якщо він стане більшим, або оновлення чи "
 "перезапис файла, навіть якщо жодного розділу не буде розпаковано або стиснено"
 
-#: src/elfcompress.c:1324 src/strip.c:93
+#: src/elfcompress.c:1322 src/strip.c:93
 msgid "Relax a few rules to handle slightly broken ELF files"
 msgstr ""
 "Знехтувати декількома правилами для обробки трохи пошкоджених файлів ELF"
 
-#: src/elfcompress.c:1327
+#: src/elfcompress.c:1325
 msgid "Be silent when a section cannot be compressed"
 msgstr "Не сповіщати, якщо розділ неможливо стиснути"
 
-#. Strings for arguments in help texts.
-#: src/elfcompress.c:1336 src/elflint.c:77 src/readelf.c:158
-msgid "FILE..."
-msgstr "ФАЙЛ..."
-
-#: src/elfcompress.c:1337
+#: src/elfcompress.c:1335
 msgid "Compress or decompress sections in an ELF file."
 msgstr "Стиснути або розпакувати розділи у файлі ELF."
 
@@ -1680,7 +1917,7 @@
 
 #: src/elflint.c:610 src/elflint.c:1498 src/elflint.c:1549 src/elflint.c:1655
 #: src/elflint.c:1991 src/elflint.c:2317 src/elflint.c:2943 src/elflint.c:3106
-#: src/elflint.c:3254 src/elflint.c:3444 src/elflint.c:4456
+#: src/elflint.c:3254 src/elflint.c:3456 src/elflint.c:4458
 #, c-format
 msgid "section [%2d] '%s': cannot get section data\n"
 msgstr "розділ [%2d] «%s»: не вдалося отримати дані розділу\n"
@@ -2828,36 +3065,36 @@
 msgid "section [%2d] '%s': unknown parent version '%s'\n"
 msgstr "розділ [%2d] «%s»: невідома основна версія «%s»\n"
 
-#: src/elflint.c:3436
+#: src/elflint.c:3448
 #, c-format
 msgid "section [%2d] '%s': empty object attributes section\n"
 msgstr "розділ [%2d] «%s»: порожній розділ атрибутів об’єкта\n"
 
-#: src/elflint.c:3457
+#: src/elflint.c:3464
 #, c-format
 msgid "section [%2d] '%s': unrecognized attribute format\n"
 msgstr "розділ [%2d] «%s»: не вдалося визначити формат атрибутів\n"
 
-#: src/elflint.c:3473
+#: src/elflint.c:3475
 #, c-format
 msgid ""
 "section [%2d] '%s': offset %zu: zero length field in attribute section\n"
 msgstr ""
 "розділ [%2d] «%s»: зміщення %zu: поле нульового розміру у розділі атрибутів\n"
 
-#: src/elflint.c:3482
+#: src/elflint.c:3484
 #, c-format
 msgid "section [%2d] '%s': offset %zu: invalid length in attribute section\n"
 msgstr ""
 "розділ [%2d] «%s»: зміщення %zu: некоректна довжина у розділі атрибутів\n"
 
-#: src/elflint.c:3494
+#: src/elflint.c:3496
 #, c-format
 msgid "section [%2d] '%s': offset %zu: unterminated vendor name string\n"
 msgstr ""
 "розділ [%2d] «%s»: зміщення %zu: незавершений рядок назви постачальника\n"
 
-#: src/elflint.c:3511
+#: src/elflint.c:3513
 #, c-format
 msgid ""
 "section [%2d] '%s': offset %zu: endless ULEB128 in attribute subsection tag\n"
@@ -2865,12 +3102,12 @@
 "розділ [%2d] «%s»: зміщення %zu: незавершене поле ULEB128 у тезі підрозділу "
 "атрибутів\n"
 
-#: src/elflint.c:3520
+#: src/elflint.c:3522
 #, c-format
 msgid "section [%2d] '%s': offset %zu: truncated attribute section\n"
 msgstr "розділ [%2d] «%s»: зміщення %zu: обрізаний розділ атрибутів\n"
 
-#: src/elflint.c:3529
+#: src/elflint.c:3531
 #, c-format
 msgid ""
 "section [%2d] '%s': offset %zu: zero length field in attribute subsection\n"
@@ -2878,7 +3115,7 @@
 "розділ [%2d] «%s»: зміщення %zu: поле нульового розміру у підрозділі "
 "атрибутів\n"
 
-#: src/elflint.c:3544
+#: src/elflint.c:3546
 #, c-format
 msgid ""
 "section [%2d] '%s': offset %zu: invalid length in attribute subsection\n"
@@ -2886,7 +3123,7 @@
 "розділ [%2d] «%s»: зміщення %zu: некоректна довжина у підрозділі атрибутів\n"
 
 #. Tag_File
-#: src/elflint.c:3555
+#: src/elflint.c:3557
 #, c-format
 msgid ""
 "section [%2d] '%s': offset %zu: attribute subsection has unexpected tag %u\n"
@@ -2894,35 +3131,35 @@
 "розділ [%2d] «%s»: зміщення %zu: підрозділ атрибутів містить неочікуваний "
 "теґ %u\n"
 
-#: src/elflint.c:3573
+#: src/elflint.c:3575
 #, c-format
 msgid "section [%2d] '%s': offset %zu: endless ULEB128 in attribute tag\n"
 msgstr ""
 "розділ [%2d] «%s»: зміщення %zu: незавершене поле ULEB128 у тезі атрибуту\n"
 
-#: src/elflint.c:3584
+#: src/elflint.c:3586
 #, c-format
 msgid "section [%2d] '%s': offset %zu: unterminated string in attribute\n"
 msgstr "розділ [%2d] «%s»: зміщення %zu: незавершений рядок у атрибуті\n"
 
-#: src/elflint.c:3597
+#: src/elflint.c:3599
 #, c-format
 msgid "section [%2d] '%s': offset %zu: unrecognized attribute tag %u\n"
 msgstr "розділ [%2d] «%s»: зміщення %zu: незавершений теґ атрибуту %u\n"
 
-#: src/elflint.c:3601
+#: src/elflint.c:3603
 #, c-format
 msgid ""
 "section [%2d] '%s': offset %zu: unrecognized %s attribute value %<PRIu64>\n"
 msgstr ""
 "розділ [%2d] «%s»: зміщення %zu: невідоме значення %s атрибуту %<PRIu64>\n"
 
-#: src/elflint.c:3611
+#: src/elflint.c:3613
 #, c-format
 msgid "section [%2d] '%s': offset %zu: vendor '%s' unknown\n"
 msgstr "розділ [%2d] «%s»: зміщення %zu: невідомий постачальник «%s»\n"
 
-#: src/elflint.c:3617
+#: src/elflint.c:3619
 #, c-format
 msgid ""
 "section [%2d] '%s': offset %zu: extra bytes after last attribute section\n"
@@ -2930,47 +3167,47 @@
 "розділ [%2d] «%s»: зміщення %zu: зайві байти після останнього розділу "
 "атрибутів\n"
 
-#: src/elflint.c:3714
+#: src/elflint.c:3716
 #, c-format
 msgid "cannot get section header of zeroth section\n"
 msgstr "не вдалося отримати заголовок нульового розділу\n"
 
-#: src/elflint.c:3718
+#: src/elflint.c:3720
 #, c-format
 msgid "zeroth section has nonzero name\n"
 msgstr "нульовий розділ має ненульову назву\n"
 
-#: src/elflint.c:3720
+#: src/elflint.c:3722
 #, c-format
 msgid "zeroth section has nonzero type\n"
 msgstr "нульовий розділ має ненульовий тип\n"
 
-#: src/elflint.c:3722
+#: src/elflint.c:3724
 #, c-format
 msgid "zeroth section has nonzero flags\n"
 msgstr "нульовий розділ має ненульові прапорці\n"
 
-#: src/elflint.c:3724
+#: src/elflint.c:3726
 #, c-format
 msgid "zeroth section has nonzero address\n"
 msgstr "нульовий розділ має ненульову адресу\n"
 
-#: src/elflint.c:3726
+#: src/elflint.c:3728
 #, c-format
 msgid "zeroth section has nonzero offset\n"
 msgstr "нульовий розділ має ненульове зміщення\n"
 
-#: src/elflint.c:3728
+#: src/elflint.c:3730
 #, c-format
 msgid "zeroth section has nonzero align value\n"
 msgstr "нульовий розділ має ненульове значення вирівнювання\n"
 
-#: src/elflint.c:3730
+#: src/elflint.c:3732
 #, c-format
 msgid "zeroth section has nonzero entry size value\n"
 msgstr "нульовий розділ має ненульове значення розміру запису\n"
 
-#: src/elflint.c:3733
+#: src/elflint.c:3735
 #, c-format
 msgid ""
 "zeroth section has nonzero size value while ELF header has nonzero shnum "
@@ -2979,7 +3216,7 @@
 "нульовий розділ має ненульове значення розміру, хоча заголовок ELF ман "
 "ненульове значення shnum\n"
 
-#: src/elflint.c:3737
+#: src/elflint.c:3739
 #, c-format
 msgid ""
 "zeroth section has nonzero link value while ELF header does not signal "
@@ -2988,7 +3225,7 @@
 "нульовий розділ має ненульове значення компонування, хоча у заголовку ELF "
 "немає сигналу переповнення у shstrndx\n"
 
-#: src/elflint.c:3741
+#: src/elflint.c:3743
 #, c-format
 msgid ""
 "zeroth section has nonzero link value while ELF header does not signal "
@@ -2997,28 +3234,28 @@
 "нульовий розділ має ненульове значення компонування, хоча у заголовку ELF "
 "немає сигналу переповнення у phnum\n"
 
-#: src/elflint.c:3759
+#: src/elflint.c:3761
 #, c-format
 msgid "cannot get section header for section [%2zu] '%s': %s\n"
 msgstr "не вдалося отримати заголовок розділу [%2zu] «%s»: %s\n"
 
-#: src/elflint.c:3768
+#: src/elflint.c:3770
 #, c-format
 msgid "section [%2zu]: invalid name\n"
 msgstr "розділ [%2zu]: некоректна назва\n"
 
-#: src/elflint.c:3795
+#: src/elflint.c:3797
 #, c-format
 msgid "section [%2d] '%s' has wrong type: expected %s, is %s\n"
 msgstr ""
 "розділ [%2d] «%s» належить до помилкового типу: мав бути %s, маємо %s\n"
 
-#: src/elflint.c:3812
+#: src/elflint.c:3814
 #, c-format
 msgid "section [%2zu] '%s' has wrong flags: expected %s, is %s\n"
 msgstr "розділ [%2zu] «%s» має помилкові прапорці: мало бути %s, маємо %s\n"
 
-#: src/elflint.c:3830
+#: src/elflint.c:3832
 #, c-format
 msgid ""
 "section [%2zu] '%s' has wrong flags: expected %s and possibly %s, is %s\n"
@@ -3026,12 +3263,12 @@
 "розділ [%2zu] «%s» має помилкові прапорці: мало бути %s, можливо, %s, але "
 "маємо %s\n"
 
-#: src/elflint.c:3847
+#: src/elflint.c:3849
 #, c-format
 msgid "section [%2zu] '%s' present in object file\n"
 msgstr "у об’єктному файлі виявлено розділ [%2zu] «%s»\n"
 
-#: src/elflint.c:3853 src/elflint.c:3885
+#: src/elflint.c:3855 src/elflint.c:3887
 #, c-format
 msgid ""
 "section [%2zu] '%s' has SHF_ALLOC flag set but there is no loadable segment\n"
@@ -3039,7 +3276,7 @@
 "у розділ [%2zu] «%s» встановлено прапорець SHF_ALLOC, але немає придатного "
 "до завантаження сегмента\n"
 
-#: src/elflint.c:3858 src/elflint.c:3890
+#: src/elflint.c:3860 src/elflint.c:3892
 #, c-format
 msgid ""
 "section [%2zu] '%s' has SHF_ALLOC flag not set but there are loadable "
@@ -3048,7 +3285,7 @@
 "у розділі [%2zu] «%s» не встановлено прапорець SHF_ALLOC, але є придатні до "
 "завантаження сегменти\n"
 
-#: src/elflint.c:3866
+#: src/elflint.c:3868
 #, c-format
 msgid ""
 "section [%2zu] '%s' is extension section index table in non-object file\n"
@@ -3056,22 +3293,22 @@
 "розділ [%2zu] «%s» є таблицею-покажчиком розділу розширень у файлі, який не "
 "є об’єктним\n"
 
-#: src/elflint.c:3909
+#: src/elflint.c:3911
 #, c-format
 msgid "section [%2zu] '%s': size not multiple of entry size\n"
 msgstr "розділ [%2zu] «%s»: розмір не є кратним до розміру запису\n"
 
-#: src/elflint.c:3914
+#: src/elflint.c:3916
 #, c-format
 msgid "cannot get section header\n"
 msgstr "не вдалося отримати заголовок розділу\n"
 
-#: src/elflint.c:3924
+#: src/elflint.c:3926
 #, c-format
 msgid "section [%2zu] '%s' has unsupported type %d\n"
 msgstr "розділ [%2zu] «%s» належить до непідтримуваного типу %d\n"
 
-#: src/elflint.c:3944
+#: src/elflint.c:3946
 #, c-format
 msgid ""
 "section [%2zu] '%s' contains invalid processor-specific flag(s) %#<PRIx64>\n"
@@ -3079,74 +3316,74 @@
 "розділ [%2zu] «%s» містить некоректні специфічні для процесора прапорці "
 "%#<PRIx64>\n"
 
-#: src/elflint.c:3954
+#: src/elflint.c:3956
 #, c-format
 msgid "section [%2zu] '%s' contains unknown flag(s) %#<PRIx64>\n"
 msgstr "розділ [%2zu] «%s» містить невідомі прапорці %#<PRIx64>\n"
 
-#: src/elflint.c:3962
+#: src/elflint.c:3964
 #, c-format
 msgid "section [%2zu] '%s': thread-local data sections address not zero\n"
 msgstr ""
 "розділ [%2zu] «%s»: адреса розділів локальних даних потоків не є нульовою\n"
 
-#: src/elflint.c:3972
+#: src/elflint.c:3974
 #, c-format
 msgid "section [%2zu] '%s': allocated section cannot be compressed\n"
 msgstr ""
 "розділ [%2zu] «%s»: розміщений у пам'яті розділ не може бути стиснений\n"
 
-#: src/elflint.c:3977
+#: src/elflint.c:3979
 #, c-format
 msgid "section [%2zu] '%s': nobits section cannot be compressed\n"
 msgstr "розділ [%2zu] «%s»: розділ nobits не може бути стиснений\n"
 
-#: src/elflint.c:3983
+#: src/elflint.c:3985
 #, c-format
 msgid ""
 "section [%2zu] '%s': compressed section with no compression header: %s\n"
 msgstr "розділ [%2zu] «%s»: стиснений розділ без заголовка стиснення: %s\n"
 
-#: src/elflint.c:3989
+#: src/elflint.c:3991
 #, c-format
 msgid "section [%2zu] '%s': invalid section reference in link value\n"
 msgstr ""
 "розділ [%2zu] «%s»: некоректне посилання на розділ у значенні компонування\n"
 
-#: src/elflint.c:3994
+#: src/elflint.c:3996
 #, c-format
 msgid "section [%2zu] '%s': invalid section reference in info value\n"
 msgstr ""
 "розділ [%2zu] «%s»: некоректне посилання на розділ у значенні відомостей\n"
 
-#: src/elflint.c:4001
+#: src/elflint.c:4003
 #, c-format
 msgid "section [%2zu] '%s': strings flag set without merge flag\n"
 msgstr "розділ [%2zu] «%s»: встановлено прапорець strings без прапорця merge\n"
 
-#: src/elflint.c:4006
+#: src/elflint.c:4008
 #, c-format
 msgid "section [%2zu] '%s': merge flag set but entry size is zero\n"
 msgstr ""
 "розділ [%2zu] «%s»: встановлено прапорець merge, але розмір запису є "
 "нульовим\n"
 
-#: src/elflint.c:4025
+#: src/elflint.c:4027
 #, c-format
 msgid "section [%2zu] '%s' has unexpected type %d for an executable section\n"
 msgstr "розділ [%2zu] «%s» має неочікуваний тип %d для виконуваного розділу\n"
 
-#: src/elflint.c:4034
+#: src/elflint.c:4036
 #, c-format
 msgid "section [%2zu] '%s' must be of type NOBITS in debuginfo files\n"
 msgstr "розділ [%2zu] «%s» у файлах debuginfo має належати до типу NOBITS\n"
 
-#: src/elflint.c:4041
+#: src/elflint.c:4043
 #, c-format
 msgid "section [%2zu] '%s' is both executable and writable\n"
 msgstr "розділ [%2zu] «%s» є одночасно виконуваним і придатним до запису\n"
 
-#: src/elflint.c:4072
+#: src/elflint.c:4074
 #, c-format
 msgid ""
 "section [%2zu] '%s' not fully contained in segment of program header entry "
@@ -3155,7 +3392,7 @@
 "розділ [%2zu] «%s» не повністю міститься у сегменті запису заголовка "
 "програми %d\n"
 
-#: src/elflint.c:4082
+#: src/elflint.c:4084
 #, c-format
 msgid ""
 "section [%2zu] '%s' has type NOBITS but is read from the file in segment of "
@@ -3164,7 +3401,7 @@
 "розділ [%2zu] «%s» належить до типу NOBITS, але його читання виконується з "
 "файла у сегментів запису заголовка програми %d\n"
 
-#: src/elflint.c:4108
+#: src/elflint.c:4110
 #, c-format
 msgid ""
 "section [%2zu] '%s' has type NOBITS but is read from the file in segment of "
@@ -3173,7 +3410,7 @@
 "розділ [%2zu] «%s» належить до типу NOBITS, але його читання виконується з "
 "файла у сегментів запису заголовка програми %d, а вміст файла є ненульовим\n"
 
-#: src/elflint.c:4119
+#: src/elflint.c:4121
 #, c-format
 msgid ""
 "section [%2zu] '%s' has not type NOBITS but is not read from the file in "
@@ -3182,19 +3419,19 @@
 "розділ [%2zu] «%s» не належить до типу NOBITS, але його читання не "
 "виконується з файла у сегментів запису заголовка програми %d\n"
 
-#: src/elflint.c:4130
+#: src/elflint.c:4132
 #, c-format
 msgid "section [%2zu] '%s' is executable in nonexecutable segment %d\n"
 msgstr "розділ [%2zu] «%s» є виконуваним у невиконуваному сегменті %d\n"
 
-#: src/elflint.c:4140
+#: src/elflint.c:4142
 #, c-format
 msgid "section [%2zu] '%s' is writable in unwritable segment %d\n"
 msgstr ""
 "розділ [%2zu] «%s» є придатним до запису у непридатному до запису сегменті "
 "%d\n"
 
-#: src/elflint.c:4150
+#: src/elflint.c:4152
 #, c-format
 msgid ""
 "section [%2zu] '%s': alloc flag set but section not in any loaded segment\n"
@@ -3202,7 +3439,7 @@
 "розділ [%2zu] «%s»: встановлено прапорець alloc, але розділ не перебуває у "
 "жодному завантаженому сегменті\n"
 
-#: src/elflint.c:4156
+#: src/elflint.c:4158
 #, c-format
 msgid ""
 "section [%2zu] '%s': ELF header says this is the section header string table "
@@ -3211,7 +3448,7 @@
 "розділ [%2zu] «%s»: заголовок ELF повідомляє про те, що це таблиця рядків "
 "заголовка розділу, але ця таблиця не належить до типу SHT_TYPE\n"
 
-#: src/elflint.c:4164
+#: src/elflint.c:4166
 #, c-format
 msgid ""
 "section [%2zu] '%s': relocatable files cannot have dynamic symbol tables\n"
@@ -3219,17 +3456,17 @@
 "розділ [%2zu] «%s»: придатні до пересування файли не можуть містити "
 "динамічних таблиць символів\n"
 
-#: src/elflint.c:4215
+#: src/elflint.c:4217
 #, c-format
 msgid "more than one version symbol table present\n"
 msgstr "виявлено більше за одну таблицю символів версій\n"
 
-#: src/elflint.c:4238
+#: src/elflint.c:4240
 #, c-format
 msgid "INTERP program header entry but no .interp section\n"
 msgstr "існує запис заголовка програми INTERP, але не розділ .interp\n"
 
-#: src/elflint.c:4249
+#: src/elflint.c:4251
 #, c-format
 msgid ""
 "loadable segment [%u] is executable but contains no executable sections\n"
@@ -3237,14 +3474,14 @@
 "придатний до завантаження сегмент [%u] є виконуваним, але не містить "
 "виконуваних розділів\n"
 
-#: src/elflint.c:4255
+#: src/elflint.c:4257
 #, c-format
 msgid "loadable segment [%u] is writable but contains no writable sections\n"
 msgstr ""
 "придатний до завантаження розділ [%u] є придатним до запису, але не містить "
 "придатних до запису розділів\n"
 
-#: src/elflint.c:4266
+#: src/elflint.c:4268
 #, c-format
 msgid ""
 "no .gnu.versym section present but .gnu.versym_d or .gnu.versym_r section "
@@ -3253,24 +3490,24 @@
 "немає розділу .gnu.versym, хоча існує розділ .gnu.versym_d або .gnu."
 "versym_r\n"
 
-#: src/elflint.c:4279
+#: src/elflint.c:4281
 #, c-format
 msgid "duplicate version index %d\n"
 msgstr "дублікат індексу версії %d\n"
 
-#: src/elflint.c:4293
+#: src/elflint.c:4295
 #, c-format
 msgid ".gnu.versym section present without .gnu.versym_d or .gnu.versym_r\n"
 msgstr ""
 "існує розділ .gnu.versym, але немає розділу .gnu.versym_d або .gnu.versym_r\n"
 
-#: src/elflint.c:4342
+#: src/elflint.c:4344
 #, c-format
 msgid "phdr[%d]: unknown core file note type %<PRIu32> at offset %<PRIu64>\n"
 msgstr ""
 "phdr[%d]: невідомий тип нотатки файла core %<PRIu32> за зміщенням %<PRIu64>\n"
 
-#: src/elflint.c:4346
+#: src/elflint.c:4348
 #, c-format
 msgid ""
 "section [%2d] '%s': unknown core file note type %<PRIu32> at offset %zu\n"
@@ -3278,7 +3515,7 @@
 "розділ [%2d] «%s»: невідомий тип нотатки файла core %<PRIu32> за зміщенням "
 "%zu\n"
 
-#: src/elflint.c:4395
+#: src/elflint.c:4397
 #, c-format
 msgid ""
 "phdr[%d]: unknown object file note type %<PRIu32> with owner name '%s' at "
@@ -3287,7 +3524,7 @@
 "phdr[%d]: невідомий тип нотатки у файлі об'єктів, %<PRIu32>, із іменем "
 "власника «%s» за зміщенням %zu\n"
 
-#: src/elflint.c:4400
+#: src/elflint.c:4402
 #, c-format
 msgid ""
 "section [%2d] '%s': unknown object file note type %<PRIu32> with owner name "
@@ -3296,39 +3533,39 @@
 "розділ [%2d] «%s»: невідомий тип нотатки у файлі об'єктів, %<PRIu32>, із "
 "іменем власника «%s» за зміщенням %zu\n"
 
-#: src/elflint.c:4419
+#: src/elflint.c:4421
 #, c-format
 msgid "phdr[%d]: no note entries defined for the type of file\n"
 msgstr "phdr[%d]: для цього типу файлів не визначено записів нотаток\n"
 
-#: src/elflint.c:4439
+#: src/elflint.c:4441
 #, c-format
 msgid "phdr[%d]: cannot get content of note section: %s\n"
 msgstr "phdr[%d]: не вдалося отримати вміст розділу нотаток: %s\n"
 
-#: src/elflint.c:4442
+#: src/elflint.c:4444
 #, c-format
 msgid "phdr[%d]: extra %<PRIu64> bytes after last note\n"
 msgstr "phdr[%d]: зайві %<PRIu64> байтів після останнього запису нотатки\n"
 
-#: src/elflint.c:4463
+#: src/elflint.c:4465
 #, c-format
 msgid "section [%2d] '%s': no note entries defined for the type of file\n"
 msgstr ""
 "розділ [%2d] «%s»: для цього типу файлів не визначено записів нотаток\n"
 
-#: src/elflint.c:4470
+#: src/elflint.c:4472
 #, c-format
 msgid "section [%2d] '%s': cannot get content of note section\n"
 msgstr "розділ [%2d] «%s»: не вдалося отримати вміст розділу нотаток\n"
 
-#: src/elflint.c:4473
+#: src/elflint.c:4475
 #, c-format
 msgid "section [%2d] '%s': extra %<PRIu64> bytes after last note\n"
 msgstr ""
 "розділ [%2d] «%s»: додаткові %<PRIu64> байтів після останньої нотатки\n"
 
-#: src/elflint.c:4491
+#: src/elflint.c:4493
 #, c-format
 msgid ""
 "only executables, shared objects, and core files can have program headers\n"
@@ -3336,66 +3573,66 @@
 "заголовки програм можуть бути лише у виконуваних файлів, об’єктних файлів "
 "спільного використання або файлів core\n"
 
-#: src/elflint.c:4506
+#: src/elflint.c:4508
 #, c-format
 msgid "cannot get program header entry %d: %s\n"
 msgstr "не вдалося отримати запис заголовка програми %d: %s\n"
 
-#: src/elflint.c:4516
+#: src/elflint.c:4518
 #, c-format
 msgid "program header entry %d: unknown program header entry type %#<PRIx64>\n"
 msgstr ""
 "запис заголовка програми %d: невідомий тип запису заголовка програми "
 "%#<PRIx64>\n"
 
-#: src/elflint.c:4527
+#: src/elflint.c:4529
 #, c-format
 msgid "more than one INTERP entry in program header\n"
 msgstr "більше за один запис INTERP у заголовку програми\n"
 
-#: src/elflint.c:4535
+#: src/elflint.c:4537
 #, c-format
 msgid "more than one TLS entry in program header\n"
 msgstr "більше за один запис TLS у заголовку програми\n"
 
-#: src/elflint.c:4542
+#: src/elflint.c:4544
 #, c-format
 msgid "static executable cannot have dynamic sections\n"
 msgstr "у статичному виконуваному файлі не може бути динамічних розділів\n"
 
-#: src/elflint.c:4556
+#: src/elflint.c:4558
 #, c-format
 msgid "dynamic section reference in program header has wrong offset\n"
 msgstr ""
 "посилання на динамічний розділ у заголовку програми має помилкове зміщення\n"
 
-#: src/elflint.c:4559
+#: src/elflint.c:4561
 #, c-format
 msgid "dynamic section size mismatch in program and section header\n"
 msgstr ""
 "розміри динамічного розділу у заголовку програми та у заголовку розділу не "
 "збігаються\n"
 
-#: src/elflint.c:4569
+#: src/elflint.c:4571
 #, c-format
 msgid "more than one GNU_RELRO entry in program header\n"
 msgstr "більше за один запис GNU_RELRO у заголовку програми\n"
 
-#: src/elflint.c:4590
+#: src/elflint.c:4592
 #, c-format
 msgid "loadable segment GNU_RELRO applies to is not writable\n"
 msgstr ""
 "придатний до завантаження сегмент, до якого звертається GNU_RELRO, "
 "непридатний до запису\n"
 
-#: src/elflint.c:4601
+#: src/elflint.c:4603
 #, c-format
 msgid "loadable segment [%u] flags do not match GNU_RELRO [%u] flags\n"
 msgstr ""
 "прапорці придатного до завантаження сегмента [%u] не відповідають прапорцям "
 "GNU_RELRO [%u]\n"
 
-#: src/elflint.c:4608
+#: src/elflint.c:4610
 #, c-format
 msgid ""
 "GNU_RELRO [%u] flags are not a subset of the loadable segment [%u] flags\n"
@@ -3403,76 +3640,76 @@
 "прапорці GNU_RELRO [%u] не є підмножиною прапорців завантажуваного сегмента "
 "[%u]\n"
 
-#: src/elflint.c:4617 src/elflint.c:4640
+#: src/elflint.c:4619 src/elflint.c:4642
 #, c-format
 msgid "%s segment not contained in a loaded segment\n"
 msgstr "сегмент %s не міститься у завантаженому сегменті\n"
 
-#: src/elflint.c:4646
+#: src/elflint.c:4648
 #, c-format
 msgid "program header offset in ELF header and PHDR entry do not match"
 msgstr "зміщення заголовка програми у заголовку ELF і запис PHDR не збігаються"
 
-#: src/elflint.c:4673
+#: src/elflint.c:4675
 #, c-format
 msgid "call frame search table reference in program header has wrong offset\n"
 msgstr ""
 "посилання на таблицю вікон викликів у заголовку програми має помилкове "
 "зміщення\n"
 
-#: src/elflint.c:4676
+#: src/elflint.c:4678
 #, c-format
 msgid "call frame search table size mismatch in program and section header\n"
 msgstr ""
 "розміри таблиці пошуку вікон виклику у заголовку програми та у заголовку "
 "розділу не збігаються\n"
 
-#: src/elflint.c:4689
+#: src/elflint.c:4691
 #, c-format
 msgid "PT_GNU_EH_FRAME present but no .eh_frame_hdr section\n"
 msgstr "існує PT_GNU_EH_FRAME, хоча немає розділу .eh_frame_hdr\n"
 
-#: src/elflint.c:4697
+#: src/elflint.c:4699
 #, c-format
 msgid "call frame search table must be allocated\n"
 msgstr "таблицю пошуку вікон викликів має бути розміщено у пам’яті\n"
 
-#: src/elflint.c:4700
+#: src/elflint.c:4702
 #, c-format
 msgid "section [%2zu] '%s' must be allocated\n"
 msgstr "розділ [%2zu] «%s» має бути розміщено у пам’яті\n"
 
-#: src/elflint.c:4704
+#: src/elflint.c:4706
 #, c-format
 msgid "call frame search table must not be writable\n"
 msgstr "таблиця пошуку вікон викликів не повинна бути придатною до запису\n"
 
-#: src/elflint.c:4707
+#: src/elflint.c:4709
 #, c-format
 msgid "section [%2zu] '%s' must not be writable\n"
 msgstr "розділ [%2zu] «%s» не повинен бути придатним до запису\n"
 
-#: src/elflint.c:4712
+#: src/elflint.c:4714
 #, c-format
 msgid "call frame search table must not be executable\n"
 msgstr "таблиця пошуку вікон викликів не повинна бути придатною до виконання\n"
 
-#: src/elflint.c:4715
+#: src/elflint.c:4717
 #, c-format
 msgid "section [%2zu] '%s' must not be executable\n"
 msgstr "розділ [%2zu] «%s» не повинен бути придатним до виконання\n"
 
-#: src/elflint.c:4726
+#: src/elflint.c:4728
 #, c-format
 msgid "program header entry %d: file size greater than memory size\n"
 msgstr "запис заголовка програми %d: розмір файла перевищує об’єм пам’яті\n"
 
-#: src/elflint.c:4733
+#: src/elflint.c:4735
 #, c-format
 msgid "program header entry %d: alignment not a power of 2\n"
 msgstr "запис заголовка програми %d: значення вирівнювання не є степенем 2\n"
 
-#: src/elflint.c:4736
+#: src/elflint.c:4738
 #, c-format
 msgid ""
 "program header entry %d: file offset and virtual address not module of "
@@ -3481,7 +3718,7 @@
 "запис заголовка програми %d: зміщення у файлі і віртуальна адреса не "
 "співвідносяться з вирівнюванням\n"
 
-#: src/elflint.c:4749
+#: src/elflint.c:4751
 #, c-format
 msgid ""
 "executable/DSO with .eh_frame_hdr section does not have a PT_GNU_EH_FRAME "
@@ -3490,109 +3727,109 @@
 "виконуваний модуль/DSO з розділом .eh_frame_hdr не містить запису заголовка "
 "програми PT_GNU_EH_FRAME"
 
-#: src/elflint.c:4783
+#: src/elflint.c:4785
 #, c-format
 msgid "cannot read ELF header: %s\n"
 msgstr "не вдалося прочитати заголовок ELF: %s\n"
 
-#: src/elflint.c:4795
+#: src/elflint.c:4797
 #, fuzzy, c-format
 msgid "cannot create backend for ELF file\n"
 msgstr "не вдалося створити файл"
 
-#: src/elflint.c:4816
+#: src/elflint.c:4818
 #, c-format
 msgid "text relocation flag set but not needed\n"
 msgstr ""
 "встановлено прапорець пересування тексту, але такий прапорець не потрібен\n"
 
-#: src/findtextrel.c:60
+#: src/findtextrel.c:61
 msgid "Input Selection:"
 msgstr "Вибір параметрів виводу даних:"
 
-#: src/findtextrel.c:61
+#: src/findtextrel.c:62
 msgid "Prepend PATH to all file names"
 msgstr "Додавати ШЛЯХ до всіх назв файлів"
 
-#: src/findtextrel.c:63
+#: src/findtextrel.c:64
 msgid "Use PATH as root of debuginfo hierarchy"
 msgstr "Використовувати ШЛЯХ як кореневий каталог для ієрархії debuginfo"
 
 #. Short description of program.
-#: src/findtextrel.c:70
+#: src/findtextrel.c:71
 msgid "Locate source of text relocations in FILEs (a.out by default)."
 msgstr "Шукає джерело пересуваного тексту у ФАЙЛАХ (типово, a.out)."
 
 #. Strings for arguments in help texts.
-#: src/findtextrel.c:74 src/nm.c:108 src/objdump.c:71 src/size.c:80
+#: src/findtextrel.c:75 src/nm.c:108 src/objdump.c:71 src/size.c:80
 #: src/strings.c:87 src/strip.c:101
 msgid "[FILE...]"
 msgstr "[ФАЙЛ...]"
 
-#: src/findtextrel.c:222
+#: src/findtextrel.c:224
 #, c-format
 msgid "cannot get ELF header '%s': %s"
 msgstr "не вдалося отримати заголовок ELF «%s»: %s"
 
-#: src/findtextrel.c:233
+#: src/findtextrel.c:235
 #, c-format
 msgid "'%s' is not a DSO or PIE"
 msgstr "«%s» не є DSO або PIE"
 
-#: src/findtextrel.c:253
+#: src/findtextrel.c:255
 #, c-format
 msgid "getting get section header of section %zu: %s"
 msgstr "отримання заголовка розділу get розділу %zu: %s"
 
-#: src/findtextrel.c:277
+#: src/findtextrel.c:279
 #, c-format
 msgid "cannot read dynamic section: %s"
 msgstr "не вдалося прочитати динамічний розділ: %s"
 
-#: src/findtextrel.c:298
+#: src/findtextrel.c:300
 #, c-format
 msgid "no text relocations reported in '%s'"
 msgstr "у «%s» не виявлено пересувань тексту"
 
-#: src/findtextrel.c:310
+#: src/findtextrel.c:311
 #, c-format
 msgid "while reading ELF file"
 msgstr "під час спроби читання файла ELF"
 
-#: src/findtextrel.c:314
+#: src/findtextrel.c:315
 #, c-format
 msgid "cannot get program header count: %s"
 msgstr "не вдалося отримати кількість заголовків програми: %s"
 
-#: src/findtextrel.c:325 src/findtextrel.c:342
+#: src/findtextrel.c:326 src/findtextrel.c:341
 #, c-format
 msgid "cannot get program header index at offset %zd: %s"
 msgstr "не вдалося отримати індекс заголовка програми за зміщенням %zd: %s"
 
-#: src/findtextrel.c:406
+#: src/findtextrel.c:397
 #, c-format
 msgid "cannot get symbol table section %zu in '%s': %s"
 msgstr "не вдалося отримати таблицю символів розділу %zu у «%s»: %s"
 
-#: src/findtextrel.c:427 src/findtextrel.c:450
+#: src/findtextrel.c:418 src/findtextrel.c:441
 #, c-format
 msgid "cannot get relocation at index %d in section %zu in '%s': %s"
 msgstr ""
 "не вдалося отримати пересування за індексом %d у розділі %zu у «%s»: %s"
 
-#: src/findtextrel.c:516
+#: src/findtextrel.c:507
 #, c-format
 msgid "%s not compiled with -fpic/-fPIC\n"
 msgstr "%s не зібрано з -fpic/-fPIC\n"
 
-#: src/findtextrel.c:570
+#: src/findtextrel.c:561
 #, c-format
 msgid ""
 "the file containing the function '%s' is not compiled with -fpic/-fPIC\n"
 msgstr ""
 "файл, що містить функцію «%s», не було зібрано з параметрами -fpic/-fPIC\n"
 
-#: src/findtextrel.c:577 src/findtextrel.c:597
+#: src/findtextrel.c:568 src/findtextrel.c:588
 #, c-format
 msgid ""
 "the file containing the function '%s' might not be compiled with -fpic/-"
@@ -3601,7 +3838,7 @@
 "файл, що містить функцію «%s», ймовірно, не було зібрано з параметрами -"
 "fpic/-fPIC\n"
 
-#: src/findtextrel.c:585
+#: src/findtextrel.c:576
 #, c-format
 msgid ""
 "either the file containing the function '%s' or the file containing the "
@@ -3610,7 +3847,7 @@
 "файл, що містить функцію «%s», або файл, що містить функцію «%s», зібрано "
 "без параметрів -fpic/-fPIC\n"
 
-#: src/findtextrel.c:605
+#: src/findtextrel.c:596
 #, c-format
 msgid ""
 "a relocation modifies memory at offset %llu in a write-protected segment\n"
@@ -3717,12 +3954,12 @@
 msgstr "%s: ВНУТРІШНЯ ПОМИЛКА %d (%s): %s"
 
 #: src/nm.c:381 src/nm.c:393 src/size.c:288 src/size.c:297 src/size.c:308
-#: src/strip.c:2763
+#: src/strip.c:2767
 #, c-format
 msgid "while closing '%s'"
 msgstr "під час закриття «%s»"
 
-#: src/nm.c:403 src/objdump.c:280 src/strip.c:818
+#: src/nm.c:403 src/objdump.c:280 src/strip.c:822
 #, c-format
 msgid "%s: File format not recognized"
 msgstr "%s: не вдалося розпізнати формат файла"
@@ -3756,24 +3993,24 @@
 msgid "%s%s%s: file format not recognized"
 msgstr "%s%s%s: не вдалося розпізнати формат файла"
 
-#: src/nm.c:705
+#: src/nm.c:704
 #, c-format
 msgid "cannot create search tree"
 msgstr "не вдалося створити дерево пошуку"
 
-#: src/nm.c:746 src/nm.c:1239 src/objdump.c:782 src/readelf.c:637
+#: src/nm.c:745 src/nm.c:1238 src/objdump.c:781 src/readelf.c:637
 #: src/readelf.c:1451 src/readelf.c:1602 src/readelf.c:1803 src/readelf.c:2009
-#: src/readelf.c:2199 src/readelf.c:2377 src/readelf.c:2453 src/readelf.c:2711
-#: src/readelf.c:2787 src/readelf.c:2874 src/readelf.c:3472 src/readelf.c:3522
-#: src/readelf.c:3592 src/readelf.c:11328 src/readelf.c:12523
-#: src/readelf.c:12734 src/readelf.c:12803 src/size.c:398 src/size.c:470
-#: src/strip.c:1084
+#: src/readelf.c:2199 src/readelf.c:2377 src/readelf.c:2453 src/readelf.c:2719
+#: src/readelf.c:2795 src/readelf.c:2882 src/readelf.c:3478 src/readelf.c:3528
+#: src/readelf.c:3598 src/readelf.c:11409 src/readelf.c:12603
+#: src/readelf.c:12814 src/readelf.c:12883 src/size.c:398 src/size.c:470
+#: src/strip.c:1089
 #, c-format
 msgid "cannot get section header string table index"
 msgstr "не вдалося визначити індекс заголовка розділу у таблиці рядків"
 
 #. We always print this prolog.
-#: src/nm.c:771
+#: src/nm.c:770
 #, c-format
 msgid ""
 "\n"
@@ -3787,7 +4024,7 @@
 "\n"
 
 #. The header line.
-#: src/nm.c:774
+#: src/nm.c:773
 #, c-format
 msgid ""
 "%*s%-*s %-*s Class  Type     %-*s %*s Section\n"
@@ -3796,28 +4033,53 @@
 "%*s%-*s %-*s Клас   Тип      %-*s %*s Розділ\n"
 "\n"
 
-#: src/nm.c:1250
+#: src/nm.c:775
+#, fuzzy
+#| msgid " Name: "
+msgctxt "sysv"
+msgid "Name"
+msgstr "Назва: "
+
+#. TRANS: the "sysv|" parts makes the string unique.
+#: src/nm.c:777
+msgctxt "sysv"
+msgid "Value"
+msgstr ""
+
+#. TRANS: the "sysv|" parts makes the string unique.
+#: src/nm.c:779
+msgctxt "sysv"
+msgid "Size"
+msgstr ""
+
+#. TRANS: the "sysv|" parts makes the string unique.
+#: src/nm.c:781
+msgctxt "sysv"
+msgid "Line"
+msgstr ""
+
+#: src/nm.c:1249
 #, c-format
 msgid "%s: entry size in section %zd `%s' is not what we expect"
 msgstr "%s: розмір запису у розділі %zd «%s» не є очікуваним"
 
-#: src/nm.c:1255
+#: src/nm.c:1254
 #, c-format
 msgid "%s: size of section %zd `%s' is not multiple of entry size"
 msgstr "%s: розмір розділу %zd «%s» не є кратним до розміру запису"
 
-#: src/nm.c:1334
+#: src/nm.c:1335
 #, c-format
 msgid "%s: entries (%zd) in section %zd `%s' is too large"
 msgstr "%s: записи (%zd) у розділі %zd, «%s» є завеликим"
 
 #. XXX Add machine specific object file types.
-#: src/nm.c:1570
+#: src/nm.c:1571
 #, c-format
 msgid "%s%s%s%s: Invalid operation"
 msgstr "%s%s%s%s: некоректна дія"
 
-#: src/nm.c:1620
+#: src/nm.c:1621
 #, c-format
 msgid "%s%s%s: no symbols"
 msgstr "%s%s%s: немає символів"
@@ -3893,7 +4155,7 @@
 msgid "cannot disassemble"
 msgstr "не вдалося дизасемблювати"
 
-#: src/objdump.c:760
+#: src/objdump.c:759
 #, fuzzy, c-format
 msgid "cannot create backend for elf file"
 msgstr "не вдалося створити файл"
@@ -4079,7 +4341,7 @@
 msgid "cannot generate Elf descriptor: %s"
 msgstr "не вдалося створити дескриптор Elf: %s"
 
-#: src/readelf.c:628 src/readelf.c:955 src/strip.c:1179
+#: src/readelf.c:628 src/readelf.c:955 src/strip.c:1184
 #, c-format
 msgid "cannot determine number of sections: %s"
 msgstr "не вдалося визначити кількість розділів: %s"
@@ -4089,11 +4351,11 @@
 msgid "cannot get section: %s"
 msgstr "не вдалося отримати розділ: %s"
 
-#: src/readelf.c:655 src/readelf.c:1272 src/readelf.c:1483 src/readelf.c:12754
-#: src/unstrip.c:397 src/unstrip.c:428 src/unstrip.c:487 src/unstrip.c:608
-#: src/unstrip.c:629 src/unstrip.c:669 src/unstrip.c:885 src/unstrip.c:1216
-#: src/unstrip.c:1343 src/unstrip.c:1367 src/unstrip.c:1423 src/unstrip.c:1487
-#: src/unstrip.c:1662 src/unstrip.c:1813 src/unstrip.c:1956 src/unstrip.c:2055
+#: src/readelf.c:655 src/readelf.c:1272 src/readelf.c:1483 src/readelf.c:12834
+#: src/unstrip.c:397 src/unstrip.c:428 src/unstrip.c:491 src/unstrip.c:612
+#: src/unstrip.c:633 src/unstrip.c:673 src/unstrip.c:889 src/unstrip.c:1224
+#: src/unstrip.c:1351 src/unstrip.c:1375 src/unstrip.c:1431 src/unstrip.c:1472
+#: src/unstrip.c:1665 src/unstrip.c:1816 src/unstrip.c:1959 src/unstrip.c:2058
 #, c-format
 msgid "cannot get section header: %s"
 msgstr "не вдалося отримати заголовок розділу: %s"
@@ -4103,8 +4365,8 @@
 msgid "cannot get section name"
 msgstr "не вдалося отримати назву розділу"
 
-#: src/readelf.c:672 src/readelf.c:6628 src/readelf.c:10600 src/readelf.c:10702
-#: src/readelf.c:10880
+#: src/readelf.c:672 src/readelf.c:6634 src/readelf.c:10681 src/readelf.c:10783
+#: src/readelf.c:10961
 #, c-format
 msgid "cannot get %s content: %s"
 msgstr "не вдалося отримати дані %s: %s"
@@ -4446,7 +4708,7 @@
 " Відображення розділів на сегмент:\n"
 "  Розділи сегмента..."
 
-#: src/readelf.c:1464 src/unstrip.c:2114 src/unstrip.c:2156 src/unstrip.c:2163
+#: src/readelf.c:1464 src/unstrip.c:2117 src/unstrip.c:2159 src/unstrip.c:2166
 #, c-format
 msgid "cannot get program header: %s"
 msgstr "не вдалося отримати заголовок програми: %s"
@@ -4495,18 +4757,18 @@
 msgid "<INVALID SECTION>"
 msgstr "<НЕКОРЕКТНИЙ РОЗДІЛ>"
 
-#: src/readelf.c:1660 src/readelf.c:2387 src/readelf.c:3488 src/readelf.c:12625
-#: src/readelf.c:12632 src/readelf.c:12676 src/readelf.c:12683
+#: src/readelf.c:1660 src/readelf.c:2387 src/readelf.c:3494 src/readelf.c:12705
+#: src/readelf.c:12712 src/readelf.c:12756 src/readelf.c:12763
 msgid "Couldn't uncompress section"
 msgstr "Не вдалося розпакувати розділ"
 
-#: src/readelf.c:1665 src/readelf.c:2392 src/readelf.c:3493
+#: src/readelf.c:1665 src/readelf.c:2392 src/readelf.c:3499
 #, c-format
 msgid "cannot get section [%zd] header: %s"
 msgstr "не вдалося отримати заголовок розділу [%zd]: %s"
 
-#: src/readelf.c:1809 src/readelf.c:2459 src/readelf.c:2717 src/readelf.c:2793
-#: src/readelf.c:3097 src/readelf.c:3171 src/readelf.c:5401
+#: src/readelf.c:1809 src/readelf.c:2459 src/readelf.c:2725 src/readelf.c:2801
+#: src/readelf.c:3105 src/readelf.c:3179 src/readelf.c:5407
 #, c-format
 msgid "invalid sh_link value in section %zu"
 msgstr "некоректне значення sh_link у розділі %zu"
@@ -4681,20 +4943,20 @@
 msgid "%5u: %0*<PRIx64> %6<PRId64> %-7s %-6s %-9s %6s %s"
 msgstr "%5u: %0*<PRIx64> %6<PRId64> %-7s %-6s %-9s %6s %s"
 
-#: src/readelf.c:2590
+#: src/readelf.c:2595
 #, c-format
 msgid "bad dynamic symbol"
 msgstr "помилковий динамічний символ"
 
-#: src/readelf.c:2672
+#: src/readelf.c:2680
 msgid "none"
 msgstr "немає"
 
-#: src/readelf.c:2689
+#: src/readelf.c:2697
 msgid "| <unknown>"
 msgstr "| <невідомо>"
 
-#: src/readelf.c:2720
+#: src/readelf.c:2728
 #, c-format
 msgid ""
 "\n"
@@ -4717,17 +4979,17 @@
 "Розділ потреби у версіях [%2u] «%s», що містить %d записів:\n"
 " Адр.: %#0*<PRIx64>  Зміщ.:  %#08<PRIx64>  Посилання на розділ: [%2u] «%s»\n"
 
-#: src/readelf.c:2741
+#: src/readelf.c:2749
 #, c-format
 msgid "  %#06x: Version: %hu  File: %s  Cnt: %hu\n"
 msgstr "  %#06x: Версія: %hu  Файл: %s  Кть: %hu\n"
 
-#: src/readelf.c:2754
+#: src/readelf.c:2762
 #, c-format
 msgid "  %#06x: Name: %s  Flags: %s  Version: %hu\n"
 msgstr "  %#06x: Назва: %s  Прап: %s  Версія: %hu\n"
 
-#: src/readelf.c:2797
+#: src/readelf.c:2805
 #, c-format
 msgid ""
 "\n"
@@ -4750,18 +5012,18 @@
 "Розділ визначення версії [%2u] «%s», що містить %d записів:\n"
 " Адр.: %#0*<PRIx64>  Зміщ.:  %#08<PRIx64>  Посилання на розділ: [%2u] «%s»\n"
 
-#: src/readelf.c:2825
+#: src/readelf.c:2833
 #, c-format
 msgid "  %#06x: Version: %hd  Flags: %s  Index: %hd  Cnt: %hd  Name: %s\n"
 msgstr "  %#06x: Версія:  %hd  Прап.: %s  Індекс: %hd К-ть: %hd Назва: %s\n"
 
-#: src/readelf.c:2840
+#: src/readelf.c:2848
 #, c-format
 msgid "  %#06x: Parent %d: %s\n"
 msgstr "  %#06x: батьківський %d: %s\n"
 
 #. Print the header.
-#: src/readelf.c:3101
+#: src/readelf.c:3109
 #, c-format
 msgid ""
 "\n"
@@ -4784,15 +5046,15 @@
 "Розділ символів версій [%2u] «%s», що містить %d записів:\n"
 " Адр.: %#0*<PRIx64>  Зміщ.:  %#08<PRIx64>  Посилання на розділ: [%2u] «%s»"
 
-#: src/readelf.c:3129
+#: src/readelf.c:3137
 msgid "   0 *local*                     "
 msgstr "   0 *локальний*                 "
 
-#: src/readelf.c:3134
+#: src/readelf.c:3142
 msgid "   1 *global*                    "
 msgstr "   1 *загальний*                 "
 
-#: src/readelf.c:3176
+#: src/readelf.c:3184
 #, c-format
 msgid ""
 "\n"
@@ -4820,22 +5082,22 @@
 "блоками):\n"
 " Адр.: %#0*<PRIx64>  Зміщ.: %#08<PRIx64>  Посилання на розділ: [%2u] «%s»\n"
 
-#: src/readelf.c:3198
+#: src/readelf.c:3206
 #, no-c-format
 msgid " Length  Number  % of total  Coverage\n"
 msgstr " Довжина Номер   % від загал. Покриття\n"
 
-#: src/readelf.c:3200
+#: src/readelf.c:3208
 #, c-format
 msgid "      0  %6<PRIu32>      %5.1f%%\n"
 msgstr "      0  %6<PRIu32>      %5.1f%%\n"
 
-#: src/readelf.c:3207
+#: src/readelf.c:3215
 #, c-format
 msgid "%7d  %6<PRIu32>      %5.1f%%    %5.1f%%\n"
 msgstr "%7d  %6<PRIu32>      %5.1f%%    %5.1f%%\n"
 
-#: src/readelf.c:3220
+#: src/readelf.c:3228
 #, c-format
 msgid ""
 " Average number of tests:   successful lookup: %f\n"
@@ -4844,37 +5106,37 @@
 " Середня кількість тестів:   успішний пошук: %f\n"
 "\t\t\t  неуспішний пошук: %f\n"
 
-#: src/readelf.c:3238 src/readelf.c:3302 src/readelf.c:3368
+#: src/readelf.c:3246 src/readelf.c:3310 src/readelf.c:3376
 #, c-format
 msgid "cannot get data for section %d: %s"
 msgstr "не вдалося отримати дані для розділу %d: %s"
 
-#: src/readelf.c:3246
+#: src/readelf.c:3254
 #, c-format
 msgid "invalid data in sysv.hash section %d"
 msgstr "некоректні дані у розділі sysv.hash %d"
 
-#: src/readelf.c:3275
+#: src/readelf.c:3283
 #, c-format
 msgid "invalid chain in sysv.hash section %d"
 msgstr "некоректний ланцюжок у розділі sysv.hash %d"
 
-#: src/readelf.c:3310
+#: src/readelf.c:3318
 #, c-format
 msgid "invalid data in sysv.hash64 section %d"
 msgstr "некоректні дані у розділі sysv.hash64 %d"
 
-#: src/readelf.c:3341
+#: src/readelf.c:3349
 #, c-format
 msgid "invalid chain in sysv.hash64 section %d"
 msgstr "некоректний ланцюжок у розділі sysv.hash64 %d"
 
-#: src/readelf.c:3377
+#: src/readelf.c:3385
 #, c-format
 msgid "invalid data in gnu.hash section %d"
 msgstr "некоректні дані у розділі gnu.hash %d"
 
-#: src/readelf.c:3444
+#: src/readelf.c:3451
 #, c-format
 msgid ""
 " Symbol Bias: %u\n"
@@ -4884,7 +5146,7 @@
 " Розмір бітової маски: %zu байтів  %<PRIuFAST32>%% встановлених бітів  зсув "
 "2-го хешу: %u\n"
 
-#: src/readelf.c:3533
+#: src/readelf.c:3539
 #, c-format
 msgid ""
 "\n"
@@ -4905,7 +5167,7 @@
 "Розділ списку бібліотек [%2zu] «%s» за зміщенням %#0<PRIx64> містить %d "
 "записів:\n"
 
-#: src/readelf.c:3547
+#: src/readelf.c:3553
 msgid ""
 "       Library                       Time Stamp          Checksum Version "
 "Flags"
@@ -4913,7 +5175,7 @@
 "       Бібліотека                    Часовий штамп       Версія суми      "
 "Прапорці"
 
-#: src/readelf.c:3606
+#: src/readelf.c:3612
 #, c-format
 msgid ""
 "\n"
@@ -4924,102 +5186,102 @@
 "Розділ атрибутів об’єктів [%2zu] «%s» з %<PRIu64> байтів за зміщенням "
 "%#0<PRIx64>:\n"
 
-#: src/readelf.c:3623
+#: src/readelf.c:3629
 msgid "  Owner          Size\n"
 msgstr "  Власник        Розмір\n"
 
-#: src/readelf.c:3647
+#: src/readelf.c:3653
 #, c-format
 msgid "  %-13s  %4<PRIu32>\n"
 msgstr "  %-13s  %4<PRIu32>\n"
 
 #. Unknown subsection, print and skip.
-#: src/readelf.c:3686
+#: src/readelf.c:3692
 #, c-format
 msgid "    %-4u %12<PRIu32>\n"
 msgstr "    %-4u %12<PRIu32>\n"
 
 #. Tag_File
-#: src/readelf.c:3691
+#: src/readelf.c:3697
 #, c-format
 msgid "    File: %11<PRIu32>\n"
 msgstr "    Файл: %11<PRIu32>\n"
 
-#: src/readelf.c:3740
+#: src/readelf.c:3746
 #, c-format
 msgid "      %s: %<PRId64>, %s\n"
 msgstr "      %s: %<PRId64>, %s\n"
 
-#: src/readelf.c:3743
+#: src/readelf.c:3749
 #, c-format
 msgid "      %s: %<PRId64>\n"
 msgstr "      %s: %<PRId64>\n"
 
-#: src/readelf.c:3746
+#: src/readelf.c:3752
 #, c-format
 msgid "      %s: %s\n"
 msgstr "      %s: %s\n"
 
-#: src/readelf.c:3756
+#: src/readelf.c:3762
 #, c-format
 msgid "      %u: %<PRId64>\n"
 msgstr "      %u: %<PRId64>\n"
 
-#: src/readelf.c:3759
+#: src/readelf.c:3765
 #, c-format
 msgid "      %u: %s\n"
 msgstr "      %u: %s\n"
 
-#: src/readelf.c:3829
+#: src/readelf.c:3835
 #, c-format
 msgid "sprintf failure"
 msgstr "помилка sprintf"
 
-#: src/readelf.c:4311
+#: src/readelf.c:4317
 msgid "empty block"
 msgstr "порожній блок"
 
-#: src/readelf.c:4314
+#: src/readelf.c:4320
 #, c-format
 msgid "%zu byte block:"
 msgstr "%zu-байтовий блок:"
 
-#: src/readelf.c:4792
+#: src/readelf.c:4798
 #, c-format
 msgid "%*s[%2<PRIuMAX>] %s  <TRUNCATED>\n"
 msgstr "%*s[%2<PRIuMAX>] %s  <ОБРІЗАНО>\n"
 
-#: src/readelf.c:4859
+#: src/readelf.c:4865
 #, c-format
 msgid "%s %#<PRIx64> used with different address sizes"
 msgstr "%s %#<PRIx64> використано з різними розмірами адрес"
 
-#: src/readelf.c:4866
+#: src/readelf.c:4872
 #, c-format
 msgid "%s %#<PRIx64> used with different offset sizes"
 msgstr "%s %#<PRIx64> використано з різними розмірами зміщень"
 
-#: src/readelf.c:4873
+#: src/readelf.c:4879
 #, c-format
 msgid "%s %#<PRIx64> used with different base addresses"
 msgstr "%s %#<PRIx64> використано з різними базовими адресами"
 
-#: src/readelf.c:4880
+#: src/readelf.c:4886
 #, c-format
 msgid "%s %#<PRIx64> used with different attribute %s and %s"
 msgstr "%s %#<PRIx64> використано з різними атрибутами, %s і %s"
 
-#: src/readelf.c:4980
+#: src/readelf.c:4986
 #, c-format
 msgid " [%6tx]  <UNUSED GARBAGE IN REST OF SECTION>\n"
 msgstr " [%6tx]  <НЕВИКОРИСТОВУВАНІ ДАНІ У РЕШТІ РОЗДІЛУ>\n"
 
-#: src/readelf.c:4988
+#: src/readelf.c:4994
 #, c-format
 msgid " [%6tx]  <UNUSED GARBAGE> ... %<PRIu64> bytes ...\n"
 msgstr " [%6tx]  <НЕВИКОРИСТОВУВАНІ ДАНІ> ... %<PRIu64> байтів ...\n"
 
-#: src/readelf.c:5091
+#: src/readelf.c:5097
 #, c-format
 msgid ""
 "\n"
@@ -5030,7 +5292,7 @@
 "Розділ DWARF [%2zu] «%s» зі зміщенням %#<PRIx64>:\n"
 " [ Код]\n"
 
-#: src/readelf.c:5099
+#: src/readelf.c:5105
 #, c-format
 msgid ""
 "\n"
@@ -5039,20 +5301,20 @@
 "\n"
 "Розділ скорочень за зміщенням %<PRIu64>:\n"
 
-#: src/readelf.c:5112
+#: src/readelf.c:5118
 #, c-format
 msgid " *** error while reading abbreviation: %s\n"
 msgstr " *** помилка під час читання скорочення: %s\n"
 
-#: src/readelf.c:5128
+#: src/readelf.c:5134
 #, c-format
 msgid " [%5u] offset: %<PRId64>, children: %s, tag: %s\n"
 msgstr " [%5u] зміщення: %<PRId64>, дочірній: %s, мітка: %s\n"
 
-#: src/readelf.c:5161 src/readelf.c:5470 src/readelf.c:5637 src/readelf.c:6022
-#: src/readelf.c:6638 src/readelf.c:8375 src/readelf.c:9064 src/readelf.c:9537
-#: src/readelf.c:9788 src/readelf.c:9954 src/readelf.c:10341
-#: src/readelf.c:10401
+#: src/readelf.c:5167 src/readelf.c:5476 src/readelf.c:5643 src/readelf.c:6028
+#: src/readelf.c:6644 src/readelf.c:8399 src/readelf.c:9145 src/readelf.c:9618
+#: src/readelf.c:9869 src/readelf.c:10035 src/readelf.c:10422
+#: src/readelf.c:10482
 #, c-format
 msgid ""
 "\n"
@@ -5061,54 +5323,54 @@
 "\n"
 "Розділ DWARF [%2zu] «%s» зі зміщенням %#<PRIx64>:\n"
 
-#: src/readelf.c:5174
+#: src/readelf.c:5180
 #, c-format
 msgid "cannot get .debug_addr section data: %s"
 msgstr "не вдалося отримати дані розділу .debug_addr: %s"
 
-#: src/readelf.c:5274 src/readelf.c:5298 src/readelf.c:5682 src/readelf.c:9109
+#: src/readelf.c:5280 src/readelf.c:5304 src/readelf.c:5688 src/readelf.c:9190
 #, c-format
 msgid " Length:         %8<PRIu64>\n"
 msgstr " Довжина:        %8<PRIu64>\n"
 
-#: src/readelf.c:5276 src/readelf.c:5313 src/readelf.c:5695 src/readelf.c:9122
+#: src/readelf.c:5282 src/readelf.c:5319 src/readelf.c:5701 src/readelf.c:9203
 #, c-format
 msgid " DWARF version:  %8<PRIu16>\n"
 msgstr " версія DWARF:   %8<PRIu16>\n"
 
-#: src/readelf.c:5277 src/readelf.c:5322 src/readelf.c:5704 src/readelf.c:9131
+#: src/readelf.c:5283 src/readelf.c:5328 src/readelf.c:5710 src/readelf.c:9212
 #, c-format
 msgid " Address size:   %8<PRIu64>\n"
 msgstr " Розмір адреси:  %8<PRIu64>\n"
 
-#: src/readelf.c:5279 src/readelf.c:5332 src/readelf.c:5714 src/readelf.c:9141
+#: src/readelf.c:5285 src/readelf.c:5338 src/readelf.c:5720 src/readelf.c:9222
 #, c-format
 msgid " Segment size:   %8<PRIu64>\n"
 msgstr ""
 " Розмір сегмента: %8<PRIu64>\n"
 "\n"
 
-#: src/readelf.c:5317 src/readelf.c:5699 src/readelf.c:9126 src/readelf.c:10533
+#: src/readelf.c:5323 src/readelf.c:5705 src/readelf.c:9207 src/readelf.c:10614
 #, c-format
 msgid "Unknown version"
 msgstr "Невідома версія"
 
-#: src/readelf.c:5327 src/readelf.c:5540 src/readelf.c:5709 src/readelf.c:9136
+#: src/readelf.c:5333 src/readelf.c:5546 src/readelf.c:5715 src/readelf.c:9217
 #, c-format
 msgid "unsupported address size"
 msgstr "непідтримуваний розмір адреси"
 
-#: src/readelf.c:5338 src/readelf.c:5551 src/readelf.c:5719 src/readelf.c:9146
+#: src/readelf.c:5344 src/readelf.c:5557 src/readelf.c:5725 src/readelf.c:9227
 #, c-format
 msgid "unsupported segment size"
 msgstr "непідтримуваний розмір сегмента"
 
-#: src/readelf.c:5391 src/readelf.c:5465
+#: src/readelf.c:5397 src/readelf.c:5471
 #, c-format
 msgid "cannot get .debug_aranges content: %s"
 msgstr "не вдалося отримати дані get .debug_aranges: %s"
 
-#: src/readelf.c:5406
+#: src/readelf.c:5412
 #, c-format
 msgid ""
 "\n"
@@ -5126,12 +5388,12 @@
 "\n"
 "Розділ DWARF [%2zu] «%s» за зміщенням %#<PRIx64> містить %zu записів:\n"
 
-#: src/readelf.c:5437
+#: src/readelf.c:5443
 #, c-format
 msgid " [%*zu] ???\n"
 msgstr " [%*zu] ???\n"
 
-#: src/readelf.c:5439
+#: src/readelf.c:5445
 #, c-format
 msgid ""
 " [%*zu] start: %0#*<PRIx64>, length: %5<PRIu64>, CU DIE offset: %6<PRId64>\n"
@@ -5139,7 +5401,7 @@
 " [%*zu] початок: %0#*<PRIx64>, довжина: %5<PRIu64>, зміщення CU DIE: "
 "%6<PRId64>\n"
 
-#: src/readelf.c:5483 src/readelf.c:8402
+#: src/readelf.c:5489 src/readelf.c:8426
 #, c-format
 msgid ""
 "\n"
@@ -5148,13 +5410,13 @@
 "\n"
 "Таблиця за зміщенням %zu:\n"
 
-#: src/readelf.c:5487 src/readelf.c:5663 src/readelf.c:6662 src/readelf.c:8413
-#: src/readelf.c:9090
+#: src/readelf.c:5493 src/readelf.c:5669 src/readelf.c:6668 src/readelf.c:8437
+#: src/readelf.c:9171
 #, c-format
 msgid "invalid data in section [%zu] '%s'"
 msgstr "некоректні дані у розділі [%zu] «%s»"
 
-#: src/readelf.c:5503
+#: src/readelf.c:5509
 #, c-format
 msgid ""
 "\n"
@@ -5163,27 +5425,27 @@
 "\n"
 " Довжина:       %6<PRIu64>\n"
 
-#: src/readelf.c:5515
+#: src/readelf.c:5521
 #, c-format
 msgid " DWARF version: %6<PRIuFAST16>\n"
 msgstr " версія DWARF:  %6<PRIuFAST16>\n"
 
-#: src/readelf.c:5519
+#: src/readelf.c:5525
 #, c-format
 msgid "unsupported aranges version"
 msgstr "непідтримувана версія aranges"
 
-#: src/readelf.c:5530
+#: src/readelf.c:5536
 #, c-format
 msgid " CU offset:     %6<PRIx64>\n"
 msgstr " зміщення CU:     %6<PRIx64>\n"
 
-#: src/readelf.c:5536
+#: src/readelf.c:5542
 #, c-format
 msgid " Address size:  %6<PRIu64>\n"
 msgstr " Розмір адреси:  %6<PRIu64>\n"
 
-#: src/readelf.c:5547
+#: src/readelf.c:5553
 #, c-format
 msgid ""
 " Segment size:  %6<PRIu64>\n"
@@ -5192,17 +5454,17 @@
 " Розмір сегмента:  %6<PRIu64>\n"
 "\n"
 
-#: src/readelf.c:5602
+#: src/readelf.c:5608
 #, c-format
 msgid "   %zu padding bytes\n"
 msgstr "   %zu байтів доповнення\n"
 
-#: src/readelf.c:5646
+#: src/readelf.c:5652
 #, c-format
 msgid "cannot get .debug_rnglists content: %s"
 msgstr "не вдалося отримати вміст .debug_rnglists: %s"
 
-#: src/readelf.c:5669 src/readelf.c:9096
+#: src/readelf.c:5675 src/readelf.c:9177
 #, c-format
 msgid ""
 "Table at Offset 0x%<PRIx64>:\n"
@@ -5211,42 +5473,42 @@
 "Таблиця за зміщенням 0x%<PRIx64>:\n"
 "\n"
 
-#: src/readelf.c:5724 src/readelf.c:9151
+#: src/readelf.c:5730 src/readelf.c:9232
 #, c-format
 msgid " Offset entries: %8<PRIu64>\n"
 msgstr " Записи зміщення: %8<PRIu64>\n"
 
-#: src/readelf.c:5740 src/readelf.c:9167
+#: src/readelf.c:5746 src/readelf.c:9248
 #, c-format
 msgid " Unknown CU base: "
 msgstr " Невідома основа CU: "
 
-#: src/readelf.c:5742 src/readelf.c:9169
+#: src/readelf.c:5748 src/readelf.c:9250
 #, c-format
 msgid " CU [%6<PRIx64>] base: "
 msgstr " Основа CU [%6<PRIx64>]: "
 
-#: src/readelf.c:5748 src/readelf.c:9175
+#: src/readelf.c:5754 src/readelf.c:9256
 #, c-format
 msgid " Not associated with a CU.\n"
 msgstr " Не пов'язано із CU.\n"
 
-#: src/readelf.c:5759 src/readelf.c:9186
+#: src/readelf.c:5765 src/readelf.c:9267
 #, c-format
 msgid "too many offset entries for unit length"
 msgstr "забагато записів зсуву для довжини модуля"
 
-#: src/readelf.c:5763 src/readelf.c:9190
+#: src/readelf.c:5769 src/readelf.c:9271
 #, c-format
 msgid "  Offsets starting at 0x%<PRIx64>:\n"
 msgstr "  Зміщення, що починаються з 0x%<PRIx64>:\n"
 
-#: src/readelf.c:5815
+#: src/readelf.c:5821
 #, c-format
 msgid "invalid range list data"
 msgstr "некоректні дані списку діапазонів"
 
-#: src/readelf.c:6000 src/readelf.c:9515
+#: src/readelf.c:6006 src/readelf.c:9596
 #, c-format
 msgid ""
 "   %zu padding bytes\n"
@@ -5255,12 +5517,12 @@
 "   %zu байтів доповнення\n"
 "\n"
 
-#: src/readelf.c:6017
+#: src/readelf.c:6023
 #, c-format
 msgid "cannot get .debug_ranges content: %s"
 msgstr "не вдалося отримати дані .debug_ranges: %s"
 
-#: src/readelf.c:6053 src/readelf.c:9570
+#: src/readelf.c:6059 src/readelf.c:9651
 #, c-format
 msgid ""
 "\n"
@@ -5269,7 +5531,7 @@
 "\n"
 " Невідома основа CU: "
 
-#: src/readelf.c:6055 src/readelf.c:9572
+#: src/readelf.c:6061 src/readelf.c:9653
 #, c-format
 msgid ""
 "\n"
@@ -5278,31 +5540,31 @@
 "\n"
 " Основа CU [%6<PRIx64>]: "
 
-#: src/readelf.c:6064 src/readelf.c:9598 src/readelf.c:9624
+#: src/readelf.c:6070 src/readelf.c:9679 src/readelf.c:9705
 #, c-format
 msgid " [%6tx]  <INVALID DATA>\n"
 msgstr " [%6tx]  <НЕКОРЕКТНІ ДАНІ>\n"
 
-#: src/readelf.c:6089 src/readelf.c:9708
+#: src/readelf.c:6095 src/readelf.c:9789
 #, fuzzy
 msgid "base address"
 msgstr " встановити адресу у значення "
 
-#: src/readelf.c:6099 src/readelf.c:9718
+#: src/readelf.c:6105 src/readelf.c:9799
 #, c-format
 msgid " [%6tx] empty list\n"
 msgstr " [%6tx] порожній список\n"
 
-#: src/readelf.c:6359
+#: src/readelf.c:6365
 msgid "         <INVALID DATA>\n"
 msgstr "         <НЕКОРЕКТНІ ДАНІ>\n"
 
-#: src/readelf.c:6616
+#: src/readelf.c:6622
 #, c-format
 msgid "cannot get ELF: %s"
 msgstr "не вдалося отримати ELF: %s"
 
-#: src/readelf.c:6634
+#: src/readelf.c:6640
 #, c-format
 msgid ""
 "\n"
@@ -5311,7 +5573,7 @@
 "\n"
 "Розділ відомостей щодо вікна викликів [%2zu] «%s» за зміщенням %#<PRIx64>:\n"
 
-#: src/readelf.c:6684
+#: src/readelf.c:6690
 #, c-format
 msgid ""
 "\n"
@@ -5320,65 +5582,65 @@
 "\n"
 " [%6tx] нульовий переривач\n"
 
-#: src/readelf.c:6785 src/readelf.c:6939
+#: src/readelf.c:6791 src/readelf.c:6945
 #, c-format
 msgid "invalid augmentation length"
 msgstr "некоректна довжина збільшення"
 
-#: src/readelf.c:6800
+#: src/readelf.c:6806
 msgid "FDE address encoding: "
 msgstr "Кодування адреси FDE: "
 
-#: src/readelf.c:6806
+#: src/readelf.c:6812
 msgid "LSDA pointer encoding: "
 msgstr "Кодування вказівника LSDA: "
 
-#: src/readelf.c:6916
+#: src/readelf.c:6922
 #, c-format
 msgid " (offset: %#<PRIx64>)"
 msgstr " (зміщення: %#<PRIx64>)"
 
-#: src/readelf.c:6923
+#: src/readelf.c:6929
 #, c-format
 msgid " (end offset: %#<PRIx64>)"
 msgstr " (зміщення від кінця: %#<PRIx64>)"
 
-#: src/readelf.c:6960
+#: src/readelf.c:6966
 #, c-format
 msgid "   %-26sLSDA pointer: %#<PRIx64>\n"
 msgstr "   %-26sвказівник LSDA: %#<PRIx64>\n"
 
-#: src/readelf.c:7045
+#: src/readelf.c:7051
 #, c-format
 msgid "DIE [%<PRIx64>] cannot get attribute code: %s"
 msgstr "DIE [%<PRIx64>] не вдалося отримати код атрибута: %s"
 
-#: src/readelf.c:7055
+#: src/readelf.c:7061
 #, c-format
 msgid "DIE [%<PRIx64>] cannot get attribute form: %s"
 msgstr "DIE [%<PRIx64>] не вдалося отримати форму атрибута: %s"
 
-#: src/readelf.c:7077
+#: src/readelf.c:7083
 #, c-format
 msgid "DIE [%<PRIx64>] cannot get attribute '%s' (%s) value: %s"
 msgstr "DIE [%<PRIx64>] не вдалося отримати значення атрибута «%s» (%s): %s"
 
-#: src/readelf.c:7407
+#: src/readelf.c:7413
 #, c-format
 msgid "invalid file (%<PRId64>): %s"
 msgstr "некоректний файл (%<PRId64>): %s"
 
-#: src/readelf.c:7411
+#: src/readelf.c:7417
 #, c-format
 msgid "no srcfiles for CU [%<PRIx64>]"
 msgstr "немає srcfiles для CU [%<PRIx64>]"
 
-#: src/readelf.c:7415
+#: src/readelf.c:7421
 #, c-format
 msgid "couldn't get DWARF CU: %s"
 msgstr "не вдалося отримати CU DWARF: %s"
 
-#: src/readelf.c:7728
+#: src/readelf.c:7736
 #, c-format
 msgid ""
 "\n"
@@ -5389,12 +5651,12 @@
 "Розділ DWARF [%2zu] «%s» за зміщенням %#<PRIx64>:\n"
 " [Зміщення]\n"
 
-#: src/readelf.c:7778
+#: src/readelf.c:7786
 #, c-format
 msgid "cannot get next unit: %s"
 msgstr "не вдалося отримати наступний модуль: %s"
 
-#: src/readelf.c:7797
+#: src/readelf.c:7806
 #, c-format
 msgid ""
 " Type unit at offset %<PRIu64>:\n"
@@ -5407,7 +5669,7 @@
 "%<PRIu8>, Розмір зміщення: %<PRIu8>\n"
 " Підпис типу: %#<PRIx64>, Зміщення типу: %#<PRIx64> [%<PRIx64>]\n"
 
-#: src/readelf.c:7809
+#: src/readelf.c:7818
 #, c-format
 msgid ""
 " Compilation unit at offset %<PRIu64>:\n"
@@ -5418,38 +5680,38 @@
 " Версія: %<PRIu16>, Зміщення розділу скорочень: %<PRIu64>, Адреса: %<PRIu8>, "
 "Зміщення: %<PRIu8>\n"
 
-#: src/readelf.c:7819 src/readelf.c:7982
+#: src/readelf.c:7828 src/readelf.c:7989
 #, c-format
 msgid " Unit type: %s (%<PRIu8>)"
 msgstr " Тип модуля: %s (%<PRIu8>)"
 
-#: src/readelf.c:7846
+#: src/readelf.c:7855
 #, c-format
 msgid "unknown version (%d) or unit type (%d)"
 msgstr "невідома версія (%d) або тип модуля (%d)"
 
-#: src/readelf.c:7875
+#: src/readelf.c:7884
 #, c-format
 msgid "cannot get DIE offset: %s"
 msgstr "не вдалося отримати зміщення DIE: %s"
 
-#: src/readelf.c:7884
+#: src/readelf.c:7893
 #, c-format
 msgid "cannot get tag of DIE at offset [%<PRIx64>] in section '%s': %s"
 msgstr ""
 "не вдалося отримати мітку DIE за зміщенням [%<PRIu64>] у розділі «%s»: %s"
 
-#: src/readelf.c:7922
+#: src/readelf.c:7929
 #, c-format
 msgid "cannot get next DIE: %s\n"
 msgstr "не вдалося визначити наступний DIE: %s\n"
 
-#: src/readelf.c:7930
+#: src/readelf.c:7937
 #, c-format
 msgid "cannot get next DIE: %s"
 msgstr "не вдалося визначити наступний DIE: %s"
 
-#: src/readelf.c:7974
+#: src/readelf.c:7981
 #, c-format
 msgid ""
 " Split compilation unit at offset %<PRIu64>:\n"
@@ -5460,7 +5722,7 @@
 " Версія: %<PRIu16>, Зміщення розділу скорочень: %<PRIu64>, Адреса: %<PRIu8>, "
 "Зміщення: %<PRIu8>\n"
 
-#: src/readelf.c:8026
+#: src/readelf.c:8033
 #, c-format
 msgid ""
 "\n"
@@ -5471,18 +5733,18 @@
 "Розділ DWARF [%2zu] «%s» зі зміщенням %#<PRIx64>:\n"
 "\n"
 
-#: src/readelf.c:8358
+#: src/readelf.c:8365
 #, c-format
 msgid "unknown form: %s"
 msgstr "невідома форма: %s"
 
-#: src/readelf.c:8389
+#: src/readelf.c:8413
 #, c-format
 msgid "cannot get line data section data: %s"
 msgstr "не вдалося отримати дані розділу лінійних даних: %s"
 
 #. Print what we got so far.
-#: src/readelf.c:8491
+#: src/readelf.c:8517
 #, c-format
 msgid ""
 "\n"
@@ -5515,27 +5777,27 @@
 "\n"
 "Коди операцій:\n"
 
-#: src/readelf.c:8513
+#: src/readelf.c:8539
 #, c-format
 msgid "cannot handle .debug_line version: %u\n"
 msgstr "не вдалося обробити версію .debug_line: %u\n"
 
-#: src/readelf.c:8521
+#: src/readelf.c:8547
 #, c-format
 msgid "cannot handle address size: %u\n"
 msgstr "не вдалося обробити розмір адреси: %u\n"
 
-#: src/readelf.c:8529
+#: src/readelf.c:8555
 #, c-format
 msgid "cannot handle segment selector size: %u\n"
 msgstr "не вдалося обробити розмір селектора сегментів: %u\n"
 
-#: src/readelf.c:8539
+#: src/readelf.c:8565
 #, c-format
 msgid "invalid data at offset %tu in section [%zu] '%s'"
 msgstr "некоректні дані зі зміщенням %tu у розділі [%zu] «%s»"
 
-#: src/readelf.c:8554
+#: src/readelf.c:8580
 #, c-format
 msgid "  [%*<PRIuFAST8>]  %hhu argument\n"
 msgid_plural "  [%*<PRIuFAST8>]  %hhu arguments\n"
@@ -5543,7 +5805,7 @@
 msgstr[1] "  [%*<PRIuFAST8>]  %hhu аргументи\n"
 msgstr[2] "  [%*<PRIuFAST8>]  %hhu аргументів\n"
 
-#: src/readelf.c:8565
+#: src/readelf.c:8591
 msgid ""
 "\n"
 "Directory table:"
@@ -5551,12 +5813,12 @@
 "\n"
 "Таблиця каталогу:"
 
-#: src/readelf.c:8571 src/readelf.c:8648
+#: src/readelf.c:8597 src/readelf.c:8674
 #, c-format
 msgid "      ["
 msgstr "      ["
 
-#: src/readelf.c:8642
+#: src/readelf.c:8668
 msgid ""
 "\n"
 "File name table:"
@@ -5564,11 +5826,11 @@
 "\n"
 " Таблиця назв файлів:"
 
-#: src/readelf.c:8703
+#: src/readelf.c:8729
 msgid " Entry Dir   Time      Size      Name"
 msgstr " Запис Кат   Час       Розмір    Назва"
 
-#: src/readelf.c:8742
+#: src/readelf.c:8775
 #, fuzzy
 msgid ""
 "\n"
@@ -5577,7 +5839,7 @@
 "\n"
 "Оператори номерів рядків:"
 
-#: src/readelf.c:8746
+#: src/readelf.c:8779
 msgid ""
 "\n"
 "Line number statements:"
@@ -5585,118 +5847,129 @@
 "\n"
 "Оператори номерів рядків:"
 
-#: src/readelf.c:8766
+#: src/readelf.c:8794
 #, c-format
 msgid "invalid maximum operations per instruction is zero"
 msgstr "некоректну кількість операцій на інструкцію прирівняно до нуля"
 
-#: src/readelf.c:8800
+#: src/readelf.c:8828
 #, c-format
 msgid " special opcode %u: address+%u = "
 msgstr " спеціальний код операції %u: адреса+%u = "
 
-#: src/readelf.c:8804
+#: src/readelf.c:8832
 #, c-format
 msgid ", op_index = %u, line%+d = %zu\n"
 msgstr ", індекс_оп = %u, рядок%+d = %zu\n"
 
-#: src/readelf.c:8807
+#: src/readelf.c:8835
 #, c-format
 msgid ", line%+d = %zu\n"
 msgstr ", рядок%+d = %zu\n"
 
-#: src/readelf.c:8825
+#: src/readelf.c:8853
 #, c-format
 msgid " extended opcode %u: "
 msgstr " розширений код операції %u: "
 
-#: src/readelf.c:8830
+#: src/readelf.c:8858
 msgid " end of sequence"
 msgstr " кінець послідовності"
 
-#: src/readelf.c:8848
+#: src/readelf.c:8876
 #, c-format
 msgid " set address to "
 msgstr " встановити адресу у значення "
 
-#: src/readelf.c:8876
+#: src/readelf.c:8904
 #, c-format
 msgid " define new file: dir=%u, mtime=%<PRIu64>, length=%<PRIu64>, name=%s\n"
 msgstr ""
 " визначення нового файла: dir=%u, mtime=%<PRIu64>, довжина=%<PRIu64>, назва="
 "%s\n"
 
-#: src/readelf.c:8890
+#: src/readelf.c:8918
 #, c-format
 msgid " set discriminator to %u\n"
 msgstr " встановити розрізнення для %u\n"
 
+#: src/readelf.c:8945
+#, c-format
+msgid " set inlined context %u, function name %s (0x%x)\n"
+msgstr ""
+
+#: src/readelf.c:8969
+#, fuzzy, c-format
+#| msgid "Also show function names"
+msgid " set function name %s (0x%x)\n"
+msgstr "Показувати також назви функцій"
+
 #. Unknown, ignore it.
-#: src/readelf.c:8895
+#: src/readelf.c:8976
 msgid " unknown opcode"
 msgstr " невідомий код операції"
 
 #. Takes no argument.
-#: src/readelf.c:8907
+#: src/readelf.c:8988
 msgid " copy"
 msgstr " копія"
 
-#: src/readelf.c:8918
+#: src/readelf.c:8999
 #, c-format
 msgid " advance address by %u to "
 msgstr " збільшення адреси на %u до "
 
-#: src/readelf.c:8922 src/readelf.c:8983
+#: src/readelf.c:9003 src/readelf.c:9064
 #, c-format
 msgid ", op_index to %u"
 msgstr ", op_index до %u"
 
-#: src/readelf.c:8934
+#: src/readelf.c:9015
 #, c-format
 msgid " advance line by constant %d to %<PRId64>\n"
 msgstr " просувати рядок на сталу %d до %<PRId64>\n"
 
-#: src/readelf.c:8944
+#: src/readelf.c:9025
 #, c-format
 msgid " set file to %<PRIu64>\n"
 msgstr " встановити файл у %<PRIu64>\n"
 
-#: src/readelf.c:8955
+#: src/readelf.c:9036
 #, c-format
 msgid " set column to %<PRIu64>\n"
 msgstr " встановити значення стовпчика %<PRIu64>\n"
 
-#: src/readelf.c:8962
+#: src/readelf.c:9043
 #, c-format
 msgid " set '%s' to %<PRIuFAST8>\n"
 msgstr " встановити «%s» у %<PRIuFAST8>\n"
 
 #. Takes no argument.
-#: src/readelf.c:8968
+#: src/readelf.c:9049
 msgid " set basic block flag"
 msgstr " встановити прапорець базового блоку"
 
-#: src/readelf.c:8979
+#: src/readelf.c:9060
 #, c-format
 msgid " advance address by constant %u to "
 msgstr " збільшити адресу на сталу величину %u до "
 
-#: src/readelf.c:8999
+#: src/readelf.c:9080
 #, c-format
 msgid " advance address by fixed value %u to \n"
 msgstr " збільшити адресу на фіксовану величину %u до \n"
 
 #. Takes no argument.
-#: src/readelf.c:9009
+#: src/readelf.c:9090
 msgid " set prologue end flag"
 msgstr " встановити прапорець кінця вступу"
 
 #. Takes no argument.
-#: src/readelf.c:9014
+#: src/readelf.c:9095
 msgid " set epilogue begin flag"
 msgstr " встановити прапорець початку епілогу"
 
-#: src/readelf.c:9024
+#: src/readelf.c:9105
 #, c-format
 msgid " set isa to %u\n"
 msgstr " встановити isa у %u\n"
@@ -5704,7 +5977,7 @@
 #. This is a new opcode the generator but not we know about.
 #. Read the parameters associated with it but then discard
 #. everything.  Read all the parameters for this opcode.
-#: src/readelf.c:9033
+#: src/readelf.c:9114
 #, c-format
 msgid " unknown opcode with %<PRIu8> parameter:"
 msgid_plural " unknown opcode with %<PRIu8> parameters:"
@@ -5712,102 +5985,102 @@
 msgstr[1] " невідомий код операції з %<PRIu8> параметрами:"
 msgstr[2] " невідомий код операції з %<PRIu8> параметрами:"
 
-#: src/readelf.c:9073
+#: src/readelf.c:9154
 #, c-format
 msgid "cannot get .debug_loclists content: %s"
 msgstr "не вдалося отримати вміст .debug_loclists: %s"
 
-#: src/readelf.c:9239
+#: src/readelf.c:9320
 #, fuzzy, c-format
 msgid "    <INVALID DATA>\n"
 msgstr "   <НЕКОРЕКТНІ ДАНІ>\n"
 
-#: src/readelf.c:9279
+#: src/readelf.c:9360
 #, c-format
 msgid "invalid loclists data"
 msgstr "некоректні дані loclists"
 
-#: src/readelf.c:9532
+#: src/readelf.c:9613
 #, c-format
 msgid "cannot get .debug_loc content: %s"
 msgstr "не вдалося отримати вміст .debug_loc: %s"
 
-#: src/readelf.c:9745 src/readelf.c:10789
+#: src/readelf.c:9826 src/readelf.c:10870
 msgid "   <INVALID DATA>\n"
 msgstr "   <НЕКОРЕКТНІ ДАНІ>\n"
 
-#: src/readelf.c:9800 src/readelf.c:9963
+#: src/readelf.c:9881 src/readelf.c:10044
 #, c-format
 msgid "cannot get macro information section data: %s"
 msgstr "не вдалося отримати дані розділу відомостей щодо макросів: %s"
 
-#: src/readelf.c:9880
+#: src/readelf.c:9961
 #, c-format
 msgid "%*s*** non-terminated string at end of section"
 msgstr "%*s*** незавершений рядок наприкінці розділу"
 
-#: src/readelf.c:9903
+#: src/readelf.c:9984
 #, c-format
 msgid "%*s*** missing DW_MACINFO_start_file argument at end of section"
 msgstr "%*s*** пропущено аргумент DW_MACINFO_start_file наприкінці розділу"
 
-#: src/readelf.c:10004
+#: src/readelf.c:10085
 #, c-format
 msgid " Offset:             0x%<PRIx64>\n"
 msgstr " Зміщення:           0x%<PRIx64>\n"
 
-#: src/readelf.c:10016
+#: src/readelf.c:10097
 #, c-format
 msgid " Version:            %<PRIu16>\n"
 msgstr " Версія:             %<PRIu16>\n"
 
-#: src/readelf.c:10022 src/readelf.c:10909
+#: src/readelf.c:10103 src/readelf.c:10990
 #, c-format
 msgid "  unknown version, cannot parse section\n"
 msgstr "  невідома версія, не вдалося обробити розділ\n"
 
-#: src/readelf.c:10029
+#: src/readelf.c:10110
 #, c-format
 msgid " Flag:               0x%<PRIx8>"
 msgstr " Прапорець:          0x%<PRIx8>"
 
-#: src/readelf.c:10058
+#: src/readelf.c:10139
 #, c-format
 msgid " Offset length:      %<PRIu8>\n"
 msgstr " Довжина зміщення:   %<PRIu8>\n"
 
-#: src/readelf.c:10066
+#: src/readelf.c:10147
 #, c-format
 msgid " .debug_line offset: 0x%<PRIx64>\n"
 msgstr " зміщення .debug_line: 0x%<PRIx64>\n"
 
-#: src/readelf.c:10091
+#: src/readelf.c:10172
 #, c-format
 msgid "  extension opcode table, %<PRIu8> items:\n"
 msgstr "  таблиця кодів операцій розширень, записів — %<PRIu8>:\n"
 
-#: src/readelf.c:10098
+#: src/readelf.c:10179
 #, c-format
 msgid "    [%<PRIx8>]"
 msgstr "    [%<PRIx8>]"
 
-#: src/readelf.c:10110
+#: src/readelf.c:10191
 #, c-format
 msgid " %<PRIu8> arguments:"
 msgstr " %<PRIu8> аргументів:"
 
-#: src/readelf.c:10125
+#: src/readelf.c:10206
 #, c-format
 msgid " no arguments."
 msgstr " немає аргументів."
 
-#: src/readelf.c:10326
+#: src/readelf.c:10407
 #, c-format
 msgid " [%5d] DIE offset: %6<PRId64>, CU DIE offset: %6<PRId64>, name: %s\n"
 msgstr ""
 " [%5d] зміщення DIE: %6<PRId64>, зміщення CU DIE: %6<PRId64>, назва: %s\n"
 
-#: src/readelf.c:10370
+#: src/readelf.c:10451
 #, c-format
 msgid ""
 "\n"
@@ -5818,37 +6091,43 @@
 "Розділ DWARF [%2zu] «%s» зі зміщенням %#<PRIx64>:\n"
 " %*s  Рядок\n"
 
-#: src/readelf.c:10385
+#. TRANS: the debugstr| prefix makes the string unique.
+#: src/readelf.c:10456
+msgctxt "debugstr"
+msgid "Offset"
+msgstr ""
+
+#: src/readelf.c:10466
 #, c-format
 msgid " *** error, missing string terminator\n"
 msgstr " *** помилка, пропущено роздільник рядків\n"
 
-#: src/readelf.c:10414
+#: src/readelf.c:10495
 #, c-format
 msgid "cannot get .debug_str_offsets section data: %s"
 msgstr "не вдалося отримати дані розділу .debug_str_offsets: %s"
 
-#: src/readelf.c:10513
+#: src/readelf.c:10594
 #, c-format
 msgid " Length:        %8<PRIu64>\n"
 msgstr " Довжина:       %8<PRIu64>\n"
 
-#: src/readelf.c:10515
+#: src/readelf.c:10596
 #, c-format
 msgid " Offset size:   %8<PRIu8>\n"
 msgstr " Розмір зсуву:   %8<PRIu8>\n"
 
-#: src/readelf.c:10529
+#: src/readelf.c:10610
 #, c-format
 msgid " DWARF version: %8<PRIu16>\n"
 msgstr " версія DWARF:  %8<PRIu16>\n"
 
-#: src/readelf.c:10538
+#: src/readelf.c:10619
 #, c-format
 msgid " Padding:       %8<PRIx16>\n"
 msgstr " Заповнення:     %8<PRIx16>\n"
 
-#: src/readelf.c:10592
+#: src/readelf.c:10673
 #, c-format
 msgid ""
 "\n"
@@ -5857,7 +6136,7 @@
 "\n"
 "Розділ таблиці пошуку вікон виклику [%2zu] '.eh_frame_hdr':\n"
 
-#: src/readelf.c:10694
+#: src/readelf.c:10775
 #, c-format
 msgid ""
 "\n"
@@ -5866,22 +6145,22 @@
 "\n"
 "Розділ таблиці обробки виключень [%2zu] '.gcc_except_table':\n"
 
-#: src/readelf.c:10717
+#: src/readelf.c:10798
 #, c-format
 msgid " LPStart encoding:    %#x "
 msgstr " Кодування LPStart:   %#x "
 
-#: src/readelf.c:10729
+#: src/readelf.c:10810
 #, c-format
 msgid " TType encoding:      %#x "
 msgstr " Кодування TType:     %#x "
 
-#: src/readelf.c:10744
+#: src/readelf.c:10825
 #, c-format
 msgid " Call site encoding:  %#x "
 msgstr " Кодування місця виклику:%#x "
 
-#: src/readelf.c:10757
+#: src/readelf.c:10838
 msgid ""
 "\n"
 " Call site table:"
@@ -5889,7 +6168,7 @@
 "\n"
 " Таблиця місця виклику:"
 
-#: src/readelf.c:10771
+#: src/readelf.c:10852
 #, c-format
 msgid ""
 " [%4u] Call site start:   %#<PRIx64>\n"
@@ -5902,12 +6181,12 @@
 "        Місце застосування:   %#<PRIx64>\n"
 "        Дія:                  %u\n"
 
-#: src/readelf.c:10844
+#: src/readelf.c:10925
 #, c-format
 msgid "invalid TType encoding"
 msgstr "некоректне кодування TType"
 
-#: src/readelf.c:10871
+#: src/readelf.c:10952
 #, c-format
 msgid ""
 "\n"
@@ -5916,37 +6195,37 @@
 "\n"
 "Розділ GDB [%2zu] «%s» за зміщенням %#<PRIx64> містить %<PRId64> байтів:\n"
 
-#: src/readelf.c:10900
+#: src/readelf.c:10981
 #, c-format
 msgid " Version:         %<PRId32>\n"
 msgstr " Версія:          %<PRId32>\n"
 
-#: src/readelf.c:10918
+#: src/readelf.c:10999
 #, c-format
 msgid " CU offset:       %#<PRIx32>\n"
 msgstr " зміщення CU:     %#<PRIx32>\n"
 
-#: src/readelf.c:10925
+#: src/readelf.c:11006
 #, c-format
 msgid " TU offset:       %#<PRIx32>\n"
 msgstr " зміщення TU:      %#<PRIx32>\n"
 
-#: src/readelf.c:10932
+#: src/readelf.c:11013
 #, c-format
 msgid " address offset:  %#<PRIx32>\n"
 msgstr " зміщення адреси: %#<PRIx32>\n"
 
-#: src/readelf.c:10939
+#: src/readelf.c:11020
 #, c-format
 msgid " symbol offset:   %#<PRIx32>\n"
 msgstr " зміщення символу: %#<PRIx32>\n"
 
-#: src/readelf.c:10946
+#: src/readelf.c:11027
 #, c-format
 msgid " constant offset: %#<PRIx32>\n"
 msgstr " стале зміщення:  %#<PRIx32>\n"
 
-#: src/readelf.c:10960
+#: src/readelf.c:11041
 #, c-format
 msgid ""
 "\n"
@@ -5955,7 +6234,7 @@
 "\n"
 " Список CU зі зміщенням %#<PRIx32> містить %zu записів:\n"
 
-#: src/readelf.c:10985
+#: src/readelf.c:11066
 #, c-format
 msgid ""
 "\n"
@@ -5964,7 +6243,7 @@
 "\n"
 " Список TU зі зміщенням %#<PRIx32> містить %zu записів:\n"
 
-#: src/readelf.c:11014
+#: src/readelf.c:11095
 #, c-format
 msgid ""
 "\n"
@@ -5973,7 +6252,7 @@
 "\n"
 " Список адрес зі зміщенням %#<PRIx32> містить %zu записів:\n"
 
-#: src/readelf.c:11046
+#: src/readelf.c:11127
 #, c-format
 msgid ""
 "\n"
@@ -5982,18 +6261,18 @@
 "\n"
 " Таблиця символів за зміщенням %#<PRIx32> містить %zu позицій:\n"
 
-#: src/readelf.c:11184
+#: src/readelf.c:11265
 #, c-format
 msgid "cannot get debug context descriptor: %s"
 msgstr "не вдалося отримати дескриптор контексту зневаджування: %s"
 
-#: src/readelf.c:11552 src/readelf.c:12179 src/readelf.c:12290
-#: src/readelf.c:12348
+#: src/readelf.c:11633 src/readelf.c:12260 src/readelf.c:12371
+#: src/readelf.c:12429
 #, c-format
 msgid "cannot convert core note data: %s"
 msgstr "не вдалося перетворити дані запису ядра: %s"
 
-#: src/readelf.c:11915
+#: src/readelf.c:11996
 #, c-format
 msgid ""
 "\n"
@@ -6002,21 +6281,21 @@
 "\n"
 "%*s... <повторюється %u разів> ..."
 
-#: src/readelf.c:12427
+#: src/readelf.c:12508
 msgid "  Owner          Data size  Type\n"
 msgstr "  Власник        Розм. даних Тип\n"
 
-#: src/readelf.c:12456
+#: src/readelf.c:12536
 #, c-format
 msgid "  %-13.*s  %9<PRId32>  %s\n"
 msgstr "  %-13.*s  %9<PRId32>  %s\n"
 
-#: src/readelf.c:12508
+#: src/readelf.c:12588
 #, c-format
 msgid "cannot get content of note: %s"
 msgstr "не вдалося отримати вміст нотатки: %s"
 
-#: src/readelf.c:12542
+#: src/readelf.c:12622
 #, c-format
 msgid ""
 "\n"
@@ -6026,7 +6305,7 @@
 "Розділ записів (note) [%2zu] «%s» з %<PRIu64> байтів за зміщенням "
 "%#0<PRIx64>:\n"
 
-#: src/readelf.c:12565
+#: src/readelf.c:12645
 #, c-format
 msgid ""
 "\n"
@@ -6035,7 +6314,7 @@
 "\n"
 "Сегмент записів з %<PRIu64> байтів за зміщенням %#0<PRIx64>:\n"
 
-#: src/readelf.c:12612
+#: src/readelf.c:12692
 #, c-format
 msgid ""
 "\n"
@@ -6044,12 +6323,12 @@
 "\n"
 "У розділі [%zu] «%s» не міститься даних для створення дампу.\n"
 
-#: src/readelf.c:12639 src/readelf.c:12690
+#: src/readelf.c:12719 src/readelf.c:12770
 #, c-format
 msgid "cannot get data for section [%zu] '%s': %s"
 msgstr "не вдалося отримати дані для розділу [%zu] «%s»: %s"
 
-#: src/readelf.c:12644
+#: src/readelf.c:12724
 #, c-format
 msgid ""
 "\n"
@@ -6058,7 +6337,7 @@
 "\n"
 "Шіст. дамп розділу [%zu] «%s», %<PRIu64> байтів за зміщенням %#0<PRIx64>:\n"
 
-#: src/readelf.c:12649
+#: src/readelf.c:12729
 #, c-format
 msgid ""
 "\n"
@@ -6069,7 +6348,7 @@
 "Шіст. дамп розділу [%zu] «%s», %<PRIu64> байтів (%zd нестиснено) за "
 "зміщенням %#0<PRIx64>:\n"
 
-#: src/readelf.c:12663
+#: src/readelf.c:12743
 #, c-format
 msgid ""
 "\n"
@@ -6078,7 +6357,7 @@
 "\n"
 "У розділі [%zu] «%s» не міститься рядків для створення дампу.\n"
 
-#: src/readelf.c:12695
+#: src/readelf.c:12775
 #, c-format
 msgid ""
 "\n"
@@ -6087,7 +6366,7 @@
 "\n"
 "Розділ рядків [%zu] «%s» містить %<PRIu64> байтів за зміщенням %#0<PRIx64>:\n"
 
-#: src/readelf.c:12700
+#: src/readelf.c:12780
 #, c-format
 msgid ""
 "\n"
@@ -6098,7 +6377,7 @@
 "Рядок розділу [%zu] «%s» містить %<PRIu64> байти (%zd нестиснено) на "
 "зміщенні %#0<PRIx64>:\n"
 
-#: src/readelf.c:12749
+#: src/readelf.c:12829
 #, c-format
 msgid ""
 "\n"
@@ -6107,7 +6386,7 @@
 "\n"
 "розділу [%lu] не існує"
 
-#: src/readelf.c:12779
+#: src/readelf.c:12859
 #, c-format
 msgid ""
 "\n"
@@ -6116,12 +6395,12 @@
 "\n"
 "розділу «%s» не існує"
 
-#: src/readelf.c:12836
+#: src/readelf.c:12916
 #, c-format
 msgid "cannot get symbol index of archive '%s': %s"
 msgstr "не вдалося отримати покажчик символів архіву «%s»: %s"
 
-#: src/readelf.c:12839
+#: src/readelf.c:12919
 #, c-format
 msgid ""
 "\n"
@@ -6130,7 +6409,7 @@
 "\n"
 "У архіві «%s» немає покажчика символів\n"
 
-#: src/readelf.c:12843
+#: src/readelf.c:12923
 #, c-format
 msgid ""
 "\n"
@@ -6139,12 +6418,12 @@
 "\n"
 "Покажчик архіву «%s» містить %zu записів:\n"
 
-#: src/readelf.c:12861
+#: src/readelf.c:12941
 #, c-format
 msgid "cannot extract member at offset %zu in '%s': %s"
 msgstr "не вдалося видобути елемент за зміщенням %zu у «%s»: %s"
 
-#: src/readelf.c:12866
+#: src/readelf.c:12946
 #, c-format
 msgid "Archive member '%s' contains:\n"
 msgstr "Елемент архіву «%s» містить:\n"
@@ -6211,11 +6490,63 @@
 msgid "%s: file format not recognized"
 msgstr "%s: не вдалося розпізнати формат файла"
 
+#: src/size.c:328
+msgctxt "bsd"
+msgid "text"
+msgstr ""
+
+#: src/size.c:329
+msgctxt "bsd"
+msgid "data"
+msgstr ""
+
+#: src/size.c:330
+msgctxt "bsd"
+msgid "bss"
+msgstr ""
+
+#: src/size.c:331
+msgctxt "bsd"
+msgid "dec"
+msgstr ""
+
+#: src/size.c:332
+msgctxt "bsd"
+msgid "hex"
+msgstr ""
+
+#: src/size.c:333
+msgctxt "bsd"
+msgid "filename"
+msgstr ""
+
 #: src/size.c:418 src/size.c:560
 #, c-format
 msgid " (ex %s)"
 msgstr " (прикл. %s)"
 
+#: src/size.c:420
+#, fuzzy
+#| msgid "invalid section"
+msgctxt "sysv"
+msgid "section"
+msgstr "некоректний розділ"
+
+#: src/size.c:421
+msgctxt "sysv"
+msgid "size"
+msgstr ""
+
+#: src/size.c:422
+msgctxt "sysv"
+msgid "addr"
+msgstr ""
+
+#: src/size.c:451 src/size.c:454 src/size.c:457
+msgctxt "sysv"
+msgid "Total"
+msgstr ""
+
 #: src/size.c:482
 #, c-format
 msgid "cannot get section header"
@@ -6541,17 +6872,17 @@
 msgid "bad relocation"
 msgstr "помилкове пересування"
 
-#: src/strip.c:747 src/strip.c:771
+#: src/strip.c:751 src/strip.c:775
 #, c-format
 msgid "cannot stat input file '%s'"
 msgstr "не вдалося отримати дані з вхідного файла «%s» за допомогою stat"
 
-#: src/strip.c:761
+#: src/strip.c:765
 #, c-format
 msgid "while opening '%s'"
 msgstr "під час спроби відкриття «%s»"
 
-#: src/strip.c:799
+#: src/strip.c:803
 #, c-format
 msgid "%s: cannot use -o or -f when stripping archive"
 msgstr ""
@@ -6564,133 +6895,133 @@
 #. result = handle_ar (fd, elf, NULL, fname,
 #. preserve_dates ? tv : NULL);
 #.
-#: src/strip.c:811
+#: src/strip.c:815
 #, c-format
 msgid "%s: no support for stripping archive"
 msgstr "%s: підтримки вилучення додаткового вмісту з архіву не передбачено"
 
-#: src/strip.c:1047
+#: src/strip.c:1052
 #, c-format
 msgid "cannot open EBL backend"
 msgstr "не вдалося відкрити канал сервера EBL"
 
-#: src/strip.c:1092
+#: src/strip.c:1097
 #, c-format
 msgid "cannot get number of phdrs"
 msgstr "не вдалося отримати кількість phdr"
 
-#: src/strip.c:1106 src/strip.c:1149
+#: src/strip.c:1111 src/strip.c:1154
 #, c-format
 msgid "cannot create new ehdr for file '%s': %s"
 msgstr "не вдалося створити ehdr для файла «%s»: %s"
 
-#: src/strip.c:1116 src/strip.c:1159
+#: src/strip.c:1121 src/strip.c:1164
 #, c-format
 msgid "cannot create new phdr for file '%s': %s"
 msgstr "не вдалося створити phdr для файла «%s»: %s"
 
-#: src/strip.c:1240
+#: src/strip.c:1244
 #, c-format
 msgid "illformed file '%s'"
 msgstr "помилкове форматування файла «%s»"
 
-#: src/strip.c:1250
+#: src/strip.c:1254
 #, c-format
 msgid "Cannot remove allocated section '%s'"
 msgstr "Неможливо вилучити розміщений у пам'яті розділ «%s»"
 
-#: src/strip.c:1259
+#: src/strip.c:1263
 #, c-format
 msgid "Cannot both keep and remove section '%s'"
 msgstr "Неможливо одночасно зберегти та вилучити розділ «%s»"
 
-#: src/strip.c:1624 src/strip.c:1739
+#: src/strip.c:1628 src/strip.c:1743
 #, c-format
 msgid "while generating output file: %s"
 msgstr "під час спроби створення файла з виведеними даними: %s"
 
-#: src/strip.c:1688
+#: src/strip.c:1692
 #, c-format
 msgid "%s: error while updating ELF header: %s"
 msgstr "%s: помилка під час оновлення заголовка ELF: %s"
 
-#: src/strip.c:1697
+#: src/strip.c:1701
 #, c-format
 msgid "%s: error while getting shdrstrndx: %s"
 msgstr "%s: помилка під час отримання shdrstrndx: %s"
 
-#: src/strip.c:1705 src/strip.c:2550
+#: src/strip.c:1709 src/strip.c:2554
 #, c-format
 msgid "%s: error updating shdrstrndx: %s"
 msgstr "%s: помилка під час оновлення shdrstrndx: %s"
 
-#: src/strip.c:1722
+#: src/strip.c:1726
 #, c-format
 msgid "while preparing output for '%s'"
 msgstr "під час приготування виведених даних для «%s»"
 
-#: src/strip.c:1784 src/strip.c:1847
+#: src/strip.c:1788 src/strip.c:1851
 #, c-format
 msgid "while create section header section: %s"
 msgstr "під час створення розділу заголовка розділу: %s"
 
-#: src/strip.c:1793
+#: src/strip.c:1797
 #, c-format
 msgid "cannot allocate section data: %s"
 msgstr "не вдалося розмістити дані розділу: %s"
 
-#: src/strip.c:1859
+#: src/strip.c:1863
 #, c-format
 msgid "while create section header string table: %s"
 msgstr "під час створення таблиці рядків заголовка розділу: %s"
 
-#: src/strip.c:1866
+#: src/strip.c:1870
 #, c-format
 msgid "no memory to create section header string table"
 msgstr "недостатньо пам'яті для створення таблиці рядків заголовка розділу"
 
-#: src/strip.c:2079
+#: src/strip.c:2083
 #, c-format
 msgid "Cannot remove symbol [%zd] from allocated symbol table [%zd]"
 msgstr ""
 "Неможливо вилучити символ [%zd] з розміщеної у пам'яті таблиці символів [%zd]"
 
-#: src/strip.c:2466 src/strip.c:2574
+#: src/strip.c:2470 src/strip.c:2578
 #, c-format
 msgid "while writing '%s': %s"
 msgstr "під час запису «%s»: %s"
 
-#: src/strip.c:2477
+#: src/strip.c:2481
 #, c-format
 msgid "while creating '%s'"
 msgstr "під час спроби створення «%s»"
 
-#: src/strip.c:2500
+#: src/strip.c:2504
 #, c-format
 msgid "while computing checksum for debug information"
 msgstr "під час обчислення контрольної суми для діагностичних даних"
 
-#: src/strip.c:2541
+#: src/strip.c:2545
 #, c-format
 msgid "%s: error while creating ELF header: %s"
 msgstr "%s: помилка під час створення заголовка ELF: %s"
 
-#: src/strip.c:2559
+#: src/strip.c:2563
 #, c-format
 msgid "%s: error while reading the file: %s"
 msgstr "%s: помилка під час читання файла: %s"
 
-#: src/strip.c:2599 src/strip.c:2619
+#: src/strip.c:2603 src/strip.c:2623
 #, c-format
 msgid "while writing '%s'"
 msgstr "під час спроби запису «%s»"
 
-#: src/strip.c:2656 src/strip.c:2663
+#: src/strip.c:2660 src/strip.c:2667
 #, c-format
 msgid "error while finishing '%s': %s"
 msgstr "помилка під час завершення «%s»: %s"
 
-#: src/strip.c:2680 src/strip.c:2756
+#: src/strip.c:2684 src/strip.c:2760
 #, c-format
 msgid "cannot set access and modification date of '%s'"
 msgstr "не вдалося встановити права доступу та дату зміни «%s»"
@@ -6783,7 +7114,7 @@
 msgid "cannot get shdrstrndx:%s"
 msgstr "не вдалося отримати shdrstrndx:%s"
 
-#: src/unstrip.c:244 src/unstrip.c:2085
+#: src/unstrip.c:244 src/unstrip.c:2088
 #, c-format
 msgid "cannot get ELF header: %s"
 msgstr "не вдалося отримати заголовок ELF: %s"
@@ -6803,12 +7134,12 @@
 msgid "cannot copy ELF header: %s"
 msgstr "не вдалося скопіювати заголовок ELF: %s"
 
-#: src/unstrip.c:265 src/unstrip.c:2103 src/unstrip.c:2146
+#: src/unstrip.c:265 src/unstrip.c:2106 src/unstrip.c:2149
 #, c-format
 msgid "cannot get number of program headers: %s"
 msgstr "не вдалося отримати кількість заголовків програми: %s"
 
-#: src/unstrip.c:270 src/unstrip.c:2107
+#: src/unstrip.c:270 src/unstrip.c:2110
 #, c-format
 msgid "cannot create program headers: %s"
 msgstr "не вдалося створити заголовки програми: %s"
@@ -6823,12 +7154,12 @@
 msgid "cannot copy section header: %s"
 msgstr "не вдалося скопіювати заголовок розділу: %s"
 
-#: src/unstrip.c:289 src/unstrip.c:1707
+#: src/unstrip.c:289 src/unstrip.c:1710
 #, c-format
 msgid "cannot get section data: %s"
 msgstr "не вдалося отримати дані розділу: %s"
 
-#: src/unstrip.c:291 src/unstrip.c:1709
+#: src/unstrip.c:291 src/unstrip.c:1712
 #, c-format
 msgid "cannot copy section data: %s"
 msgstr "не вдалося скопіювати дані розділу: %s"
@@ -6838,14 +7169,14 @@
 msgid "cannot create directory '%s'"
 msgstr "не вдалося створити каталог «%s»"
 
-#: src/unstrip.c:393 src/unstrip.c:655 src/unstrip.c:689 src/unstrip.c:857
-#: src/unstrip.c:1749
+#: src/unstrip.c:393 src/unstrip.c:659 src/unstrip.c:693 src/unstrip.c:861
+#: src/unstrip.c:1752
 #, c-format
 msgid "cannot get symbol table entry: %s"
 msgstr "не вдалося отримати запис таблиці символів: %s"
 
-#: src/unstrip.c:409 src/unstrip.c:658 src/unstrip.c:679 src/unstrip.c:692
-#: src/unstrip.c:1770 src/unstrip.c:1965 src/unstrip.c:1989
+#: src/unstrip.c:409 src/unstrip.c:662 src/unstrip.c:683 src/unstrip.c:696
+#: src/unstrip.c:1773 src/unstrip.c:1968 src/unstrip.c:1992
 #, c-format
 msgid "cannot update symbol table: %s"
 msgstr "не вдалося оновити таблицю символів: %s"
@@ -6855,167 +7186,177 @@
 msgid "cannot update section header: %s"
 msgstr "не вдалося оновити заголовок розділу: %s"
 
-#: src/unstrip.c:465 src/unstrip.c:479
+#: src/unstrip.c:465
+#, c-format
+msgid "gelf_getrel failed: %s"
+msgstr ""
+
+#: src/unstrip.c:468 src/unstrip.c:483
 #, c-format
 msgid "cannot update relocation: %s"
 msgstr "не вдалося оновити пересування: %s"
 
-#: src/unstrip.c:578
+#: src/unstrip.c:480
+#, c-format
+msgid "gelf_getrela failed: %s"
+msgstr ""
+
+#: src/unstrip.c:582
 #, c-format
 msgid "cannot get symbol version: %s"
 msgstr "не вдалося отримати версію символу: %s"
 
-#: src/unstrip.c:591
+#: src/unstrip.c:595
 #, c-format
 msgid "unexpected section type in [%zu] with sh_link to symtab"
 msgstr "неочікуваний тип розділу у [%zu] з посиланням sh_link на symtab"
 
-#: src/unstrip.c:846
+#: src/unstrip.c:850
 #, c-format
 msgid "cannot get symbol section data: %s"
 msgstr "не вдалося отримати дані розділу символів: %s"
 
-#: src/unstrip.c:848
+#: src/unstrip.c:852
 #, c-format
 msgid "cannot get string section data: %s"
 msgstr "не вдалося отримати дані розділу рядків: %s"
 
-#: src/unstrip.c:865
+#: src/unstrip.c:869
 #, c-format
 msgid "invalid string offset in symbol [%zu]"
 msgstr "некоректне зміщення рядка у символі [%zu]"
 
-#: src/unstrip.c:1023 src/unstrip.c:1427
+#: src/unstrip.c:1027 src/unstrip.c:1435
 #, c-format
 msgid "cannot read section [%zu] name: %s"
 msgstr "не вдалося прочитати назву розділу [%zu]: %s"
 
-#: src/unstrip.c:1038
+#: src/unstrip.c:1042
 #, c-format
 msgid "bad sh_link for group section: %s"
 msgstr "помилкове значення sh_link для розділу груп: %s"
 
-#: src/unstrip.c:1044
+#: src/unstrip.c:1048
 #, c-format
 msgid "couldn't get shdr for group section: %s"
 msgstr "не вдалося отримати shdr для розділу груп: %s"
 
-#: src/unstrip.c:1049
+#: src/unstrip.c:1053
 #, c-format
 msgid "bad data for group symbol section: %s"
 msgstr "помилкові дані для розділу символів груп: %s"
 
-#: src/unstrip.c:1055
+#: src/unstrip.c:1059
 #, c-format
 msgid "couldn't get symbol for group section: %s"
 msgstr "не вдалося отримати символ для розділу груп: %s"
 
-#: src/unstrip.c:1060
+#: src/unstrip.c:1064
 #, c-format
 msgid "bad symbol name for group section: %s"
 msgstr "помилкова назва символу для розділу груп: %s"
 
-#: src/unstrip.c:1102 src/unstrip.c:1121 src/unstrip.c:1159
-#, c-format
-msgid "cannot read '.gnu.prelink_undo' section: %s"
-msgstr "не вдалося прочитати розділ «.gnu.prelink_undo»: %s"
-
-#: src/unstrip.c:1139
-#, c-format
-msgid "overflow with shnum = %zu in '%s' section"
-msgstr "переповнення з shnum = %zu у розділі «%s»"
-
-#: src/unstrip.c:1150
-#, c-format
-msgid "invalid contents in '%s' section"
-msgstr "некоректний вміст розділу «%s»"
-
-#: src/unstrip.c:1206 src/unstrip.c:1553
+#: src/unstrip.c:1075 src/unstrip.c:1556
 #, c-format
 msgid "cannot find matching section for [%zu] '%s'"
 msgstr "не вдалося знайти відповідний розділ для [%zu] «%s»"
 
-#: src/unstrip.c:1331 src/unstrip.c:1347 src/unstrip.c:1633 src/unstrip.c:1924
+#: src/unstrip.c:1120 src/unstrip.c:1139 src/unstrip.c:1177
+#, c-format
+msgid "cannot read '.gnu.prelink_undo' section: %s"
+msgstr "не вдалося прочитати розділ «.gnu.prelink_undo»: %s"
+
+#: src/unstrip.c:1157
+#, c-format
+msgid "overflow with shnum = %zu in '%s' section"
+msgstr "переповнення з shnum = %zu у розділі «%s»"
+
+#: src/unstrip.c:1168
+#, c-format
+msgid "invalid contents in '%s' section"
+msgstr "некоректний вміст розділу «%s»"
+
+#: src/unstrip.c:1339 src/unstrip.c:1355 src/unstrip.c:1636 src/unstrip.c:1927
 #, c-format
 msgid "cannot add section name to string table: %s"
 msgstr "не вдалося додати назву розділу до таблиці рядків: %s"
 
-#: src/unstrip.c:1356
+#: src/unstrip.c:1364
 #, c-format
 msgid "cannot update section header string table data: %s"
 msgstr "не вдалося оновити дані заголовка розділу у таблиці рядків: %s"
 
-#: src/unstrip.c:1385 src/unstrip.c:1389
+#: src/unstrip.c:1393 src/unstrip.c:1397
 #, c-format
 msgid "cannot get section header string table section index: %s"
 msgstr ""
 "не вдалося визначити індекс розділу заголовка розділу у таблиці рядків: %s"
 
-#: src/unstrip.c:1393 src/unstrip.c:1397 src/unstrip.c:1648
+#: src/unstrip.c:1401 src/unstrip.c:1405 src/unstrip.c:1651
 #, c-format
 msgid "cannot get section count: %s"
 msgstr "не вдалося отримати кількість розділів: %s"
 
-#: src/unstrip.c:1400
+#: src/unstrip.c:1408
 #, c-format
 msgid "more sections in stripped file than debug file -- arguments reversed?"
 msgstr ""
 "у очищеному файлі більше розділів ніж у файлі з даними для зневаджування — "
 "помилковий порядок параметрів?"
 
-#: src/unstrip.c:1404
+#: src/unstrip.c:1412
 #, c-format
 msgid "no sections in stripped file"
 msgstr "у очищеному файлі немає розділів"
 
-#: src/unstrip.c:1475 src/unstrip.c:1568
+#: src/unstrip.c:1460 src/unstrip.c:1571
 #, c-format
 msgid "cannot read section header string table: %s"
 msgstr "не вдалося прочитати таблицю рядків заголовка розділу: %s"
 
-#: src/unstrip.c:1627
+#: src/unstrip.c:1630
 #, c-format
 msgid "cannot add new section: %s"
 msgstr "не вдалося додати новий розділ: %s"
 
-#: src/unstrip.c:1757
+#: src/unstrip.c:1760
 #, c-format
 msgid "symbol [%zu] has invalid section index"
 msgstr "символ [%zu] має некоректний індекс розділу"
 
-#: src/unstrip.c:1789
+#: src/unstrip.c:1792
 #, c-format
 msgid "group has invalid section index [%zd]"
 msgstr "група містить некоректний індекс розділу [%zd]"
 
-#: src/unstrip.c:2064
+#: src/unstrip.c:2067
 #, c-format
 msgid "cannot read section data: %s"
 msgstr "не вдалося прочитати дані розділу: %s"
 
-#: src/unstrip.c:2093
+#: src/unstrip.c:2096
 #, c-format
 msgid "cannot update ELF header: %s"
 msgstr "не вдалося оновити заголовок ELF: %s"
 
-#: src/unstrip.c:2117
+#: src/unstrip.c:2120
 #, c-format
 msgid "cannot update program header: %s"
 msgstr "не вдалося оновити заголовок програми: %s"
 
-#: src/unstrip.c:2122 src/unstrip.c:2205
+#: src/unstrip.c:2125 src/unstrip.c:2208
 #, c-format
 msgid "cannot write output file: %s"
 msgstr "не вдалося записати файл виведених даних: %s"
 
-#: src/unstrip.c:2173
+#: src/unstrip.c:2176
 #, c-format
 msgid "DWARF data not adjusted for prelinking bias; consider prelink -u"
 msgstr ""
 "Дані DWARF не скориговано відповідно до відхилення перед компонуванням; "
 "спробуйте виправити це командою prelink -u"
 
-#: src/unstrip.c:2176
+#: src/unstrip.c:2179
 #, c-format
 msgid ""
 "DWARF data in '%s' not adjusted for prelinking bias; consider prelink -u"
@@ -7023,76 +7364,76 @@
 "Дані DWARF у «%s» не скориговано відповідно до відхилення перед "
 "компонуванням; спробуйте виправити це командою prelink -u"
 
-#: src/unstrip.c:2196 src/unstrip.c:2247 src/unstrip.c:2259 src/unstrip.c:2345
+#: src/unstrip.c:2199 src/unstrip.c:2251 src/unstrip.c:2263 src/unstrip.c:2353
 #, c-format
 msgid "cannot create ELF descriptor: %s"
 msgstr "не вдалося створити дескриптор ELF: %s"
 
-#: src/unstrip.c:2238
+#: src/unstrip.c:2237
 msgid "WARNING: "
 msgstr "УВАГА: "
 
-#: src/unstrip.c:2240
+#: src/unstrip.c:2239
 msgid ", use --force"
 msgstr ", скористайтеся --force"
 
-#: src/unstrip.c:2263
+#: src/unstrip.c:2267
 msgid "ELF header identification (e_ident) different"
 msgstr "Різні ідентифікатори заголовків ELF (e_ident)"
 
-#: src/unstrip.c:2266
+#: src/unstrip.c:2271
 msgid "ELF header type (e_type) different"
 msgstr "Різні типи заголовків ELF (e_type)"
 
-#: src/unstrip.c:2269
+#: src/unstrip.c:2275
 msgid "ELF header machine type (e_machine) different"
 msgstr "Різні типи архітектур заголовків ELF (e_machine)"
 
-#: src/unstrip.c:2272
+#: src/unstrip.c:2279
 msgid "stripped program header (e_phnum) smaller than unstripped"
 msgstr "очищений заголовок програми (e_phnum) є меншим за неочищений"
 
-#: src/unstrip.c:2302
+#: src/unstrip.c:2310
 #, c-format
 msgid "cannot find stripped file for module '%s': %s"
 msgstr "не вдалося знайти очищений файл для модуля «%s»: %s"
 
-#: src/unstrip.c:2306
+#: src/unstrip.c:2314
 #, c-format
 msgid "cannot open stripped file '%s' for module '%s': %s"
 msgstr "не вдалося відкрити очищений файл «%s» для модуля «%s»: %s"
 
-#: src/unstrip.c:2321
+#: src/unstrip.c:2329
 #, c-format
 msgid "cannot find debug file for module '%s': %s"
 msgstr "не вдалося знайти файл діагностичних даних для модуля «%s»: %s"
 
-#: src/unstrip.c:2325
+#: src/unstrip.c:2333
 #, c-format
 msgid "cannot open debug file '%s' for module '%s': %s"
 msgstr "не вдалося відкрити файл діагностичних даних «%s» для модуля «%s»: %s"
 
-#: src/unstrip.c:2338
+#: src/unstrip.c:2346
 #, c-format
 msgid "module '%s' file '%s' is not stripped"
 msgstr "у модулі «%s» файл «%s» не очищено strip"
 
-#: src/unstrip.c:2369
+#: src/unstrip.c:2377
 #, c-format
 msgid "cannot cache section addresses for module '%s': %s"
 msgstr "не вдалося кешувати адреси розділів для модуля «%s»: %s"
 
-#: src/unstrip.c:2501
+#: src/unstrip.c:2505
 #, c-format
 msgid "no matching modules found"
 msgstr "відповідних модулів не виявлено"
 
-#: src/unstrip.c:2510
+#: src/unstrip.c:2515
 #, c-format
 msgid "matched more than one module"
 msgstr "встановлено відповідність декількох модулів"
 
-#: src/unstrip.c:2554
+#: src/unstrip.c:2560
 msgid ""
 "STRIPPED-FILE DEBUG-FILE\n"
 "[MODULE...]"
@@ -7100,7 +7441,7 @@
 "ОЧИЩЕНИЙ-ФАЙЛ ФАЙЛ-DEBUG\n"
 "[МОДУЛЬ...]"
 
-#: src/unstrip.c:2555
+#: src/unstrip.c:2561
 msgid ""
 "Combine stripped files with separate symbols and debug information.\n"
 "\n"
@@ -7159,7 +7500,23 @@
 "окремого файла діагностичних даних або «-», якщо файла діагностичних даних "
 "не вдалося знайти, і «.», якщо ФАЙЛ сам містить діагностичні дані."
 
-#: tests/backtrace.c:436
+#. Short description of program.
+#: debuginfod/debuginfod-find.c:42
+msgid "Request debuginfo-related content from debuginfods listed in $"
+msgstr ""
+
+#. Strings for arguments in help texts.
+#: debuginfod/debuginfod-find.c:46
+msgid ""
+"debuginfo BUILDID\n"
+"debuginfo PATH\n"
+"executable BUILDID\n"
+"executable PATH\n"
+"source BUILDID /FILENAME\n"
+"source PATH /FILENAME\n"
+msgstr ""
+
+#: tests/backtrace.c:483
 msgid "Run executable"
 msgstr "Запустити виконуваний файл"
 
@@ -7171,6 +7528,10 @@
 msgid "Show instances of inlined functions"
 msgstr "Вивести екземпляри вбудованих функцій"
 
+#, c-format
+#~ msgid "cannot allocate memory"
+#~ msgstr "не вдалося розподілити пам’ять"
+
 #~ msgid ""
 #~ " [%6tx] base address\n"
 #~ "          "
@@ -7481,18 +7842,12 @@
 #~ msgid "unknown option `-%c %s'"
 #~ msgstr "невідомий параметр «-%c %s»"
 
-#~ msgid "invalid page size value '%s': ignored"
-#~ msgstr "некоректне значення розміру сторінки «%s»: проігноровано"
-
 #~ msgid "invalid hash style '%s'"
 #~ msgstr "некоректний формат хешування «%s»"
 
 #~ msgid "invalid build-ID style '%s'"
 #~ msgstr "некоректний формат ідентифікатора збирання «%s»"
 
-#~ msgid "More than one output file name given."
-#~ msgstr "Вказано декілька назв файлів виведення даних."
-
 #~ msgid "Invalid optimization level `%s'"
 #~ msgstr "Некоректний рівень оптимізації «%s»"
 
@@ -7716,9 +8071,6 @@
 #~ msgid "while reading version script '%s': %s at line %d"
 #~ msgstr "під час читання скрипту версій «%s»: %s у рядку %d"
 
-#~ msgid "while reading linker script '%s': %s at line %d"
-#~ msgstr "під час читання скрипту компонування «%s»: %s у рядку %d"
-
 #~ msgid ""
 #~ "symbol '%s' is declared both local and global for unnamed version '%s'"
 #~ msgstr ""
diff --git a/src/ChangeLog b/src/ChangeLog
index e65620f..05b2522 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,185 @@
+2021-10-20  John M Mellor-Crummey  <johnmc@rice.edu>
+
+	* readelf.c (print_debug_line_section): Try to read
+	debug_str_offset if available.  Handle DW_LNE_NVIDIA_inlined_call
+	and DW_LNE_NVIDIA_set_function_name.
+
+2021-10-06  Mark Wielaard  <mark@klomp.org>
+
+	* elflint.c (check_sections): Don't dereference databits if bad.
+
+2021-09-09  Dmitry V. Levin  <ldv@altlinux.org>
+
+	* findtextrel.c: Include "libeu.h".
+	(open_rootdir_file): New function.
+	(process_file): Use it to open file inside rootdir.
+	* Makefile.am (findtextrel_no_Wstack_usage): Remove.
+
+2021-09-06  Dmitry V. Levin  <ldv@altlinux.org>
+
+	* objdump.c (show_disasm): Replace asprintf followed by
+	error(EXIT_FAILURE) with xasprintf.
+	* readelf.c (handle_gnu_hash): Likewise.
+	* unstrip.c (handle_output_dir_module, main): Likewise.
+
+	* elflint.c (check_sections): Remove cast of xcalloc return value.
+	* findtextrel.c (process_file): Remove casts of malloc and realloc
+	return values.
+	* nm.c (get_local_names, show_symbols_sysv, show_symbols): Remove
+	casts of xmalloc return values.
+	* readelf.c (print_hash_info, handle_sysv_hash, handle_sysv_hash64,
+	handle_gnu_hash): Remove cast of xcalloc return value.
+	(print_debug_units): Remove casts of xmalloc return values.
+	* strip.c (handle_elf): Remove casts of xcalloc and xmalloc return
+	values.
+
+2021-09-05  Dmitry V. Levin  <ldv@altlinux.org>
+
+	* Makefile.am (AM_LDFLAGS): Add $(STACK_USAGE_NO_ERROR).
+
+2021-08-20  Saleem Abdulrasool  <abdulras@google.com>
+
+	* elfclassify.c: Remove error.h include.
+
+2021-03-18  Timm Bäder  <tbaeder@redhat.com>
+
+	* readelf.c (run_advance_pc): New static inline function
+	lifted from...
+	(print_debug_line_section): ... here. Define advance_pc
+	using run_advance_pc.
+
+2021-07-03  Mark Wielaard  <mark@klomp.org>
+
+	* readelf.c (compare_listptr): Fix dwarf_attr_name argument.
+
+2021-06-18  Mark Wielaard  <mark@klomp.org>
+
+	* unstrip.c (adjust_relocs): Check gelf_getrel and geld_getrela.
+
+2021-06-18  Mark Wielaard  <mark@klomp.org>
+
+	* strip.c (remove_debug_relocations): Check gelf_update results.
+	(update_section_size): Likewise.
+
+2021-06-06  Sergei Trofimovich  <slyfox@gentoo.org>
+
+	* elflint.c (buffer_left): Mark as 'static' to avoid external linkage
+	failure.
+
+2021-05-12  Dmitry V. Levin  <ldv@altlinux.org>
+
+	* elfcompress.c (process_file): Return 1 instead of -1 in case of an
+	error.
+
+	* elfcompress.c (process_file): Remove redundant assignment in case of
+	"Nothing to do".
+
+	* elfcompress.c (process_file): Set res to 0 in case of "Nothing to do".
+
+2021-04-19  Martin Liska  <mliska@suse.cz>
+
+	* elfclassify.c (run_classify): Use startswith.
+	* elfcompress.c (process_file): Likewise.
+	* nm.c (show_symbols_sysv): Likewise.
+	* readelf.c (print_debug): Likewise.
+	(handle_notes_data): Likewise.
+	(dump_data_section): Likewise.
+	(print_string_section): Likewise.
+	* strip.c (remove_debug_relocations): Likewise.
+
+2021-04-03  Mark Wielaard  <mark@klomp.org>
+
+	* nm.c (show_symbols): close dwfl_fd if dwfl_begin fails.
+
+2021-04-03  Mark Wielaard  <mark@klomp.org>
+
+	* unstrip.c (handle_output_dir_module): Free output_file when done.
+
+2021-04-03  Mark Wielaard  <mark@klomp.org>
+
+	* ar.c (do_oper_insert): Always close newfd.
+
+2021-03-03  Mark Wielaard  <mark@klomp.org>
+
+	* readelf.c (handle_symtab): Sanity check verneed vna_next,
+	vn_next and verdef vd_next offsets.
+
+2021-03-02  Timm Bäder  <tbaeder@redhat.com>
+
+	* elfcompress.c (process_file): Remove cleanup() function and
+	replace it with a cleanup label at the end of the function.
+	Initialize res to -1.
+
+2021-02-17  Timm Bäder  <tbaeder@redhat.com>
+
+	* elfcompress.c (process_file): Move get_sections function...
+	(get_section): ...to top-level static function taking an
+	sections array and shnum.
+
+2021-02-17  Timm Bäder  <tbaeder@redhat.com>
+
+	* elfcompress.c (process_file): Move get_section function...
+	(get_section): ...to top-level static function taking an
+	sections array.
+
+2021-02-17  Timm Bäder  <tbaeder@redhat.com>
+
+	* elfcompress.c (process_file): Move set_section function...
+	(set_section): ...to top-level static function taking a
+	section array.
+
+2021-02-17  Timm Bäder  <tbaeder@redhat.com>
+
+	* unstrip.c (handle_implicit_modules): Inline the next function
+	in three places. This is simply dwfl_getmodules with match_module
+	callback providing mmi.
+
+2021-02-17  Timm Bäder  <tbaeder@redhat.com>
+
+	* unstrip.c (handle_explicit_files): Move warn function...
+	(warn): ...here as top-level static function taking stripped,
+	unstripped files and force flag as extra arguments.
+
+2021-02-17  Timm Bäder  <tbaeder@redhat.com>
+
+	* unstrip.c (copy_elided_sections): Inline find_unalloc_section
+	function into calling location. The sec pointer is set to NULL
+	before the if-else statement and only set when match is found.
+
+2021-02-17  Timm Bäder  <tbaeder@redhat.com>
+
+	* unstrip.c (find_alloc_sections_prelink): Move check_match to...
+	(check_match): Adjusted to return whether there was no match,
+	which indicates a failure. So callers are adjusted to or the
+	result into a local fail boolean.
+
+2021-02-17  Timm Bäder  <tbaeder@redhat.com>
+
+	* unstrip.c (adjust_relocs): Move adjust_reloc function to...
+	(adjust_reloc): ... here as static top-level function taking
+	a map array and size as extra arguments.
+
+2021-02-17  Timm Bäder  <tbaeder@redhat.com>
+
+	* elflint.c (check_attributes): Rename and move left function...
+	(buffer_left): ...as static toplevel function taking both an
+	Elf_Data pointer argument and the unsigned char pointer p.
+
+2021-02-17  Timm Bäder  <tbaeder@redhat.com>
+
+	* elflint.c (check_attributes): Rename and move pos function...
+	(buffer_pos): ...as static toplevel function taking an extra
+	Elf_Data pointer argument.
+
+2021-02-12  Mark Wielaard  <mark@klomp.org>
+
+	* readelf.c (print_debug_units): Type DIE offset is from start CU.
+
+2021-02-12  Mark Wielaard  <mark@klomp.org>
+
+	* readelf.c (attr_callback): Don't handle blocks as expression
+	blocks for DWARF version 4 or higher.
+
 2021-02-03 Timm Bäder <tbaeder@redhat.com>
 
 	* ar.c (do_oper_extract): Extract should_truncate_fname function
diff --git a/src/Makefile.am b/src/Makefile.am
index 88d0ac8..6cc019d 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -23,7 +23,7 @@
 	    -I$(srcdir)/../libdw -I$(srcdir)/../libdwelf \
 	    -I$(srcdir)/../libdwfl -I$(srcdir)/../libasm
 
-AM_LDFLAGS = -Wl,-rpath-link,../libelf:../libdw
+AM_LDFLAGS = -Wl,-rpath-link,../libelf:../libdw $(STACK_USAGE_NO_ERROR)
 
 bin_PROGRAMS = readelf nm size strip elflint findtextrel addr2line \
 	       elfcmp objdump ranlib strings ar unstrip stack elfcompress \
@@ -61,7 +61,6 @@
 size_no_Wstack_usage = yes
 strip_no_Wstack_usage = yes
 elflint_no_Wstack_usage = yes
-findtextrel_no_Wstack_usage = yes
 elfcmp_no_Wstack_usage = yes
 objdump_no_Wstack_usage = yes
 ranlib_no_Wstack_usage = yes
diff --git a/src/ar.c b/src/ar.c
index 66b2c4f..ab6098f 100644
--- a/src/ar.c
+++ b/src/ar.c
@@ -1566,6 +1566,9 @@
   if (fd != -1)
     close (fd);
 
+  if (newfd != -1)
+    close (newfd);
+
   return status;
 }
 
diff --git a/src/elfclassify.c b/src/elfclassify.c
index ae626bb..2f70b29 100644
--- a/src/elfclassify.c
+++ b/src/elfclassify.c
@@ -16,9 +16,9 @@
    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 #include <config.h>
+#include <system.h>
 
 #include <argp.h>
-#include <error.h>
 #include <fcntl.h>
 #include <gelf.h>
 #include <stdbool.h>
@@ -335,11 +335,8 @@
 		     stderr);
 	    has_bits_alloc = true;
 	  }
-        const char *debug_prefix = ".debug_";
-        const char *zdebug_prefix = ".zdebug_";
-        if (strncmp (section_name, debug_prefix, strlen (debug_prefix)) == 0
-	    || strncmp (section_name, zdebug_prefix,
-			strlen (zdebug_prefix)) == 0)
+        if (startswith (section_name, ".debug_")
+	    || startswith (section_name, ".zdebug_"))
           {
             if (verbose > 1 && !has_debug_sections)
               fputs ("debug: .debug_* section found\n", stderr);
diff --git a/src/elfcompress.c b/src/elfcompress.c
index 1b5b1e3..2c6d91b 100644
--- a/src/elfcompress.c
+++ b/src/elfcompress.c
@@ -52,6 +52,8 @@
 #define T_DECOMPRESS 1    /* none */
 #define T_COMPRESS_ZLIB 2 /* zlib */
 #define T_COMPRESS_GNU  3 /* zlib-gnu */
+#define WORD_BITS (8U * sizeof (unsigned int))
+
 static int type = T_UNSET;
 
 struct section_pattern
@@ -242,6 +244,28 @@
   return res;
 }
 
+static void
+set_section (unsigned int *sections, size_t ndx)
+{
+  sections[ndx / WORD_BITS] |= (1U << (ndx % WORD_BITS));
+}
+
+static bool
+get_section (unsigned int *sections, size_t ndx)
+{
+  return (sections[ndx / WORD_BITS] & (1U << (ndx % WORD_BITS))) != 0;
+}
+
+/* How many sections are we going to change?  */
+static size_t
+get_sections (unsigned int *sections, size_t shnum)
+{
+  size_t s = 0;
+  for (size_t i = 0; i < shnum / WORD_BITS + 1; i++)
+    s += __builtin_popcount (sections[i]);
+  return s;
+}
+
 static int
 process_file (const char *fname)
 {
@@ -274,67 +298,13 @@
 
   /* How many sections are we talking about?  */
   size_t shnum = 0;
-
-#define WORD_BITS (8U * sizeof (unsigned int))
-  void set_section (size_t ndx)
-  {
-    sections[ndx / WORD_BITS] |= (1U << (ndx % WORD_BITS));
-  }
-
-  bool get_section (size_t ndx)
-  {
-    return (sections[ndx / WORD_BITS] & (1U << (ndx % WORD_BITS))) != 0;
-  }
-
-  /* How many sections are we going to change?  */
-  size_t get_sections (void)
-  {
-    size_t s = 0;
-    for (size_t i = 0; i < shnum / WORD_BITS + 1; i++)
-      s += __builtin_popcount (sections[i]);
-    return s;
-  }
-
-  int cleanup (int res)
-  {
-    elf_end (elf);
-    close (fd);
-
-    elf_end (elfnew);
-    close (fdnew);
-
-    if (fnew != NULL)
-      {
-	unlink (fnew);
-	free (fnew);
-	fnew = NULL;
-      }
-
-    free (snamebuf);
-    if (names != NULL)
-      {
-	dwelf_strtab_free (names);
-	free (scnstrents);
-	free (symstrents);
-	free (namesbuf);
-	if (scnnames != NULL)
-	  {
-	    for (size_t n = 0; n < shnum; n++)
-	      free (scnnames[n]);
-	    free (scnnames);
-	  }
-      }
-
-    free (sections);
-
-    return res;
-  }
+  int res = 1;
 
   fd = open (fname, O_RDONLY);
   if (fd < 0)
     {
       error (0, errno, "Couldn't open %s\n", fname);
-      return cleanup (-1);
+      goto cleanup;
     }
 
   elf = elf_begin (fd, ELF_C_READ, NULL);
@@ -342,7 +312,7 @@
     {
       error (0, 0, "Couldn't open ELF file %s for reading: %s",
 	     fname, elf_errmsg (-1));
-      return cleanup (-1);
+      goto cleanup;
     }
 
   /* We don't handle ar files (or anything else), we probably should.  */
@@ -353,21 +323,21 @@
 	error (0, 0, "Cannot handle ar files: %s", fname);
       else
 	error (0, 0, "Unknown file type: %s", fname);
-      return cleanup (-1);
+      goto cleanup;
     }
 
   struct stat st;
   if (fstat (fd, &st) != 0)
     {
       error (0, errno, "Couldn't fstat %s", fname);
-      return cleanup (-1);
+      goto cleanup;
     }
 
   GElf_Ehdr ehdr;
   if (gelf_getehdr (elf, &ehdr) == NULL)
     {
       error (0, 0, "Couldn't get ehdr for %s: %s", fname, elf_errmsg (-1));
-      return cleanup (-1);
+      goto cleanup;
     }
 
   /* Get the section header string table.  */
@@ -376,7 +346,7 @@
     {
       error (0, 0, "Couldn't get section header string table index in %s: %s",
 	     fname, elf_errmsg (-1));
-      return cleanup (-1);
+      goto cleanup;
     }
 
   /* How many sections are we talking about?  */
@@ -384,13 +354,13 @@
     {
       error (0, 0, "Couldn't get number of sections in %s: %s",
 	     fname, elf_errmsg (1));
-      return cleanup (-1);
+      goto cleanup;
     }
 
   if (shnum == 0)
     {
       error (0, 0, "ELF file %s has no sections", fname);
-      return cleanup (-1);
+      goto cleanup;
     }
 
   sections = xcalloc (shnum / 8 + 1, sizeof (unsigned int));
@@ -399,7 +369,7 @@
   if (elf_getphdrnum (elf, &phnum) != 0)
     {
       error (0, 0, "Couldn't get phdrnum: %s", elf_errmsg (-1));
-      return cleanup (-1);
+      goto cleanup;
     }
 
   /* Whether we need to adjust any section names (going to/from GNU
@@ -456,7 +426,7 @@
 	{
 	  error (0, 0, "Unexpected section number %zd, expected only %zd",
 		 ndx, shnum);
-	  cleanup (-1);
+	  goto cleanup;
 	}
 
       GElf_Shdr shdr_mem;
@@ -464,21 +434,21 @@
       if (shdr == NULL)
 	{
 	  error (0, 0, "Couldn't get shdr for section %zd", ndx);
-	  return cleanup (-1);
+	  goto cleanup;
 	}
 
       const char *sname = elf_strptr (elf, shdrstrndx, shdr->sh_name);
       if (sname == NULL)
 	{
 	  error (0, 0, "Couldn't get name for section %zd", ndx);
-	  return cleanup (-1);
+	  goto cleanup;
 	}
 
       if (section_name_matches (sname))
 	{
 	  if (!force && type == T_DECOMPRESS
 	      && (shdr->sh_flags & SHF_COMPRESSED) == 0
-	      && strncmp (sname, ".zdebug", strlen (".zdebug")) != 0)
+	      && !startswith (sname, ".zdebug"))
 	    {
 	      if (verbose > 0)
 		printf ("[%zd] %s already decompressed\n", ndx, sname);
@@ -490,7 +460,7 @@
 		printf ("[%zd] %s already compressed\n", ndx, sname);
 	    }
 	  else if (!force && type == T_COMPRESS_GNU
-		   && strncmp (sname, ".zdebug", strlen (".zdebug")) == 0)
+		   && startswith (sname, ".zdebug"))
 	    {
 	      if (verbose > 0)
 		printf ("[%zd] %s already GNU compressed\n", ndx, sname);
@@ -498,15 +468,13 @@
 	  else if (shdr->sh_type != SHT_NOBITS
 	      && (shdr->sh_flags & SHF_ALLOC) == 0)
 	    {
-	      set_section (ndx);
+	      set_section (sections, ndx);
 	      /* Check if we might want to change this section name.  */
 	      if (! adjust_names
 		  && ((type != T_COMPRESS_GNU
-		       && strncmp (sname, ".zdebug",
-				   strlen (".zdebug")) == 0)
+		       && startswith (sname, ".zdebug"))
 		      || (type == T_COMPRESS_GNU
-			  && strncmp (sname, ".debug",
-				      strlen (".debug")) == 0)))
+			  && startswith (sname, ".debug"))))
 		adjust_names = true;
 
 	      /* We need a buffer this large if we change the names.  */
@@ -532,7 +500,7 @@
 		{
 		  error (0, 0,
 			 "Multiple symbol tables (%zd, %zd) using the same string table unsupported", symtabndx, ndx);
-		  return cleanup (-1);
+		  goto cleanup;
 		}
 	      symtabndx = ndx;
 	    }
@@ -549,12 +517,12 @@
 	  }
     }
 
-  if (foutput == NULL && get_sections () == 0)
+  if (foutput == NULL && get_sections (sections, shnum) == 0)
     {
       if (verbose > 0)
 	printf ("Nothing to do.\n");
-      fnew = NULL;
-      return cleanup (0);
+      res = 0;
+      goto cleanup;
     }
 
   if (adjust_names)
@@ -563,7 +531,7 @@
       if (names == NULL)
 	{
 	  error (0, 0, "Not enough memory for new strtab");
-	  return cleanup (-1);
+	  goto cleanup;
 	}
       scnstrents = xmalloc (shnum
 			    * sizeof (Dwelf_Strent *));
@@ -590,7 +558,7 @@
       /* Since we didn't create it we don't want to try to unlink it.  */
       free (fnew);
       fnew = NULL;
-      return cleanup (-1);
+      goto cleanup;
     }
 
   elfnew = elf_begin (fdnew, ELF_C_WRITE, NULL);
@@ -598,21 +566,21 @@
     {
       error (0, 0, "Couldn't open new ELF %s for writing: %s",
 	     fnew, elf_errmsg (-1));
-      return cleanup (-1);
+      goto cleanup;
     }
 
   /* Create the new ELF header and copy over all the data.  */
   if (gelf_newehdr (elfnew, gelf_getclass (elf)) == 0)
     {
       error (0, 0, "Couldn't create new ehdr: %s", elf_errmsg (-1));
-      return cleanup (-1);
+      goto cleanup;
     }
 
   GElf_Ehdr newehdr;
   if (gelf_getehdr (elfnew, &newehdr) == NULL)
     {
       error (0, 0, "Couldn't get new ehdr: %s", elf_errmsg (-1));
-      return cleanup (-1);
+      goto cleanup;
     }
 
   newehdr.e_ident[EI_DATA] = ehdr.e_ident[EI_DATA];
@@ -625,7 +593,7 @@
   if (gelf_update_ehdr (elfnew, &newehdr) == 0)
     {
       error (0, 0, "Couldn't update ehdr: %s", elf_errmsg (-1));
-      return cleanup (-1);
+      goto cleanup;
     }
 
   /* Copy over the phdrs as is.  */
@@ -634,7 +602,7 @@
       if (gelf_newphdr (elfnew, phnum) == 0)
 	{
 	  error (0, 0, "Couldn't create phdrs: %s", elf_errmsg (-1));
-	  return cleanup (-1);
+	  goto cleanup;
 	}
 
       for (size_t cnt = 0; cnt < phnum; ++cnt)
@@ -644,13 +612,13 @@
 	  if (phdr == NULL)
 	    {
 	      error (0, 0, "Couldn't get phdr %zd: %s", cnt, elf_errmsg (-1));
-	      return cleanup (-1);
+	      goto cleanup;
 	    }
 	  if (gelf_update_phdr (elfnew, cnt, phdr) == 0)
 	    {
 	      error (0, 0, "Couldn't create phdr %zd: %s", cnt,
 		     elf_errmsg (-1));
-	      return cleanup (-1);
+	      goto cleanup;
 	    }
 	}
     }
@@ -687,14 +655,14 @@
       /* (de)compress if section matched.  */
       char *sname = NULL;
       char *newname = NULL;
-      if (get_section (ndx))
+      if (get_section (sections, ndx))
 	{
 	  GElf_Shdr shdr_mem;
 	  GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem);
 	  if (shdr == NULL)
 	    {
 	      error (0, 0, "Couldn't get shdr for section %zd", ndx);
-	      return cleanup (-1);
+	      goto cleanup;
 	    }
 
 	  uint64_t size = shdr->sh_size;
@@ -702,7 +670,7 @@
 	  if (sname == NULL)
 	    {
 	      error (0, 0, "Couldn't get name for section %zd", ndx);
-	      return cleanup (-1);
+	      goto cleanup;
 	    }
 
 	  /* strdup sname, the shdrstrndx section itself might be
@@ -724,23 +692,23 @@
 		{
 		  if (compress_section (scn, size, sname, NULL, ndx,
 					false, false, verbose > 0) < 0)
-		    return cleanup (-1);
+		    goto cleanup;
 		}
-	      else if (strncmp (sname, ".zdebug", strlen (".zdebug")) == 0)
+	      else if (startswith (sname, ".zdebug"))
 		{
 		  snamebuf[0] = '.';
 		  strcpy (&snamebuf[1], &sname[2]);
 		  newname = snamebuf;
 		  if (compress_section (scn, size, sname, newname, ndx,
 					true, false, verbose > 0) < 0)
-		    return cleanup (-1);
+		    goto cleanup;
 		}
 	      else if (verbose > 0)
 		printf ("[%zd] %s already decompressed\n", ndx, sname);
 	      break;
 
 	    case T_COMPRESS_GNU:
-	      if (strncmp (sname, ".debug", strlen (".debug")) == 0)
+	      if (startswith (sname, ".debug"))
 		{
 		  if ((shdr->sh_flags & SHF_COMPRESSED) != 0)
 		    {
@@ -748,7 +716,7 @@
 			 Don't report even when verbose.  */
 		      if (compress_section (scn, size, sname, NULL, ndx,
 					    false, false, false) < 0)
-			return cleanup (-1);
+			goto cleanup;
 		    }
 
 		  snamebuf[0] = '.';
@@ -775,19 +743,19 @@
 		    }
 		  else
 		    {
-		      int res = compress_section (scn, size, sname, newname,
-						  ndx, true, true,
-						  verbose > 0);
-		      if (res < 0)
-			return cleanup (-1);
+		      int result = compress_section (scn, size, sname, newname,
+						     ndx, true, true,
+						     verbose > 0);
+		      if (result < 0)
+			goto cleanup;
 
-		      if (res == 0)
+		      if (result == 0)
 			newname = NULL;
 		    }
 		}
 	      else if (verbose >= 0)
 		{
-		  if (strncmp (sname, ".zdebug", strlen (".zdebug")) == 0)
+		  if (startswith (sname, ".zdebug"))
 		    printf ("[%zd] %s unchanged, already GNU compressed",
 			    ndx, sname);
 		  else
@@ -799,13 +767,13 @@
 	    case T_COMPRESS_ZLIB:
 	      if ((shdr->sh_flags & SHF_COMPRESSED) == 0)
 		{
-		  if (strncmp (sname, ".zdebug", strlen (".zdebug")) == 0)
+		  if (startswith (sname, ".zdebug"))
 		    {
 		      /* First decompress to recompress zlib style.
 			 Don't report even when verbose.  */
 		      if (compress_section (scn, size, sname, NULL, ndx,
 					    true, false, false) < 0)
-			return cleanup (-1);
+			goto cleanup;
 
 		      snamebuf[0] = '.';
 		      strcpy (&snamebuf[1], &sname[2]);
@@ -833,7 +801,7 @@
 		    }
 		  else if (compress_section (scn, size, sname, newname, ndx,
 					     false, true, verbose > 0) < 0)
-		    return cleanup (-1);
+		    goto cleanup;
 		}
 	      else if (verbose > 0)
 		printf ("[%zd] %s already compressed\n", ndx, sname);
@@ -847,7 +815,7 @@
       if (newscn == NULL)
 	{
 	  error (0, 0, "Couldn't create new section %zd", ndx);
-	  return cleanup (-1);
+	  goto cleanup;
 	}
 
       GElf_Shdr shdr_mem;
@@ -855,13 +823,13 @@
       if (shdr == NULL)
 	{
 	  error (0, 0, "Couldn't get shdr for section %zd", ndx);
-	  return cleanup (-1);
+	  goto cleanup;
 	}
 
       if (gelf_update_shdr (newscn, shdr) == 0)
         {
 	  error (0, 0, "Couldn't update section header %zd", ndx);
-	  return cleanup (-1);
+	  goto cleanup;
 	}
 
       /* Except for the section header string table all data can be
@@ -874,14 +842,14 @@
 	  if (data == NULL)
 	    {
 	      error (0, 0, "Couldn't get data from section %zd", ndx);
-	      return cleanup (-1);
+	      goto cleanup;
 	    }
 
 	  Elf_Data *newdata = elf_newdata (newscn);
 	  if (newdata == NULL)
 	    {
 	      error (0, 0, "Couldn't create new data for section %zd", ndx);
-	      return cleanup (-1);
+	      goto cleanup;
 	    }
 
 	  *newdata = *data;
@@ -899,7 +867,7 @@
 	      if (name == NULL)
 		{
 		  error (0, 0, "Couldn't get name for section [%zd]", ndx);
-		  return cleanup (-1);
+		  goto cleanup;
 		}
 	    }
 
@@ -908,7 +876,7 @@
 	  if ((scnstrents[ndx] = dwelf_strtab_add (names, name)) == NULL)
 	    {
 	      error (0, 0, "No memory to add section name string table");
-	      return cleanup (-1);
+	      goto cleanup;
 	    }
 
 	  /* If the symtab shares strings then add those too.  */
@@ -925,17 +893,17 @@
 		      /* Don't report the (internal) uncompression.  */
 		      if (compress_section (newscn, size, sname, NULL, ndx,
 					    false, false, false) < 0)
-			return cleanup (-1);
+			goto cleanup;
 
 		      symtab_size = size;
 		      symtab_compressed = T_COMPRESS_ZLIB;
 		    }
-		  else if (strncmp (name, ".zdebug", strlen (".zdebug")) == 0)
+		  else if (startswith (name, ".zdebug"))
 		    {
 		      /* Don't report the (internal) uncompression.  */
 		      if (compress_section (newscn, size, sname, NULL, ndx,
 					    true, false, false) < 0)
-			return cleanup (-1);
+			goto cleanup;
 
 		      symtab_size = size;
 		      symtab_compressed = T_COMPRESS_GNU;
@@ -947,7 +915,7 @@
 		{
 		  error (0, 0, "Couldn't get symtab data for section [%zd] %s",
 			 ndx, name);
-		  return cleanup (-1);
+		  goto cleanup;
 		}
 	      size_t elsize = gelf_fsize (elfnew, ELF_T_SYM, 1, EV_CURRENT);
 	      size_t syms = symd->d_size / elsize;
@@ -959,7 +927,7 @@
 		  if (sym == NULL)
 		    {
 		      error (0, 0, "Couldn't get symbol %zd", i);
-		      return cleanup (-1);
+		      goto cleanup;
 		    }
 		  if (sym->st_name != 0)
 		    {
@@ -971,13 +939,13 @@
 		      if (symname == NULL)
 			{
 			  error (0, 0, "Couldn't get symbol %zd name", i);
-			  return cleanup (-1);
+			  goto cleanup;
 			}
 		      symstrents[i] = dwelf_strtab_add (names, symname);
 		      if (symstrents[i] == NULL)
 			{
 			  error (0, 0, "No memory to add to symbol name");
-			  return cleanup (-1);
+			  goto cleanup;
 			}
 		    }
 		}
@@ -996,19 +964,19 @@
 	{
 	  error (0, 0, "Couldn't get new section header string table [%zd]",
 		 shdrstrndx);
-	  return cleanup (-1);
+	  goto cleanup;
 	}
 
       Elf_Data *data = elf_newdata (scn);
       if (data == NULL)
 	{
 	  error (0, 0, "Couldn't create new section header string table data");
-	  return cleanup (-1);
+	  goto cleanup;
 	}
       if (dwelf_strtab_finalize (names, data) == NULL)
 	{
 	  error (0, 0, "Not enough memory to create string table");
-	  return cleanup (-1);
+	  goto cleanup;
 	}
       namesbuf = data->d_buf;
 
@@ -1018,7 +986,7 @@
 	{
 	  error (0, 0, "Couldn't get shdr for new section strings %zd",
 		 shdrstrndx);
-	  return cleanup (-1);
+	  goto cleanup;
 	}
 
       /* Note that we also might have to compress and possibly set
@@ -1038,7 +1006,7 @@
 	{
 	  error (0, 0, "Couldn't update new section strings [%zd]",
 		 shdrstrndx);
-	  return cleanup (-1);
+	  goto cleanup;
 	}
 
       /* We might have to compress the data if the user asked us to,
@@ -1054,7 +1022,7 @@
 	    {
 	      error (0, 0, "Couldn't get section header string table [%zd]",
 		     shdrstrndx);
-	      return cleanup (-1);
+	      goto cleanup;
 	    }
 
 	  shdr = gelf_getshdr (oldscn, &shdr_mem);
@@ -1062,7 +1030,7 @@
 	    {
 	      error (0, 0, "Couldn't get shdr for old section strings [%zd]",
 		     shdrstrndx);
-	      return cleanup (-1);
+	      goto cleanup;
 	    }
 
 	  shstrtab_name = elf_strptr (elf, shdrstrndx, shdr->sh_name);
@@ -1070,13 +1038,13 @@
 	    {
 	      error (0, 0, "Couldn't get name for old section strings [%zd]",
 		     shdrstrndx);
-	      return cleanup (-1);
+	      goto cleanup;
 	    }
 
 	  shstrtab_size = shdr->sh_size;
 	  if ((shdr->sh_flags & SHF_COMPRESSED) != 0)
 	    shstrtab_compressed = T_COMPRESS_ZLIB;
-	  else if (strncmp (shstrtab_name, ".zdebug", strlen (".zdebug")) == 0)
+	  else if (startswith (shstrtab_name, ".zdebug"))
 	    shstrtab_compressed = T_COMPRESS_GNU;
 	}
 
@@ -1087,7 +1055,7 @@
 				shstrtab_newname, shdrstrndx,
 				shstrtab_compressed == T_COMPRESS_GNU,
 				true, verbose > 0) < 0)
-	    return cleanup (-1);
+	    goto cleanup;
 	}
     }
 
@@ -1096,7 +1064,7 @@
   if (gelf_getehdr (elfnew, &newehdr) == NULL)
     {
       error (0, 0, "Couldn't re-get new ehdr: %s", elf_errmsg (-1));
-      return cleanup (-1);
+      goto cleanup;
     }
 
   /* Set this after the sections have been created, otherwise section
@@ -1104,7 +1072,7 @@
   if (setshdrstrndx (elfnew, &newehdr, shdrstrndx) != 0)
     {
       error (0, 0, "Couldn't set new shdrstrndx: %s", elf_errmsg (-1));
-      return cleanup (-1);
+      goto cleanup;
     }
 
   /* Fixup pass.  Adjust string table references, symbol table and
@@ -1121,7 +1089,7 @@
 	  if (shdr == NULL)
 	    {
 	      error (0, 0, "Couldn't get shdr for section %zd", ndx);
-	      return cleanup (-1);
+	      goto cleanup;
 	    }
 
 	  /* Keep the offset of allocated sections so they are at the
@@ -1143,7 +1111,7 @@
 	  if (gelf_update_shdr (scn, shdr) == 0)
 	    {
 	      error (0, 0, "Couldn't update section header %zd", ndx);
-	      return cleanup (-1);
+	      goto cleanup;
 	    }
 
 	  if (adjust_names && ndx == symtabndx)
@@ -1156,7 +1124,7 @@
 		{
 		  error (0, 0, "Couldn't get new symtab data section [%zd]",
 			 ndx);
-		  return cleanup (-1);
+		  goto cleanup;
 		}
 	      size_t elsize = gelf_fsize (elfnew, ELF_T_SYM, 1, EV_CURRENT);
 	      size_t syms = symd->d_size / elsize;
@@ -1167,7 +1135,7 @@
 		  if (sym == NULL)
 		    {
 		      error (0, 0, "2 Couldn't get symbol %zd", i);
-		      return cleanup (-1);
+		      goto cleanup;
 		    }
 
 		  if (sym->st_name != 0)
@@ -1177,7 +1145,7 @@
 		      if (gelf_update_sym (symd, i, sym) == 0)
 			{
 			  error (0, 0, "Couldn't update symbol %zd", i);
-			  return cleanup (-1);
+			  goto cleanup;
 			}
 		    }
 		}
@@ -1195,7 +1163,7 @@
 		    {
 		      error (0, 0, "Couldn't get symbol table [%zd]",
 			     symtabndx);
-		      return cleanup (-1);
+		      goto cleanup;
 		    }
 
 		  shdr = gelf_getshdr (oldscn, &shdr_mem);
@@ -1203,7 +1171,7 @@
 		    {
 		      error (0, 0, "Couldn't get old symbol table shdr [%zd]",
 			     symtabndx);
-		      return cleanup (-1);
+		      goto cleanup;
 		    }
 
 		  symtab_name = elf_strptr (elf, shdrstrndx, shdr->sh_name);
@@ -1211,14 +1179,13 @@
 		    {
 		      error (0, 0, "Couldn't get old symbol table name [%zd]",
 			     symtabndx);
-		      return cleanup (-1);
+		      goto cleanup;
 		    }
 
 		  symtab_size = shdr->sh_size;
 		  if ((shdr->sh_flags & SHF_COMPRESSED) != 0)
 		    symtab_compressed = T_COMPRESS_ZLIB;
-		  else if (strncmp (symtab_name, ".zdebug",
-				    strlen (".zdebug")) == 0)
+		  else if (startswith (symtab_name, ".zdebug"))
 		    symtab_compressed = T_COMPRESS_GNU;
 		}
 
@@ -1229,7 +1196,7 @@
 					symtab_newname, symtabndx,
 					symtab_compressed == T_COMPRESS_GNU,
 					true, verbose > 0) < 0)
-		    return cleanup (-1);
+		    goto cleanup;
 		}
 	    }
 	}
@@ -1243,7 +1210,7 @@
       if (gelf_getehdr (elfnew, &newehdr) == NULL)
 	{
 	  error (0, 0, "Couldn't get ehdr: %s", elf_errmsg (-1));
-	  return cleanup (-1);
+	  goto cleanup;
 	}
 
       /* Position the shdrs after the last (unallocated) section.  */
@@ -1258,7 +1225,7 @@
       if (gelf_update_ehdr (elfnew, &newehdr) == 0)
 	{
 	  error (0, 0, "Couldn't update ehdr: %s", elf_errmsg (-1));
-	  return cleanup (-1);
+	  goto cleanup;
 	}
     }
 
@@ -1268,7 +1235,7 @@
   if (elf_update (elfnew, ELF_C_WRITE) < 0)
     {
       error (0, 0, "Couldn't write %s: %s", fnew, elf_errmsg (-1));
-      return cleanup (-1);
+      goto cleanup;
     }
 
   elf_end (elfnew);
@@ -1290,14 +1257,45 @@
     if (rename (fnew, fname) != 0)
       {
 	error (0, errno, "Couldn't rename %s to %s", fnew, fname);
-	return cleanup (-1);
+	goto cleanup;
       }
 
   /* We are finally done with the new file, don't unlink it now.  */
   free (fnew);
   fnew = NULL;
+  res = 0;
 
-  return cleanup (0);
+cleanup:
+  elf_end (elf);
+  close (fd);
+
+  elf_end (elfnew);
+  close (fdnew);
+
+  if (fnew != NULL)
+    {
+      unlink (fnew);
+      free (fnew);
+      fnew = NULL;
+    }
+
+  free (snamebuf);
+  if (names != NULL)
+    {
+      dwelf_strtab_free (names);
+      free (scnstrents);
+      free (symstrents);
+      free (namesbuf);
+      if (scnnames != NULL)
+	{
+	  for (size_t n = 0; n < shnum; n++)
+	    free (scnnames[n]);
+	  free (scnnames);
+	}
+    }
+
+  free (sections);
+  return res;
 }
 
 int
diff --git a/src/elflint.c b/src/elflint.c
index 6a94683..ef7725c 100644
--- a/src/elflint.c
+++ b/src/elflint.c
@@ -3428,6 +3428,18 @@
     }
 }
 
+static inline size_t
+buffer_pos (Elf_Data *data, const unsigned char *p)
+{
+  return p - (const unsigned char *) data->d_buf;
+}
+
+static inline size_t
+buffer_left (Elf_Data *data, const unsigned char *p)
+{
+  return (const unsigned char *) data->d_buf + data->d_size - p;
+}
+
 static void
 check_attributes (Ebl *ebl, GElf_Ehdr *ehdr, GElf_Shdr *shdr, int idx)
 {
@@ -3446,11 +3458,6 @@
       return;
     }
 
-  inline size_t pos (const unsigned char *p)
-  {
-    return p - (const unsigned char *) data->d_buf;
-  }
-
   const unsigned char *p = data->d_buf;
   if (*p++ != 'A')
     {
@@ -3459,12 +3466,7 @@
       return;
     }
 
-  inline size_t left (void)
-  {
-    return (const unsigned char *) data->d_buf + data->d_size - p;
-  }
-
-  while (left () >= 4)
+  while (buffer_left (data, p) >= 4)
     {
       uint32_t len;
       memcpy (&len, p, sizeof len);
@@ -3472,16 +3474,16 @@
       if (len == 0)
 	ERROR (_("\
 section [%2d] '%s': offset %zu: zero length field in attribute section\n"),
-	       idx, section_name (ebl, idx), pos (p));
+	       idx, section_name (ebl, idx), buffer_pos (data, p));
 
       if (MY_ELFDATA != ehdr->e_ident[EI_DATA])
 	CONVERT (len);
 
-      if (len > left ())
+      if (len > buffer_left (data, p))
 	{
 	  ERROR (_("\
 section [%2d] '%s': offset %zu: invalid length in attribute section\n"),
-		 idx, section_name (ebl, idx), pos (p));
+		 idx, section_name (ebl, idx), buffer_pos (data, p));
 	  break;
 	}
 
@@ -3493,7 +3495,7 @@
 	{
 	  ERROR (_("\
 section [%2d] '%s': offset %zu: unterminated vendor name string\n"),
-		 idx, section_name (ebl, idx), pos (p));
+		 idx, section_name (ebl, idx), buffer_pos (data, p));
 	  break;
 	}
       ++q;
@@ -3510,7 +3512,7 @@
 	      {
 		ERROR (_("\
 section [%2d] '%s': offset %zu: endless ULEB128 in attribute subsection tag\n"),
-		       idx, section_name (ebl, idx), pos (chunk));
+		       idx, section_name (ebl, idx), buffer_pos (data, chunk));
 		break;
 	      }
 
@@ -3519,7 +3521,7 @@
 	      {
 		ERROR (_("\
 section [%2d] '%s': offset %zu: truncated attribute section\n"),
-		       idx, section_name (ebl, idx), pos (q));
+		       idx, section_name (ebl, idx), buffer_pos (data, q));
 		break;
 	      }
 
@@ -3528,7 +3530,7 @@
 	      {
 		ERROR (_("\
 section [%2d] '%s': offset %zu: zero length field in attribute subsection\n"),
-		       idx, section_name (ebl, idx), pos (q));
+		       idx, section_name (ebl, idx), buffer_pos (data, q));
 
 		q += sizeof subsection_len;
 		continue;
@@ -3543,7 +3545,7 @@
 	      {
 		ERROR (_("\
 section [%2d] '%s': offset %zu: invalid length in attribute subsection\n"),
-		       idx, section_name (ebl, idx), pos (q));
+		       idx, section_name (ebl, idx), buffer_pos (data, q));
 		break;
 	      }
 
@@ -3554,7 +3556,7 @@
 	    if (subsection_tag != 1) /* Tag_File */
 	      ERROR (_("\
 section [%2d] '%s': offset %zu: attribute subsection has unexpected tag %u\n"),
-		     idx, section_name (ebl, idx), pos (chunk), subsection_tag);
+		     idx, section_name (ebl, idx), buffer_pos (data, chunk), subsection_tag);
 	    else
 	      {
 		chunk += sizeof subsection_len;
@@ -3572,7 +3574,7 @@
 			  {
 			    ERROR (_("\
 section [%2d] '%s': offset %zu: endless ULEB128 in attribute tag\n"),
-				   idx, section_name (ebl, idx), pos (chunk));
+				   idx, section_name (ebl, idx), buffer_pos (data, chunk));
 			    break;
 			  }
 		      }
@@ -3583,7 +3585,7 @@
 			  {
 			    ERROR (_("\
 section [%2d] '%s': offset %zu: unterminated string in attribute\n"),
-				   idx, section_name (ebl, idx), pos (chunk));
+				   idx, section_name (ebl, idx), buffer_pos (data, chunk));
 			    break;
 			  }
 			++r;
@@ -3596,11 +3598,11 @@
 						     &tag_name, &value_name))
 		      ERROR (_("\
 section [%2d] '%s': offset %zu: unrecognized attribute tag %u\n"),
-			     idx, section_name (ebl, idx), pos (chunk), tag);
+			     idx, section_name (ebl, idx), buffer_pos (data, chunk), tag);
 		    else if ((tag & 1) == 0 && value_name == NULL)
 		      ERROR (_("\
 section [%2d] '%s': offset %zu: unrecognized %s attribute value %" PRIu64 "\n"),
-			     idx, section_name (ebl, idx), pos (chunk),
+			     idx, section_name (ebl, idx), buffer_pos (data, chunk),
 			     tag_name, value);
 
 		    chunk = r;
@@ -3610,13 +3612,13 @@
       else
 	ERROR (_("\
 section [%2d] '%s': offset %zu: vendor '%s' unknown\n"),
-	       idx, section_name (ebl, idx), pos (p), name);
+	       idx, section_name (ebl, idx), buffer_pos (data, p), name);
     }
 
-  if (left () != 0)
+  if (buffer_left (data, p) != 0)
     ERROR (_("\
 section [%2d] '%s': offset %zu: extra bytes after last attribute section\n"),
-	   idx, section_name (ebl, idx), pos (p));
+	   idx, section_name (ebl, idx), buffer_pos (data, p));
 }
 
 static bool has_loadable_segment;
@@ -3703,7 +3705,7 @@
     return;
 
   /* Allocate array to count references in section groups.  */
-  scnref = (int *) xcalloc (shnum, sizeof (int));
+  scnref = xcalloc (shnum, sizeof (int));
 
   /* Check the zeroth section first.  It must not have any contents
      and the section header must contain nonzero value at most in the
@@ -4100,7 +4102,7 @@
 			    bad = (databits == NULL
 				   || databits->d_size != shdr->sh_size);
 			    for (size_t idx = 0;
-				 idx < databits->d_size && ! bad;
+				 ! bad && idx < databits->d_size;
 				 idx++)
 			      bad = ((char *) databits->d_buf)[idx] != 0;
 
diff --git a/src/findtextrel.c b/src/findtextrel.c
index 220ee90..ecb1d11 100644
--- a/src/findtextrel.c
+++ b/src/findtextrel.c
@@ -36,6 +36,7 @@
 #include <unistd.h>
 
 #include <printversion.h>
+#include "libeu.h"
 #include "system.h"
 
 struct segments
@@ -181,30 +182,31 @@
 
 
 static int
+open_rootdir_file (const char *fname)
+{
+  char *new_fname = NULL;
+  const char *real_fname = fname;
+
+  if (fname[0] == '/' && (rootdir[0] != '/' || rootdir[1] != '\0'))
+    real_fname = new_fname = xasprintf ("%s/%s", rootdir, fname);
+
+  int fd = open (real_fname, O_RDONLY);
+  if (fd == -1)
+    error (0, errno, _("cannot open '%s'"), fname);
+
+  free (new_fname);
+  return fd;
+}
+
+
+static int
 process_file (const char *fname, bool more_than_one)
 {
   int result = 0;
   void *knownsrcs = NULL;
-
-  size_t fname_len = strlen (fname);
-  size_t rootdir_len = strlen (rootdir);
-  const char *real_fname = fname;
-  if (fname[0] == '/' && (rootdir[0] != '/' || rootdir[1] != '\0'))
-    {
-      /* Prepend the user-provided root directory.  */
-      char *new_fname = alloca (rootdir_len + fname_len + 2);
-      *((char *) mempcpy (stpcpy (mempcpy (new_fname, rootdir, rootdir_len),
-				  "/"),
-			  fname, fname_len)) = '\0';
-      real_fname = new_fname;
-    }
-
-  int fd = open (real_fname, O_RDONLY);
+  int fd = open_rootdir_file (fname);
   if (fd == -1)
-    {
-      error (0, errno, _("cannot open '%s'"), fname);
-      return 1;
-    }
+    return 1;
 
   Elf *elf = elf_begin (fd, ELF_C_READ_MMAP, NULL);
   if (elf == NULL)
@@ -304,8 +306,7 @@
   /* Get the address ranges for the loaded segments.  */
   size_t nsegments_max = 10;
   size_t nsegments = 0;
-  struct segments *segments
-    = (struct segments *) malloc (nsegments_max * sizeof (segments[0]));
+  struct segments *segments = malloc (nsegments_max * sizeof (segments[0]));
   if (segments == NULL)
     error (1, errno, _("while reading ELF file"));
 
@@ -334,9 +335,7 @@
 	    {
 	      nsegments_max *= 2;
 	      segments
-		= (struct segments *) realloc (segments,
-					       nsegments_max
-					       * sizeof (segments[0]));
+		= realloc (segments, nsegments_max * sizeof (segments[0]));
 	      if (segments == NULL)
 		{
 		  error (0, 0, _("\
@@ -362,18 +361,10 @@
 	 is specified with an absolute path.  */
       if (dw == NULL && fname[0] == '/')
 	{
-	  size_t debuginfo_rootlen = strlen (debuginfo_root);
-	  char *difname = (char *) alloca (rootdir_len + debuginfo_rootlen
-					   + fname_len + 8);
-	  strcpy (mempcpy (stpcpy (mempcpy (mempcpy (difname, rootdir,
-						     rootdir_len),
-					    debuginfo_root,
-					    debuginfo_rootlen),
-				   "/"),
-			   fname, fname_len),
-		  ".debug");
-
+	  char *difname =
+	    xasprintf("%s%s/%s.debug", rootdir, debuginfo_root, fname);
 	  fd2 = open (difname, O_RDONLY);
+	  free (difname);
 	  if (fd2 != -1
 	      && (elf2 = elf_begin (fd2, ELF_C_READ_MMAP, NULL)) != NULL)
 	    dw = dwarf_begin_elf (elf2, DWARF_C_READ, NULL);
diff --git a/src/nm.c b/src/nm.c
index fb761ef..2ae29c4 100644
--- a/src/nm.c
+++ b/src/nm.c
@@ -687,8 +687,7 @@
 	      }
 
 	    /* We have all the information.  Create a record.  */
-	    struct local_name *newp
-	      = (struct local_name *) xmalloc (sizeof (*newp));
+	    struct local_name *newp = xmalloc (sizeof (*newp));
 	    newp->name = name;
 	    newp->file = dwarf_filesrc (files, fileidx, NULL, NULL);
 	    newp->lineno = lineno;
@@ -736,7 +735,7 @@
   bool scnnames_malloced = shnum * sizeof (const char *) > 128 * 1024;
   const char **scnnames;
   if (scnnames_malloced)
-    scnnames = (const char **) xmalloc (sizeof (const char *) * shnum);
+    scnnames = xmalloc (sizeof (const char *) * shnum);
   else
     scnnames = (const char **) alloca (sizeof (const char *) * shnum);
   /* Get the section header string table index.  */
@@ -858,7 +857,7 @@
       bind = ebl_symbol_binding_name (ebl,
 				      GELF_ST_BIND (syms[cnt].sym.st_info),
 				      symbindbuf, sizeof (symbindbuf));
-      if (bind != NULL && strncmp (bind, "GNU_", strlen ("GNU_")) == 0)
+      if (bind != NULL && startswith (bind, "GNU_"))
 	bind += strlen ("GNU_");
       printf ("%-*s|%s|%-6s|%-8s|%s|%*s|%s\n",
 	      longest_name, symstr, addressbuf, bind,
@@ -1308,6 +1307,8 @@
 		      dwfl_getmodules (dwfl, &getdbg_dwflmod, &get, 0);
 		    }
 		}
+	      else
+		close (dwfl_fd);
 	    }
 	}
       if (dbg != NULL)
@@ -1338,7 +1339,7 @@
   if (nentries * sizeof (GElf_SymX) < MAX_STACK_ALLOC)
     sym_mem = (GElf_SymX *) alloca (nentries * sizeof (GElf_SymX));
   else
-    sym_mem = (GElf_SymX *) xmalloc (nentries * sizeof (GElf_SymX));
+    sym_mem = xmalloc (nentries * sizeof (GElf_SymX));
 
   /* Iterate over all symbols.  */
 #ifdef USE_DEMANGLE
diff --git a/src/objdump.c b/src/objdump.c
index 3a93248..f7ea6c9 100644
--- a/src/objdump.c
+++ b/src/objdump.c
@@ -717,15 +717,14 @@
 	      info.address_color = color_address;
 	      info.bytes_color = color_bytes;
 
-	      if (asprintf (&fmt, "%s%%7m %s%%.1o,%s%%.2o,%s%%.3o,,%s%%.4o%s%%.5o%%34a %s%%l",
-			    color_mnemonic ?: "",
-			    color_operand1 ?: "",
-			    color_operand2 ?: "",
-			    color_operand3 ?: "",
-                            color_operand4 ?: "",
-                            color_operand5 ?: "",
-			    color_label ?: "") < 0)
-		error (EXIT_FAILURE, errno, _("cannot allocate memory"));
+	      fmt = xasprintf ("%s%%7m %s%%.1o,%s%%.2o,%s%%.3o,,%s%%.4o%s%%.5o%%34a %s%%l",
+			       color_mnemonic ?: "",
+			       color_operand1 ?: "",
+			       color_operand2 ?: "",
+			       color_operand3 ?: "",
+			       color_operand4 ?: "",
+			       color_operand5 ?: "",
+			       color_label ?: "");
 	    }
 	  else
 	    {
diff --git a/src/readelf.c b/src/readelf.c
index 11692bb..c10038e 100644
--- a/src/readelf.c
+++ b/src/readelf.c
@@ -1335,7 +1335,7 @@
 		       _("bad compression header for section %zd: %s"),
 		       elf_ndxscn (scn), elf_errmsg (-1));
 	    }
-	  else if (strncmp(".zdebug", sname, strlen (".zdebug")) == 0)
+	  else if (startswith (sname, ".zdebug"))
 	    {
 	      ssize_t size;
 	      if ((size = dwelf_scn_gnu_compressed_size (scn)) >= 0)
@@ -2554,7 +2554,9 @@
 						 &vernaux_mem);
 		      while (vernaux != NULL
 			     && vernaux->vna_other != *versym
-			     && vernaux->vna_next != 0)
+			     && vernaux->vna_next != 0
+			     && (verneed_data->d_size - vna_offset
+				 >= vernaux->vna_next))
 			{
 			  /* Update the offset.  */
 			  vna_offset += vernaux->vna_next;
@@ -2571,6 +2573,9 @@
 			/* Found it.  */
 			break;
 
+		      if (verneed_data->d_size - vn_offset < verneed->vn_next)
+			break;
+
 		      vn_offset += verneed->vn_next;
 		      verneed = (verneed->vn_next == 0
 				 ? NULL
@@ -2606,6 +2611,9 @@
 			/* Found the definition.  */
 			break;
 
+		      if (verdef_data->d_size - vd_offset < verdef->vd_next)
+			break;
+
 		      vd_offset += verdef->vd_next;
 		      verdef = (verdef->vd_next == 0
 				? NULL
@@ -3157,7 +3165,7 @@
 		 uint_fast32_t maxlength, Elf32_Word nbucket,
 		 uint_fast32_t nsyms, uint32_t *lengths, const char *extrastr)
 {
-  uint32_t *counts = (uint32_t *) xcalloc (maxlength + 1, sizeof (uint32_t));
+  uint32_t *counts = xcalloc (maxlength + 1, sizeof (uint32_t));
 
   for (Elf32_Word cnt = 0; cnt < nbucket; ++cnt)
     ++counts[lengths[cnt]];
@@ -3258,7 +3266,7 @@
   Elf32_Word *bucket = &((Elf32_Word *) data->d_buf)[2];
   Elf32_Word *chain = &((Elf32_Word *) data->d_buf)[2 + nbucket];
 
-  uint32_t *lengths = (uint32_t *) xcalloc (nbucket, sizeof (uint32_t));
+  uint32_t *lengths = xcalloc (nbucket, sizeof (uint32_t));
 
   uint_fast32_t maxlength = 0;
   uint_fast32_t nsyms = 0;
@@ -3324,7 +3332,7 @@
   Elf64_Xword *bucket = &((Elf64_Xword *) data->d_buf)[2];
   Elf64_Xword *chain = &((Elf64_Xword *) data->d_buf)[2 + nbucket];
 
-  uint32_t *lengths = (uint32_t *) xcalloc (nbucket, sizeof (uint32_t));
+  uint32_t *lengths = xcalloc (nbucket, sizeof (uint32_t));
 
   uint_fast32_t maxlength = 0;
   uint_fast32_t nsyms = 0;
@@ -3402,7 +3410,7 @@
   if (used_buf > data->d_size)
     goto invalid_data;
 
-  lengths = (uint32_t *) xcalloc (nbucket, sizeof (uint32_t));
+  lengths = xcalloc (nbucket, sizeof (uint32_t));
 
   Elf32_Word *bitmask = &((Elf32_Word *) data->d_buf)[4];
   Elf32_Word *bucket = &((Elf32_Word *) data->d_buf)[4 + bitmask_words];
@@ -3440,17 +3448,15 @@
       nbits += (word & 0x0000ffff) + ((word >> 16) & 0x0000ffff);
     }
 
-  char *str;
-  if (unlikely (asprintf (&str, _("\
+  char *str = xasprintf (_("\
  Symbol Bias: %u\n\
  Bitmask Size: %zu bytes  %" PRIuFAST32 "%% bits set  2nd hash shift: %u\n"),
-			  (unsigned int) symbias,
-			  bitmask_words * sizeof (Elf32_Word),
-			  ((nbits * 100 + 50)
-			   / (uint_fast32_t) (bitmask_words
+			 (unsigned int) symbias,
+			 bitmask_words * sizeof (Elf32_Word),
+			 ((nbits * 100 + 50)
+			  / (uint_fast32_t) (bitmask_words
 					      * sizeof (Elf32_Word) * 8)),
-			  (unsigned int) shift) == -1))
-    error (EXIT_FAILURE, 0, _("memory exhausted"));
+			  (unsigned int) shift);
 
   print_hash_info (ebl, scn, shdr, shstrndx, maxlength, nbucket, nsyms,
 		   lengths, str);
@@ -4879,7 +4885,7 @@
 	  error (0, 0,
 		 _("%s %#" PRIx64
 			  " used with different attribute %s and %s"),
-		 name, (uint64_t) p1->offset, dwarf_attr_name (p2->attr),
+		 name, (uint64_t) p1->offset, dwarf_attr_name (p1->attr),
 		 dwarf_attr_name (p2->attr));
 	}
     }
@@ -7599,7 +7605,9 @@
 	case DW_AT_GNU_call_site_data_value:
 	case DW_AT_GNU_call_site_target:
 	case DW_AT_GNU_call_site_target_clobbered:
-	  if (form != DW_FORM_data16)
+	  if (form == DW_FORM_exprloc
+	      || (form != DW_FORM_data16
+		  && attrp->cu->version < 4)) /* blocks were expressions.  */
 	    {
 	      putchar ('\n');
 	      print_ops (cbargs->dwflmod, cbargs->dbg,
@@ -7734,7 +7742,7 @@
     return;
 
   int maxdies = 20;
-  Dwarf_Die *dies = (Dwarf_Die *) xmalloc (maxdies * sizeof (Dwarf_Die));
+  Dwarf_Die *dies = xmalloc (maxdies * sizeof (Dwarf_Die));
 
   /* New compilation unit.  */
   Dwarf_Half version;
@@ -7792,7 +7800,8 @@
 	{
 	  Dwarf_Die typedie;
 	  Dwarf_Off dieoffset;
-	  dieoffset = dwarf_dieoffset (dwarf_offdie_types (dbg, subdie_off,
+	  dieoffset = dwarf_dieoffset (dwarf_offdie_types (dbg, cu->start
+							   + subdie_off,
 							   &typedie));
 	  printf (_(" Type unit at offset %" PRIu64 ":\n"
 			   " Version: %" PRIu16
@@ -7905,9 +7914,7 @@
 
       /* Make room for the next level's DIE.  */
       if (level + 1 == maxdies)
-	dies = (Dwarf_Die *) xrealloc (dies,
-				       (maxdies += 10)
-				       * sizeof (Dwarf_Die));
+	dies = xrealloc (dies, (maxdies += 10) * sizeof (Dwarf_Die));
 
       int res = dwarf_child (&dies[level], &dies[level + 1]);
       if (res > 0)
@@ -8362,6 +8369,23 @@
   return readp;
 }
 
+/* Only used via run_advance_pc() macro */
+static inline void
+run_advance_pc (unsigned int op_advance,
+                unsigned int minimum_instr_len,
+                unsigned int max_ops_per_instr,
+                unsigned int *op_addr_advance,
+                Dwarf_Word *address,
+                unsigned int *op_index)
+{
+  const unsigned int advanced_op_index = (*op_index) + op_advance;
+
+  *op_addr_advance = minimum_instr_len * (advanced_op_index
+                                         / max_ops_per_instr);
+  *address = *address + *op_addr_advance;
+  *op_index = advanced_op_index % max_ops_per_instr;
+}
+
 static void
 print_debug_line_section (Dwfl_Module *dwflmod, Ebl *ebl, GElf_Ehdr *ehdr,
 			  Elf_Scn *scn, GElf_Shdr *shdr, Dwarf *dbg)
@@ -8454,6 +8478,8 @@
 	  header_length = read_8ubyte_unaligned_inc (dbg, linep);
 	}
 
+      const unsigned char *header_start = linep;
+
       /* Next the minimum instruction length.  */
       if ((size_t) (lineendp - linep) < 1)
 	goto invalid_data;
@@ -8737,10 +8763,17 @@
 	  ++linep;
 	}
 
+      unsigned int debug_str_offset = 0;
+      if (unlikely (linep == header_start + header_length - 4))
+	{
+	  /* CUBINs contain an unsigned 4-byte offset */
+	  debug_str_offset = read_4ubyte_unaligned_inc (dbg, linep);
+	}
+
       if (linep == lineendp)
 	{
 	  puts (_("\nNo line number statements."));
-	  return;
+	  continue;
 	}
 
       puts (_("\nLine number statements:"));
@@ -8752,13 +8785,8 @@
       /* Apply the "operation advance" from a special opcode
 	 or DW_LNS_advance_pc (as per DWARF4 6.2.5.1).  */
       unsigned int op_addr_advance;
-      inline void advance_pc (unsigned int op_advance)
-      {
-	op_addr_advance = minimum_instr_len * ((op_index + op_advance)
-					       / max_ops_per_instr);
-	address += op_addr_advance;
-	op_index = (op_index + op_advance) % max_ops_per_instr;
-      }
+#define advance_pc(op_advance) run_advance_pc(op_advance, minimum_instr_len, \
+                      max_ops_per_instr, &op_addr_advance, &address, &op_index)
 
       if (max_ops_per_instr == 0)
 	{
@@ -8890,6 +8918,59 @@
 		  printf (_(" set discriminator to %u\n"), u128);
 		  break;
 
+		case DW_LNE_NVIDIA_inlined_call:
+		  {
+		    if (unlikely (linep >= lineendp))
+		      goto invalid_data;
+
+		    unsigned int context;
+		    get_uleb128 (context, linep, lineendp);
+
+		    if (unlikely (linep >= lineendp))
+		      goto invalid_data;
+
+		    unsigned int function_name;
+		    get_uleb128 (function_name, linep, lineendp);
+		    function_name += debug_str_offset;
+
+		    Elf_Data *str_data = dbg->sectiondata[IDX_debug_str];
+		    char *function_str;
+		    if (str_data == NULL || function_name >= str_data->d_size
+			|| memchr (str_data->d_buf + function_name, '\0',
+				   str_data->d_size - function_name) == NULL)
+		      function_str = "???";
+		    else
+		      function_str = (char *) str_data->d_buf + function_name;
+
+		    printf (_(" set inlined context %u,"
+		              " function name %s (0x%x)\n"),
+			    context, function_str, function_name);
+		    break;
+		  }
+
+		case DW_LNE_NVIDIA_set_function_name:
+		  {
+		    if (unlikely (linep >= lineendp))
+		      goto invalid_data;
+
+		    unsigned int function_name;
+		    get_uleb128 (function_name, linep, lineendp);
+		    function_name += debug_str_offset;
+
+		    Elf_Data *str_data = dbg->sectiondata[IDX_debug_str];
+		    char *function_str;
+		    if (str_data == NULL || function_name >= str_data->d_size
+			|| memchr (str_data->d_buf + function_name, '\0',
+				   str_data->d_size - function_name) == NULL)
+		      function_str = "???";
+		    else
+		      function_str = (char *) str_data->d_buf + function_name;
+
+		    printf (_(" set function name %s (0x%x)\n"),
+			    function_str, function_name);
+		  }
+		  break;
+
 		default:
 		  /* Unknown, ignore it.  */
 		  puts (_(" unknown opcode"));
@@ -11440,7 +11521,7 @@
 			  || (scnlen == dbglen + 5
 			      && strstr (name, ".dwo") == name + dbglen + 1)))
 		  || (scnlen > 14 /* .gnu.debuglto_ prefix. */
-		      && strncmp (name, ".gnu.debuglto_", 14) == 0
+		      && startswith (name, ".gnu.debuglto_")
 		      && strcmp (&name[14], debug_sections[n].name) == 0)
 )
 		{
@@ -12444,8 +12525,7 @@
 	 into the owner name field.  Extract just the owner name
 	 prefix here, then use the rest later as data.  */
       bool is_gnu_build_attr
-	= strncmp (name, ELF_NOTE_GNU_BUILD_ATTRIBUTE_PREFIX,
-		   strlen (ELF_NOTE_GNU_BUILD_ATTRIBUTE_PREFIX)) == 0;
+	= startswith (name, ELF_NOTE_GNU_BUILD_ATTRIBUTE_PREFIX);
       const char *print_name = (is_gnu_build_attr
 				? ELF_NOTE_GNU_BUILD_ATTRIBUTE_PREFIX : name);
       size_t print_namesz = (is_gnu_build_attr
@@ -12625,7 +12705,7 @@
 			_("Couldn't uncompress section"),
 			elf_ndxscn (scn));
 	    }
-	  else if (strncmp (name, ".zdebug", strlen (".zdebug")) == 0)
+	  else if (startswith (name, ".zdebug"))
 	    {
 	      if (elf_compress_gnu (scn, 0, 0) < 0)
 		printf ("WARNING: %s [%zd]\n",
@@ -12676,7 +12756,7 @@
 			_("Couldn't uncompress section"),
 			elf_ndxscn (scn));
 	    }
-	  else if (strncmp (name, ".zdebug", strlen (".zdebug")) == 0)
+	  else if (startswith (name, ".zdebug"))
 	    {
 	      if (elf_compress_gnu (scn, 0, 0) < 0)
 		printf ("WARNING: %s [%zd]\n",
diff --git a/src/strip.c b/src/strip.c
index 7a5d4e4..d5b753d 100644
--- a/src/strip.c
+++ b/src/strip.c
@@ -607,7 +607,7 @@
 	  GElf_Chdr tchdr;
 	  int tcompress_type = 0;
 	  bool is_gnu_compressed = false;
-	  if (strncmp (tname, ".zdebug", strlen ("zdebug")) == 0)
+	  if (startswith (tname, ".zdebug"))
 	    {
 	      is_gnu_compressed = true;
 	      if (elf_compress_gnu (tscn, 0, 0) != 1)
@@ -705,17 +705,21 @@
 relocate_failed:
 	      if (relidx != next)
 		{
+		  int updated;
 		  if (is_rela)
-		    gelf_update_rela (reldata, next, rel_p);
+		    updated = gelf_update_rela (reldata, next, rel_p);
 		  else
-		    gelf_update_rel (reldata, next, rel_p);
+		    updated = gelf_update_rel (reldata, next, rel_p);
+		  if (updated == 0)
+		    INTERNAL_ERROR (fname);
 		}
 	      ++next;
 	    }
 
 	  nrels = next;
 	  shdr->sh_size = reldata->d_size = nrels * shdr->sh_entsize;
-	  gelf_update_shdr (scn, shdr);
+	  if (gelf_update_shdr (scn, shdr) == 0)
+	    INTERNAL_ERROR (fname);
 
 	  if (is_gnu_compressed)
 	    {
@@ -952,7 +956,8 @@
   GElf_Shdr shdr_mem;
   GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem);
   shdr->sh_size = newdata->d_size;
-  (void) gelf_update_shdr (scn, shdr);
+  if (gelf_update_shdr (scn, shdr) == 0)
+    INTERNAL_ERROR (fname);
   if (debugelf != NULL)
     {
       /* libelf will use d_size to set sh_size.  */
@@ -1057,7 +1062,7 @@
 	 the debug file if the file would not contain any
 	 information.  */
       size_t debug_fname_len = strlen (debug_fname);
-      tmp_debug_fname = (char *) xmalloc (debug_fname_len + sizeof (".XXXXXX"));
+      tmp_debug_fname = xmalloc (debug_fname_len + sizeof (".XXXXXX"));
       strcpy (mempcpy (tmp_debug_fname, debug_fname, debug_fname_len),
 	      ".XXXXXX");
 
@@ -1191,8 +1196,7 @@
      table.  Maybe some weird tool created an ELF file without one.
      The other one is used for the debug link section.  */
   if ((shnum + 2) * sizeof (struct shdr_info) > MAX_STACK_ALLOC)
-    shdr_info = (struct shdr_info *) xcalloc (shnum + 2,
-					      sizeof (struct shdr_info));
+    shdr_info = xcalloc (shnum + 2, sizeof (struct shdr_info));
   else
     {
       shdr_info = (struct shdr_info *) alloca ((shnum + 2)
@@ -1975,8 +1979,8 @@
 		  }
 
 		shdr_info[cnt].newsymidx
-		  = (Elf32_Word *) xcalloc (shdr_info[cnt].data->d_size
-					    / elsize, sizeof (Elf32_Word));
+		  = xcalloc (shdr_info[cnt].data->d_size / elsize,
+			     sizeof (Elf32_Word));
 
 		bool last_was_local = true;
 		size_t destidx;
diff --git a/src/unstrip.c b/src/unstrip.c
index 8580329..aacc9aa 100644
--- a/src/unstrip.c
+++ b/src/unstrip.c
@@ -432,6 +432,19 @@
   update_shdr (outscn, newshdr);
 }
 
+static inline void
+adjust_reloc (GElf_Xword *info,
+	      size_t map[], size_t map_size)
+{
+  size_t ndx = GELF_R_SYM (*info);
+  if (ndx != STN_UNDEF)
+    {
+      if (ndx > map_size)
+	error (EXIT_FAILURE, 0, "bad symbol ndx section");
+      *info = GELF_R_INFO (map[ndx - 1], GELF_R_TYPE (*info));
+    }
+}
+
 /* Update relocation sections using the symbol table.  */
 static void
 adjust_relocs (Elf_Scn *outscn, Elf_Scn *inscn, const GElf_Shdr *shdr,
@@ -439,17 +452,6 @@
 {
   Elf_Data *data = elf_getdata (outscn, NULL);
 
-  inline void adjust_reloc (GElf_Xword *info)
-    {
-      size_t ndx = GELF_R_SYM (*info);
-      if (ndx != STN_UNDEF)
-	{
-	  if (ndx > map_size)
-	    error (EXIT_FAILURE, 0, "bad symbol ndx section");
-	  *info = GELF_R_INFO (map[ndx - 1], GELF_R_TYPE (*info));
-	}
-    }
-
   switch (shdr->sh_type)
     {
     case SHT_REL:
@@ -460,7 +462,8 @@
 	{
 	  GElf_Rel rel_mem;
 	  GElf_Rel *rel = gelf_getrel (data, i, &rel_mem);
-	  adjust_reloc (&rel->r_info);
+	  ELF_CHECK (rel != NULL, _("gelf_getrel failed: %s"));
+	  adjust_reloc (&rel->r_info, map, map_size);
 	  ELF_CHECK (gelf_update_rel (data, i, rel),
 		     _("cannot update relocation: %s"));
 	}
@@ -474,7 +477,8 @@
 	{
 	  GElf_Rela rela_mem;
 	  GElf_Rela *rela = gelf_getrela (data, i, &rela_mem);
-	  adjust_reloc (&rela->r_info);
+	  ELF_CHECK (rela != NULL, _("gelf_getrela failed: %s"));
+	  adjust_reloc (&rela->r_info, map, map_size);
 	  ELF_CHECK (gelf_update_rela (data, i, rela),
 		     _("cannot update relocation: %s"));
 	}
@@ -1063,6 +1067,20 @@
   return sig;
 }
 
+static inline bool
+check_match (bool match, Elf_Scn *scn, const char *name)
+{
+  if (!match)
+    {
+      error (0, 0, _("cannot find matching section for [%zu] '%s'"),
+	     elf_ndxscn (scn), name);
+      return true;
+    }
+
+  return false;
+}
+
+
 /* Fix things up when prelink has moved some allocated sections around
    and the debuginfo file's section headers no longer match up.
    This fills in SECTIONS[0..NALLOC-1].outscn or exits.
@@ -1198,16 +1216,6 @@
     }
 
   bool fail = false;
-  inline void check_match (bool match, Elf_Scn *scn, const char *name)
-    {
-      if (!match)
-	{
-	  fail = true;
-	  error (0, 0, _("cannot find matching section for [%zu] '%s'"),
-		 elf_ndxscn (scn), name);
-	}
-    }
-
   Elf_Scn *scn = NULL;
   while ((scn = elf_nextscn (debug, scn)) != NULL)
     {
@@ -1238,7 +1246,7 @@
       for (size_t i = 0; shdr != NULL && i < nalloc; ++i)
 	if (sections[i].outscn == scn)
 	  shdr = NULL;
-      check_match (shdr == NULL, scn, name);
+      fail |= check_match (shdr == NULL, scn, name);
     }
 
   if (fail)
@@ -1294,7 +1302,7 @@
 	    }
 	}
 
-      check_match (undo_sec == NULL, scn, name);
+      fail |= check_match (undo_sec == NULL, scn, name);
     }
 
   free (undo_sections);
@@ -1446,29 +1454,6 @@
 	stripped_symtab = &sections[nalloc];
     }
 
-  /* Locate a matching unallocated section in SECTIONS.  */
-  inline struct section *find_unalloc_section (const GElf_Shdr *shdr,
-					       const char *name,
-					       const char *sig)
-    {
-      size_t l = nalloc, u = stripped_shnum - 1;
-      while (l < u)
-	{
-	  size_t i = (l + u) / 2;
-	  struct section *sec = &sections[i];
-	  int cmp = compare_unalloc_sections (shdr, &sec->shdr,
-					      name, sec->name,
-					      sig, sec->sig);
-	  if (cmp < 0)
-	    u = i;
-	  else if (cmp > 0)
-	    l = i + 1;
-	  else
-	    return sec;
-	}
-      return NULL;
-    }
-
   Elf_Data *shstrtab = elf_getdata (elf_getscn (unstripped,
 						unstripped_shstrndx), NULL);
   ELF_CHECK (shstrtab != NULL,
@@ -1530,9 +1515,27 @@
 	}
       else
 	{
-	  /* Look for the section that matches.  */
-	  sec = find_unalloc_section (shdr, name,
-				      get_group_sig (unstripped, shdr));
+	  /* Locate a matching unallocated section in SECTIONS.  */
+	  const char *sig = get_group_sig (unstripped, shdr);
+	  size_t l = nalloc, u = stripped_shnum - 1;
+	  while (l < u)
+	    {
+	      size_t i = (l + u) / 2;
+	      struct section *section = &sections[i];
+	      int cmp = compare_unalloc_sections (shdr, &section->shdr,
+						  name, section->name,
+						  sig, section->sig);
+	      if (cmp < 0)
+		u = i;
+	      else if (cmp > 0)
+		l = i + 1;
+	      else
+		{
+		  sec = section;
+		  break;
+		}
+	    }
+
 	  if (sec == NULL)
 	    {
 	      /* An additional unallocated section is fine if not SHT_NOBITS.
@@ -2224,22 +2227,23 @@
   return fd;
 }
 
+/* Warn, and exit if not forced to continue, if some ELF header
+   sanity check for the stripped and unstripped files failed.  */
+static void
+warn (const char *msg, bool force,
+      const char *stripped_file, const char *unstripped_file)
+{
+  error (force ? 0 : EXIT_FAILURE, 0, "%s'%s' and '%s' %s%s.",
+	 force ? _("WARNING: ") : "",
+	 stripped_file, unstripped_file, msg,
+	 force ? "" : _(", use --force"));
+}
+
 /* Handle a pair of files we need to open by name.  */
 static void
 handle_explicit_files (const char *output_file, bool create_dirs, bool force,
 		       const char *stripped_file, const char *unstripped_file)
 {
-
-  /* Warn, and exit if not forced to continue, if some ELF header
-     sanity check for the stripped and unstripped files failed.  */
-  void warn (const char *msg)
-  {
-    error (force ? 0 : EXIT_FAILURE, 0, "%s'%s' and '%s' %s%s.",
-	   force ? _("WARNING: ") : "",
-	   stripped_file, unstripped_file, msg,
-	   force ? "" : _(", use --force"));
-  }
-
   int stripped_fd = open_file (stripped_file, false);
   Elf *stripped = elf_begin (stripped_fd, ELF_C_READ, NULL);
   GElf_Ehdr stripped_ehdr;
@@ -2260,16 +2264,20 @@
 
       if (memcmp (stripped_ehdr.e_ident,
 		  unstripped_ehdr.e_ident, EI_NIDENT) != 0)
-	warn (_("ELF header identification (e_ident) different"));
+	warn (_("ELF header identification (e_ident) different"), force,
+	      stripped_file, unstripped_file);
 
       if (stripped_ehdr.e_type != unstripped_ehdr.e_type)
-	warn (_("ELF header type (e_type) different"));
+	warn (_("ELF header type (e_type) different"), force,
+	      stripped_file, unstripped_file);
 
       if (stripped_ehdr.e_machine != unstripped_ehdr.e_machine)
-	warn (_("ELF header machine type (e_machine) different"));
+	warn (_("ELF header machine type (e_machine) different"), force,
+	      stripped_file, unstripped_file);
 
       if (stripped_ehdr.e_phnum < unstripped_ehdr.e_phnum)
-	warn (_("stripped program header (e_phnum) smaller than unstripped"));
+	warn (_("stripped program header (e_phnum) smaller than unstripped"),
+	      force, stripped_file, unstripped_file);
     }
 
   handle_file (output_file, create_dirs, stripped, &stripped_ehdr, unstripped);
@@ -2393,11 +2401,11 @@
   if (file == NULL && ignore)
     return;
 
-  char *output_file;
-  if (asprintf (&output_file, "%s/%s", output_dir, modnames ? name : file) < 0)
-    error (EXIT_FAILURE, 0, _("memory exhausted"));
+  char *output_file = xasprintf ("%s/%s", output_dir, modnames ? name : file);
 
   handle_dwfl_module (output_file, true, force, mod, all, ignore, relocate);
+
+  free (output_file);
 }
 
 
@@ -2492,21 +2500,18 @@
 handle_implicit_modules (const struct arg_info *info)
 {
   struct match_module_info mmi = { info->args, NULL, info->match_files };
-  inline ptrdiff_t next (ptrdiff_t offset)
-    {
-      return dwfl_getmodules (info->dwfl, &match_module, &mmi, offset);
-    }
-  ptrdiff_t offset = next (0);
+  ptrdiff_t offset = dwfl_getmodules (info->dwfl, &match_module, &mmi, 0);
   if (offset == 0)
     error (EXIT_FAILURE, 0, _("no matching modules found"));
 
   if (info->list)
     do
       list_module (mmi.found);
-    while ((offset = next (offset)) > 0);
+    while ((offset = dwfl_getmodules (info->dwfl, &match_module, &mmi,
+				      offset)) > 0);
   else if (info->output_dir == NULL)
     {
-      if (next (offset) != 0)
+      if (dwfl_getmodules (info->dwfl, &match_module, &mmi, offset) != 0)
 	error (EXIT_FAILURE, 0, _("matched more than one module"));
       handle_dwfl_module (info->output_file, false, info->force, mmi.found,
 			  info->all, info->ignore, info->relocate);
@@ -2516,7 +2521,8 @@
       handle_output_dir_module (info->output_dir, mmi.found, info->force,
 				info->all, info->ignore,
 				info->modnames, info->relocate);
-    while ((offset = next (offset)) > 0);
+    while ((offset = dwfl_getmodules (info->dwfl, &match_module, &mmi,
+				      offset)) > 0);
 }
 
 int
@@ -2598,9 +2604,7 @@
 
       if (info.output_dir != NULL)
 	{
-	  char *file;
-	  if (asprintf (&file, "%s/%s", info.output_dir, info.args[0]) < 0)
-	    error (EXIT_FAILURE, 0, _("memory exhausted"));
+	  char *file = xasprintf ("%s/%s", info.output_dir, info.args[0]);
 	  handle_explicit_files (file, true, info.force,
 				 info.args[0], info.args[1]);
 	  free (file);
diff --git a/tests/.gitignore b/tests/.gitignore
index d0e83da..99d0481 100644
--- a/tests/.gitignore
+++ b/tests/.gitignore
@@ -85,6 +85,7 @@
 /next-files
 /next-lines
 /next_cfi
+/nvidia_extended_linemap_libdw
 /peel_type
 /rdwrmmap
 /read_unaligned
diff --git a/tests/ChangeLog b/tests/ChangeLog
index 907b635..a59cdd5 100644
--- a/tests/ChangeLog
+++ b/tests/ChangeLog
@@ -1,3 +1,381 @@
+2021-11-05  Frank Ch. Eigler  <fche@redhat.com>
+
+	PR28430
+	* run-debuginfod-extraction-passive.sh: New test.
+	* Makefile.am (TESTS, EXTRA_DIST): Add it.
+
+2021-10-20  John M Mellor-Crummey  <johnmc@rice.edu>
+
+	* nvidia_extended_linemap_libdw.c: New file.
+	* run-nvidia-extended-linemap-libdw.sh: New test.
+	* run-nvidia-extended-linemap-readelf.sh: Likewise.
+	* testfile_nvidia_linemap.bz2: New test file.
+	* .gitignore: Add nvidia_extended_linemap_libdw.
+	* Makefile.am (check_PROGRAMS): Add nvidia_extended_linemap_libdw.
+	(TESTS): Add run-nvidia-extended-linemap-libdw.sh and
+	run-nvidia-extended-linemap-readelf.sh
+	(EXTRA_DIST): Likewise and testfile_nvidia_linemap.bz2.
+	(nvidia_extended_linemap_libdw_LDADD): New variable.
+
+2021-11-08  Mark Wielaard  <mark@klomp.org>
+
+	* Makefile.am (TESTS): Add run-readelf-fat-lto.sh.
+	(EXTRA_DIST): Add run-readelf-fat-lto.sh and
+	testfile-dwarf5-fat-lto.o.bz2.
+	* run-readelf-fat-lto.sh: New test.
+	* testfile-dwarf5-fat-lto.o.bz2: New test file.
+
+2021-11-04  Frank Ch. Eigler  <fche@redhat.com>
+
+	PR28514
+	* run-debuginfod-archive-groom.sh: Look for new groom metric.
+
+2021-10-23  Frank Ch. Eigler  <fche@redhat.com>
+
+	PR28240
+	* run-debuginfod-000-permission.sh, -writable.sh:
+	Correct negative-cache file permission checking.
+
+2021-10-06  Mark Wielaard  <mark@klomp.org>
+
+	* show-die-info.c (handle): Handle dwarf_attr_string returning NULL.
+
+2021-10-06  Di Chen <dichen@redhat.com>
+
+	PR28242
+	* run-debuginfod-000-permission.sh: Expect artifacttype metrics.
+
+2021-09-17  Noah Sanci  <nsanci@redhat.com>
+
+	* run-debuginfod-response-header.sh: removed checking for Connection
+	and Cache-Control in response headers.
+
+2021-09-08  Mark Wielaard  <mark@klomp.org>
+
+	* run-varlocs-vars.sh: New test.
+	* testfile-vars-clang-dwarf4-32.o.bz2: New test file.
+	* testfile-vars-clang-dwarf4-64.o.bz2: Likewise.
+	* testfile-vars-clang-dwarf5-32.o.bz2: Likewise.
+	* testfile-vars-clang-dwarf5-64.o.bz2: Likewise.
+	* testfile-vars-gcc-dwarf4-32.o.bz2: Likewise.
+	* testfile-vars-gcc-dwarf4-64.o.bz2: Likewise.
+	* testfile-vars-gcc-dwarf5-32.o.bz2: Likewise.
+	* testfile-vars-gcc-dwarf5-64.o.bz2: Likewise.
+	* Makefile.am (EXTRA_DIST): Add new test and test files.
+	(TESTS): Add run-varlocs-vars.sh.
+
+2021-09-09  Mark Wielaard  <mark@klomp.org>
+
+	* debuginfod-subr.sh: set -o functrace.
+	(cleanup): Disable trap 0.
+	(err): Disable trap ERR.
+	* run-debuginfod-fd-prefetch-caches.sh: Use || true when grep -c fails.
+
+2021-09-09  Mark Wielaard  <mark@klomp.org>
+
+	* debuginfod-subr.sh: set -o errtrace.
+	(cleanup): Don't fail kill or wait. Only trap on normal exit.
+	(err): Don't fail curl metrics. Call cleanup.
+	* run-debuginfod-federation-link.sh: Use separate client caches
+	for both servers and debuginfod client. Remove duplicate valgrind
+	disabling.
+	* run-debuginfod-federation-metrics.sh: Likewise.
+	* run-debuginfod-federation-sqlite.sh: Likewise.
+
+2021-09-13  Noah Sanci  <nsanci@redhat.com>
+
+	* Makefile.am: added run-debuginfod-percent-escape.sh to TESTS and
+	EXTRA_DIST.
+
+2021-09-06  Dmitry V. Levin  <ldv@altlinux.org>
+
+	* elfcopy.c (copy_elf): Remove cast of malloc return value.
+
+2021-09-07  Mark Wielaard  <mark@klomp.org>
+
+	* run-debuginfod-archive-groom.sh: Wait for initial scan and groom
+	cycle before making any changes to the scan dirs.
+	* run-debuginfod-archive-rename.sh: Likewise.
+	* run-debuginfod-artifact-running.sh: Wait for initial scan cycle
+	before making any changes to the scan dirs.
+	* run-debuginfod-dlopen.sh: Likewise.
+	* run-debuginfod-extraction.sh: Likewise.
+	* run-debuginfod-federation-link.sh: Don't wait twice for the initial
+	scan.
+
+2021-09-06  Mark Wielaard  <mark@klomp.org>
+
+	* run-debuginfod-archive-groom.sh: Wait for initial scan and groom
+	cycle.
+	* run-debuginfod-archive-rename.sh: Likewise.
+	* run-debuginfod-federation-sqlite.sh: Likewise.
+	* run-debuginfod-archive-test.sh: Wait for initial scan cycle.
+	* run-debuginfod-artifact-running.sh: Likewise.
+	* run-debuginfod-dlopen.sh: Likewise.
+	* run-debuginfod-extraction.sh: Likewise.
+	* run-debuginfod-federation-link.sh: Likewise.
+	* run-debuginfod-federation-metrics.sh: Likewise.
+	* run-debuginfod-malformed.sh: Likewise.
+	* run-debuginfod-regex.sh: Likewise.
+	* run-debuginfod-tmp-home.sh: Likewise.
+	* run-debuginfod-writable.sh: Likewise.
+
+2021-09-06  Mark Wielaard  <mark@klomp.org>
+
+	* run-debuginfod-archive-groom.sh: Set DEBUGINFOD_URLS after starting
+	debuginfod server.
+	* run-debuginfod-archive-rename.sh: Likewise.
+	* run-debuginfod-federation-link.sh: Don't set DEBUGINFOD_URLS.
+	* run-debuginfod-federation-sqlite.sh: Likewise.
+	* run-debuginfod-federation-metrics.sh: Add comment why invalid
+	DEBUGINFOD_URLS is set.
+
+2021-09-06  Mark Wielaard  <mark@klomp.org>
+
+	* debuginfod-subr.sh (err): Change ports to port in for loop so both
+	PORT1 and PORT2 are used.
+	(get_ports): Simplify port selection by using for 50 for PORT1 and
+	second 50 for PORT2.
+
+2021-09-06  Mark Wielaard  <mark@klomp.org>
+
+	* run-debuginfod-file.sh: Set DEBUGINFOD_CACHE_PATH. Export
+	correct DEBUGINFOD_URLS.
+	* run-debuginfod-query-retry.sh: Add DEBUGINFOD_CACHE_PATH
+	to env.
+
+2021-09-03  Mark Wielaard  <mark@klomp.org>
+
+	* run-debuginfod-000-permission.sh: Set DEBUGINFOD_CACHE_PATH
+	and use an unique sqlite db.
+	* run-debuginfod-archive-groom.sh: Likewise.
+	* run-debuginfod-archive-test.sh: Likewise.
+	* run-debuginfod-dlopen.sh: Likewise.
+	* run-debuginfod-duplicate-urls.sh: Likewise.
+	* run-debuginfod-extraction.sh: Likewise.
+	* run-debuginfod-fd-prefetch-caches.sh: Likewise.
+	* run-debuginfod-malformed.sh: Likewise.
+	* run-debuginfod-sizetime.sh: Likewise.
+	* run-debuginfod-tmp-home.sh: Likewise.
+	* run-debuginfod-writable.sh: Likewise.
+
+2021-09-03  Mark Wielaard  <mark@klomp.org>
+
+	* debuginfod-subr.sh (EXTRA_DIST): Add debuginfod-subr.sh.
+
+2021-08-20  Noah Sanci  <nsanci@redhat.com>
+
+	* run-debuginfod-response-headers.sh: Ensures custom http response
+	headers are used and functional
+	* Makefile.am: Added the above new file to TESTS and EXTRA_DIST
+
+2021-08-28  Mark Wielaard  <mark@klomp.org>
+
+	* run-debuginfod-find.sh: Use ":memory:" for the
+	forwarded-ttl-limit tests.
+
+2021-08-28  Mark Wielaard  <mark@klomp.org>
+
+	* run-debuginfod-find.sh: Use clean, separate databases for
+	forwarded-ttl-limit tests.
+
+2021-08-20  Di Chen  <dichen@redhat.com>
+
+	* run-debuginfod-find.sh: Add test for X-Forwarded-For hops limit.
+
+2021-08-20  Noah Sanci  <nsanci@redhat.com>
+
+	* debuginfod-find.sh: Separated file into 
+	run-debuginfod-000-permission.sh, 
+	run-debuginfod-archive-groom.sh,
+	run-debuginfod-archive-rename.sh,
+	run-debuginfod-archive-test.sh,
+	run-debuginfod-artifact-running.sh,
+	run-debuginfod-dlopen.sh,
+	run-debuginfod-duplicate-urls.sh,
+	run-debuginfod-extraction.sh,
+	run-debuginfod-fd-prefetch-caches.sh,
+	run-debuginfod-federation-link.sh,
+	run-debuginfod-federation-metrics.sh,
+	run-debuginfod-federation-sqlite.sh,
+	run-debuginfod-file.sh,
+	run-debuginfod-malformed.sh,
+	run-debuginfod-no-urls.sh,
+	run-debuginfod-query-retry.sh,
+	run-debuginfod-regex.sh,
+	run-debuginfod-sizetime.sh,
+	run-debuginfod-tmp-home.sh,
+	run-debuginfod-x-forwarded.sh
+	and run-debuginfod-writable.sh.
+	All files source debuginfod-subr.sh and use the $base variable to find ports.
+	* tests/Makefile.am: Added the above new files to the test suite
+	* tests/debuginfod-subr.sh: Added some general functions for above tests
+
+2021-08-04  Mark Wielaard  <mark@klomp.org>
+
+	PR28190
+	* backtrace.c (callback_verify): Check for pthread_kill as first
+	frame. Change asserts to fprintf plus abort.
+
+2021-07-26  Noah Sanci  <nsanci@redhat.com>
+
+	PR27982
+	* run-debuginfod-find.sh: Added a test to ensure that
+	DEBUGINFOD_MAXSIZE and DEBUGINFOD_MAXTIME work properly
+	by searching server and client logs for prompts.
+
+2021-07-16  Noah Sanci  <nsanci@redhat.com>
+
+	PR28034
+	* run-debuginfod-percent-escape.sh: Added a test ensuring files with %
+	escapable characters in their paths are accessible.
+
+2021-07-21  Noah Sanci <nsanci@redhat.com>
+
+	* run-debuginfod-find.sh: Properly kill $PID4 by waiting for it to
+	finish. Report $PORT3's metrics in err().
+
+2021-06-28  Noah Sanci <nsanci@redhat.com>
+
+	PR25978
+	* run-debuginfod-find.sh: Test to ensure options
+	fdcache-prefetch-fds/mbs are set. Check that inc_metric works for lru
+	and prefetch cache metrics.
+
+2021-07-06  Alice Zhang  <alizhang@redhat.com>
+
+	PR27531
+	* run-debuginfod-find.sh: Add test case for retry mechanism.
+
+2021-07-01  Noah Sanci <nsanci@redhat.com>
+
+	PR2711
+	* run-debuginfod-find.sh: Added test case for grooming the database
+	using regexes. 
+
+2021-07-09  Noah Sanci  <nsanci@redhat.com>
+
+	PR27983
+	* run-debuginfod-find.sh: Wrote test to ensure duplicate urls are in
+	fact not checked.
+
+2021-07-08  Mark Wielaard  <mark@klomp.org>
+
+	* Makefile.am (EXTRA_DIST): Fix typo testfile-largealign.bz2 was
+	was missing .o.
+
+2021-06-09  Andrei Homescu  <ah@immunant.com>
+
+	* testfile-largealign.o.bz2: New test file.
+	* run-strip-largealign.sh: New test.
+	* Makefile.am (TESTS): Add run-strip-largealign.sh.
+	(EXTRA_DIST): Add run-strip-largealign.sh and
+	testfile-largealign.o.bz2
+
+2021-07-02  Mark Wielaard  <mark@klomp.org>
+
+	* run-debuginfo-find.sh: unset VALGRIND_CMD before testing debuginfod
+	client cache.
+
+2021-06-16  Frank Ch. Eigler <fche@redhat.com>
+
+	* run-debuginfod-find.sh: Fix intermittent groom/stale failure,
+	due to SIGUSR1/SIGUSR2 races.  Trace more.
+
+2021-06-15  Frank Ch. Eigler <fche@redhat.com>
+
+	* run-debuginfod-find.sh (err): Elaborate.  Use as the reliable
+	error-report triggering function, rather than "exit 1".
+
+2021-06-03  Frank Ch. Eigler <fche@redhat.com>
+
+	PR27863
+	* run-debuginfod-find.sh: Test "after-you" queueing via flooding
+	with concurent curls.
+
+2021-05-14  Frank Ch. Eigler <fche@redhat.com>
+
+	PR27859
+	* run-debuginfod-find.sh: Test absence of 404-latch bug in client
+	curl handle reuse.
+
+2021-04-19  Martin Liska  <mliska@suse.cz>
+
+	* dwelf_elf_e_machine_string.c (main): Use startswith.
+	* dwelfgnucompressed.c (main): Likewise.
+	* elfgetchdr.c (main): Likewise.
+	* elfputzdata.c (main): Likewise.
+	* vdsosyms.c (module_callback): Likewise.
+
+2021-05-04  Alice Zhang  <alizhang@redhat.com>
+
+	* run-debuginfod-find.sh: Added tests for negative cache files.
+
+2021-04-26  Frank Ch. Eigler <fche@redhat.com>
+
+	PR27571
+	* run-debuginfod-find.sh: Add test case for unwriteable cache files.
+
+2021-04-23  Omar Sandoval  <osandov@fb.com>
+
+	* run-low_high_pc-dw-form-indirect.sh: New file.
+	* run-readelf-dw-form-indirect.sh: New file.
+	* testfile-dw-form-indirect.bz2: New file.
+	* Makefile.am (TESTS): Add run-low_high_pc-dw-form-indirect.sh and
+	run-readelf-dw-form-indirect.sh.
+	(EXTRA_DIST): Add run-low_high_pc-dw-form-indirect.sh,
+	run-readelf-dw-form-indirect.sh, and testfile-dw-form-indirect.bz2.
+
+2021-04-26  Frank Ch. Eigler <fche@redhat.com>
+
+	PR26125
+	* run-debuginfod-find.sh: Add test case for cache cleanup rmdir.
+
+2021-04-23  Frank Ch. Eigler  <fche@redhat.com>
+
+	* run-debuginfod-find.sh: Add a tiny test for client object reuse.
+	Add an "errfiles" test construct to ask the framework to print
+	various files in the case of an error.
+
+2021-03-30  Frank Ch. Eigler  <fche@redhat.com>
+
+	* run-debuginfod-find.sh: Add thread comm checks.
+
+2021-02-17  Timm Bäder  <tbaeder@redhat.com>
+
+	* elfstrmerge.c (main): Move new_data_buf function to...
+	(new_data_buf): ...top-level static function adding fname,
+	ndx, shdrstrnd and shdrnum as arguments.
+
+2021-02-17  Timm Bäder  <tbaeder@redhat.com>
+
+	* elfstrmerge.c (main): Move newsecndx function to...
+	(newsecndx): ...top-level static function adding shdrstrndx,
+	shdrnum and fname as arguments.
+
+2021-02-25  Frank Ch. Eigler <fche@redhat.com>
+
+	* run-debuginfod-find.sh: Add bad webapi artifacttype test.
+
+2021-02-17  Frank Ch. Eigler <fche@redhat.com>
+
+	* run-debuginfod-find.sh: Tweak wait_ready() to also print -vvv log of
+	appropriate debuginfod if metric timeout occurs.  Focus grooming
+	test carefully at a more deterministic metric.
+
+2021-02-12  Mark Wielaard  <mark@klomp.org>
+
+	* run-readelf-types.sh: Add CU start to type offset reference.
+
+2021-02-07  Alexander Miller  <alex.miller@gmx.de>
+
+	* Makefile.am (TESTS_ENVIRONMENT): Quote variables.
+	(valgrind_cmd): Unquote variable.
+
+2021-02-08  Érico Nogueira  <ericonr@disroot.org>
+
+	* run-debuginfod-find.sh: Check for cpio availability.
+
 2021-02-04  Frank Ch. Eigler <fche@redhat.com>
 
 	* run-debuginfod-find.sh: Smoke test --fdcache-mintmp option handling.
diff --git a/tests/Makefile.am b/tests/Makefile.am
index c145720..bfb8b13 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -61,6 +61,7 @@
 		  dwelf_elf_e_machine_string \
 		  getphdrnum leb128 read_unaligned \
 		  msg_tst system-elf-libelf-test \
+		  nvidia_extended_linemap_libdw \
 		  $(asm_TESTS)
 
 asm_TESTS = asm-tst1 asm-tst2 asm-tst3 asm-tst4 asm-tst5 \
@@ -139,11 +140,11 @@
 	run-low_high_pc.sh run-macro-test.sh run-elf_cntl_gelf_getshdr.sh \
 	run-test-archive64.sh run-readelf-vmcoreinfo.sh \
 	run-readelf-mixed-corenote.sh run-dwfllines.sh \
-	run-readelf-variant.sh \
+	run-readelf-variant.sh run-readelf-fat-lto.sh \
 	run-dwfl-report-elf-align.sh run-addr2line-test.sh \
 	run-addr2line-i-test.sh run-addr2line-i-lex-test.sh \
 	run-addr2line-i-demangle-test.sh run-addr2line-alt-debugpath.sh \
-	run-varlocs.sh run-exprlocs.sh run-funcretval.sh \
+	run-varlocs.sh run-exprlocs.sh run-varlocs-vars.sh run-funcretval.sh \
 	run-backtrace-native.sh run-backtrace-data.sh run-backtrace-dwarf.sh \
 	run-backtrace-native-biarch.sh run-backtrace-native-core.sh \
 	run-backtrace-native-core-biarch.sh run-backtrace-core-x86_64.sh \
@@ -158,6 +159,7 @@
 	run-backtrace-demangle.sh run-stack-d-test.sh run-stack-i-test.sh \
 	run-stack-demangled-test.sh run-readelf-zx.sh run-readelf-zp.sh \
 	run-readelf-addr.sh run-readelf-str.sh \
+	run-readelf-multi-noline.sh \
 	run-readelf-types.sh \
 	run-readelf-dwz-multi.sh run-allfcts-multi.sh run-deleted.sh \
 	run-linkmap-cut.sh run-aggregate-size.sh run-peel-type.sh \
@@ -187,7 +189,9 @@
 	run-getphdrnum.sh run-test-includes.sh \
 	leb128 read_unaligned \
 	msg_tst system-elf-libelf-test \
-	$(asm_TESTS) run-disasm-bpf.sh
+	$(asm_TESTS) run-disasm-bpf.sh run-low_high_pc-dw-form-indirect.sh \
+	run-nvidia-extended-linemap-libdw.sh run-nvidia-extended-linemap-readelf.sh \
+	run-readelf-dw-form-indirect.sh run-strip-largealign.sh
 
 if !BIARCH
 export ELFUTILS_DISABLE_BIARCH = 1
@@ -209,7 +213,30 @@
 check_PROGRAMS += debuginfod_build_id_find
 # With the dummy delegation doesn't work
 if !DUMMY_LIBDEBUGINFOD
-TESTS += run-debuginfod-find.sh
+TESTS += run-debuginfod-dlopen.sh \
+	 run-debuginfod-artifact-running.sh \
+	 run-debuginfod-fd-prefetch-caches.sh \
+	 run-debuginfod-regex.sh \
+	 run-debuginfod-duplicate-urls.sh \
+	 run-debuginfod-file.sh \
+	 run-debuginfod-sizetime.sh \
+	 run-debuginfod-malformed.sh \
+	 run-debuginfod-000-permission.sh \
+	 run-debuginfod-tmp-home.sh \
+	 run-debuginfod-writable.sh \
+	 run-debuginfod-no-urls.sh \
+	 run-debuginfod-query-retry.sh \
+	 run-debuginfod-extraction.sh \
+	 run-debuginfod-archive-groom.sh \
+	 run-debuginfod-archive-rename.sh \
+	 run-debuginfod-archive-test.sh \
+	 run-debuginfod-federation-sqlite.sh \
+	 run-debuginfod-federation-link.sh \
+	 run-debuginfod-federation-metrics.sh \
+         run-debuginfod-percent-escape.sh \
+         run-debuginfod-x-forwarded-for.sh \
+         run-debuginfod-response-headers.sh \
+         run-debuginfod-extraction-passive.sh
 endif
 endif
 
@@ -278,7 +305,7 @@
 	     testfile21.bz2 testfile21.index.bz2 \
 	     testfile22.bz2 testfile23.bz2 testfile24.bz2 testfile25.bz2 \
 	     testfile26.bz2 testfile27.bz2 \
-	     coverage.sh test-subr.sh test-wrapper.sh \
+	     coverage.sh test-subr.sh test-wrapper.sh debuginfod-subr.sh \
 	     run-readelf-test1.sh run-readelf-test2.sh run-readelf-test3.sh \
 	     run-readelf-test4.sh run-readelf-twofiles.sh \
 	     run-bug1-test.sh testfile28.bz2 testfile28.rdwr.bz2 \
@@ -310,6 +337,7 @@
 	     testfile_multi.dwz.bz2 testfile_multi_main.bz2 \
 	     testfile-dwzstr.bz2 testfile-dwzstr.multi.bz2 \
 	     run-readelf-addr.sh run-readelf-str.sh \
+	     run-readelf-multi-noline.sh testfile_multi_noline.bz2 \
 	     run-readelf-types.sh \
 	     run-readelf-frames.sh \
 	     run-readelf-n.sh \
@@ -354,6 +382,7 @@
 	     testfilebazminppc64.bz2 testfilebazminppc64_pl.bz2 \
 	     testfilebazminppc64_plr.bz2 testfilebaztabppc64.bz2 \
 	     run-readelf-variant.sh testfile-ada-variant.bz2 \
+	     run-readelf-fat-lto.sh testfile-dwarf5-fat-lto.o.bz2 \
 	     run-dwflsyms.sh \
 	     run-unstrip-n.sh testcore-rtlib.bz2 testcore-rtlib-ppc.bz2 \
 	     run-low_high_pc.sh testfile_low_high_pc.bz2 \
@@ -376,7 +405,16 @@
 	     testfileppc32.bz2 testfileppc64.bz2 \
 	     testfiles390.bz2 testfiles390x.bz2 \
 	     testfilearm.bz2 testfileaarch64.bz2 \
-	     run-varlocs.sh run-exprlocs.sh testfile-stridex.bz2 \
+	     run-varlocs.sh run-exprlocs.sh run-varlocs-vars.sh \
+	     testfile-vars-clang-dwarf4-32.o.bz2 \
+	     testfile-vars-clang-dwarf4-64.o.bz2 \
+	     testfile-vars-clang-dwarf5-32.o.bz2 \
+	     testfile-vars-clang-dwarf5-64.o.bz2 \
+	     testfile-vars-gcc-dwarf4-32.o.bz2 \
+	     testfile-vars-gcc-dwarf4-64.o.bz2 \
+	     testfile-vars-gcc-dwarf5-32.o.bz2 \
+	     testfile-vars-gcc-dwarf5-64.o.bz2 \
+	     testfile-stridex.bz2 \
 	     testfile_const_type.c testfile_const_type.bz2 \
 	     testfile_implicit_pointer.c testfile_implicit_pointer.bz2 \
 	     testfile_parameter_ref.c testfile_parameter_ref.bz2 \
@@ -471,7 +509,30 @@
 	     run-elfclassify.sh run-elfclassify-self.sh \
 	     run-disasm-riscv64.sh \
 	     testfile-riscv64-dis1.o.bz2 testfile-riscv64-dis1.expect.bz2 \
-             run-debuginfod-find.sh \
+             run-debuginfod-extraction.sh \
+             run-debuginfod-federation-link.sh \
+             run-debuginfod-federation-metrics.sh \
+             run-debuginfod-artifact-running.sh \
+             run-debuginfod-federation-sqlite.sh \
+             run-debuginfod-x-forwarded-for.sh \
+	     run-debuginfod-fd-prefetch-caches.sh \
+	     run-debuginfod-regex.sh \
+	     run-debuginfod-duplicate-urls.sh \
+	     run-debuginfod-file.sh \
+	     run-debuginfod-sizetime.sh \
+	     run-debuginfod-dlopen.sh \
+	     run-debuginfod-malformed.sh \
+	     run-debuginfod-000-permission.sh \
+	     run-debuginfod-tmp-home.sh \
+	     run-debuginfod-writable.sh \
+	     run-debuginfod-no-urls.sh \
+	     run-debuginfod-query-retry.sh \
+	     run-debuginfod-archive-groom.sh \
+	     run-debuginfod-archive-rename.sh \
+             run-debuginfod-archive-test.sh \
+             run-debuginfod-percent-escape.sh \
+	     run-debuginfod-response-headers.sh \
+             run-debuginfod-extraction-passive.sh \
 	     debuginfod-rpms/fedora30/hello2-1.0-2.src.rpm \
 	     debuginfod-rpms/fedora30/hello2-1.0-2.x86_64.rpm \
 	     debuginfod-rpms/fedora30/hello2-debuginfo-1.0-2.x86_64.rpm \
@@ -507,40 +568,45 @@
 	     run-pt_gnu_prop-tests.sh \
 	     testfile_pt_gnu_prop.bz2 testfile_pt_gnu_prop32.bz2 \
 	     run-getphdrnum.sh testfile-phdrs.elf.bz2 \
-	     run-test-includes.sh
+	     run-test-includes.sh run-low_high_pc-dw-form-indirect.sh \
+	     run-readelf-dw-form-indirect.sh testfile-dw-form-indirect.bz2 \
+	     run-nvidia-extended-linemap-libdw.sh run-nvidia-extended-linemap-readelf.sh \
+	     testfile_nvidia_linemap.bz2 \
+	     testfile-largealign.o.bz2 run-strip-largealign.sh
 
 
 if USE_VALGRIND
-valgrind_cmd='valgrind -q --leak-check=full --error-exitcode=1'
+valgrind_cmd=valgrind -q --leak-check=full --error-exitcode=1
 endif
 
 
-installed_TESTS_ENVIRONMENT = libdir=$(DESTDIR)$(libdir); \
-			      bindir=$(DESTDIR)$(bindir); \
+installed_TESTS_ENVIRONMENT = libdir='$(DESTDIR)$(libdir)'; \
+			      bindir='$(DESTDIR)$(bindir)'; \
 			      LC_ALL=C; LANG=C; \
-			      VALGRIND_CMD=$(valgrind_cmd); \
-			      abs_srcdir=$(abs_srcdir); \
-			      abs_builddir=$(abs_builddir); \
-			      abs_top_builddir=$(abs_top_builddir); \
+			      VALGRIND_CMD='$(valgrind_cmd)'; \
+			      abs_srcdir='$(abs_srcdir)'; \
+			      abs_builddir='$(abs_builddir)'; \
+			      abs_top_builddir='$(abs_top_builddir)'; \
 			      export abs_srcdir; export abs_builddir; \
 			      export abs_top_builddir; \
 			      export libdir; export bindir; \
 			      export LC_ALL; export LANG; export VALGRIND_CMD; \
 			      unset DEBUGINFOD_URLS; \
-			      NM=$(NM); export NM; \
-			      CC=$(CC); export CC;
+			      NM='$(NM)'; export NM; \
+			      CC='$(CC)'; export CC;
 installed_LOG_COMPILER = $(abs_srcdir)/test-wrapper.sh \
 			 installed $(tests_rpath) \
 			 '$(program_transform_name)'
-TESTS_ENVIRONMENT = LC_ALL=C; LANG=C; VALGRIND_CMD=$(valgrind_cmd); \
-		    abs_srcdir=$(abs_srcdir);  abs_builddir=$(abs_builddir); \
-		    abs_top_builddir=$(abs_top_builddir); \
+TESTS_ENVIRONMENT = LC_ALL=C; LANG=C; VALGRIND_CMD='$(valgrind_cmd)'; \
+		    abs_srcdir='$(abs_srcdir)'; \
+		    abs_builddir='$(abs_builddir)'; \
+		    abs_top_builddir='$(abs_top_builddir)'; \
 		    export abs_srcdir; export abs_builddir; \
 		    export abs_top_builddir; \
 		    export LC_ALL; export LANG; export VALGRIND_CMD; \
 		    unset DEBUGINFOD_URLS; \
-		    NM=$(NM); export NM; \
-		    CC=$(CC); export CC;
+		    NM='$(NM)'; export NM; \
+		    CC='$(CC)'; export CC;
 LOG_COMPILER = $(abs_srcdir)/test-wrapper.sh \
 	       $(abs_top_builddir)/libdw:$(abs_top_builddir)/backends:$(abs_top_builddir)/libelf:$(abs_top_builddir)/libasm:$(abs_top_builddir)/debuginfod
 
@@ -679,6 +745,7 @@
 getphdrnum_LDADD = $(libelf) $(libdw)
 leb128_LDADD = $(libelf) $(libdw)
 read_unaligned_LDADD = $(libelf) $(libdw)
+nvidia_extended_linemap_libdw_LDADD = $(libelf) $(libdw)
 
 # We want to test the libelf header against the system elf.h header.
 # Don't include any -I CPPFLAGS. Except when we install our own elf.h.
diff --git a/tests/backtrace.c b/tests/backtrace.c
index 36c8b8c..afc12fb 100644
--- a/tests/backtrace.c
+++ b/tests/backtrace.c
@@ -97,6 +97,9 @@
   static bool reduce_frameno = false;
   if (reduce_frameno)
     frameno--;
+  static bool pthread_kill_seen = false;
+  if (pthread_kill_seen)
+    frameno--;
   if (! use_raise_jmp_patching && frameno >= 2)
     frameno += 2;
   const char *symname2 = NULL;
@@ -107,11 +110,26 @@
 	       && (strcmp (symname, "__kernel_vsyscall") == 0
 		   || strcmp (symname, "__libc_do_syscall") == 0))
 	reduce_frameno = true;
+      else if (! pthread_kill_seen && symname
+	       && strstr (symname, "pthread_kill") != NULL)
+	pthread_kill_seen = true;
       else
-	assert (symname && strcmp (symname, "raise") == 0);
+	{
+	  if (!symname || strcmp (symname, "raise") != 0)
+	    {
+	      fprintf (stderr,
+		       "case 0: expected symname 'raise' got '%s'\n", symname);
+	      abort ();
+	    }
+	}
       break;
     case 1:
-      assert (symname != NULL && strcmp (symname, "sigusr2") == 0);
+      if (symname == NULL || strcmp (symname, "sigusr2") != 0)
+	{
+	  fprintf (stderr,
+		   "case 1: expected symname 'sigusr2' got '%s'\n", symname);
+	  abort ();
+	}
       break;
     case 2: // x86_64 only
       /* __restore_rt - glibc maybe does not have to have this symbol.  */
@@ -120,11 +138,21 @@
       if (use_raise_jmp_patching)
 	{
 	  /* Verify we trapped on the very first instruction of jmp.  */
-	  assert (symname != NULL && strcmp (symname, "jmp") == 0);
+	  if (symname == NULL || strcmp (symname, "jmp") != 0)
+	    {
+	      fprintf (stderr,
+		       "case 3: expected symname 'raise' got '%s'\n", symname);
+	      abort ();
+	    }
 	  mod = dwfl_addrmodule (dwfl, pc - 1);
 	  if (mod)
 	    symname2 = dwfl_module_addrname (mod, pc - 1);
-	  assert (symname2 == NULL || strcmp (symname2, "jmp") != 0);
+	  if (symname2 == NULL || strcmp (symname2, "jmp") != 0)
+	    {
+	      fprintf (stderr,
+		       "case 3: expected symname2 'jmp' got '%s'\n", symname2);
+	      abort ();
+	    }
 	  break;
 	}
       FALLTHROUGH;
@@ -137,11 +165,22 @@
 	  duplicate_sigusr2 = true;
 	  break;
 	}
-      assert (symname != NULL && strcmp (symname, "stdarg") == 0);
+      if (symname == NULL || strcmp (symname, "stdarg") != 0)
+	{
+	  fprintf (stderr,
+		   "case 4: expected symname 'stdarg' got '%s'\n", symname);
+	  abort ();
+	}
       break;
     case 5:
       /* Verify we trapped on the very last instruction of child.  */
-      assert (symname != NULL && strcmp (symname, "backtracegen") == 0);
+      if (symname == NULL || strcmp (symname, "backtracegen") != 0)
+	{
+	  fprintf (stderr,
+		   "case 5: expected symname 'backtracegen' got '%s'\n",
+		   symname);
+	  abort ();
+	}
       mod = dwfl_addrmodule (dwfl, pc);
       if (mod)
 	symname2 = dwfl_module_addrname (mod, pc);
@@ -151,7 +190,15 @@
       // instructions or even inserts some padding instructions at the end
       // (which apparently happens on ppc64).
       if (use_raise_jmp_patching)
-        assert (symname2 == NULL || strcmp (symname2, "backtracegen") != 0);
+	{
+          if (symname2 != NULL && strcmp (symname2, "backtracegen") == 0)
+	    {
+	      fprintf (stderr,
+		       "use_raise_jmp_patching didn't expect symname2 "
+		       "'backtracegen'\n");
+	      abort ();
+	    }
+	}
       break;
   }
 }
diff --git a/tests/debuginfod-subr.sh b/tests/debuginfod-subr.sh
new file mode 100755
index 0000000..59033f3
--- /dev/null
+++ b/tests/debuginfod-subr.sh
@@ -0,0 +1,160 @@
+# Copyright (C) 2021 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 the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# 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 a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# sourced from run-debuginfod-*.sh tests (must be bash scripts)
+
+# We trap ERR and like commands that fail in function to also trap
+set -o functrace
+set -o errtrace
+
+. $srcdir/test-subr.sh  # includes set -e
+
+type curl 2>/dev/null || (echo "need curl"; exit 77)
+type rpm2cpio 2>/dev/null || (echo "need rpm2cpio"; exit 77)
+type cpio 2>/dev/null || (echo "need cpio"; exit 77)
+type bzcat 2>/dev/null || (echo "need bzcat"; exit 77)
+bsdtar --version | grep -q zstd && zstd=true || zstd=false
+echo "zstd=$zstd bsdtar=`bsdtar --version`"
+
+cleanup()
+{
+  # No more cleanups after this cleanup
+  trap - 0
+
+  if [ $PID1 -ne 0 ]; then kill $PID1 || : ; wait $PID1 || :; fi
+  if [ $PID2 -ne 0 ]; then kill $PID2 || : ; wait $PID2 || :; fi
+  rm -rf F R D L Z ${PWD}/foobar ${PWD}/mocktree ${PWD}/.client_cache* ${PWD}/tmp*
+  exit_cleanup
+}
+
+# clean up trash if we exit
+trap cleanup 0
+
+errfiles_list=
+err() {
+    # Don't trap any new errors from now on
+    trap - ERR
+
+    echo ERROR REPORTS
+    for port in $PORT1 $PORT2
+    do
+        echo ERROR REPORT $port metrics
+        curl -s http://127.0.0.1:$port/metrics || :
+        echo
+    done
+    for x in $errfiles_list
+    do
+        echo ERROR REPORT "$x"
+        cat $x
+        echo
+    done
+    cleanup
+    false # trigger set -e
+}
+trap err ERR
+
+errfiles() {
+    errfiles_list="$errfiles_list $*"
+}
+
+# We want to run debuginfod in the background.  We also want to start
+# it with the same check/installcheck-sensitive LD_LIBRARY_PATH stuff
+# that the testrun alias sets.  But: we if we just use
+#    testrun .../debuginfod
+# it runs in a subshell, with different pid, so not helpful.
+#
+# So we gather the LD_LIBRARY_PATH with this cunning trick:
+ldpath=`testrun sh -c 'echo $LD_LIBRARY_PATH'`
+
+wait_ready()
+{
+  port=$1;
+  what=$2;
+  value=$3;
+  timeout=20;
+
+  echo "Wait $timeout seconds on $port for metric $what to change to $value"
+  while [ $timeout -gt 0 ]; do
+    mvalue="$(curl -s http://127.0.0.1:$port/metrics \
+              | grep "$what" | awk '{print $NF}')"
+    if [ -z "$mvalue" ]; then mvalue=0; fi
+      echo "metric $what: $mvalue"
+      if [ "$mvalue" -eq "$value" ]; then
+        break;
+    fi
+    sleep 0.5;
+    ((timeout--));
+  done;
+
+  if [ $timeout -eq 0 ]; then
+    echo "metric $what never changed to $value on port $port"
+    err
+  fi
+}
+
+archive_test() {
+    __BUILDID=$1
+    __SOURCEPATH=$2
+    __SOURCESHA1=$3
+
+    filename=`testrun ${abs_top_builddir}/debuginfod/debuginfod-find executable $__BUILDID`
+    buildid=`env LD_LIBRARY_PATH=$ldpath ${abs_builddir}/../src/readelf \
+             -a $filename | grep 'Build ID' | cut -d ' ' -f 7`
+    test $__BUILDID = $buildid
+    # check that timestamps are plausible - older than the near-present (tmpdir mtime)
+    test $filename -ot `pwd`
+
+    # run again to assure that fdcache is being enjoyed
+    filename=`testrun ${abs_top_builddir}/debuginfod/debuginfod-find executable $__BUILDID`
+    buildid=`env LD_LIBRARY_PATH=$ldpath ${abs_builddir}/../src/readelf \
+             -a $filename | grep 'Build ID' | cut -d ' ' -f 7`
+    test $__BUILDID = $buildid
+    test $filename -ot `pwd`
+
+    filename=`testrun ${abs_top_builddir}/debuginfod/debuginfod-find debuginfo $__BUILDID`
+    buildid=`env LD_LIBRARY_PATH=$ldpath ${abs_builddir}/../src/readelf \
+             -a $filename | grep 'Build ID' | cut -d ' ' -f 7`
+    test $__BUILDID = $buildid
+    test $filename -ot `pwd`
+
+    if test "x$__SOURCEPATH" != "x"; then
+        filename=`testrun ${abs_top_builddir}/debuginfod/debuginfod-find source $__BUILDID $__SOURCEPATH`
+        hash=`cat $filename | sha1sum | awk '{print $1}'`
+        test $__SOURCESHA1 = $hash
+        test $filename -ot `pwd`
+    fi
+}
+
+get_ports() {
+  while true; do
+    PORT1=`expr '(' $RANDOM % 50 ')' + $base`
+    ss -atn | fgrep ":$PORT1" || break
+  done
+# Some tests will use two servers, so assign the second var
+  while true; do
+    PORT2=`expr '(' $RANDOM % 50 ')' + $base + 50`
+    ss -atn | fgrep ":$PORT2" || break
+  done
+
+}
+
+VERBOSE=-vvv
+# We gather the LD_LIBRARY_PATH with this cunning trick:
+ldpath=`testrun sh -c 'echo $LD_LIBRARY_PATH'`
+PORT1=0
+PORT2=0
+PID1=0
+PID2=0
diff --git a/tests/dwelf_elf_e_machine_string.c b/tests/dwelf_elf_e_machine_string.c
index afad105..30599c3 100644
--- a/tests/dwelf_elf_e_machine_string.c
+++ b/tests/dwelf_elf_e_machine_string.c
@@ -19,6 +19,8 @@
 # include <config.h>
 #endif
 
+#include <system.h>
+
 #include <assert.h>
 #include <errno.h>
 #include <inttypes.h>
@@ -41,7 +43,7 @@
       const char *machine;
 
       errno = 0;
-      if (strncmp ("0x", argv[i], 2) == 0)
+      if (startswith (argv[i], "0x"))
 	val = strtol (&argv[i][2], NULL, 16);
       else
 	val = strtol (argv[i], NULL, 10);
diff --git a/tests/dwelfgnucompressed.c b/tests/dwelfgnucompressed.c
index 0132271..447f3d5 100644
--- a/tests/dwelfgnucompressed.c
+++ b/tests/dwelfgnucompressed.c
@@ -18,6 +18,8 @@
 # include <config.h>
 #endif
 
+#include <system.h>
+
 #include <assert.h>
 #include <sys/types.h>
 #include <sys/stat.h>
@@ -82,7 +84,7 @@
 	      break;
 	    }
 
-	  if (strncmp(".zdebug", sname, strlen (".zdebug")) == 0)
+	  if (startswith (sname, ".zdebug"))
 	    {
 	      ssize_t size;
 	      if ((size = dwelf_scn_gnu_compressed_size (scn)) == -1)
diff --git a/tests/elfcopy.c b/tests/elfcopy.c
index 4542222..10b2d36 100644
--- a/tests/elfcopy.c
+++ b/tests/elfcopy.c
@@ -194,7 +194,7 @@
 	  exit (1);
 	}
 
-      offs = (GElf_Off *) malloc (shnum * sizeof (GElf_Off));
+      offs = malloc (shnum * sizeof (GElf_Off));
       if (offs == NULL)
 	{
 	  printf ("couldn't allocate memory for offs\n");
diff --git a/tests/elfgetchdr.c b/tests/elfgetchdr.c
index 44ba178..171c4df 100644
--- a/tests/elfgetchdr.c
+++ b/tests/elfgetchdr.c
@@ -18,6 +18,8 @@
 # include <config.h>
 #endif
 
+#include <system.h>
+
 #include <assert.h>
 #include <sys/types.h>
 #include <sys/stat.h>
@@ -99,7 +101,7 @@
 		}
 
 	      /* This duplicates what the dwelfgnucompressed testcase does.  */
-	      if (strncmp(".zdebug", sname, strlen (".zdebug")) == 0)
+	      if (startswith (sname, ".zdebug"))
 		{
 		  ssize_t size;
 		  if ((size = dwelf_scn_gnu_compressed_size (scn)) == -1)
diff --git a/tests/elfputzdata.c b/tests/elfputzdata.c
index 0d9c020..0ff363f 100644
--- a/tests/elfputzdata.c
+++ b/tests/elfputzdata.c
@@ -18,6 +18,8 @@
 # include <config.h>
 #endif
 
+#include <system.h>
+
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <fcntl.h>
@@ -83,7 +85,7 @@
 	      printf ("Cannot compress %zd %s\n", idx, name);
 	    }
 	  else if ((shdr->sh_flags & SHF_COMPRESSED) != 0
-		   || strncmp (name, ".zdebug", strlen (".zdebug")) == 0)
+		   || startswith (name, ".zdebug"))
 	    {
 	      printf ("Already compressed %zd %s\n", idx, name);
 	    }
diff --git a/tests/elfstrmerge.c b/tests/elfstrmerge.c
index abbdf3f..197c6a5 100644
--- a/tests/elfstrmerge.c
+++ b/tests/elfstrmerge.c
@@ -147,6 +147,47 @@
   abort();
 }
 
+/* section index mapping and sanity checking.  */
+static size_t
+newsecndx (size_t secndx, size_t shdrstrndx, size_t shdrnum,
+	   const char *fname,
+	   const char *what, size_t widx,
+	   const char *member, size_t midx)
+{
+  if (unlikely (secndx == 0 || secndx == shdrstrndx || secndx >= shdrnum))
+    {
+      /* Don't use fail... too specialized messages.  Call release
+	 outselves and then error.  Ignores midx if widx is
+	 zero.  */
+      release ();
+      if (widx == 0)
+	error (1, 0, "%s: bad section index %zd in %s for %s",
+	       fname, secndx, what, member);
+      else if (midx == 0)
+	error (1, 0, "%s: bad section index %zd in %s %zd for %s",
+	       fname, secndx, what, widx, member);
+      else
+	error (1, 0, "%s: bad section index %zd in %s %zd for %s %zd",
+	       fname, secndx, what, widx, member, midx);
+    }
+
+  return secndx < shdrstrndx ? secndx : secndx - 1;
+}
+
+static void
+new_data_buf (Elf_Data *d, const char *fname,
+	      size_t ndx, size_t shdrstrndx, size_t shdrnum)
+{
+  size_t s = d->d_size;
+  if (s == 0)
+    fail_idx ("Expected data in section", fname, ndx);
+  void *b = malloc (d->d_size);
+  if (b == NULL)
+    fail_idx ("Couldn't allocated buffer for section", NULL, ndx);
+  newscnbufs[newsecndx (ndx, shdrstrndx, shdrnum, fname,
+			"section", ndx, "d_buf", 0)] = d->d_buf = b;
+}
+
 int
 main (int argc, char **argv)
 {
@@ -325,30 +366,6 @@
   if (newstrtabdata.d_size >= shdrstrshdr->sh_size + strtabshdr->sh_size)
     fail ("Impossible, merged string table is larger", fname);
 
-  /* section index mapping and sanity checking.  */
-  size_t newsecndx (size_t secndx, const char *what, size_t widx,
-		    const char *member, size_t midx)
-  {
-    if (unlikely (secndx == 0 || secndx == shdrstrndx || secndx >= shdrnum))
-      {
-	/* Don't use fail... too specialized messages.  Call release
-	   ourselves and then error.  Ignores midx if widx is
-	   zero.  */
-	release ();
-	if (widx == 0)
-	  error (1, 0, "%s: bad section index %zd in %s for %s",
-		 fname, secndx, what, member);
-	else if (midx == 0)
-	  error (1, 0, "%s: bad section index %zd in %s %zd for %s",
-		 fname, secndx, what, widx, member);
-	else
-	  error (1, 0, "%s: bad section index %zd in %s %zd for %s %zd",
-		 fname, secndx, what, widx, member, midx);
-      }
-
-    return secndx < shdrstrndx ? secndx : secndx - 1;
-  }
-
   struct stat st;
   if (fstat (fd, &st) != 0)
     fail_errno("Couldn't fstat", fname);
@@ -392,7 +409,8 @@
   newehdr.e_flags = ehdr.e_flags;
 
   /* The new file uses the new strtab as shstrtab.  */
-  size_t newstrtabndx = newsecndx (strtabndx, "ehdr", 0, "e_shstrndx", 0);
+  size_t newstrtabndx = newsecndx (strtabndx, shdrstrndx, shdrnum,
+				   fname, "ehdr", 0, "e_shstrndx", 0);
   if (newstrtabndx < SHN_LORESERVE)
     newehdr.e_shstrndx = newstrtabndx;
   else
@@ -460,11 +478,14 @@
       newshdr.sh_addr = shdr->sh_addr;
       newshdr.sh_size = shdr->sh_size;
       if (shdr->sh_link != 0)
-	newshdr.sh_link = newsecndx (shdr->sh_link, "shdr", ndx, "sh_link", 0);
+	newshdr.sh_link = newsecndx (shdr->sh_link, shdrstrndx, shdrnum,
+				     fname, "shdr", ndx, "sh_link", 0);
       else
 	newshdr.sh_link = 0;
       if (SH_INFO_LINK_P (shdr) && shdr->sh_info != 0)
-	newshdr.sh_info = newsecndx (shdr->sh_info, "shdr", ndx, "sh_info", 0);
+	newshdr.sh_info = newsecndx (shdr->sh_info, shdrstrndx, shdrnum,
+				     fname, "shdr", ndx, "sh_info", 0);
+
       else
 	newshdr.sh_info = shdr->sh_info;
       newshdr.sh_entsize = shdr->sh_entsize;
@@ -473,17 +494,6 @@
 	 manipulate the original data.  Allocate and check here, so we
 	 have a list of all data buffers we might need to release when
 	 done.  */
-      void new_data_buf (Elf_Data *d)
-      {
-	size_t s = d->d_size;
-	if (s == 0)
-	  fail_idx ("Expected data in section", fname, ndx);
-	void *b = malloc (d->d_size);
-	if (b == NULL)
-	  fail_idx ("Couldn't allocated buffer for section", NULL, ndx);
-	newscnbufs[newsecndx (ndx, "section", ndx, "d_buf", 0)] = d->d_buf = b;
-      }
-
       Elf_Data *newdata = elf_newdata (newscn);
       if (newdata == NULL)
 	fail_elf_idx ("Couldn't create new data for section", fnew, ndx);
@@ -510,7 +520,7 @@
 		const bool update_name = shdr->sh_link == strtabndx;
 		if (update_name && ndx != symtabndx)
 		  fail ("Only one symbol table using strtab expected", fname);
-		new_data_buf (newdata);
+		new_data_buf (newdata, fname, ndx, shdrstrndx, shdrnum);
 		size_t syms = (data->d_size
 			       / gelf_fsize (elf, ELF_T_SYM, 1, EV_CURRENT));
 		for (size_t i = 0; i < syms; i++)
@@ -526,8 +536,8 @@
 			       " for old shdrstrndx %zd\n", ndx, i, shdrstrndx);
 		    else if (sym.st_shndx != SHN_UNDEF
 			     && sym.st_shndx < SHN_LORESERVE)
-		      sym.st_shndx = newsecndx (sym.st_shndx, "section", ndx,
-						"symbol", i);
+		      sym.st_shndx = newsecndx (sym.st_shndx, shdrstrndx, shdrnum,
+					 fname, "section", ndx, "symbol", i);
 		    if (update_name && sym.st_name != 0)
 		      sym.st_name = dwelf_strent_off (symstrents[i]);
 
@@ -541,7 +551,7 @@
 
 	    case SHT_GROUP:
 	      {
-		new_data_buf (newdata);
+		new_data_buf (newdata, fname, ndx, shdrstrndx, shdrnum);
 		/* A section group contains Elf32_Words. The first
 		   word is a flag value, the rest of the words are
 		   indexes of the sections belonging to the group.  */
@@ -552,14 +562,14 @@
 		  fail_idx ("Not enough data in group section", fname, ndx);
 		newgroup[0] = group[0];
 		for (size_t i = 1; i < words; i++)
-		  newgroup[i] = newsecndx (group[i], "section", ndx,
-					   "group", i);
+		  newgroup[i] = newsecndx (group[i], shdrstrndx, shdrnum,
+					   fname, "section", ndx, "group", i);
 	      }
 	      break;
 
 	    case SHT_SYMTAB_SHNDX:
 	      {
-		new_data_buf (newdata);
+		new_data_buf (newdata, fname, ndx, shdrstrndx, shdrnum);
 		/* A SHNDX just contains an array of section indexes
 		   for the corresponding symbol table.  The entry is
 		   SHN_UNDEF unless the corresponding symbol is
@@ -571,8 +581,8 @@
 		  if (shndx[i] == SHN_UNDEF)
 		    newshndx[i] = SHN_UNDEF;
 		  else
-		    newshndx[i] = newsecndx (shndx[i], "section", ndx,
-					     "shndx", i);
+		    newshndx[i] = newsecndx (shndx[i], shdrstrndx, shdrnum,
+					     fname, "section", ndx, "shndx", i);
 	      }
 	      break;
 
diff --git a/tests/nvidia_extended_linemap_libdw.c b/tests/nvidia_extended_linemap_libdw.c
new file mode 100644
index 0000000..20d8d40
--- /dev/null
+++ b/tests/nvidia_extended_linemap_libdw.c
@@ -0,0 +1,166 @@
+/* Inspect nvidia extended linemap with dwarf_next_lines.
+   Copyright (C) 2002, 2004, 2018 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 the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   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 a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <fcntl.h>
+#include <inttypes.h>
+#include <libelf.h>
+#include ELFUTILS_HEADER(dw)
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+
+
+int
+main (int argc, char *argv[])
+{
+  int result = 0;
+  int cnt;
+
+  for (cnt = 1; cnt < argc; ++cnt)
+    {
+      int fd = open (argv[cnt], O_RDONLY);
+
+      Dwarf *dbg = dwarf_begin (fd, DWARF_C_READ);
+      if  (dbg == NULL)
+	{
+	  printf ("%s not usable: %s\n", argv[cnt], dwarf_errmsg (-1));
+	  close  (fd);
+	  continue;
+	}
+
+      Dwarf_Off off;
+      Dwarf_Off next_off = 0;
+      Dwarf_CU *cu = NULL;
+      Dwarf_Lines *lb;
+      size_t nlb;
+      int res;
+      while ((res = dwarf_next_lines (dbg, off = next_off, &next_off, &cu,
+				      NULL, NULL, &lb, &nlb)) == 0)
+	{
+	  printf ("off = %" PRIu64 "\n", off);
+	  printf (" %zu lines\n", nlb);
+
+	  for (size_t i = 0; i < nlb; ++i)
+	    {
+	      Dwarf_Line *l = dwarf_onesrcline (lb, i);
+	      if (l == NULL)
+		{
+		  printf ("%s: cannot get individual line\n", argv[cnt]);
+		  result = 1;
+		  break;
+		}
+
+	      Dwarf_Addr addr;
+	      if (dwarf_lineaddr (l, &addr) != 0)
+		addr = 0;
+	      const char *file = dwarf_linesrc (l, NULL, NULL);
+	      int line;
+	      if (dwarf_lineno (l, &line) != 0)
+		line = 0;
+
+	      printf ("%" PRIx64 ": %s:%d:", (uint64_t) addr,
+		      file ?: "???", line);
+
+	      /* Getting the file path through the Dwarf_Files should
+		 result in the same path.  */
+	      Dwarf_Files *files;
+	      size_t idx;
+	      if (dwarf_line_file (l, &files, &idx) != 0)
+		{
+		  printf ("%s: cannot get file from line (%zd): %s\n",
+			  argv[cnt], i, dwarf_errmsg (-1));
+		  result = 1;
+		  break;
+		}
+	      const char *path = dwarf_filesrc (files, idx, NULL, NULL);
+	      if ((path == NULL && file != NULL)
+		  || (path != NULL && file == NULL)
+		  || (strcmp (file, path) != 0))
+		{
+		  printf ("%s: line %zd srcline (%s) != file srcline (%s)\n",
+			  argv[cnt], i, file ?: "???", path ?: "???");
+		  result = 1;
+		  break;
+		}
+
+	      int column;
+	      if (dwarf_linecol (l, &column) != 0)
+		column = 0;
+	      if (column >= 0)
+		printf ("%d:", column);
+
+	      bool is_stmt;
+	      if (dwarf_linebeginstatement (l, &is_stmt) != 0)
+		is_stmt = false;
+	      bool end_sequence;
+	      if (dwarf_lineendsequence (l, &end_sequence) != 0)
+		end_sequence = false;
+	      bool basic_block;
+	      if (dwarf_lineblock (l, &basic_block) != 0)
+		basic_block = false;
+	      bool prologue_end;
+	      if (dwarf_lineprologueend (l, &prologue_end) != 0)
+		prologue_end = false;
+	      bool epilogue_begin;
+	      if (dwarf_lineepiloguebegin (l, &epilogue_begin) != 0)
+		epilogue_begin = false;
+	      printf (" is_stmt:%s, end_seq:%s, bb:%s, prologue:%s, epilogue:%s\n",
+		      is_stmt ? "yes" : "no", end_sequence ? "yes" : "no",
+		      basic_block ? "yes" : "no", prologue_end  ? "yes" : "no",
+		      epilogue_begin ? "yes" : "no");
+
+	      Dwarf_Line* callee_context = l;
+	      Dwarf_Line* caller_context = dwarf_linecontext (lb, l);
+	      unsigned int depth = 0;
+	      while (caller_context != NULL)
+		{
+		  depth++;
+		  for (unsigned int x = 0; x < depth; x++)
+		    printf ("  ");
+
+		  const char *inlined_file = dwarf_linesrc (caller_context,
+							    NULL, NULL);
+		  int inlined_line;
+		  if (dwarf_lineno (caller_context, &inlined_line) != 0)
+		    inlined_line = 0;
+
+		  printf ("%s inlined at %s:%d\n",
+			  dwarf_linefunctionname(dbg, callee_context),
+			  inlined_file ?: "???", inlined_line);
+
+		  callee_context = caller_context;
+		  caller_context = dwarf_linecontext (lb, callee_context);
+	        }
+	    }
+	}
+
+      if (res < 0)
+	{
+	  printf ("dwarf_next_lines failed: %s\n", dwarf_errmsg (-1));
+	  result = 1;
+	}
+
+      dwarf_end (dbg);
+      close (fd);
+    }
+
+  return result;
+}
diff --git a/tests/run-debuginfod-000-permission.sh b/tests/run-debuginfod-000-permission.sh
new file mode 100755
index 0000000..c1b2cf8
--- /dev/null
+++ b/tests/run-debuginfod-000-permission.sh
@@ -0,0 +1,86 @@
+#!/usr/bin/env bash
+#
+# Copyright (C) 2019-2021 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 the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# 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 a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+. $srcdir/debuginfod-subr.sh
+
+# for test case debugging, uncomment:
+set -x
+unset VALGRIND_CMD
+DB=${PWD}/.debuginfod_tmp.sqlite
+tempfiles $DB
+export DEBUGINFOD_CACHE_PATH=${PWD}/.client_cache
+# This variable is essential and ensures no time-race for claiming ports occurs
+# set base to a unique multiple of 100 not used in any other 'run-debuginfod-*' test
+base=8000
+get_ports
+env LD_LIBRARY_PATH=$ldpath DEBUGINFOD_URLS= ${abs_builddir}/../debuginfod/debuginfod $VERBOSE -F -p $PORT1 -d $DB \
+    -t0 -g0 -v ${PWD} > vlog$PORT1 2>&1 &
+PID1=$!
+tempfiles vlog$PORT1
+errfiles vlog$PORT1
+# Server must become ready
+wait_ready $PORT1 'ready' 1
+export DEBUGINFOD_URLS=http://127.0.0.1:$PORT1/   # or without trailing /
+
+# Be patient when run on a busy machine things might take a bit.
+export DEBUGINFOD_TIMEOUT=10
+
+# Check thread comm names
+ps -q $PID1 -e -L -o '%p %c %a' | grep groom
+ps -q $PID1 -e -L -o '%p %c %a' | grep scan
+ps -q $PID1 -e -L -o '%p %c %a' | grep traverse
+
+########################################################################
+# PR25628
+rm -rf $DEBUGINFOD_CACHE_PATH # clean it from previous tests
+
+# The query is designed to fail, while the 000-permission file should be created.
+testrun ${abs_top_builddir}/debuginfod/debuginfod-find debuginfo 01234567 || true
+if [ ! -f $DEBUGINFOD_CACHE_PATH/01234567/debuginfo ]; then
+  echo "could not find cache in $DEBUGINFOD_CACHE_PATH"
+  err
+fi
+
+if [ `stat -c "%A" $DEBUGINFOD_CACHE_PATH/01234567/debuginfo` != "----------" ]; then
+  echo "The cache $DEBUGINFOD_CACHE_PATH/01234567/debuginfo is readable"
+  err
+fi
+
+bytecount_before=`curl -s http://127.0.0.1:$PORT1/metrics | grep 'http_responses_transfer_bytes_count{code="404",type="debuginfo"}'`
+testrun ${abs_top_builddir}/debuginfod/debuginfod-find debuginfo 01234567 || true
+bytecount_after=`curl -s http://127.0.0.1:$PORT1/metrics | grep 'http_responses_transfer_bytes_count{code="404",type="debuginfo"}'`
+if [ "$bytecount_before" != "$bytecount_after" ]; then
+  echo "http_responses_transfer_bytes_count{code="404",type="debuginfo"} has changed."
+  err
+fi
+
+# set cache_miss_s to 0 and sleep 1 to make the mtime expire.
+echo 0 > $DEBUGINFOD_CACHE_PATH/cache_miss_s
+sleep 1
+bytecount_before=`curl -s http://127.0.0.1:$PORT1/metrics | grep 'http_responses_transfer_bytes_count{code="404",type="debuginfo"}'`
+testrun ${abs_top_builddir}/debuginfod/debuginfod-find debuginfo 01234567 || true
+bytecount_after=`curl -s http://127.0.0.1:$PORT1/metrics | grep 'http_responses_transfer_bytes_count{code="404",type="debuginfo"}'`
+if [ "$bytecount_before" == "$bytecount_after" ]; then
+  echo "http_responses_transfer_bytes_count{code="404",type="debuginfo"} should be incremented."
+  err
+fi
+
+kill $PID1
+wait $PID1
+PID1=0
+exit 0
diff --git a/tests/run-debuginfod-archive-groom.sh b/tests/run-debuginfod-archive-groom.sh
new file mode 100755
index 0000000..030e0aa
--- /dev/null
+++ b/tests/run-debuginfod-archive-groom.sh
@@ -0,0 +1,167 @@
+#!/usr/bin/env bash
+#
+# Copyright (C) 2019-2021 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 the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# 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 a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+. $srcdir/debuginfod-subr.sh
+
+# for test case debugging, uncomment:
+set -x
+unset VALGRIND_CMD
+# This variable is essential and ensures no time-race for claiming ports occurs
+# set base to a unique multiple of 100 not used in any other 'run-debuginfod-*' test
+base=8100
+get_ports
+DB=${PWD}/.debuginfod_tmp.sqlite
+tempfiles $DB
+export DEBUGINFOD_CACHE_PATH=${PWD}/.client_cache
+export DEBUGINFOD_TIMEOUT=10
+
+# Clean old dirictories
+mkdir R ${PWD}/F
+env LD_LIBRARY_PATH=$ldpath ${abs_builddir}/../debuginfod/debuginfod $VERBOSE \
+    -F -R -d $DB -p $PORT1 -t0 -g0 -v R ${PWD}/F > vlog$PORT1 2>&1 &
+PID1=$!
+tempfiles vlog$PORT1
+errfiles vlog$PORT1
+# Server must become ready
+wait_ready $PORT1 'ready' 1
+# Be patient when run on a busy machine things might take a bit.
+
+# Check thread comm names
+ps -q $PID1 -e -L -o '%p %c %a' | grep groom
+ps -q $PID1 -e -L -o '%p %c %a' | grep scan
+ps -q $PID1 -e -L -o '%p %c %a' | grep traverse
+
+# wait till the initial scan is done before triggering a new one
+# and before dropping new file into the scan dirs
+wait_ready $PORT1 'thread_work_total{role="traverse"}' 1
+# Same for the initial groom cycle, we don't want it to be done
+# half way initializing the file setup
+wait_ready $PORT1 'thread_work_total{role="groom"}' 1
+
+# Build a non-stripped binary
+echo "int main() { return 0; }" > ${PWD}/F/prog.c
+gcc -Wl,--build-id -g -o ${PWD}/F/prog ${PWD}/F/prog.c
+BUILDID=`env LD_LIBRARY_PATH=$ldpath ${abs_builddir}/../src/readelf \
+          -a ${PWD}/F/prog | grep 'Build ID' | cut -d ' ' -f 7`
+tempfiles ${PWD}/F/prog ${PWD}/F/prog.c
+
+cp -rvp ${abs_srcdir}/debuginfod-rpms R
+if [ "$zstd" = "false" ]; then  # nuke the zstd fedora 31 ones
+    rm -vrf R/debuginfod-rpms/fedora31
+fi
+
+kill -USR1 $PID1
+# Now there should be 1 files in the index
+wait_ready $PORT1 'thread_work_total{role="traverse"}' 2
+wait_ready $PORT1 'thread_work_pending{role="scan"}' 0
+wait_ready $PORT1 'thread_busy{role="scan"}' 0
+
+cp -rvp ${abs_srcdir}/debuginfod-rpms R
+if [ "$zstd" = "false" ]; then  # nuke the zstd fedora 31 ones
+    rm -vrf R/debuginfod-rpms/fedora31
+fi
+
+tempfiles vlog3
+cp -rvp ${abs_srcdir}/debuginfod-tars Z
+kill -USR1 $PID1
+# Wait till both files are in the index and scan/index fully finished
+wait_ready $PORT1 'thread_work_total{role="traverse"}' 3
+wait_ready $PORT1 'thread_work_pending{role="scan"}' 0
+wait_ready $PORT1 'thread_busy{role="scan"}' 0
+########################################################################
+# All rpms need to be in the index, except the dummy permission-000 one
+rpms=$(find R -name \*rpm | grep -v nothing | wc -l)
+wait_ready $PORT1 'scanned_files_total{source=".rpm archive"}' $rpms
+txz=$(find Z -name \*tar.xz | wc -l)
+
+kill -USR1 $PID1  # two hits of SIGUSR1 may be needed to resolve .debug->dwz->srefs
+# Wait till both files are in the index and scan/index fully finished
+wait_ready $PORT1 'thread_work_total{role="traverse"}' 4
+wait_ready $PORT1 'thread_work_pending{role="scan"}' 0
+wait_ready $PORT1 'thread_busy{role="scan"}' 0
+
+# Expect all source files found in the rpms (they are all called hello.c :)
+# We will need to extract all rpms (in their own directory) and could all
+# sources referenced in the .debug files.
+mkdir extracted
+cd extracted
+subdir=0;
+newrpms=$(find ../R -name \*\.rpm | grep -v nothing)
+for i in $newrpms; do
+    subdir=$[$subdir+1];
+    mkdir $subdir;
+    cd $subdir;
+    ls -lah ../$i
+    rpm2cpio ../$i | cpio -ivd;
+    cd ..;
+done
+sourcefiles=$(find -name \*\\.debug \
+              | env LD_LIBRARY_PATH=$ldpath xargs \
+                ${abs_top_builddir}/src/readelf --debug-dump=decodedline \
+              | grep mtime: | wc --lines)
+cd ..
+rm -rf extracted
+
+wait_ready $PORT1 'found_sourcerefs_total{source=".rpm archive"}' $sourcefiles
+
+export DEBUGINFOD_URLS=http://127.0.0.1:$PORT1
+
+# common source file sha1
+SHA=f4a1a8062be998ae93b8f1cd744a398c6de6dbb1
+# fedora31
+if [ $zstd = true ]; then
+    # fedora31 uses zstd compression on rpms, older rpm2cpio/libarchive can't handle it
+    # and we're not using the fancy -Z '.rpm=(rpm2cpio|zstdcat)<' workaround in this testsuite
+    archive_test 420e9e3308971f4b817cc5bf83928b41a6909d88 /usr/src/debug/hello3-1.0-2.x86_64/foobar////./../hello.c $SHA
+    archive_test 87c08d12c78174f1082b7c888b3238219b0eb265 /usr/src/debug/hello3-1.0-2.x86_64///foobar/./..//hello.c $SHA
+fi
+# fedora30
+archive_test c36708a78618d597dee15d0dc989f093ca5f9120 /usr/src/debug/hello2-1.0-2.x86_64/hello.c $SHA
+archive_test 41a236eb667c362a1c4196018cc4581e09722b1b /usr/src/debug/hello2-1.0-2.x86_64/hello.c $SHA
+# rhel7
+archive_test bc1febfd03ca05e030f0d205f7659db29f8a4b30 /usr/src/debug/hello-1.0/hello.c $SHA
+archive_test f0aa15b8aba4f3c28cac3c2a73801fefa644a9f2 /usr/src/debug/hello-1.0/hello.c $SHA
+# rhel6
+archive_test bbbf92ebee5228310e398609c23c2d7d53f6e2f9 /usr/src/debug/hello-1.0/hello.c $SHA
+archive_test d44d42cbd7d915bc938c81333a21e355a6022fb7 /usr/src/debug/hello-1.0/hello.c $SHA
+RPM_BUILDID=d44d42cbd7d915bc938c81333a21e355a6022fb7 # in rhel6/ subdir
+
+# Drop some of the artifacts, run a groom cycle; confirm that
+# debuginfod has forgotten them, but remembers others
+rm -r R/debuginfod-rpms/rhel6/*
+
+kill -USR2 $PID1  # groom cycle
+## 1 groom cycle already took place at/soon-after startup, so -USR2 makes 2
+wait_ready $PORT1 'thread_work_total{role="groom"}' 2
+# Expect 4 rpms containing 2 buildids to be deleted by the groom
+wait_ready $PORT1 'groomed_total{decision="stale"}' 4
+# Expect no more groom actions pending
+wait_ready $PORT1 'thread_work_pending{role="groom"}' 0
+
+rm -rf $DEBUGINFOD_CACHE_PATH # clean it from previous tests
+
+# this is one of the buildids from the groom-deleted rpms
+testrun ${abs_top_builddir}/debuginfod/debuginfod-find executable $RPM_BUILDID && false || true
+
+# but this one was not deleted so should be still around
+testrun ${abs_top_builddir}/debuginfod/debuginfod-find executable $BUILDID || true
+
+kill $PID1
+wait $PID1
+PID1=0
+exit 0
diff --git a/tests/run-debuginfod-archive-rename.sh b/tests/run-debuginfod-archive-rename.sh
new file mode 100755
index 0000000..5369949
--- /dev/null
+++ b/tests/run-debuginfod-archive-rename.sh
@@ -0,0 +1,104 @@
+#!/usr/bin/env bash
+#
+# Copyright (C) 2019-2021 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 the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# 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 a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+. $srcdir/debuginfod-subr.sh
+
+# for test case debugging, uncomment:
+set -x
+unset VALGRIND_CMD
+# This variable is essential and ensures no time-race for claiming ports occurs
+# set base to a unique multiple of 100 not used in any other 'run-debuginfod-*' test
+base=8200
+get_ports
+DB=${PWD}/.debuginfod_tmp.sqlite
+export DEBUGINFOD_CACHE_PATH=${PWD}/.client_cache
+export DEBUGINFOD_TIMEOUT=10
+tempfiles $DEBUGINFOD_CACHE_PATH $DB
+# Clean old dirictories
+mkdir R ${PWD}/F
+env LD_LIBRARY_PATH=$ldpath ${abs_builddir}/../debuginfod/debuginfod $VERBOSE \
+    -F -R -d $DB -p $PORT1 -t0 -g0 -v R ${PWD}/F > vlog$PORT1 2>&1 &
+
+PID1=$!
+tempfiles vlog$PORT1
+errfiles vlog$PORT1
+# Server must become ready
+wait_ready $PORT1 'ready' 1
+# Check thread comm names
+ps -q $PID1 -e -L -o '%p %c %a' | grep groom
+ps -q $PID1 -e -L -o '%p %c %a' | grep scan
+ps -q $PID1 -e -L -o '%p %c %a' | grep traverse
+
+# wait till the initial scan is done before triggering a new one
+# and before dropping new file into the scan dirs
+wait_ready $PORT1 'thread_work_total{role="traverse"}' 1
+# Same for the initial groom cycle, we don't want it to be done
+# half way initializing the file setup
+wait_ready $PORT1 'thread_work_total{role="groom"}' 1
+
+cp -rvp ${abs_srcdir}/debuginfod-rpms R
+if [ "$zstd" = "false" ]; then  # nuke the zstd fedora 31 ones
+    rm -vrf R/debuginfod-rpms/fedora31
+fi
+
+kill -USR1 $PID1
+# Now there should be 1 files in the index
+wait_ready $PORT1 'thread_work_total{role="traverse"}' 2
+wait_ready $PORT1 'thread_work_pending{role="scan"}' 0
+wait_ready $PORT1 'thread_busy{role="scan"}' 0
+
+# common source file sha1
+SHA=f4a1a8062be998ae93b8f1cd744a398c6de6dbb1
+
+########################################################################
+## PR26810: Now rename some files in the R directory, then rescan, so
+# there are two copies of the same buildid in the index, one for the
+# no-longer-existing file name, and one under the new name.
+
+# run a groom cycle to force server to drop its fdcache
+kill -USR2 $PID1  # groom cycle
+wait_ready $PORT1 'thread_work_total{role="groom"}' 2
+# move it around a couple of times to make it likely to hit a nonexistent entry during iteration
+mv R/debuginfod-rpms/rhel7 R/debuginfod-rpms/rhel7renamed
+kill -USR1 $PID1  # scan cycle
+wait_ready $PORT1 'thread_work_total{role="traverse"}' 3
+wait_ready $PORT1 'thread_work_pending{role="scan"}' 0
+wait_ready $PORT1 'thread_busy{role="scan"}' 0
+mv R/debuginfod-rpms/rhel7renamed R/debuginfod-rpms/rhel7renamed2
+kill -USR1 $PID1  # scan cycle
+wait_ready $PORT1 'thread_work_total{role="traverse"}' 4
+wait_ready $PORT1 'thread_work_pending{role="scan"}' 0
+wait_ready $PORT1 'thread_busy{role="scan"}' 0
+mv R/debuginfod-rpms/rhel7renamed2 R/debuginfod-rpms/rhel7renamed3
+kill -USR1 $PID1  # scan cycle
+wait_ready $PORT1 'thread_work_total{role="traverse"}' 5
+wait_ready $PORT1 'thread_work_pending{role="scan"}' 0
+wait_ready $PORT1 'thread_busy{role="scan"}' 0
+
+export DEBUGINFOD_URLS=http://127.0.0.1:$PORT1
+
+# retest rhel7
+archive_test bc1febfd03ca05e030f0d205f7659db29f8a4b30 /usr/src/debug/hello-1.0/hello.c $SHA
+archive_test f0aa15b8aba4f3c28cac3c2a73801fefa644a9f2 /usr/src/debug/hello-1.0/hello.c $SHA
+
+egrep '(libc.error.*rhel7)|(bc1febfd03ca)|(f0aa15b8aba)' vlog$PORT1
+
+kill $PID1
+wait $PID1
+PID1=0
+exit 0;
diff --git a/tests/run-debuginfod-archive-test.sh b/tests/run-debuginfod-archive-test.sh
new file mode 100755
index 0000000..9f7454b
--- /dev/null
+++ b/tests/run-debuginfod-archive-test.sh
@@ -0,0 +1,88 @@
+#!/usr/bin/env bash
+#
+# Copyright (C) 2019-2021 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 the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# 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 a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+. $srcdir/debuginfod-subr.sh
+
+# for test case debugging, uncomment:
+set -x
+unset VALGRIND_CMD
+
+# find an unused port number
+mkdir R
+# This variable is essential and ensures no time-race for claiming ports occurs
+# set base to a unique multiple of 100 not used in any other 'run-debuginfod-*' test
+base=8300
+get_ports
+DB=${PWD}/.debuginfod_tmp.sqlite
+tempfiles $DB
+export DEBUGINFOD_CACHE_PATH=${PWD}/.client_cache
+
+env LD_LIBRARY_PATH=$ldpath ${abs_builddir}/../debuginfod/debuginfod $VERBOSE -R -p $PORT1 -d $DB -t0 -g0 -v R > vlog$PORT1 2>&1 &
+PID1=$!
+tempfiles vlog$PORT1
+errfiles vlog$PORT1
+# Server must become ready
+wait_ready $PORT1 'ready' 1
+# And make sure first scan is done
+wait_ready $PORT1 'thread_work_total{role="traverse"}' 1
+
+# Be patient when run on a busy machine things might take a bit.
+export DEBUGINFOD_TIMEOUT=10
+export DEBUGINFOD_URLS='http://127.0.0.1:'$PORT1
+
+# Check thread comm names
+ps -q $PID1 -e -L -o '%p %c %a' | grep groom
+ps -q $PID1 -e -L -o '%p %c %a' | grep scan
+ps -q $PID1 -e -L -o '%p %c %a' | grep traverse
+
+cp -rvp ${abs_srcdir}/debuginfod-rpms R
+if [ "$zstd" = "false" ]; then  # nuke the zstd fedora 31 ones
+    rm -vrf R/debuginfod-rpms/fedora31
+fi
+
+kill -USR1 $PID1
+# Wait till both files are in the index and scan/index fully finished
+wait_ready $PORT1 'thread_work_total{role="traverse"}' 2
+wait_ready $PORT1 'thread_work_pending{role="scan"}' 0
+wait_ready $PORT1 'thread_busy{role="scan"}' 0
+
+# common source file sha1
+SHA=f4a1a8062be998ae93b8f1cd744a398c6de6dbb1
+# fedora31
+if [ $zstd = true ]; then
+    # fedora31 uses zstd compression on rpms, older rpm2cpio/libarchive can't handle it
+    # and we're not using the fancy -Z '.rpm=(rpm2cpio|zstdcat)<' workaround in this testsuite
+    archive_test 420e9e3308971f4b817cc5bf83928b41a6909d88 /usr/src/debug/hello3-1.0-2.x86_64/foobar////./../hello.c $SHA
+    archive_test 87c08d12c78174f1082b7c888b3238219b0eb265 /usr/src/debug/hello3-1.0-2.x86_64///foobar/./..//hello.c $SHA
+fi
+# fedora30
+archive_test c36708a78618d597dee15d0dc989f093ca5f9120 /usr/src/debug/hello2-1.0-2.x86_64/hello.c $SHA
+archive_test 41a236eb667c362a1c4196018cc4581e09722b1b /usr/src/debug/hello2-1.0-2.x86_64/hello.c $SHA
+# rhel7
+archive_test bc1febfd03ca05e030f0d205f7659db29f8a4b30 /usr/src/debug/hello-1.0/hello.c $SHA
+archive_test f0aa15b8aba4f3c28cac3c2a73801fefa644a9f2 /usr/src/debug/hello-1.0/hello.c $SHA
+# rhel6
+archive_test bbbf92ebee5228310e398609c23c2d7d53f6e2f9 /usr/src/debug/hello-1.0/hello.c $SHA
+archive_test d44d42cbd7d915bc938c81333a21e355a6022fb7 /usr/src/debug/hello-1.0/hello.c $SHA
+# arch
+#archive_test cee13b2ea505a7f37bd20d271c6bc7e5f8d2dfcb /usr/src/debug/hello.c 7a1334e086b97e5f124003a6cfb3ed792d10cdf4
+
+kill $PID1
+wait $PID1
+PID1=0
+exit 0
diff --git a/tests/run-debuginfod-artifact-running.sh b/tests/run-debuginfod-artifact-running.sh
new file mode 100755
index 0000000..b944442
--- /dev/null
+++ b/tests/run-debuginfod-artifact-running.sh
@@ -0,0 +1,122 @@
+#!/usr/bin/env bash
+#
+# Copyright (C) 2019-2021 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 the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# 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 a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+. $srcdir/debuginfod-subr.sh
+
+# for test case debugging, uncomment:
+set -x
+unset VALGRIND_CMD
+# This variable is essential and ensures no time-race for claiming ports occurs
+# set base to a unique multiple of 100 not used in any other 'run-debuginfod-*' test
+base=8400
+get_ports
+mkdir F
+
+DB=${PWD}/.debuginfod_tmp.sqlite
+tempfiles $DB
+export DEBUGINFOD_CACHE_PATH=${PWD}/.client_cache
+
+echo 'int main(int argc, char * argv){ return 0; }' > ${PWD}/prog.c
+gcc -Wl,--build-id -g -o prog ${PWD}/prog.c
+testrun ${abs_top_builddir}/src/strip -g -f prog.debug ${PWD}/prog
+tempfiles prog prog.debug prog.c
+BUILDID=`env LD_LIBRARY_PATH=$ldpath ${abs_builddir}/../src/readelf \
+          -a prog | grep 'Build ID' | cut -d ' ' -f 7`
+export DEBUGINFOD_URLS=http://127.0.0.1:$PORT1
+env LD_LIBRARY_PATH=$ldpath ${abs_builddir}/../debuginfod/debuginfod $VERBOSE -d $DB -F -p $PORT1 -t0 -g0 -v F > vlog$PORT1 2>&1 &
+PID1=$!
+tempfiles vlog$PORT1
+errfiles vlog$PORT1
+
+# Server must become ready
+wait_ready $PORT1 'ready' 1
+# And the initial scan should have been done before moving
+# files under the scan dirs.
+wait_ready $PORT1 'thread_work_total{role="traverse"}' 1
+
+mv prog F
+mv prog.debug F
+tempfiles prog/F
+
+# Be patient when run on a busy machine things might take a bit.
+export DEBUGINFOD_TIMEOUT=10
+
+kill -USR1 $PID1
+wait_ready $PORT1 'thread_work_total{role="traverse"}' 2
+wait_ready $PORT1 'thread_work_pending{role="scan"}' 0
+wait_ready $PORT1 'thread_busy{role="scan"}' 0
+
+# Check thread comm names
+ps -q $PID1 -e -L -o '%p %c %a' | grep groom
+ps -q $PID1 -e -L -o '%p %c %a' | grep scan
+ps -q $PID1 -e -L -o '%p %c %a' | grep traverse
+
+# Add artifacts to the search paths and test whether debuginfod finds them while already running.
+# Build another, non-stripped binary
+echo "int main() { return 0; }" > ${PWD}/prog2.c
+tempfiles prog2.c
+gcc -Wl,--build-id -g -o prog2 ${PWD}/prog2.c
+#testrun ${abs_top_builddir}/src/strip -g -f prog.debug ${PWD}/prog
+BUILDID2=`env LD_LIBRARY_PATH=$ldpath ${abs_builddir}/../src/readelf \
+          -a prog2 | grep 'Build ID' | cut -d ' ' -f 7`
+mv prog2 F
+#mv prog2.debug F
+tempfiles F/prog2 F/prog2.debug
+
+kill -USR1 $PID1
+# Now there should be 3 files in the index
+wait_ready $PORT1 'thread_work_total{role="traverse"}' 3
+wait_ready $PORT1 'thread_work_pending{role="scan"}' 0
+wait_ready $PORT1 'thread_busy{role="scan"}' 0
+
+########################################################################
+
+# Test whether debuginfod-find is able to fetch those files.
+rm -rf $DEBUGINFOD_CACHE_PATH # clean it from previous tests
+filename=`testrun ${abs_top_builddir}/debuginfod/debuginfod-find debuginfo $BUILDID`
+cmp $filename F/prog.debug
+
+filename=`testrun ${abs_top_builddir}/debuginfod/debuginfod-find executable F/prog`
+cmp $filename F/prog
+
+# raw source filename
+filename=`testrun ${abs_top_builddir}/debuginfod/debuginfod-find source $BUILDID ${PWD}/foobar///./../prog.c`
+cmp $filename  ${PWD}/prog.c
+
+# and also the canonicalized one
+filename=`testrun ${abs_top_builddir}/debuginfod/debuginfod-find source $BUILDID ${PWD}/prog.c`
+cmp $filename  ${PWD}/prog.c
+
+# Rerun same tests for the prog2 binary
+filename=`testrun ${abs_top_builddir}/debuginfod/debuginfod-find -v debuginfo $BUILDID2 2>vlog`
+cmp $filename F/prog2
+grep -q Progress vlog
+grep -q Downloaded.from vlog
+tempfiles vlog
+filename=`testrun env DEBUGINFOD_PROGRESS=1 ${abs_top_builddir}/debuginfod/debuginfod-find executable $BUILDID2 2>vlog2`
+cmp $filename F/prog2
+grep -q 'Downloading.*http' vlog2
+tempfiles vlog2
+filename=`testrun ${abs_top_builddir}/debuginfod/debuginfod-find source $BUILDID2 ${PWD}/prog2.c`
+cmp $filename ${PWD}/prog2.c
+
+
+kill $PID1
+wait $PID1
+PID1=0
+exit 0
diff --git a/tests/run-debuginfod-dlopen.sh b/tests/run-debuginfod-dlopen.sh
new file mode 100755
index 0000000..39ee519
--- /dev/null
+++ b/tests/run-debuginfod-dlopen.sh
@@ -0,0 +1,94 @@
+#!/usr/bin/env bash
+#
+# Copyright (C) 2019-2021 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 the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# 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 a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+. $srcdir/debuginfod-subr.sh
+
+# for test case debugging, uncomment:
+set -x
+unset VALGRIND_CMD
+
+mkdir F
+# This variable is essential and ensures no time-race for claiming ports occurs
+# set base to a unique multiple of 100 not used in any other 'run-debuginfod-*' test
+base=8500
+get_ports
+
+DB=${PWD}/.debuginfod_tmp.sqlite
+tempfiles $DB
+export DEBUGINFOD_CACHE_PATH=${PWD}/.client_cache
+
+env LD_LIBRARY_PATH=$ldpath DEBUGINFOD_URLS= ${abs_builddir}/../debuginfod/debuginfod -F -R $VERBOSE -p $PORT1 -d $DB \
+    -t0 -g0 -v F > vlog$PORT1 2>&1 &
+PID1=$!
+tempfiles vlog$PORT1
+errfiles vlog$PORT1
+
+# Server must become ready
+wait_ready $PORT1 'ready' 1
+export DEBUGINFOD_URLS=http://127.0.0.1:$PORT1/   # or without trailing /
+
+# Be patient when run on a busy machine things might take a bit.
+export DEBUGINFOD_TIMEOUT=10
+
+# Check thread comm names
+ps -q $PID1 -e -L -o '%p %c %a'
+ps -q $PID1 -e -L -o '%p %c %a' | grep groom
+ps -q $PID1 -e -L -o '%p %c %a' | grep scan
+ps -q $PID1 -e -L -o '%p %c %a' | grep traverse
+
+# Make sure the initial scan has finished.
+# Before moving files under the scan dirs.
+wait_ready $PORT1 'thread_work_total{role="traverse"}' 1
+
+# We use -t0 and -g0 here to turn off time-based scanning & grooming.
+# For testing purposes, we just sic SIGUSR1 / SIGUSR2 at the process.
+
+########################################################################
+
+# Compile a simple program, strip its debuginfo and save the build-id.
+# Also move the debuginfo into another directory so that elfutils
+# cannot find it without debuginfod.
+echo "int main() { return 0; }" > ${PWD}/p+r%o\$g.c
+tempfiles p+r%o\$g.c
+# Create a subdirectory to confound source path names
+mkdir foobar
+gcc -Wl,--build-id -g -o p+r%o\$g ${PWD}/foobar///./../p+r%o\$g.c
+testrun ${abs_top_builddir}/src/strip -g -f p+r%o\$g.debug ${PWD}/p+r%o\$g
+BUILDID=`env LD_LIBRARY_PATH=$ldpath ${abs_builddir}/../src/readelf \
+          -a p+r%o\\$g | grep 'Build ID' | cut -d ' ' -f 7`
+
+mv p+r%o\$g F
+mv p+r%o\$g.debug F
+
+kill -USR1 $PID1
+# Wait till both files are in the index.
+wait_ready $PORT1 'thread_work_total{role="traverse"}' 2
+wait_ready $PORT1 'thread_work_pending{role="scan"}' 0
+wait_ready $PORT1 'thread_busy{role="scan"}' 0
+
+########################################################################
+
+# Test whether elfutils, via the debuginfod client library dlopen hooks,
+# is able to fetch debuginfo from the local debuginfod.
+testrun ${abs_builddir}/debuginfod_build_id_find -e F/p+r%o\$g 1
+
+kill $PID1
+wait $PID1
+PID1=0
+
+exit 0
diff --git a/tests/run-debuginfod-duplicate-urls.sh b/tests/run-debuginfod-duplicate-urls.sh
new file mode 100755
index 0000000..50e39cb
--- /dev/null
+++ b/tests/run-debuginfod-duplicate-urls.sh
@@ -0,0 +1,56 @@
+#!/usr/bin/env bash
+#
+# Copyright (C) 2019-2021 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 the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# 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 a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+. $srcdir/debuginfod-subr.sh
+
+# for test case debugging, uncomment:
+set -x
+unset VALGRIND_CMD
+# This variable is essential and ensures no time-race for claiming ports occurs
+# set base to a unique multiple of 100 not used in any other 'run-debuginfod-*' test
+base=8600
+get_ports
+
+DB=${PWD}/.debuginfod_tmp.sqlite
+tempfiles $DB
+export DEBUGINFOD_CACHE_PATH=${PWD}/.client_cache
+
+env LD_LIBRARY_PATH=$ldpath ${abs_builddir}/../debuginfod/debuginfod \
+    $VERBOSE -F -p $PORT1 -t0 -g0 -d ${DB} F > vlog$PORT1 2>&1 &
+PID1=$!
+tempfiles vlog$PORT1
+errfiles vlog$PORT1
+wait_ready $PORT1 'ready' 1
+
+########################################################################
+## PR27983
+# Ensure no duplicate urls are used in when querying servers for files
+rm -rf $DEBUGINFOD_CACHE_PATH # clean it from previous tests
+env DEBUGINFOD_URLS="http://127.0.0.1:$PORT1 http://127.0.0.1:$PORT1 http://127.0.0.1:$PORT1 http://127.0.0.1:7999" \
+ LD_LIBRARY_PATH=$ldpath ${abs_top_builddir}/debuginfod/debuginfod-find -vvv executable 0 > vlog1 2>&1 || true
+tempfiles vlog1
+cat vlog1
+if [ $( grep -c 'duplicate url: http://127.0.0.1:'$PORT1'.*' vlog1 ) -ne 2 ]; then
+  echo "Duplicate servers remain";
+  err
+fi
+
+kill $PID1
+wait $PID1
+PID1=0
+exit 0
diff --git a/tests/run-debuginfod-extraction-passive.sh b/tests/run-debuginfod-extraction-passive.sh
new file mode 100755
index 0000000..c2724b5
--- /dev/null
+++ b/tests/run-debuginfod-extraction-passive.sh
@@ -0,0 +1,77 @@
+#!/usr/bin/env bash
+#
+# Copyright (C) 2019-2021 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 the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# 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 a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+. $srcdir/debuginfod-subr.sh
+
+# for test case debugging, uncomment:
+set -x
+
+mkdir Z
+# This variable is essential and ensures no time-race for claiming ports occurs
+# set base to a unique multiple of 100 not used in any other 'run-debuginfod-*' test
+base=11000
+get_ports
+
+DB=${PWD}/.debuginfod.sqlite
+tempfiles $DB
+export DEBUGINFOD_CACHE_PATH=${PWD}/.client_cache
+
+cp -rvp ${abs_srcdir}/debuginfod-tars Z
+tempfiles Z
+
+env LD_LIBRARY_PATH=$ldpath ${abs_builddir}/../debuginfod/debuginfod $VERBOSE -d $DB -Z .tar.xz -Z .tar.bz2=bzcat -p $PORT1 -t0 -g0 -v Z > vlog$PORT1 2>&1 &
+PID1=$!
+tempfiles vlog$PORT1
+errfiles vlog$PORT1
+
+wait_ready $PORT1 'ready' 1
+
+# Start second passive server with same database
+env LD_LIBRARY_PATH=$ldpath ${abs_builddir}/../debuginfod/debuginfod $VERBOSE --passive -d $DB -Z .tar.xz -Z .tar.bz2=bzcat -p $PORT2 -v > vlog$PORT2 2>&1 &
+PID2=$!
+
+tempfiles vlog$PORT2
+errfiles vlog$PORT2
+
+wait_ready $PORT2 'ready' 1
+
+# Wait for first server to finish indexing
+wait_ready $PORT1 'thread_work_total{role="traverse"}' 1
+wait_ready $PORT1 'thread_work_pending{role="scan"}' 0
+wait_ready $PORT1 'thread_busy{role="scan"}' 0
+
+# No similar metrics for the passive server
+! (curl http://localhost:$PORT2/metrics | egrep 'role="scan"|role="groom"|role="traverse"')
+
+# Confirm no active threads
+! (ps -q $PID2 -e -L -o '%p %c %a' | egrep 'scan|groom|traverse')
+
+# Do a random lookup via passive server
+env LD_LIBRARY_PATH=$ldpath DEBUGINFOD_URLS=http://localhost:$PORT2 ${abs_builddir}/../debuginfod/debuginfod-find debuginfo cee13b2ea505a7f37bd20d271c6bc7e5f8d2dfcb
+
+tempfiles $DB*
+
+kill $PID1
+wait $PID1
+PID1=0
+
+kill $PID2
+wait $PID2
+PID2=0
+
+exit 0
diff --git a/tests/run-debuginfod-extraction.sh b/tests/run-debuginfod-extraction.sh
new file mode 100755
index 0000000..06f60e7
--- /dev/null
+++ b/tests/run-debuginfod-extraction.sh
@@ -0,0 +1,109 @@
+#!/usr/bin/env bash
+#
+# Copyright (C) 2019-2021 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 the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# 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 a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+. $srcdir/debuginfod-subr.sh
+
+# for test case debugging, uncomment:
+set -x
+unset VALGRIND_CMD
+
+mkdir R Z
+# This variable is essential and ensures no time-race for claiming ports occurs
+# set base to a unique multiple of 100 not used in any other 'run-debuginfod-*' test
+base=8700
+get_ports
+
+DB=${PWD}/.debuginfod_tmp.sqlite
+tempfiles $DB
+export DEBUGINFOD_CACHE_PATH=${PWD}/.client_cache
+
+env LD_LIBRARY_PATH=$ldpath ${abs_builddir}/../debuginfod/debuginfod $VERBOSE -d $DB -F -R -Z .tar.xz -Z .tar.bz2=bzcat -p $PORT1 -t0 -g0 -v R Z > vlog$PORT1 2>&1 &
+PID1=$!
+tempfiles vlog$PORT1
+errfiles vlog$PORT1
+# Server must become ready
+wait_ready $PORT1 'ready' 1
+
+# Be patient when run on a busy machine things might take a bit.
+export DEBUGINFOD_TIMEOUT=10
+
+# Check thread comm names
+ps -q $PID1 -e -L -o '%p %c %a' | grep groom
+ps -q $PID1 -e -L -o '%p %c %a' | grep scan
+ps -q $PID1 -e -L -o '%p %c %a' | grep traverse
+
+# Make sure the initial scan has finished before copying the new files in
+# We might remove some, which we don't want to be accidentially scanned.
+wait_ready $PORT1 'thread_work_total{role="traverse"}' 1
+
+cp -rvp ${abs_srcdir}/debuginfod-rpms R
+if [ "$zstd" = "false" ]; then  # nuke the zstd fedora 31 ones
+    rm -vrf R/debuginfod-rpms/fedora31
+fi
+
+cp -rvp ${abs_srcdir}/debuginfod-tars Z
+
+kill -USR1 $PID1
+# Wait till both files are in the index and scan/index fully finished
+wait_ready $PORT1 'thread_work_total{role="traverse"}' 2
+wait_ready $PORT1 'thread_work_pending{role="scan"}' 0
+wait_ready $PORT1 'thread_busy{role="scan"}' 0
+
+########################################################################
+# All rpms need to be in the index, except the dummy permission-000 one
+rpms=$(find R -name \*rpm | grep -v nothing | wc -l)
+wait_ready $PORT1 'scanned_files_total{source=".rpm archive"}' $rpms
+txz=$(find Z -name \*tar.xz | wc -l)
+wait_ready $PORT1 'scanned_files_total{source=".tar.xz archive"}' $txz
+tb2=$(find Z -name \*tar.bz2 | wc -l)
+wait_ready $PORT1 'scanned_files_total{source=".tar.bz2 archive"}' $tb2
+
+kill -USR1 $PID1  # two hits of SIGUSR1 may be needed to resolve .debug->dwz->srefs
+# Wait till both files are in the index and scan/index fully finished
+wait_ready $PORT1 'thread_work_total{role="traverse"}' 3
+wait_ready $PORT1 'thread_work_pending{role="scan"}' 0
+wait_ready $PORT1 'thread_busy{role="scan"}' 0
+
+# Expect all source files found in the rpms (they are all called hello.c :)
+# We will need to extract all rpms (in their own directory) and could all
+# sources referenced in the .debug files.
+mkdir extracted
+cd extracted
+subdir=0;
+newrpms=$(find ../R -name \*\.rpm | grep -v nothing)
+for i in $newrpms; do
+    subdir=$[$subdir+1];
+    mkdir $subdir;
+    cd $subdir;
+    ls -lah ../$i
+    rpm2cpio ../$i | cpio -ivd;
+    cd ..;
+done
+sourcefiles=$(find -name \*\\.debug \
+              | env LD_LIBRARY_PATH=$ldpath xargs \
+                ${abs_top_builddir}/src/readelf --debug-dump=decodedline \
+              | grep mtime: | wc --lines)
+cd ..
+rm -rf extracted
+
+wait_ready $PORT1 'found_sourcerefs_total{source=".rpm archive"}' $sourcefiles
+
+kill $PID1
+wait $PID1
+PID1=0
+exit 0
diff --git a/tests/run-debuginfod-fd-prefetch-caches.sh b/tests/run-debuginfod-fd-prefetch-caches.sh
new file mode 100755
index 0000000..7fbf7b2
--- /dev/null
+++ b/tests/run-debuginfod-fd-prefetch-caches.sh
@@ -0,0 +1,66 @@
+#!/usr/bin/env bash
+#
+# Copyright (C) 2019-2021 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 the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# 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 a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+. $srcdir/debuginfod-subr.sh
+
+# for test case debugging, uncomment:
+set -x
+unset VALGRIND_CMD
+
+FDCACHE_FDS=100
+FDCACHE_MBS=100
+PREFETCH_FDS=100
+PREFETCH_MBS=100
+# This variable is essential and ensures no time-race for claiming ports occurs
+# set base to a unique multiple of 100 not used in any other 'run-debuginfod-*' test
+base=8800
+get_ports
+
+DB=${PWD}/.debuginfod_tmp.sqlite
+tempfiles $DB
+export DEBUGINFOD_CACHE_PATH=${PWD}/.client_cache
+
+echo $PORT1
+env LD_LIBRARY_PATH=$ldpath DEBUGINFOD_URLS= ${abs_builddir}/../debuginfod/debuginfod $VERBOSE -p $PORT1 -d $DB \
+    --fdcache-mbs=$FDCACHE_MDS --fdcache-fds=$FDCACHE_FDS --fdcache-prefetch-mbs=$PREFETCH_MBS \
+    --fdcache-prefetch-fds=$PREFETCH_FDS --fdcache-mintmp 0 -v -F F > vlog$PORT1 2>&1 &
+PID1=$!
+tempfiles vlog$PORT1
+errfiles vlog$PORT1
+# Server must become ready
+wait_ready $PORT1 'ready' 1
+
+grep 'fdcache fds ' vlog$PORT1 #$FDCACHE_FDS
+grep 'fdcache mbs ' vlog$PORT1 #$FDCACHE_MBS
+grep 'prefetch fds ' vlog$PORT1 #$PREFETCH_FDS
+grep 'prefetch mbs ' vlog$PORT1 #$PREFETCH_MBS
+# search the vlog to find what metric counts should be and check the correct metrics
+# were incrimented
+enqueue_nr=$(grep -c 'interned.*front=1' vlog$PORT1 || true)
+wait_ready $PORT1 'fdcache_op_count{op="enqueue"}' $enqueue_nr
+evict_nr=$(grep -c 'evicted a=.*' vlog$PORT1 || true)
+wait_ready $PORT1 'fdcache_op_count{op="evict"}' $evict_nr
+prefetch_enqueue_nr=$(grep -c 'interned.*front=0' vlog$PORT1 || true)
+wait_ready $PORT1 'fdcache_op_count{op="prefetch_enqueue"}' $prefetch_enqueue_nr
+prefetch_evict_nr=$(grep -c 'evicted from prefetch a=.*front=0' vlog$PORT1 || true)
+wait_ready $PORT1 'fdcache_op_count{op="prefetch_evict"}' $prefetch_evict_nr
+
+kill $PID1
+wait $PID1
+PID1=0
+exit 0
diff --git a/tests/run-debuginfod-federation-link.sh b/tests/run-debuginfod-federation-link.sh
new file mode 100755
index 0000000..1347e7b
--- /dev/null
+++ b/tests/run-debuginfod-federation-link.sh
@@ -0,0 +1,165 @@
+#!/usr/bin/env bash
+#
+# Copyright (C) 2019-2021 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 the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# 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 a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+. $srcdir/debuginfod-subr.sh
+
+# for test case debugging, uncomment:
+set -x
+unset VALGRIND_CMD
+
+DB=${PWD}/.debuginfod_tmp.sqlite
+export DEBUGINFOD_CACHE_PATH=${PWD}/.client_cache
+export DEBUGINFOD_TIMEOUT=10
+tempfiles $DB
+
+# Clean old dirictories
+mkdir D L F
+mkdir -p $DEBUGINFOD_CACHE_PATH
+# not tempfiles F R L D Z - they are directories which we clean up manually
+ln -s ${abs_builddir}/dwfllines L/foo   # any program not used elsewhere in this test
+# This variable is essential and ensures no time-race for claiming ports occurs
+# set base to a unique multiple of 100 not used in any other 'run-debuginfod-*' test
+base=8900
+get_ports
+# Launch server which will be unable to follow symlinks
+env LD_LIBRARY_PATH=$ldpath ${abs_builddir}/../debuginfod/debuginfod $VERBOSE -d ${DB} -F -U -t0 -g0 -p $PORT1 L D F > vlog$PORT1 2>&1 &
+PID1=$!
+tempfiles vlog$PORT1
+errfiles vlog$PORT1
+
+wait_ready $PORT1 'ready' 1
+# Make sure initial scan was done
+wait_ready $PORT1 'thread_work_total{role="traverse"}' 1
+wait_ready $PORT1 'thread_work_pending{role="scan"}' 0
+wait_ready $PORT1 'thread_busy{role="scan"}' 0
+
+########################################################################
+# Compile a simple program, strip its debuginfo and save the build-id.
+# Also move the debuginfo into another directory so that elfutils
+# cannot find it without debuginfod.
+echo "int main() { return 0; }" > ${PWD}/prog.c
+tempfiles prog.c
+# Create a subdirectory to confound source path names
+mkdir foobar
+gcc -Wl,--build-id -g -o prog ${PWD}/foobar///./../prog.c
+testrun ${abs_top_builddir}/src/strip -g -f prog.debug ${PWD}/prog
+BUILDID=`env LD_LIBRARY_PATH=$ldpath ${abs_builddir}/../src/readelf \
+          -a prog | grep 'Build ID' | cut -d ' ' -f 7`
+
+mv prog F
+mv prog.debug F
+
+kill -USR1 $PID1
+# Wait till both files are in the index.
+wait_ready $PORT1 'thread_work_total{role="traverse"}' 2
+wait_ready $PORT1 'thread_work_pending{role="scan"}' 0
+wait_ready $PORT1 'thread_busy{role="scan"}' 0
+
+wait_ready $PORT1 'thread_busy{role="http-buildid"}' 0
+wait_ready $PORT1 'thread_busy{role="http-metrics"}' 1
+
+export DEBUGINFOD_CACHE_PATH=${PWD}/.client_cache2
+mkdir -p $DEBUGINFOD_CACHE_PATH
+
+# NB: run in -L symlink-following mode for the L subdir
+env LD_LIBRARY_PATH=$ldpath DEBUGINFOD_URLS=http://127.0.0.1:$PORT1 ${abs_builddir}/../debuginfod/debuginfod $VERBOSE -d ${DB}_2 -F -U -p $PORT2 -L L D > vlog$PORT2 2>&1 &
+PID2=$!
+tempfiles vlog$PORT2
+errfiles vlog$PORT2
+tempfiles ${DB}_2
+
+wait_ready $PORT2 'ready' 1
+
+# Make sure initial scan was done
+wait_ready $PORT2 'thread_work_total{role="traverse"}' 1
+kill -USR1 $PID2
+# Wait till both files are in the index.
+wait_ready $PORT2 'thread_work_total{role="traverse"}' 2
+wait_ready $PORT2 'thread_work_pending{role="scan"}' 0
+wait_ready $PORT2 'thread_busy{role="scan"}' 0
+
+wait_ready $PORT2 'thread_busy{role="http-buildid"}' 0
+wait_ready $PORT2 'thread_busy{role="http-metrics"}' 1
+
+# have clients contact the new server
+export DEBUGINFOD_URLS=http://127.0.0.1:$PORT2
+# Use fresh cache for debuginfod-find client requests
+export DEBUGINFOD_CACHE_PATH=${PWD}/.client_cache3
+mkdir -p $DEBUGINFOD_CACHE_PATH
+
+if type bsdtar 2>/dev/null; then
+    # copy in the deb files
+    cp -rvp ${abs_srcdir}/debuginfod-debs/*deb D
+    kill -USR1 $PID2
+    wait_ready $PORT2 'thread_work_total{role="traverse"}' 3
+    wait_ready $PORT2 'thread_work_pending{role="scan"}' 0
+    wait_ready $PORT2 'thread_busy{role="scan"}' 0
+
+    # All debs need to be in the index
+    debs=$(find D -name \*.deb | wc -l)
+    wait_ready $PORT2 'scanned_files_total{source=".deb archive"}' `expr $debs`
+    ddebs=$(find D -name \*.ddeb | wc -l)
+    wait_ready $PORT2 'scanned_files_total{source=".ddeb archive"}' `expr $ddebs`
+
+    # ubuntu
+    archive_test f17a29b5a25bd4960531d82aa6b07c8abe84fa66 "" ""
+fi
+
+testrun ${abs_top_builddir}/debuginfod/debuginfod-find debuginfo $BUILDID
+
+# send a request to stress XFF and User-Agent federation relay;
+# we'll grep for the two patterns in vlog$PORT1
+curl -s -H 'User-Agent: TESTCURL' -H 'X-Forwarded-For: TESTXFF' $DEBUGINFOD_URLS/buildid/deaddeadbeef00000000/debuginfo -o /dev/null || true
+
+grep UA:TESTCURL vlog$PORT1
+grep XFF:TESTXFF vlog$PORT1
+
+# confirm that first server can't resolve symlinked info in L/ but second can
+BUILDID=`env LD_LIBRARY_PATH=$ldpath ${abs_builddir}/../src/readelf \
+         -a L/foo | grep 'Build ID' | cut -d ' ' -f 7`
+file L/foo
+file -L L/foo
+export DEBUGINFOD_URLS=http://127.0.0.1:$PORT1
+rm -rf $DEBUGINFOD_CACHE_PATH
+testrun ${abs_top_builddir}/debuginfod/debuginfod-find debuginfo $BUILDID && false || true
+rm -f $DEBUGINFOD_CACHE_PATH/$BUILDID/debuginfo # drop 000-perm negative-hit file
+export DEBUGINFOD_URLS=http://127.0.0.1:$PORT2
+testrun ${abs_top_builddir}/debuginfod/debuginfod-find debuginfo $BUILDID
+
+# test again with scheme free url
+export DEBUGINFOD_URLS=127.0.0.1:$PORT1
+rm -rf $DEBUGINFOD_CACHE_PATH
+testrun ${abs_top_builddir}/debuginfod/debuginfod-find debuginfo $BUILDID && false || true
+rm -f $DEBUGINFOD_CACHE_PATH/$BUILDID/debuginfo # drop 000-perm negative-hit file
+export DEBUGINFOD_URLS=127.0.0.1:$PORT2
+testrun ${abs_top_builddir}/debuginfod/debuginfod-find debuginfo $BUILDID
+
+# test parallel queries in client
+rm -rf $DEBUGINFOD_CACHE_PATH
+export DEBUGINFOD_URLS="BAD http://127.0.0.1:$PORT1 127.0.0.1:$PORT1 http://127.0.0.1:$PORT2 DNE"
+
+testrun ${abs_builddir}/debuginfod_build_id_find -e F/prog 1
+
+kill $PID1
+kill $PID2
+wait $PID1
+wait $PID2
+PID1=0
+PID2=0
+
+exit 0
diff --git a/tests/run-debuginfod-federation-metrics.sh b/tests/run-debuginfod-federation-metrics.sh
new file mode 100755
index 0000000..2d0fd6d
--- /dev/null
+++ b/tests/run-debuginfod-federation-metrics.sh
@@ -0,0 +1,211 @@
+#!/usr/bin/env bash
+#
+# Copyright (C) 2019-2021 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 the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# 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 a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+. $srcdir/debuginfod-subr.sh
+
+# for test case debugging, uncomment:
+set -x
+unset VALGRIND_CMD
+
+DB=${PWD}/.debuginfod_tmp.sqlite
+export DEBUGINFOD_CACHE_PATH=${PWD}/.client_cache
+export DEBUGINFOD_TIMEOUT=10
+export DEBUGINFOD_URLS='http://127.0.0.1:0' # Note invalid, will trigger error_count metric
+tempfiles $DB
+# Clean old dirictories
+mkdir D L F
+
+# not tempfiles F R L D Z - they are directories which we clean up manually
+ln -s ${abs_builddir}/dwfllines L/foo   # any program not used elsewhere in this test
+# This variable is essential and ensures no time-race for claiming ports occurs
+# set base to a unique multiple of 100 not used in any other 'run-debuginfod-*' test
+base=9000
+get_ports
+
+# Launch server which will be unable to follow symlinks
+env LD_LIBRARY_PATH=$ldpath ${abs_builddir}/../debuginfod/debuginfod $VERBOSE -d ${DB} -F -U -t0 -g0 -p $PORT1 L D F > vlog$PORT1 2>&1 &
+PID1=$!
+tempfiles vlog$PORT1
+errfiles vlog$PORT1
+
+wait_ready $PORT1 'ready' 1
+
+# Wait till initial scan is done
+wait_ready $PORT1 'thread_work_total{role="traverse"}' 1
+wait_ready $PORT1 'thread_work_pending{role="scan"}' 0
+wait_ready $PORT1 'thread_busy{role="scan"}' 0
+########################################################################
+# Compile a simple program, strip its debuginfo and save the build-id.
+# Also move the debuginfo into another directory so that elfutils
+# cannot find it without debuginfod.
+echo "int main() { return 0; }" > ${PWD}/prog.c
+tempfiles prog.c
+# Create a subdirectory to confound source path names
+mkdir foobar
+gcc -Wl,--build-id -g -o prog ${PWD}/foobar///./../prog.c
+testrun ${abs_top_builddir}/src/strip -g -f prog.debug ${PWD}/prog
+BUILDID=`env LD_LIBRARY_PATH=$ldpath ${abs_builddir}/../src/readelf \
+          -a prog | grep 'Build ID' | cut -d ' ' -f 7`
+
+mv prog F
+mv prog.debug F
+kill -USR1 $PID1
+# Wait till both files are in the index.
+wait_ready $PORT1 'thread_work_total{role="traverse"}' 2
+wait_ready $PORT1 'thread_work_pending{role="scan"}' 0
+wait_ready $PORT1 'thread_busy{role="scan"}' 0
+
+wait_ready $PORT1 'thread_busy{role="http-buildid"}' 0
+wait_ready $PORT1 'thread_busy{role="http-metrics"}' 1
+
+export DEBUGINFOD_CACHE_PATH=${PWD}/.client_cache2
+mkdir -p $DEBUGINFOD_CACHE_PATH
+# NB: run in -L symlink-following mode for the L subdir
+env LD_LIBRARY_PATH=$ldpath DEBUGINFOD_URLS=http://127.0.0.1:$PORT1 ${abs_builddir}/../debuginfod/debuginfod $VERBOSE -d ${DB}_2 -F -U -p $PORT2 -L L D > vlog$PORT2 2>&1 &
+PID2=$!
+tempfiles vlog$PORT2
+errfiles vlog$PORT2
+tempfiles ${DB}_2
+
+wait_ready $PORT2 'ready' 1
+wait_ready $PORT2 'thread_work_total{role="traverse"}' 1
+wait_ready $PORT2 'thread_work_pending{role="scan"}' 0
+wait_ready $PORT2 'thread_busy{role="scan"}' 0
+
+wait_ready $PORT2 'thread_busy{role="http-buildid"}' 0
+wait_ready $PORT2 'thread_busy{role="http-metrics"}' 1
+
+# have clients contact the new server
+export DEBUGINFOD_URLS=http://127.0.0.1:$PORT2
+# Use fresh cache for debuginfod-find client requests
+export DEBUGINFOD_CACHE_PATH=${PWD}/.client_cache3
+mkdir -p $DEBUGINFOD_CACHE_PATH
+
+if type bsdtar 2>/dev/null; then
+    # copy in the deb files
+    cp -rvp ${abs_srcdir}/debuginfod-debs/*deb D
+    kill -USR1 $PID2
+    wait_ready $PORT2 'thread_work_total{role="traverse"}' 2
+    wait_ready $PORT2 'thread_work_pending{role="scan"}' 0
+    wait_ready $PORT2 'thread_busy{role="scan"}' 0
+
+    # All debs need to be in the index
+    debs=$(find D -name \*.deb | wc -l)
+    wait_ready $PORT2 'scanned_files_total{source=".deb archive"}' `expr $debs`
+    ddebs=$(find D -name \*.ddeb | wc -l)
+    wait_ready $PORT2 'scanned_files_total{source=".ddeb archive"}' `expr $ddebs`
+
+    # ubuntu
+    archive_test f17a29b5a25bd4960531d82aa6b07c8abe84fa66 "" ""
+fi
+
+testrun ${abs_top_builddir}/debuginfod/debuginfod-find debuginfo $BUILDID
+
+# send a request to stress XFF and User-Agent federation relay;
+# we'll grep for the two patterns in vlog$PORT1
+curl -s -H 'User-Agent: TESTCURL' -H 'X-Forwarded-For: TESTXFF' $DEBUGINFOD_URLS/buildid/deaddeadbeef00000000/debuginfo -o /dev/null || true
+
+grep UA:TESTCURL vlog$PORT1
+grep XFF:TESTXFF vlog$PORT1
+
+# confirm that first server can't resolve symlinked info in L/ but second can
+BUILDID=`env LD_LIBRARY_PATH=$ldpath ${abs_builddir}/../src/readelf \
+         -a L/foo | grep 'Build ID' | cut -d ' ' -f 7`
+file L/foo
+file -L L/foo
+export DEBUGINFOD_URLS=http://127.0.0.1:$PORT1
+rm -rf $DEBUGINFOD_CACHE_PATH
+testrun ${abs_top_builddir}/debuginfod/debuginfod-find debuginfo $BUILDID && false || true
+rm -f $DEBUGINFOD_CACHE_PATH/$BUILDID/debuginfo # drop 000-perm negative-hit file
+export DEBUGINFOD_URLS=http://127.0.0.1:$PORT2
+testrun ${abs_top_builddir}/debuginfod/debuginfod-find debuginfo $BUILDID
+
+# test again with scheme free url
+export DEBUGINFOD_URLS=127.0.0.1:$PORT1
+rm -rf $DEBUGINFOD_CACHE_PATH
+testrun ${abs_top_builddir}/debuginfod/debuginfod-find debuginfo $BUILDID && false || true
+rm -f $DEBUGINFOD_CACHE_PATH/$BUILDID/debuginfo # drop 000-perm negative-hit file
+export DEBUGINFOD_URLS=127.0.0.1:$PORT2
+testrun ${abs_top_builddir}/debuginfod/debuginfod-find debuginfo $BUILDID
+# test parallel queries in client
+export DEBUGINFOD_CACHE_PATH=${PWD}/.client_cache3
+mkdir -p $DEBUGINFOD_CACHE_PATH
+export DEBUGINFOD_URLS="BAD http://127.0.0.1:$PORT1 127.0.0.1:$PORT1 http://127.0.0.1:$PORT2 DNE"
+
+testrun ${abs_builddir}/debuginfod_build_id_find -e F/prog 1
+
+########################################################################
+# Fetch some metrics
+curl -s http://127.0.0.1:$PORT1/badapi
+curl -s http://127.0.0.1:$PORT1/metrics
+curl -s http://127.0.0.1:$PORT2/metrics
+curl -s http://127.0.0.1:$PORT1/metrics | grep -q 'http_responses_total.*result.*error'
+curl -s http://127.0.0.1:$PORT2/metrics | grep -q 'http_responses_total.*result.*upstream'
+curl -s http://127.0.0.1:$PORT1/metrics | grep 'http_responses_duration_milliseconds_count'
+curl -s http://127.0.0.1:$PORT1/metrics | grep 'http_responses_duration_milliseconds_sum'
+curl -s http://127.0.0.1:$PORT1/metrics | grep 'http_responses_transfer_bytes_count'
+curl -s http://127.0.0.1:$PORT1/metrics | grep 'http_responses_transfer_bytes_sum'
+curl -s http://127.0.0.1:$PORT1/metrics | grep 'fdcache_'
+curl -s http://127.0.0.1:$PORT1/metrics | grep 'error_count'
+curl -s http://127.0.0.1:$PORT1/metrics | grep 'traversed_total'
+curl -s http://127.0.0.1:$PORT1/metrics | grep 'scanned_bytes_total'
+
+# And generate a few errors into the second debuginfod's logs, for analysis just below
+curl -s http://127.0.0.1:$PORT2/badapi > /dev/null || true
+curl -s http://127.0.0.1:$PORT2/buildid/deadbeef/debuginfo > /dev/null || true
+# NB: this error is used to seed the 404 failure for the survive-404 tests
+
+# Confirm bad artifact types are rejected without leaving trace
+curl -s http://127.0.0.1:$PORT2/buildid/deadbeef/badtype > /dev/null || true
+(curl -s http://127.0.0.1:$PORT2/metrics | grep 'badtype') && false
+
+# Confirm that reused curl connections survive 404 errors.
+# The rm's force an uncached fetch (in both servers and client cache)
+rm -f .client_cache*/$BUILDID/debuginfo
+testrun ${abs_top_builddir}/debuginfod/debuginfod-find debuginfo $BUILDID
+rm -f .client_cache*/$BUILDID/debuginfo
+testrun ${abs_top_builddir}/debuginfod/debuginfod-find debuginfo $BUILDID
+testrun ${abs_top_builddir}/debuginfod/debuginfod-find debuginfo $BUILDID
+testrun ${abs_top_builddir}/debuginfod/debuginfod-find debuginfo $BUILDID
+rm -f .client_cache*/$BUILDID/debuginfo
+testrun ${abs_top_builddir}/debuginfod/debuginfod-find debuginfo $BUILDID
+
+# Confirm that some debuginfod client pools are being used
+curl -s http://127.0.0.1:$PORT2/metrics | grep 'dc_pool_op.*reuse'
+
+# Trigger a flood of requests against the same archive content file.
+# Use a file that hasn't been previously extracted in to make it
+# likely that even this test debuginfod will experience concurrency
+# and impose some "after-you" delays.
+(for i in `seq 100`; do
+    curl -s http://127.0.0.1:$PORT1/buildid/87c08d12c78174f1082b7c888b3238219b0eb265/executable >/dev/null &
+ done;
+ wait)
+curl -s http://127.0.0.1:$PORT1/metrics | grep 'http_responses_after_you.*'
+# If we could guarantee some minimum number of seconds of CPU time, we
+# could assert that the after_you metrics show some nonzero amount of
+# waiting.  A few hundred ms is typical on this developer's workstation.
+
+kill $PID1
+kill $PID2
+wait $PID1
+wait $PID2
+PID1=0
+PID2=0
+exit 0
+
diff --git a/tests/run-debuginfod-federation-sqlite.sh b/tests/run-debuginfod-federation-sqlite.sh
new file mode 100755
index 0000000..45761ed
--- /dev/null
+++ b/tests/run-debuginfod-federation-sqlite.sh
@@ -0,0 +1,202 @@
+#!/usr/bin/env bash
+#
+# Copyright (C) 2019-2021 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 the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# 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 a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+. $srcdir/debuginfod-subr.sh
+
+# for test case debugging, uncomment:
+set -x
+unset VALGRIND_CMD
+
+DB=${PWD}/.debuginfod_tmp.sqlite
+export DEBUGINFOD_CACHE_PATH=${PWD}/.client_cache
+export DEBUGINFOD_TIMEOUT=10
+tempfiles $DB
+
+# Clean old dirictories
+mkdir D L F
+# not tempfiles F R L D Z - they are directories which we clean up manually
+ln -s ${abs_builddir}/dwfllines L/foo   # any program not used elsewhere in this test
+
+########################################################################
+# Compile a simple program, strip its debuginfo and save the build-id.
+# Also move the debuginfo into another directory so that elfutils
+# cannot find it without debuginfod.
+echo "int main() { return 0; }" > ${PWD}/prog.c
+tempfiles prog.c
+# Create a subdirectory to confound source path names
+mkdir foobar
+gcc -Wl,--build-id -g -o prog ${PWD}/foobar///./../prog.c
+testrun ${abs_top_builddir}/src/strip -g -f prog.debug ${PWD}/prog
+BUILDID=`env LD_LIBRARY_PATH=$ldpath ${abs_builddir}/../src/readelf \
+          -a prog | grep 'Build ID' | cut -d ' ' -f 7`
+
+mv prog F
+mv prog.debug F
+# This variable is essential and ensures no time-race for claiming ports occurs
+# set base to a unique multiple of 100 not used in any other 'run-debuginfod-*' test
+base=9100
+get_ports
+# Launch server which will be unable to follow symlinks
+env LD_LIBRARY_PATH=$ldpath ${abs_builddir}/../debuginfod/debuginfod $VERBOSE -d ${DB} -F -U -t0 -g0 -p $PORT1 L D F > vlog$PORT1 2>&1 &
+PID1=$!
+tempfiles vlog$PORT1
+errfiles vlog$PORT1
+
+wait_ready $PORT1 'ready' 1
+
+# Wait till initial scan is done
+wait_ready $PORT1 'thread_work_total{role="traverse"}' 1
+wait_ready $PORT1 'thread_work_pending{role="scan"}' 0
+wait_ready $PORT1 'thread_busy{role="scan"}' 0
+
+export DEBUGINFOD_CACHE_PATH=${PWD}/.client_cache2
+mkdir -p $DEBUGINFOD_CACHE_PATH
+# NB: run in -L symlink-following mode for the L subdir
+env LD_LIBRARY_PATH=$ldpath DEBUGINFOD_URLS=http://127.0.0.1:$PORT1 ${abs_builddir}/../debuginfod/debuginfod $VERBOSE -d ${DB}_2 -F -U -p $PORT2 -L L D F > vlog$PORT2 2>&1 &
+PID2=$!
+tempfiles vlog$PORT2
+errfiles vlog$PORT2
+tempfiles ${DB}_2
+wait_ready $PORT2 'ready' 1
+# Wait till initial scan is done
+wait_ready $PORT2 'thread_work_total{role="traverse"}' 1
+# And initial groom cycle
+wait_ready $PORT1 'thread_work_total{role="groom"}' 1
+
+export DEBUGINFOD_URLS='http://127.0.0.1:'$PORT2
+# Use fresh cache for debuginfod-find client requests
+export DEBUGINFOD_CACHE_PATH=${PWD}/.client_cache3
+mkdir -p $DEBUGINFOD_CACHE_PATH
+
+if type bsdtar 2>/dev/null; then
+    # copy in the deb files
+    cp -rvp ${abs_srcdir}/debuginfod-debs/*deb D
+    kill -USR1 $PID2
+    wait_ready $PORT2 'thread_work_total{role="traverse"}' 2
+    wait_ready $PORT2 'thread_work_pending{role="scan"}' 0
+    wait_ready $PORT2 'thread_busy{role="scan"}' 0
+
+    # All debs need to be in the index
+    debs=$(find D -name \*.deb | wc -l)
+    wait_ready $PORT2 'scanned_files_total{source=".deb archive"}' `expr $debs`
+    ddebs=$(find D -name \*.ddeb | wc -l)
+    wait_ready $PORT2 'scanned_files_total{source=".ddeb archive"}' `expr $ddebs`
+
+    # ubuntu
+    archive_test f17a29b5a25bd4960531d82aa6b07c8abe84fa66 "" ""
+fi
+
+testrun ${abs_top_builddir}/debuginfod/debuginfod-find debuginfo $BUILDID
+
+# send a request to stress XFF and User-Agent federation relay;
+# we'll grep for the two patterns in vlog$PORT1
+curl -s -H 'User-Agent: TESTCURL' -H 'X-Forwarded-For: TESTXFF' $DEBUGINFOD_URLS/buildid/deaddeadbeef00000000/debuginfo -o /dev/null || true
+
+grep UA:TESTCURL vlog$PORT1
+grep XFF:TESTXFF vlog$PORT1
+
+# confirm that first server can't resolve symlinked info in L/ but second can
+BUILDID=`env LD_LIBRARY_PATH=$ldpath ${abs_builddir}/../src/readelf \
+         -a L/foo | grep 'Build ID' | cut -d ' ' -f 7`
+file L/foo
+file -L L/foo
+export DEBUGINFOD_URLS=http://127.0.0.1:$PORT1
+rm -rf $DEBUGINFOD_CACHE_PATH
+testrun ${abs_top_builddir}/debuginfod/debuginfod-find debuginfo $BUILDID && false || true
+rm -f $DEBUGINFOD_CACHE_PATH/$BUILDID/debuginfo # drop 000-perm negative-hit file
+export DEBUGINFOD_URLS=http://127.0.0.1:$PORT2
+testrun ${abs_top_builddir}/debuginfod/debuginfod-find debuginfo $BUILDID
+
+# test again with scheme free url
+export DEBUGINFOD_URLS=127.0.0.1:$PORT1
+rm -rf $DEBUGINFOD_CACHE_PATH
+testrun ${abs_top_builddir}/debuginfod/debuginfod-find debuginfo $BUILDID && false || true
+rm -f $DEBUGINFOD_CACHE_PATH/$BUILDID/debuginfo # drop 000-perm negative-hit file
+export DEBUGINFOD_URLS=127.0.0.1:$PORT2
+testrun ${abs_top_builddir}/debuginfod/debuginfod-find debuginfo $BUILDID
+# test parallel queries in client
+rm -rf $DEBUGINFOD_CACHE_PATH
+export DEBUGINFOD_URLS="BAD http://127.0.0.1:$PORT1 127.0.0.1:$PORT1 http://127.0.0.1:$PORT2 DNE"
+
+testrun ${abs_builddir}/debuginfod_build_id_find -e F/prog 1
+
+# And generate a few errors into the second debuginfod's logs, for analysis just below
+curl -s http://127.0.0.1:$PORT2/badapi > /dev/null || true
+curl -s http://127.0.0.1:$PORT2/buildid/deadbeef/debuginfo > /dev/null || true
+# NB: this error is used to seed the 404 failure for the survive-404 tests
+
+# Confirm bad artifact types are rejected without leaving trace
+curl -s http://127.0.0.1:$PORT2/buildid/deadbeef/badtype > /dev/null || true
+(curl -s http://127.0.0.1:$PORT2/metrics | grep 'badtype') && false
+
+# Confirm that reused curl connections survive 404 errors.
+# The rm's force an uncached fetch (in both servers and client cache)
+rm -f .client_cache*/$BUILDID/debuginfo
+testrun ${abs_top_builddir}/debuginfod/debuginfod-find debuginfo $BUILDID
+rm -f .client_cache*/$BUILDID/debuginfo
+testrun ${abs_top_builddir}/debuginfod/debuginfod-find debuginfo $BUILDID
+testrun ${abs_top_builddir}/debuginfod/debuginfod-find debuginfo $BUILDID
+testrun ${abs_top_builddir}/debuginfod/debuginfod-find debuginfo $BUILDID
+rm -f .client_cache*/$BUILDID/debuginfo
+testrun ${abs_top_builddir}/debuginfod/debuginfod-find debuginfo $BUILDID
+# Trigger a flood of requests against the same archive content file.
+# Use a file that hasn't been previously extracted in to make it
+# likely that even this test debuginfod will experience concurrency
+# and impose some "after-you" delays.
+(for i in `seq 100`; do
+    curl -s http://127.0.0.1:$PORT1/buildid/87c08d12c78174f1082b7c888b3238219b0eb265/executable >/dev/null &
+ done;
+ wait)
+curl -s http://127.0.0.1:$PORT1/metrics | grep 'http_responses_after_you.*'
+# If we could guarantee some minimum number of seconds of CPU time, we
+# could assert that the after_you metrics show some nonzero amount of
+# waiting.  A few hundred ms is typical on this developer's workstation.
+
+########################################################################
+# Corrupt the sqlite database and get debuginfod to trip across its errors
+curl -s http://127.0.0.1:$PORT1/metrics | grep 'sqlite3.*reset'
+dd if=/dev/zero of=$DB bs=1 count=1
+
+# trigger some random activity that's Sure to get sqlite3 upset
+kill -USR1 $PID1
+wait_ready $PORT1 'thread_work_total{role="traverse"}' 2
+wait_ready $PORT1 'thread_work_pending{role="scan"}' 0
+wait_ready $PORT1 'thread_busy{role="scan"}' 0
+kill -USR2 $PID1
+wait_ready $PORT1 'thread_work_total{role="groom"}' 2
+curl -s http://127.0.0.1:$PORT1/buildid/beefbeefbeefd00dd00d/debuginfo > /dev/null || true
+curl -s http://127.0.0.1:$PORT1/metrics | grep 'error_count.*sqlite'
+# Run the tests again without the servers running. The target file should
+# be found in the cache.
+
+kill -INT $PID1 $PID2
+wait $PID1 $PID2
+PID1=0
+PID2=0
+tempfiles .debuginfod_*
+
+testrun ${abs_builddir}/debuginfod_build_id_find -e F/prog 1
+
+# check out the debuginfod logs for the new style status lines
+cat vlog$PORT2
+grep -q 'UA:.*XFF:.*GET /buildid/.* 200 ' vlog$PORT2
+grep -q 'UA:.*XFF:.*GET /metrics 200 ' vlog$PORT2
+grep -q 'UA:.*XFF:.*GET /badapi 503 ' vlog$PORT2
+grep -q 'UA:.*XFF:.*GET /buildid/deadbeef.* 404 ' vlog$PORT2
+
+exit 0
diff --git a/tests/run-debuginfod-file.sh b/tests/run-debuginfod-file.sh
new file mode 100755
index 0000000..341bbc6
--- /dev/null
+++ b/tests/run-debuginfod-file.sh
@@ -0,0 +1,41 @@
+#!/usr/bin/env bash
+#
+# Copyright (C) 2019-2021 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 the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# 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 a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+. $srcdir/debuginfod-subr.sh
+
+# for test case debugging, uncomment:
+set -x
+unset VALGRIND_CMD
+
+export DEBUGINFOD_CACHE_PATH=${PWD}/.client_cache
+
+# Test fetching a file using file:// . No debuginfod server needs to be run for
+# this test.
+local_dir=${PWD}/mocktree/buildid/aaaaaaaaaabbbbbbbbbbccccccccccdddddddddd/source/my/path
+mkdir -p ${local_dir}
+echo "int main() { return 0; }" > ${local_dir}/main.c
+# first test that is doesn't work, when no DEBUGINFOD_URLS is set
+export DEBUGINFOD_URLS=""
+testrun ${abs_top_builddir}/debuginfod/debuginfod-find source aaaaaaaaaabbbbbbbbbbccccccccccdddddddddd /my/path/main.c && false || true
+
+# Now test is with proper DEBUGINFOD_URLS
+export DEBUGINFOD_URLS="file://${PWD}/mocktree/"
+filename=`testrun ${abs_top_builddir}/debuginfod/debuginfod-find source aaaaaaaaaabbbbbbbbbbccccccccccdddddddddd /my/path/main.c`
+cmp $filename ${local_dir}/main.c
+
+exit 0
diff --git a/tests/run-debuginfod-find.sh b/tests/run-debuginfod-find.sh
deleted file mode 100755
index 6340f60..0000000
--- a/tests/run-debuginfod-find.sh
+++ /dev/null
@@ -1,578 +0,0 @@
-#!/usr/bin/env bash
-#
-# Copyright (C) 2019-2020 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 the GNU General Public License as published by
-# the Free Software Foundation; either version 3 of the License, or
-# (at your option) any later version.
-#
-# 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 a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-. $srcdir/test-subr.sh  # includes set -e
-
-type curl 2>/dev/null || (echo "need curl"; exit 77)
-type rpm2cpio 2>/dev/null || (echo "need rpm2cpio"; exit 77)
-type bzcat 2>/dev/null || (echo "need bzcat"; exit 77)
-bsdtar --version | grep -q zstd && zstd=true || zstd=false
-echo "zstd=$zstd bsdtar=`bsdtar --version`"
-
-# for test case debugging, uncomment:
-#set -x
-#VERBOSE=-vvvv
-
-DB=${PWD}/.debuginfod_tmp.sqlite
-tempfiles $DB
-export DEBUGINFOD_CACHE_PATH=${PWD}/.client_cache
-
-PID1=0
-PID2=0
-PID3=0
-
-cleanup()
-{
-  if [ $PID1 -ne 0 ]; then kill $PID1; wait $PID1; fi
-  if [ $PID2 -ne 0 ]; then kill $PID2; wait $PID2; fi
-  if [ $PID3 -ne 0 ]; then kill $PID3; wait $PID3; fi
-
-  rm -rf F R D L Z ${PWD}/foobar ${PWD}/mocktree ${PWD}/.client_cache* ${PWD}/tmp*
-  exit_cleanup
-}
-
-# clean up trash if we were aborted early
-trap cleanup 0 1 2 3 5 9 15
-
-# find an unused port number
-while true; do
-    PORT1=`expr '(' $RANDOM % 1000 ')' + 9000`
-    ss -atn | fgrep ":$PORT1" || break
-done    
-
-# We want to run debuginfod in the background.  We also want to start
-# it with the same check/installcheck-sensitive LD_LIBRARY_PATH stuff
-# that the testrun alias sets.  But: we if we just use
-#    testrun .../debuginfod
-# it runs in a subshell, with different pid, so not helpful.
-#
-# So we gather the LD_LIBRARY_PATH with this cunning trick:
-ldpath=`testrun sh -c 'echo $LD_LIBRARY_PATH'`
-
-mkdir F R L D Z
-# not tempfiles F R L D Z - they are directories which we clean up manually
-ln -s ${abs_builddir}/dwfllines L/foo   # any program not used elsewhere in this test
-
-wait_ready()
-{
-  port=$1;
-  what=$2;
-  value=$3;
-  timeout=20;
-
-  echo "Wait $timeout seconds on $port for metric $what to change to $value"
-  while [ $timeout -gt 0 ]; do
-    mvalue="$(curl -s http://127.0.0.1:$port/metrics \
-              | grep "$what" | awk '{print $NF}')"
-    if [ -z "$mvalue" ]; then mvalue=0; fi
-      echo "metric $what: $mvalue"
-      if [ "$mvalue" -eq "$value" ]; then
-        break;
-    fi
-    sleep 0.5;
-    ((timeout--));
-  done;
-
-  if [ $timeout -eq 0 ]; then
-      echo "metric $what never changed to $value on port $port"
-      curl -s http://127.0.0.1:$port/metrics
-    exit 1;
-  fi
-}
-
-# create a bogus .rpm file to evoke a metric-visible error
-# Use a cyclic symlink instead of chmod 000 to make sure even root
-# would see an error (running the testsuite under root is NOT encouraged).
-ln -s R/nothing.rpm R/nothing.rpm
-
-env LD_LIBRARY_PATH=$ldpath DEBUGINFOD_URLS= ${abs_builddir}/../debuginfod/debuginfod $VERBOSE -F -R -d $DB -p $PORT1 -t0 -g0 --fdcache-fds 1 --fdcache-mbs 2 --fdcache-mintmp 0 -Z .tar.xz -Z .tar.bz2=bzcat -v R F Z L > vlog4 2>&1 &
-PID1=$!
-tempfiles vlog4
-# Server must become ready
-wait_ready $PORT1 'ready' 1
-export DEBUGINFOD_URLS=http://127.0.0.1:$PORT1/   # or without trailing /
-
-# Be patient when run on a busy machine things might take a bit.
-export DEBUGINFOD_TIMEOUT=10
-
-# We use -t0 and -g0 here to turn off time-based scanning & grooming.
-# For testing purposes, we just sic SIGUSR1 / SIGUSR2 at the process.
-
-########################################################################
-
-# Compile a simple program, strip its debuginfo and save the build-id.
-# Also move the debuginfo into another directory so that elfutils
-# cannot find it without debuginfod.
-echo "int main() { return 0; }" > ${PWD}/prog.c
-tempfiles prog.c
-# Create a subdirectory to confound source path names
-mkdir foobar
-gcc -Wl,--build-id -g -o prog ${PWD}/foobar///./../prog.c
-testrun ${abs_top_builddir}/src/strip -g -f prog.debug ${PWD}/prog
-BUILDID=`env LD_LIBRARY_PATH=$ldpath ${abs_builddir}/../src/readelf \
-          -a prog | grep 'Build ID' | cut -d ' ' -f 7`
-
-wait_ready $PORT1 'thread_work_total{role="traverse"}' 1
-mv prog F
-mv prog.debug F
-kill -USR1 $PID1
-# Wait till both files are in the index.
-wait_ready $PORT1 'thread_work_total{role="traverse"}' 2
-wait_ready $PORT1 'thread_work_pending{role="scan"}' 0
-wait_ready $PORT1 'thread_busy{role="scan"}' 0
-
-########################################################################
-
-# Test whether elfutils, via the debuginfod client library dlopen hooks,
-# is able to fetch debuginfo from the local debuginfod.
-testrun ${abs_builddir}/debuginfod_build_id_find -e F/prog 1
-
-########################################################################
-
-# Test whether debuginfod-find is able to fetch those files.
-rm -rf $DEBUGINFOD_CACHE_PATH # clean it from previous tests
-filename=`testrun ${abs_top_builddir}/debuginfod/debuginfod-find debuginfo $BUILDID`
-cmp $filename F/prog.debug
-
-filename=`testrun ${abs_top_builddir}/debuginfod/debuginfod-find executable F/prog`
-cmp $filename F/prog
-
-# raw source filename
-filename=`testrun ${abs_top_builddir}/debuginfod/debuginfod-find source $BUILDID ${PWD}/foobar///./../prog.c`
-cmp $filename  ${PWD}/prog.c
-
-# and also the canonicalized one
-filename=`testrun ${abs_top_builddir}/debuginfod/debuginfod-find source $BUILDID ${PWD}/prog.c`
-cmp $filename  ${PWD}/prog.c
-
-
-########################################################################
-
-# Test whether the cache default locations are correct
-
-mkdir tmphome
-
-# $HOME/.cache should be created.
-testrun env HOME=$PWD/tmphome XDG_CACHE_HOME= DEBUGINFOD_CACHE_PATH= ${abs_top_builddir}/debuginfod/debuginfod-find debuginfo $BUILDID
-if [ ! -f $PWD/tmphome/.cache/debuginfod_client/$BUILDID/debuginfo ]; then
-  echo "could not find cache in $PWD/tmphome/.cache"
-  exit 1
-fi
-
-# $HOME/.cache should be found.
-testrun env HOME=$PWD/tmphome XDG_CACHE_HOME= DEBUGINFOD_CACHE_PATH= ${abs_top_builddir}/debuginfod/debuginfod-find executable $BUILDID
-if [ ! -f $PWD/tmphome/.cache/debuginfod_client/$BUILDID/executable ]; then
-  echo "could not find cache in $PWD/tmphome/.cache"
-  exit 1
-fi
-
-# $XDG_CACHE_HOME should take priority over $HOME.cache.
-testrun env HOME=$PWD/tmphome XDG_CACHE_HOME=$PWD/tmpxdg DEBUGINFOD_CACHE_PATH= ${abs_top_builddir}/debuginfod/debuginfod-find debuginfo $BUILDID
-if [ ! -f $PWD/tmpxdg/debuginfod_client/$BUILDID/debuginfo ]; then
-  echo "could not find cache in $PWD/tmpxdg/"
-  exit 1
-fi
-
-# A cache at the old default location ($HOME/.debuginfod_client_cache) should take
-# priority over $HOME/.cache, $XDG_CACHE_HOME.
-cp -r $DEBUGINFOD_CACHE_PATH tmphome/.debuginfod_client_cache
-
-# Add a file that doesn't exist in $HOME/.cache, $XDG_CACHE_HOME.
-mkdir tmphome/.debuginfod_client_cache/deadbeef
-echo ELF... > tmphome/.debuginfod_client_cache/deadbeef/debuginfo
-filename=`testrun env HOME=$PWD/tmphome XDG_CACHE_HOME=$PWD/tmpxdg DEBUGINFOD_CACHE_PATH= ${abs_top_builddir}/debuginfod/debuginfod-find debuginfo deadbeef`
-cmp $filename tmphome/.debuginfod_client_cache/deadbeef/debuginfo
-
-# $DEBUGINFO_CACHE_PATH should take priority over all else.
-testrun env HOME=$PWD/tmphome XDG_CACHE_HOME=$PWD/tmpxdg DEBUGINFOD_CACHE_PATH=$PWD/tmpcache ${abs_top_builddir}/debuginfod/debuginfod-find debuginfo $BUILDID
-if [ ! -f $PWD/tmpcache/$BUILDID/debuginfo ]; then
-  echo "could not find cache in $PWD/tmpcache/"
-  exit 1
-fi
-
-########################################################################
-
-# Add artifacts to the search paths and test whether debuginfod finds them while already running.
-
-# Build another, non-stripped binary
-echo "int main() { return 0; }" > ${PWD}/prog2.c
-tempfiles prog2.c
-gcc -Wl,--build-id -g -o prog2 ${PWD}/prog2.c
-BUILDID2=`env LD_LIBRARY_PATH=$ldpath ${abs_builddir}/../src/readelf \
-          -a prog2 | grep 'Build ID' | cut -d ' ' -f 7`
-
-mv prog2 F
-kill -USR1 $PID1
-# Now there should be 3 files in the index
-wait_ready $PORT1 'thread_work_total{role="traverse"}' 3
-wait_ready $PORT1 'thread_work_pending{role="scan"}' 0
-wait_ready $PORT1 'thread_busy{role="scan"}' 0
-
-# Rerun same tests for the prog2 binary
-filename=`testrun ${abs_top_builddir}/debuginfod/debuginfod-find -v debuginfo $BUILDID2 2>vlog`
-cmp $filename F/prog2
-cat vlog
-grep -q Progress vlog
-grep -q Downloaded.from vlog
-tempfiles vlog
-filename=`testrun env DEBUGINFOD_PROGRESS=1 ${abs_top_builddir}/debuginfod/debuginfod-find executable $BUILDID2 2>vlog2`
-cmp $filename F/prog2
-cat vlog2
-grep -q 'Downloading.*http' vlog2
-tempfiles vlog2
-filename=`testrun ${abs_top_builddir}/debuginfod/debuginfod-find source $BUILDID2 ${PWD}/prog2.c`
-cmp $filename ${PWD}/prog2.c
-
-cp -rvp ${abs_srcdir}/debuginfod-rpms R
-if [ "$zstd" = "false" ]; then  # nuke the zstd fedora 31 ones
-    rm -vrf R/debuginfod-rpms/fedora31
-fi
-
-cp -rvp ${abs_srcdir}/debuginfod-tars Z
-kill -USR1 $PID1
-# All rpms need to be in the index, except the dummy permission-000 one
-rpms=$(find R -name \*rpm | grep -v nothing | wc -l)
-wait_ready $PORT1 'scanned_files_total{source=".rpm archive"}' $rpms
-txz=$(find Z -name \*tar.xz | wc -l)
-wait_ready $PORT1 'scanned_files_total{source=".tar.xz archive"}' $txz
-tb2=$(find Z -name \*tar.bz2 | wc -l)
-wait_ready $PORT1 'scanned_files_total{source=".tar.bz2 archive"}' $tb2
-
-kill -USR1 $PID1  # two hits of SIGUSR1 may be needed to resolve .debug->dwz->srefs
-# Expect all source files found in the rpms (they are all called hello.c :)
-# We will need to extract all rpms (in their own directory) and could all
-# sources referenced in the .debug files.
-mkdir extracted
-cd extracted
-subdir=0;
-newrpms=$(find ../R -name \*\.rpm | grep -v nothing)
-for i in $newrpms; do
-    subdir=$[$subdir+1];
-    mkdir $subdir;
-    cd $subdir;
-    ls -lah ../$i
-    rpm2cpio ../$i | cpio -ivd;
-    cd ..;
-done
-sourcefiles=$(find -name \*\\.debug \
-	      | env LD_LIBRARY_PATH=$ldpath xargs \
-		${abs_top_builddir}/src/readelf --debug-dump=decodedline \
-	      | grep mtime: | wc --lines)
-cd ..
-rm -rf extracted
-
-wait_ready $PORT1 'found_sourcerefs_total{source=".rpm archive"}' $sourcefiles
-
-# Run a bank of queries against the debuginfod-rpms / debuginfod-debs test cases
-
-archive_test() {
-    __BUILDID=$1
-    __SOURCEPATH=$2
-    __SOURCESHA1=$3
-    
-    filename=`testrun ${abs_top_builddir}/debuginfod/debuginfod-find executable $__BUILDID`
-    buildid=`env LD_LIBRARY_PATH=$ldpath ${abs_builddir}/../src/readelf \
-             -a $filename | grep 'Build ID' | cut -d ' ' -f 7`
-    test $__BUILDID = $buildid
-    # check that timestamps are plausible - older than the near-present (tmpdir mtime)
-    test $filename -ot `pwd`
-
-    # run again to assure that fdcache is being enjoyed
-    filename=`testrun ${abs_top_builddir}/debuginfod/debuginfod-find executable $__BUILDID`
-    buildid=`env LD_LIBRARY_PATH=$ldpath ${abs_builddir}/../src/readelf \
-             -a $filename | grep 'Build ID' | cut -d ' ' -f 7`
-    test $__BUILDID = $buildid
-    test $filename -ot `pwd`
-
-    filename=`testrun ${abs_top_builddir}/debuginfod/debuginfod-find debuginfo $__BUILDID`
-    buildid=`env LD_LIBRARY_PATH=$ldpath ${abs_builddir}/../src/readelf \
-             -a $filename | grep 'Build ID' | cut -d ' ' -f 7`
-    test $__BUILDID = $buildid
-    test $filename -ot `pwd`
-
-    if test "x$__SOURCEPATH" != "x"; then
-        filename=`testrun ${abs_top_builddir}/debuginfod/debuginfod-find source $__BUILDID $__SOURCEPATH`
-        hash=`cat $filename | sha1sum | awk '{print $1}'`
-        test $__SOURCESHA1 = $hash
-        test $filename -ot `pwd`
-    fi
-}
-
-
-# common source file sha1
-SHA=f4a1a8062be998ae93b8f1cd744a398c6de6dbb1
-# fedora31
-if [ $zstd = true ]; then
-    # fedora31 uses zstd compression on rpms, older rpm2cpio/libarchive can't handle it
-    # and we're not using the fancy -Z '.rpm=(rpm2cpio|zstdcat)<' workaround in this testsuite
-    archive_test 420e9e3308971f4b817cc5bf83928b41a6909d88 /usr/src/debug/hello3-1.0-2.x86_64/foobar////./../hello.c $SHA
-    archive_test 87c08d12c78174f1082b7c888b3238219b0eb265 /usr/src/debug/hello3-1.0-2.x86_64///foobar/./..//hello.c $SHA
-fi
-# fedora30
-archive_test c36708a78618d597dee15d0dc989f093ca5f9120 /usr/src/debug/hello2-1.0-2.x86_64/hello.c $SHA
-archive_test 41a236eb667c362a1c4196018cc4581e09722b1b /usr/src/debug/hello2-1.0-2.x86_64/hello.c $SHA
-# rhel7
-archive_test bc1febfd03ca05e030f0d205f7659db29f8a4b30 /usr/src/debug/hello-1.0/hello.c $SHA
-archive_test f0aa15b8aba4f3c28cac3c2a73801fefa644a9f2 /usr/src/debug/hello-1.0/hello.c $SHA
-# rhel6
-archive_test bbbf92ebee5228310e398609c23c2d7d53f6e2f9 /usr/src/debug/hello-1.0/hello.c $SHA
-archive_test d44d42cbd7d915bc938c81333a21e355a6022fb7 /usr/src/debug/hello-1.0/hello.c $SHA
-# arch
-archive_test cee13b2ea505a7f37bd20d271c6bc7e5f8d2dfcb /usr/src/debug/hello.c 7a1334e086b97e5f124003a6cfb3ed792d10cdf4
-
-RPM_BUILDID=d44d42cbd7d915bc938c81333a21e355a6022fb7 # in rhel6/ subdir, for a later test
-
-
-########################################################################
-
-# Drop some of the artifacts, run a groom cycle; confirm that
-# debuginfod has forgotten them, but remembers others
-
-rm -r R/debuginfod-rpms/rhel6/*
-kill -USR2 $PID1  # groom cycle
-# Expect 3 rpms to be deleted by the groom
-# 1 groom cycle already took place at/soon-after startup, so -USR2 makes 2
-wait_ready $PORT1 'thread_work_total{role="groom"}' 2
-wait_ready $PORT1 'groom{statistic="file d/e"}' 3
-
-rm -rf $DEBUGINFOD_CACHE_PATH # clean it from previous tests
-
-testrun ${abs_top_builddir}/debuginfod/debuginfod-find executable $RPM_BUILDID && false || true
-
-testrun ${abs_top_builddir}/debuginfod/debuginfod-find executable $BUILDID2
-
-########################################################################
-
-# PR26810: Now rename some files in the R directory, then rescan, so
-# there are two copies of the same buildid in the index, one for the
-# no-longer-existing file name, and one under the new name.
-
-# run a groom cycle to force server to drop its fdcache
-kill -USR2 $PID1  # groom cycle
-wait_ready $PORT1 'thread_work_total{role="groom"}' 3
-# move it around a couple of times to make it likely to hit a nonexistent entry during iteration
-mv R/debuginfod-rpms/rhel7 R/debuginfod-rpms/rhel7renamed
-kill -USR1 $PID1  # scan cycle
-wait_ready $PORT1 'thread_work_total{role="traverse"}' 6
-wait_ready $PORT1 'thread_work_pending{role="scan"}' 0
-wait_ready $PORT1 'thread_busy{role="scan"}' 0
-mv R/debuginfod-rpms/rhel7renamed R/debuginfod-rpms/rhel7renamed2
-kill -USR1 $PID1  # scan cycle
-wait_ready $PORT1 'thread_work_total{role="traverse"}' 7
-wait_ready $PORT1 'thread_work_pending{role="scan"}' 0
-wait_ready $PORT1 'thread_busy{role="scan"}' 0
-mv R/debuginfod-rpms/rhel7renamed2 R/debuginfod-rpms/rhel7renamed3
-kill -USR1 $PID1  # scan cycle
-wait_ready $PORT1 'thread_work_total{role="traverse"}' 8
-wait_ready $PORT1 'thread_work_pending{role="scan"}' 0
-wait_ready $PORT1 'thread_busy{role="scan"}' 0
-
-# retest rhel7
-archive_test bc1febfd03ca05e030f0d205f7659db29f8a4b30 /usr/src/debug/hello-1.0/hello.c $SHA
-archive_test f0aa15b8aba4f3c28cac3c2a73801fefa644a9f2 /usr/src/debug/hello-1.0/hello.c $SHA
-
-egrep '(libc.error.*rhel7)|(bc1febfd03ca)|(f0aa15b8aba)' vlog4
-
-########################################################################
-
-# Federation mode
-
-# find another unused port
-while true; do
-    PORT2=`expr '(' $RANDOM % 1000 ')' + 9000`
-    ss -atn | fgrep ":$PORT2" || break
-done
-
-export DEBUGINFOD_CACHE_PATH=${PWD}/.client_cache2
-mkdir -p $DEBUGINFOD_CACHE_PATH
-# NB: inherits the DEBUGINFOD_URLS to the first server
-# NB: run in -L symlink-following mode for the L subdir
-env LD_LIBRARY_PATH=$ldpath ${abs_builddir}/../debuginfod/debuginfod $VERBOSE -F -U -d ${DB}_2 -p $PORT2 -L L D > vlog3 2>&1 &
-PID2=$!
-tempfiles vlog3
-tempfiles ${DB}_2
-wait_ready $PORT2 'ready' 1
-wait_ready $PORT2 'thread_work_total{role="traverse"}' 1
-wait_ready $PORT2 'thread_work_pending{role="scan"}' 0
-wait_ready $PORT2 'thread_busy{role="scan"}' 0
-
-wait_ready $PORT2 'thread_busy{role="http-buildid"}' 0
-wait_ready $PORT2 'thread_busy{role="http-metrics"}' 1
-
-# have clients contact the new server
-export DEBUGINFOD_URLS=http://127.0.0.1:$PORT2
-
-if type bsdtar 2>/dev/null; then
-    # copy in the deb files
-    cp -rvp ${abs_srcdir}/debuginfod-debs/*deb D
-    kill -USR1 $PID2
-    # All debs need to be in the index
-    debs=$(find D -name \*.deb | wc -l)
-    wait_ready $PORT2 'scanned_files_total{source=".deb archive"}' `expr $debs`
-    ddebs=$(find D -name \*.ddeb | wc -l)
-    wait_ready $PORT2 'scanned_files_total{source=".ddeb archive"}' `expr $ddebs`
-
-    # ubuntu
-    archive_test f17a29b5a25bd4960531d82aa6b07c8abe84fa66 "" ""
-fi
-
-rm -rf $DEBUGINFOD_CACHE_PATH
-testrun ${abs_top_builddir}/debuginfod/debuginfod-find debuginfo $BUILDID
-
-# send a request to stress XFF and User-Agent federation relay;
-# we'll grep for the two patterns in vlog4
-curl -s -H 'User-Agent: TESTCURL' -H 'X-Forwarded-For: TESTXFF' $DEBUGINFOD_URLS/buildid/deaddeadbeef00000000/debuginfo -o /dev/null || true
-
-grep UA:TESTCURL vlog4
-grep XFF:TESTXFF vlog4
-
-
-# confirm that first server can't resolve symlinked info in L/ but second can
-BUILDID=`env LD_LIBRARY_PATH=$ldpath ${abs_builddir}/../src/readelf \
-         -a L/foo | grep 'Build ID' | cut -d ' ' -f 7`
-file L/foo
-file -L L/foo
-export DEBUGINFOD_URLS=http://127.0.0.1:$PORT1
-rm -rf $DEBUGINFOD_CACHE_PATH
-testrun ${abs_top_builddir}/debuginfod/debuginfod-find debuginfo $BUILDID && false || true
-export DEBUGINFOD_URLS=http://127.0.0.1:$PORT2
-testrun ${abs_top_builddir}/debuginfod/debuginfod-find debuginfo $BUILDID
-
-# test again with scheme free url
-export DEBUGINFOD_URLS=127.0.0.1:$PORT1
-rm -rf $DEBUGINFOD_CACHE_PATH
-testrun ${abs_top_builddir}/debuginfod/debuginfod-find debuginfo $BUILDID && false || true
-export DEBUGINFOD_URLS=127.0.0.1:$PORT2
-testrun ${abs_top_builddir}/debuginfod/debuginfod-find debuginfo $BUILDID
-
-# test parallel queries in client
-export DEBUGINFOD_CACHE_PATH=${PWD}/.client_cache3
-mkdir -p $DEBUGINFOD_CACHE_PATH
-export DEBUGINFOD_URLS="BAD http://127.0.0.1:$PORT1 127.0.0.1:$PORT1 http://127.0.0.1:$PORT2 DNE"
-
-testrun ${abs_builddir}/debuginfod_build_id_find -e F/prog2 1
-
-########################################################################
-
-# Fetch some metrics
-curl -s http://127.0.0.1:$PORT1/badapi
-curl -s http://127.0.0.1:$PORT1/metrics
-curl -s http://127.0.0.1:$PORT2/metrics
-curl -s http://127.0.0.1:$PORT1/metrics | grep -q 'http_responses_total.*result.*error'
-curl -s http://127.0.0.1:$PORT1/metrics | grep -q 'http_responses_total.*result.*fdcache'
-curl -s http://127.0.0.1:$PORT2/metrics | grep -q 'http_responses_total.*result.*upstream'
-curl -s http://127.0.0.1:$PORT1/metrics | grep 'http_responses_duration_milliseconds_count'
-curl -s http://127.0.0.1:$PORT1/metrics | grep 'http_responses_duration_milliseconds_sum'
-curl -s http://127.0.0.1:$PORT1/metrics | grep 'http_responses_transfer_bytes_count'
-curl -s http://127.0.0.1:$PORT1/metrics | grep 'http_responses_transfer_bytes_sum'
-curl -s http://127.0.0.1:$PORT1/metrics | grep 'fdcache_'
-curl -s http://127.0.0.1:$PORT1/metrics | grep 'error_count'
-curl -s http://127.0.0.1:$PORT1/metrics | grep 'traversed_total'
-curl -s http://127.0.0.1:$PORT1/metrics | grep 'scanned_bytes_total'
-
-# And generate a few errors into the second debuginfod's logs, for analysis just below
-curl -s http://127.0.0.1:$PORT2/badapi > /dev/null || true
-curl -s http://127.0.0.1:$PORT2/buildid/deadbeef/debuginfo > /dev/null || true
-
-
-########################################################################
-# Corrupt the sqlite database and get debuginfod to trip across its errors
-curl -s http://127.0.0.1:$PORT1/metrics | grep 'sqlite3.*reset'
-ls -al $DB
-dd if=/dev/zero of=$DB bs=1 count=1
-ls -al $DB
-# trigger some random activity that's Sure to get sqlite3 upset
-kill -USR1 $PID1
-wait_ready $PORT1 'thread_work_total{role="traverse"}' 9
-wait_ready $PORT1 'thread_work_pending{role="scan"}' 0
-wait_ready $PORT1 'thread_busy{role="scan"}' 0
-kill -USR2 $PID1
-wait_ready $PORT1 'thread_work_total{role="groom"}' 4
-curl -s http://127.0.0.1:$PORT1/buildid/beefbeefbeefd00dd00d/debuginfo > /dev/null || true
-curl -s http://127.0.0.1:$PORT1/metrics | grep 'error_count.*sqlite'
-
-########################################################################
-
-# Run the tests again without the servers running. The target file should
-# be found in the cache.
-
-kill -INT $PID1 $PID2
-wait $PID1 $PID2
-PID1=0
-PID2=0
-tempfiles .debuginfod_*
-
-testrun ${abs_builddir}/debuginfod_build_id_find -e F/prog2 1
-
-# check out the debuginfod logs for the new style status lines
-# cat vlog3
-grep -q 'UA:.*XFF:.*GET /buildid/.* 200 ' vlog3
-grep -q 'UA:.*XFF:.*GET /metrics 200 ' vlog3
-grep -q 'UA:.*XFF:.*GET /badapi 503 ' vlog3
-grep -q 'UA:.*XFF:.*GET /buildid/deadbeef.* 404 ' vlog3
-
-########################################################################
-
-# Add some files to the cache that do not fit its naming format.
-# They should survive cache cleaning.
-mkdir $DEBUGINFOD_CACHE_PATH/malformed
-touch $DEBUGINFOD_CACHE_PATH/malformed0
-touch $DEBUGINFOD_CACHE_PATH/malformed/malformed1
-
-# Trigger a cache clean and run the tests again. The clients should be unable to
-# find the target.
-echo 0 > $DEBUGINFOD_CACHE_PATH/cache_clean_interval_s
-echo 0 > $DEBUGINFOD_CACHE_PATH/max_unused_age_s
-
-testrun ${abs_builddir}/debuginfod_build_id_find -e F/prog 1
-
-testrun ${abs_top_builddir}/debuginfod/debuginfod-find debuginfo $BUILDID2 && false || true
-
-if [ ! -f $DEBUGINFOD_CACHE_PATH/malformed0 ] \
-    || [ ! -f $DEBUGINFOD_CACHE_PATH/malformed/malformed1 ]; then
-  echo "unrelated files did not survive cache cleaning"
-  exit 1
-fi
-
-# Test debuginfod without a path list; reuse $PORT1
-env LD_LIBRARY_PATH=$ldpath ${abs_builddir}/../debuginfod/debuginfod $VERBOSE -F -U -d :memory: -p $PORT1 -L -F &
-PID3=$!
-wait_ready $PORT1 'thread_work_total{role="traverse"}' 1
-wait_ready $PORT1 'thread_work_pending{role="scan"}' 0
-wait_ready $PORT1 'thread_busy{role="scan"}' 0
-kill -int $PID3
-wait $PID3
-PID3=0
-
-########################################################################
-# Test fetching a file using file:// . No debuginfod server needs to be run for
-# this test.
-local_dir=${PWD}/mocktree/buildid/aaaaaaaaaabbbbbbbbbbccccccccccdddddddddd/source/my/path
-mkdir -p ${local_dir}
-echo "int main() { return 0; }" > ${local_dir}/main.c
-
-# first test that is doesn't work, when no DEBUGINFOD_URLS is set
-DEBUGINFOD_URLS=""
-testrun ${abs_top_builddir}/debuginfod/debuginfod-find source aaaaaaaaaabbbbbbbbbbccccccccccdddddddddd /my/path/main.c && false || true
-
-# Now test is with proper DEBUGINFOD_URLS
-DEBUGINFOD_URLS="file://${PWD}/mocktree/"
-filename=`testrun ${abs_top_builddir}/debuginfod/debuginfod-find source aaaaaaaaaabbbbbbbbbbccccccccccdddddddddd /my/path/main.c`
-cmp $filename ${local_dir}/main.c
-
-exit 0
diff --git a/tests/run-debuginfod-malformed.sh b/tests/run-debuginfod-malformed.sh
new file mode 100755
index 0000000..3bc9e79
--- /dev/null
+++ b/tests/run-debuginfod-malformed.sh
@@ -0,0 +1,114 @@
+#!/usr/bin/env bash
+#
+# Copyright (C) 2019-2021 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 the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# 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 a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+. $srcdir/debuginfod-subr.sh
+
+# for test case debugging, uncomment:
+set -x
+unset VALGRIND_CMD
+
+# This variable is essential and ensures no time-race for claiming ports occurs
+# set base to a unique multiple of 100 not used in any other 'run-debuginfod-*' test
+base=9200
+# find an unused port number
+get_ports
+DB=${PWD}/.debuginfod_tmp.sqlite
+tempfiles $DB
+export DEBUGINFOD_CACHE_PATH=${PWD}/.client_cache
+mkdir F
+mkdir -p $DEBUGINFOD_CACHE_PATH
+
+env LD_LIBRARY_PATH=$ldpath DEBUGINFOD_URLS= ${abs_builddir}/../debuginfod/debuginfod $VERBOSE -F -p $PORT1 -d $DB \
+    -t0 -g0 -v F > vlog$PORT1 2>&1 &
+PID1=$!
+tempfiles vlog$PORT1
+errfiles vlog$PORT1
+# Server must become ready
+wait_ready $PORT1 'ready' 1
+# And an initial scan should be done
+wait_ready $PORT1 'thread_work_total{role="traverse"}' 1
+
+export DEBUGINFOD_URLS=http://127.0.0.1:$PORT1/   # or without trailing /
+
+# Be patient when run on a busy machine things might take a bit.
+export DEBUGINFOD_TIMEOUT=10
+
+# Check thread comm names
+ps -q $PID1 -e -L -o '%p %c %a' | grep groom
+ps -q $PID1 -e -L -o '%p %c %a' | grep scan
+ps -q $PID1 -e -L -o '%p %c %a' | grep traverse
+
+# We use -t0 and -g0 here to turn off time-based scanning & grooming.
+# For testing purposes, we just sic SIGUSR1 / SIGUSR2 at the process.
+########################################################################
+
+# Compile a simple program, strip its debuginfo and save the build-id.
+# Also move the debuginfo into another directory so that elfutils
+# cannot find it without debuginfod.
+echo "int main() { return 0; }" > ${PWD}/p+r%o\$g.c
+tempfiles p+r%o\$g.c
+# Create a subdirectory to confound source path names
+mkdir foobar
+gcc -Wl,--build-id -g -o p+r%o\$g ${PWD}/foobar///./../p+r%o\$g.c
+testrun ${abs_top_builddir}/src/strip -g -f p+r%o\$g.debug ${PWD}/p+r%o\$g
+BUILDID=`env LD_LIBRARY_PATH=$ldpath ${abs_builddir}/../src/readelf \
+          -a p+r%o\\$g | grep 'Build ID' | cut -d ' ' -f 7`
+
+mv p+r%o\$g F
+mv p+r%o\$g.debug F
+kill -USR1 $PID1
+# Wait till both files are in the index.
+wait_ready $PORT1 'thread_work_total{role="traverse"}' 2
+wait_ready $PORT1 'thread_work_pending{role="scan"}' 0
+wait_ready $PORT1 'thread_busy{role="scan"}' 0
+
+########################################################################
+# Add some files to the cache that do not fit its naming format.
+# They should survive cache cleaning.
+mkdir $DEBUGINFOD_CACHE_PATH/malformed
+touch $DEBUGINFOD_CACHE_PATH/malformed0
+touch $DEBUGINFOD_CACHE_PATH/malformed/malformed1
+
+# A valid format for an empty buildid subdirectory
+mkdir $DEBUGINFOD_CACHE_PATH/00000000
+touch -d '1970-01-01' $DEBUGINFOD_CACHE_PATH/00000000 # old enough to guarantee nukage
+
+# Trigger a cache clean and run the tests again. The clients should be unable to
+# find the target.
+echo 0 > $DEBUGINFOD_CACHE_PATH/cache_clean_interval_s
+echo 0 > $DEBUGINFOD_CACHE_PATH/max_unused_age_s
+
+testrun ${abs_builddir}/debuginfod_build_id_find -e F/p+r%o\$g 1
+
+testrun ${abs_top_builddir}/debuginfod/debuginfod-find debuginfo $BUILDID && false || true
+
+if [ ! -f $DEBUGINFOD_CACHE_PATH/malformed0 ] \
+    || [ ! -f $DEBUGINFOD_CACHE_PATH/malformed/malformed1 ]; then
+  echo "unrelated files did not survive cache cleaning"
+  err
+fi
+
+if [ -d $DEBUGINFOD_CACHE_PATH/00000000 ]; then
+    echo "failed to rmdir old cache dir"
+    err
+fi
+
+kill $PID1
+wait $PID1
+PID1=0
+exit 0
diff --git a/tests/run-debuginfod-no-urls.sh b/tests/run-debuginfod-no-urls.sh
new file mode 100755
index 0000000..7e3ffef
--- /dev/null
+++ b/tests/run-debuginfod-no-urls.sh
@@ -0,0 +1,41 @@
+#!/usr/bin/env bash
+#
+# Copyright (C) 2019-2021 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 the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# 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 a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+. $srcdir/debuginfod-subr.sh
+
+# for test case debugging, uncomment:
+set -x
+unset VALGRIND_CMD
+
+########################################################################
+# Test debuginfod without a path list
+# This variable is essential and ensures no time-race for claiming ports occurs
+# set base to a unique multiple of 100 not used in any other 'run-debuginfod-*' test
+base=9300
+get_ports
+
+env LD_LIBRARY_PATH=$ldpath ${abs_builddir}/../debuginfod/debuginfod $VERBOSE -F -U -d :memory: -p $PORT1 -L -F &
+PID1=$!
+
+wait_ready $PORT1 'thread_work_total{role="traverse"}' 1
+wait_ready $PORT1 'thread_work_pending{role="scan"}' 0
+wait_ready $PORT1 'thread_busy{role="scan"}' 0
+kill -int $PID1
+wait $PID1
+PID1=0
+exit 0
diff --git a/tests/run-debuginfod-percent-escape.sh b/tests/run-debuginfod-percent-escape.sh
new file mode 100755
index 0000000..f7d8dc6
--- /dev/null
+++ b/tests/run-debuginfod-percent-escape.sh
@@ -0,0 +1,60 @@
+#!/usr/bin/env bash
+#
+# Copyright (C) 2019-2021 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 the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# 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 a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+. $srcdir/debuginfod-subr.sh  # includes set -e
+# for test case debugging, uncomment:
+set -x
+unset VALGRIND_CMD
+# This variable is essential and ensures no time-race for claiming ports occurs
+# set base to a unique multiple of 100 not used in any other 'run-debuginfod-*' test
+base=10000
+get_ports
+DB=${PWD}/.debuginfod_tmp.sqlite
+tempfiles $DB
+mkdir F
+env LD_LIBRARY_PATH=$ldpath ${abs_builddir}/../debuginfod/debuginfod $VERBOSE \
+    -F -R -d $DB -p $PORT1 -t0 -g0 -v R ${PWD}/F > vlog$PORT1 2>&1 &
+PID1=$!
+tempfiles vlog$PORT1
+errfiles vlog$PORT1
+# Server must become ready
+wait_ready $PORT1 'ready' 1
+# Be patient when run on a busy machine things might take a bit.
+
+# Build a non-stripped binary
+echo "int main() { return 0; }" > ${PWD}/F/p++r\$\#o^^g.c
+gcc -Wl,--build-id -g -o ${PWD}/F/p++r\$\#o^^g ${PWD}/F/p++r\$\#o^^g.c
+BUILDID=`env LD_LIBRARY_PATH=$ldpath ${abs_builddir}/../src/readelf \
+          -a ${PWD}/F/p++r\\$\#o^^g | grep 'Build ID' | cut -d ' ' -f 7`
+tempfiles ${PWD}/F/p++r\$\#o^^g.c ${PWD}/F/p++r\$\#o^^g
+kill -USR1 $PID1
+# Now there should be 1 files in the index
+wait_ready $PORT1 'thread_work_total{role="traverse"}' 1
+wait_ready $PORT1 'thread_work_pending{role="scan"}' 0
+wait_ready $PORT1 'thread_busy{role="scan"}' 0
+rm -rf $DEBUGINFOD_CACHE_PATH # clean it from previous tests
+ls F
+env DEBUGINFOD_CACHE_PATH=${PWD}/.client_cache DEBUGINFOD_URLS="http://127.0.0.1:$PORT1" \
+    LD_LIBRARY_PATH=$ldpath ${abs_top_builddir}/debuginfod/debuginfod-find -vvv source F/p++r\$\#o^^g ${abs_builddir}/F/p++r\$\#o^^g.c > vlog1 2>&1 || true
+tempfiles vlog1
+grep 'F/p%2B%2Br%24%23o%5E%5Eg.c' vlog1
+
+kill $PID1
+wait $PID1
+PID1=0
+exit 0
diff --git a/tests/run-debuginfod-query-retry.sh b/tests/run-debuginfod-query-retry.sh
new file mode 100755
index 0000000..c919251
--- /dev/null
+++ b/tests/run-debuginfod-query-retry.sh
@@ -0,0 +1,35 @@
+#!/usr/bin/env bash
+#
+# Copyright (C) 2019-2021 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 the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# 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 a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+. $srcdir/debuginfod-subr.sh
+
+# for test case debugging, uncomment:
+set -x
+unset VALGRIND_CMD
+
+########################################################################
+# set up tests for retrying failed queries.
+retry_attempts=`(testrun env DEBUGINFOD_URLS=http://255.255.255.255/JUNKJUNK DEBUGINFOD_RETRY_LIMIT=10 DEBUGINFOD_VERBOSE=1 DEBUGINFOD_CACHE_PATH=${PWD}/.client_cache \
+        ${abs_top_builddir}/debuginfod/debuginfod-find debuginfo /bin/ls || true) 2>&1 >/dev/null \
+        | grep -c 'Retry failed query'`
+if [ $retry_attempts -ne 10 ]; then
+    echo "retry mechanism failed."
+    exit 1;
+fi
+
+exit 0;
diff --git a/tests/run-debuginfod-regex.sh b/tests/run-debuginfod-regex.sh
new file mode 100755
index 0000000..6837ea8
--- /dev/null
+++ b/tests/run-debuginfod-regex.sh
@@ -0,0 +1,101 @@
+#!/usr/bin/env bash
+#
+# Copyright (C) 2019-2021 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 the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# 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 a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+. $srcdir/debuginfod-subr.sh
+
+# for test case debugging, uncomment:
+set -x
+unset VALGRIND_CMD
+
+mkdir F
+
+DB=${PWD}/.debuginfod_tmp.sqlite
+tempfiles $DB
+
+export DEBUGINFOD_CACHE_PATH=${PWD}/.client_cache
+# This variable is essential and ensures no time-race for claiming ports occurs
+# set base to a unique multiple of 100 not used in any other 'run-debuginfod-*' test
+base=9400
+get_ports
+env LD_LIBRARY_PATH=$ldpath ${abs_builddir}/../debuginfod/debuginfod \
+    $VERBOSE -F -p $PORT1 -t0 -g0 -d ${DB} F > vlog$PORT1 2>&1 &
+PID1=$!
+tempfiles vlog$PORT1
+errfiles vlog$PORT1
+
+# Wait till the server is ready and an initial scan has been done
+wait_ready $PORT1 'ready' 1
+wait_ready $PORT1 'thread_work_total{role="traverse"}' 1
+
+# Compile a simple program, strip its debuginfo and save the build-id.
+# Also move the debuginfo into another directory so that elfutils
+# cannot find it without debuginfod.
+echo "int main() { return 0; }" > ${PWD}/prog.c
+tempfiles prog.c
+# Create a subdirectory to confound source path names
+mkdir foobar
+gcc -Wl,--build-id -g -o prog ${PWD}/foobar///./../prog.c
+testrun ${abs_top_builddir}/src/strip -g -f prog.debug ${PWD}/prog
+
+mv prog F
+mv prog.debug F
+tempfiles F/prog.debug F/prog
+
+kill -USR1 $PID1
+# Wait till both files are in the index.
+wait_ready $PORT1 'thread_work_total{role="traverse"}' 2
+wait_ready $PORT1 'thread_work_pending{role="scan"}' 0
+wait_ready $PORT1 'thread_busy{role="scan"}' 0
+cp ${DB} ${DB}.backup
+tempfiles ${DB}.backup
+
+kill $PID1
+wait $PID1
+PID1=0
+
+#######################################################################
+## PR27711
+# Test to ensure that the --include="^$" --exclude=".*" options remove all files from a database backup
+#
+env LD_LIBRARY_PATH=$ldpath ${abs_builddir}/../debuginfod/debuginfod \
+    $VERBOSE -p $PORT2 -t0 -g0 --regex-groom --include="^$" --exclude=".*" -d ${DB}.backup > vlog$PORT2 2>&1 &
+
+#reuse PID1
+PID1=$!
+tempfiles vlog$PORT2
+errfiles vlog$PORT2
+# Server must become ready
+wait_ready $PORT2 'ready' 1
+
+# Wait till the initial groom cycle has been done
+wait_ready $PORT2 'thread_work_total{role="groom"}' 1
+wait_ready $PORT2 'groom{statistic="archive d/e"}'  0
+wait_ready $PORT2 'groom{statistic="archive sdef"}' 0
+wait_ready $PORT2 'groom{statistic="archive sref"}' 0
+wait_ready $PORT2 'groom{statistic="buildids"}' 0
+wait_ready $PORT2 'groom{statistic="file d/e"}' 0
+wait_ready $PORT2 'groom{statistic="file s"}' 0
+wait_ready $PORT2 'groom{statistic="files scanned (#)"}' 0
+wait_ready $PORT2 'groom{statistic="files scanned (mb)"}' 0
+
+kill $PID1
+wait $PID1
+PID1=0
+
+exit 0;
+
diff --git a/tests/run-debuginfod-response-headers.sh b/tests/run-debuginfod-response-headers.sh
new file mode 100755
index 0000000..10b2ab4
--- /dev/null
+++ b/tests/run-debuginfod-response-headers.sh
@@ -0,0 +1,92 @@
+#!/usr/bin/env bash
+#
+# Copyright (C) 2019-2021 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 the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# 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 a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+. $srcdir/debuginfod-subr.sh  # includes set -e
+
+# for test case debugging, uncomment:
+set -x
+
+DB=${PWD}/.debuginfod_tmp.sqlite
+tempfiles $DB
+export DEBUGINFOD_CACHE_PATH=${PWD}/.client_cache
+
+# This variable is essential and ensures no time-race for claiming ports occurs
+# set base to a unique multiple of 100 not used in any other 'run-debuginfod-*' test
+base=9500
+get_ports
+mkdir F R
+env LD_LIBRARY_PATH=$ldpath DEBUGINFOD_URLS= ${abs_builddir}/../debuginfod/debuginfod $VERBOSE -F -R -d $DB -p $PORT1 -t0 -g0 -v R F > vlog$PORT1 2>&1 &
+PID1=$!
+tempfiles vlog$PORT1
+errfiles vlog$PORT1
+# Server must become ready
+wait_ready $PORT1 'ready' 1
+export DEBUGINFOD_URLS=http://127.0.0.1:$PORT1/   # or without trailing /
+########################################################################
+
+# Compile a simple program, strip its debuginfo and save the build-id.
+# Also move the debuginfo into another directory so that elfutils
+# cannot find it without debuginfod.
+echo "int main() { return 0; }" > ${PWD}/prog.c
+tempfiles prog.c
+# Create a subdirectory to confound source path names
+mkdir foobar
+gcc -Wl,--build-id -g -o prog ${PWD}/foobar///./../prog.c
+
+mv prog F
+
+cp -rvp ${abs_srcdir}/debuginfod-rpms R
+if [ "$zstd" = "false" ]; then  # nuke the zstd fedora 31 ones
+    rm -vrf R/debuginfod-rpms/fedora31
+fi
+
+kill -USR1 $PID1
+# Wait till both files are in the index and scan/index fully finished
+wait_ready $PORT1 'thread_work_total{role="traverse"}' 1
+# All rpms need to be in the index, except the dummy permission-000 one
+rpms=$(find R -name \*rpm | grep -v nothing | wc -l)
+wait_ready $PORT1 'scanned_files_total{source=".rpm archive"}' $rpms
+kill -USR1 $PID1  # two hits of SIGUSR1 may be needed to resolve .debug->dwz->srefs
+# Wait till both files are in the index and scan/index fully finished
+wait_ready $PORT1 'thread_work_total{role="traverse"}' 2
+
+########################################################################
+## PR27277
+# Make a simple request to the debuginfod server and check debuginfod-find's vlog to see if
+# the custom HTTP headers are received.
+rm -rf $DEBUGINFOD_CACHE_PATH
+env DEBUGINFOD_URLS="http://127.0.0.1:"$PORT1 LD_LIBRARY_PATH=$ldpath ${abs_top_builddir}/debuginfod/debuginfod-find\
+    -vvv executable F/prog > vlog-find$PORT1.1 2>&1
+tempfiles vlog-find$PORT1.1
+grep 'Content-Length: ' vlog-find$PORT1.1
+grep 'X-DEBUGINFOD-FILE: ' vlog-find$PORT1.1
+grep 'X-DEBUGINFOD-SIZE: ' vlog-find$PORT1.1
+
+# Check to see if an executable file located in an archive prints the file's description and archive
+env DEBUGINFOD_URLS="http://127.0.0.1:"$PORT1 LD_LIBRARY_PATH=$ldpath ${abs_top_builddir}/debuginfod/debuginfod-find\
+    -vvv executable c36708a78618d597dee15d0dc989f093ca5f9120 > vlog-find$PORT1.2 2>&1
+tempfiles vlog-find$PORT1.2
+grep 'Content-Length: ' vlog-find$PORT1.2
+grep 'X-DEBUGINFOD-FILE: ' vlog-find$PORT1.2
+grep 'X-DEBUGINFOD-SIZE: ' vlog-find$PORT1.2
+grep 'X-DEBUGINFOD-ARCHIVE: ' vlog-find$PORT1.2
+
+kill $PID1
+wait $PID1
+PID1=0
+exit 0
diff --git a/tests/run-debuginfod-sizetime.sh b/tests/run-debuginfod-sizetime.sh
new file mode 100755
index 0000000..2cf6f25
--- /dev/null
+++ b/tests/run-debuginfod-sizetime.sh
@@ -0,0 +1,82 @@
+#!/usr/bin/env bash
+#
+# Copyright (C) 2019-2021 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 the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# 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 a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+. $srcdir/debuginfod-subr.sh
+
+set -x
+unset VALGRIND_CMD
+# This variable is essential and ensures no time-race for claiming ports occurs
+# set base to a unique multiple of 100 not used in any other 'run-debuginfod-*' test
+base=9600
+get_ports
+
+DB=${PWD}/.debuginfod_tmp.sqlite
+tempfiles $DB
+export DEBUGINFOD_CACHE_PATH=${PWD}/.client_cache
+
+echo "int main() { return 0; }" > ${PWD}/prog.c
+# Create a subdirectory to confound source path names
+mkdir foobar
+gcc -Wl,--build-id -g -o prog ${PWD}/foobar///./../prog.c
+testrun ${abs_top_builddir}/src/strip -g -f prog.debug ${PWD}/prog
+tempfiles prog prog.debug prog.c
+BUILDID=`env LD_LIBRARY_PATH=$ldpath ${abs_builddir}/../src/readelf \
+          -a prog | grep 'Build ID' | cut -d ' ' -f 7`
+
+env LD_LIBRARY_PATH=$ldpath ${abs_builddir}/../debuginfod/debuginfod $VERBOSE -F -p $PORT1 -d $DB -t0 -g0 ${PWD} > vlog$PORT1 2>&1 &
+PID1=$!
+tempfiles vlog$PORT1
+errfiles  vlog$PORT1
+wait_ready $PORT1 'ready' 1
+wait_ready $PORT1 'thread_work_total{role="traverse"}' 1
+wait_ready $PORT1 'thread_work_pending{role="scan"}' 0
+wait_ready $PORT1 'thread_busy{role="scan"}' 0
+
+## PR27892
+# Ensure DEBUGINFOD_MAXSIZE is functional and sends back the correct http
+# code
+env LD_LIBRARY_PATH=$ldpath DEBUGINFOD_RETRY_LIMIT=1 DEBUGINFOD_URLS="http://127.0.0.1:$PORT1/" DEBUGINFOD_MAXSIZE=1 \
+    ${abs_top_builddir}/debuginfod/debuginfod-find -v executable ${PWD}/prog 2> find-vlog$PORT1 || true
+tempfiles find-vlog$PORT1
+errfiles  find-vlog$PORT1
+echo "Checking maxsize"
+grep "using max size 1B" find-vlog$PORT1
+echo "Checking maxsize"
+grep 'serving file '$(realpath ${PWD})'/prog' vlog$PORT1
+echo "Checking maxsize"
+grep 'File too large' vlog$PORT1
+if [ -f ${DEBUGINFOD_CACHE_PATH}/${BUILDID} ]; then
+  echo "File cached after maxsize check"
+  err
+fi
+# Ensure no file is downloaded for longer than DEBUGINFOD_MAXTIME
+env LD_LIBRARY_PATH=$ldpath DEBUGINFOD_URLS="http://127.0.0.1:$PORT1/" DEBUGINFOD_MAXTIME=1 \
+    ${abs_top_builddir}/debuginfod/debuginfod-find -v debuginfo ${PWD}/prog.debug 2> find-vlog$PORT1 || true
+tempfiles find-vlog$PORT1
+grep 'using max time' find-vlog$PORT1
+# Ensure p+r%o\$g.debug is NOT cached
+if [ -f ${DEBUGINFOD_CACHE_PATH}/${BUILDID} ]; then
+  echo "File cached after maxtime check"
+  err
+fi
+
+kill $PID1
+wait $PID1
+PID1=0
+
+exit 0;
diff --git a/tests/run-debuginfod-tmp-home.sh b/tests/run-debuginfod-tmp-home.sh
new file mode 100755
index 0000000..dc9accb
--- /dev/null
+++ b/tests/run-debuginfod-tmp-home.sh
@@ -0,0 +1,129 @@
+#!/usr/bin/env bash
+#
+# Copyright (C) 2019-2021 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 the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# 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 a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+. $srcdir/debuginfod-subr.sh
+
+# for test case debugging, uncomment:
+set -x
+unset VALGRIND_CMD
+
+DB=${PWD}/.debuginfod_tmp.sqlite
+tempfiles $DB
+export DEBUGINFOD_CACHE_PATH=${PWD}/.client_cache
+
+mkdir F
+mkdir -p $DEBUGINFOD_CACHE_PATH
+# This variable is essential and ensures no time-race for claiming ports occurs
+# set base to a unique multiple of 100 not used in any other 'run-debuginfod-*' test
+base=9700
+get_ports
+
+env LD_LIBRARY_PATH=$ldpath DEBUGINFOD_URLS= ${abs_builddir}/../debuginfod/debuginfod $VERBOSE -F -p $PORT1 -d $DB \
+    -t0 -g0 -v F > vlog$PORT1 2>&1 &
+PID1=$!
+tempfiles vlog$PORT1
+errfiles vlog$PORT1
+# Server must become ready
+wait_ready $PORT1 'ready' 1
+# And initial scan should be done
+wait_ready $PORT1 'thread_work_total{role="traverse"}' 1
+
+export DEBUGINFOD_URLS=http://127.0.0.1:$PORT1/   # or without trailing /
+
+# Be patient when run on a busy machine things might take a bit.
+export DEBUGINFOD_TIMEOUT=10
+
+# Check thread comm names
+ps -q $PID1 -e -L -o '%p %c %a' | grep groom
+ps -q $PID1 -e -L -o '%p %c %a' | grep scan
+ps -q $PID1 -e -L -o '%p %c %a' | grep traverse
+
+# We use -t0 and -g0 here to turn off time-based scanning & grooming.
+# For testing purposes, we just sic SIGUSR1 / SIGUSR2 at the process.
+
+########################################################################
+
+# Compile a simple program, strip its debuginfo and save the build-id.
+# Also move the debuginfo into another directory so that elfutils
+# cannot find it without debuginfod.
+echo "int main() { return 0; }" > ${PWD}/p+r%o\$g.c
+tempfiles p+r%o\$g.c
+# Create a subdirectory to confound source path names
+mkdir foobar
+gcc -Wl,--build-id -g -o p+r%o\$g ${PWD}/foobar///./../p+r%o\$g.c
+testrun ${abs_top_builddir}/src/strip -g -f p+r%o\$g.debug ${PWD}/p+r%o\$g
+BUILDID=`env LD_LIBRARY_PATH=$ldpath ${abs_builddir}/../src/readelf \
+          -a p+r%o\\$g | grep 'Build ID' | cut -d ' ' -f 7`
+
+mv p+r%o\$g F
+mv p+r%o\$g.debug F
+kill -USR1 $PID1
+# Wait till both files are in the index.
+wait_ready $PORT1 'thread_work_total{role="traverse"}' 2
+wait_ready $PORT1 'thread_work_pending{role="scan"}' 0
+wait_ready $PORT1 'thread_busy{role="scan"}' 0
+
+########################################################################
+
+# Test whether the cache default locations are correct
+mkdir tmphome
+
+# $HOME/.cache should be created.
+testrun env HOME=$PWD/tmphome XDG_CACHE_HOME= DEBUGINFOD_CACHE_PATH= ${abs_top_builddir}/debuginfod/debuginfod-find debuginfo $BUILDID
+if [ ! -f $PWD/tmphome/.cache/debuginfod_client/$BUILDID/debuginfo ]; then
+  echo "could not find cache in $PWD/tmphome/.cache"
+  err
+fi
+
+# $HOME/.cache should be found.
+testrun env HOME=$PWD/tmphome XDG_CACHE_HOME= DEBUGINFOD_CACHE_PATH= ${abs_top_builddir}/debuginfod/debuginfod-find executable $BUILDID
+if [ ! -f $PWD/tmphome/.cache/debuginfod_client/$BUILDID/executable ]; then
+  echo "could not find cache in $PWD/tmphome/.cache"
+  err
+fi
+# $XDG_CACHE_HOME should take priority over $HOME.cache.
+testrun env HOME=$PWD/tmphome XDG_CACHE_HOME=$PWD/tmpxdg DEBUGINFOD_CACHE_PATH= ${abs_top_builddir}/debuginfod/debuginfod-find debuginfo $BUILDID
+if [ ! -f $PWD/tmpxdg/debuginfod_client/$BUILDID/debuginfo ]; then
+  echo "could not find cache in $PWD/tmpxdg/"
+  err
+fi
+
+# A cache at the old default location ($HOME/.debuginfod_client_cache) should take
+# priority over $HOME/.cache, $XDG_CACHE_HOME.
+cp -vr $DEBUGINFOD_CACHE_PATH tmphome/.debuginfod_client_cache || true
+# ||true is for tolerating errors, such a valgrind or something else
+#        leaving 000-perm files in there
+
+# Add a file that doesn't exist in $HOME/.cache, $XDG_CACHE_HOME.
+mkdir tmphome/.debuginfod_client_cache/deadbeef
+echo ELF... > tmphome/.debuginfod_client_cache/deadbeef/debuginfo
+filename=`testrun env HOME=$PWD/tmphome XDG_CACHE_HOME=$PWD/tmpxdg DEBUGINFOD_CACHE_PATH= ${abs_top_builddir}/debuginfod/debuginfod-find debuginfo deadbeef`
+cmp $filename tmphome/.debuginfod_client_cache/deadbeef/debuginfo
+
+# $DEBUGINFO_CACHE_PATH should take priority over all else.
+testrun env HOME=$PWD/tmphome XDG_CACHE_HOME=$PWD/tmpxdg DEBUGINFOD_CACHE_PATH=$PWD/tmpcache ${abs_top_builddir}/debuginfod/debuginfod-find debuginfo $BUILDID
+if [ ! -f $PWD/tmpcache/$BUILDID/debuginfo ]; then
+  echo "could not find cache in $PWD/tmpcache/"
+  err
+fi
+rm -rf ${PWD}/tmphome/ ${PWD}/tmpxdg ${PWD}/tmpcache
+
+kill $PID1
+wait $PID1
+PID1=0
+exit 0
diff --git a/tests/run-debuginfod-writable.sh b/tests/run-debuginfod-writable.sh
new file mode 100755
index 0000000..9cc4ea1
--- /dev/null
+++ b/tests/run-debuginfod-writable.sh
@@ -0,0 +1,91 @@
+#!/usr/bin/env bash
+#
+# Copyright (C) 2019-2021 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 the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# 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 a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+. $srcdir/debuginfod-subr.sh
+
+# for test case debugging, uncomment:
+set -x
+unset VALGRIND_CMD
+
+mkdir F
+# This variable is essential and ensures no time-race for claiming ports occurs
+# set base to a unique multiple of 100 not used in any other 'run-debuginfod-*' test
+base=9800
+get_ports
+
+DB=${PWD}/.debuginfod_tmp.sqlite
+tempfiles $DB
+export DEBUGINFOD_CACHE_PATH=${PWD}/.client_cache
+
+env LD_LIBRARY_PATH=$ldpath DEBUGINFOD_URLS= ${abs_builddir}/../debuginfod/debuginfod $VERBOSE -F -p $PORT1 -d $DB \
+    -t0 -g0 -v F > vlog$PORT1 2>&1 &
+PID1=$!
+tempfiles vlog$PORT1
+errfiles vlog$PORT1
+# Server must become ready
+wait_ready $PORT1 'ready' 1
+# And initial scan should be done
+wait_ready $PORT1 'thread_work_total{role="traverse"}' 1
+
+export DEBUGINFOD_URLS=http://127.0.0.1:$PORT1/   # or without trailing /
+
+# Be patient when run on a busy machine things might take a bit.
+export DEBUGINFOD_TIMEOUT=10
+
+# Check thread comm names
+ps -q $PID1 -e -L -o '%p %c %a' | grep groom
+ps -q $PID1 -e -L -o '%p %c %a' | grep scan
+ps -q $PID1 -e -L -o '%p %c %a' | grep traverse
+
+########################################################################
+
+# Compile a simple program, strip its debuginfo and save the build-id.
+# Also move the debuginfo into another directory so that elfutils
+# cannot find it without debuginfod.
+echo "int main() { return 0; }" > ${PWD}/p+r%o\$g.c
+tempfiles p+r%o\$g.c
+# Create a subdirectory to confound source path names
+mkdir foobar
+gcc -Wl,--build-id -g -o p+r%o\$g ${PWD}/foobar///./../p+r%o\$g.c
+testrun ${abs_top_builddir}/src/strip -g -f p+r%o\$g.debug ${PWD}/p+r%o\$g
+BUILDID=`env LD_LIBRARY_PATH=$ldpath ${abs_builddir}/../src/readelf \
+          -a p+r%o\\$g | grep 'Build ID' | cut -d ' ' -f 7`
+
+mv p+r%o\$g F
+mv p+r%o\$g.debug F
+kill -USR1 $PID1
+# Wait till both files are in the index.
+wait_ready $PORT1 'thread_work_total{role="traverse"}' 2
+wait_ready $PORT1 'thread_work_pending{role="scan"}' 0
+wait_ready $PORT1 'thread_busy{role="scan"}' 0
+
+#######################################################################
+# Test whether debuginfod-find is able to fetch those files.
+rm -rf $DEBUGINFOD_CACHE_PATH # clean it from previous tests
+filename=`testrun ${abs_top_builddir}/debuginfod/debuginfod-find debuginfo $BUILDID`
+cmp $filename F/p+r%o\$g.debug
+if [  `stat -c "%A" $filename` != "-r--------" ]; then
+    echo "cache file writable, boo"
+    err
+fi
+
+kill $PID1
+wait $PID1
+PID1=0
+
+exit 0
diff --git a/tests/run-debuginfod-x-forwarded-for.sh b/tests/run-debuginfod-x-forwarded-for.sh
new file mode 100755
index 0000000..5b756b2
--- /dev/null
+++ b/tests/run-debuginfod-x-forwarded-for.sh
@@ -0,0 +1,63 @@
+#!/usr/bin/env bash
+#
+# Copyright (C) 2021 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 the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# 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 a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+. $srcdir/debuginfod-subr.sh
+
+# for test case debugging, uncomment:
+set -x
+unset VALGRIND_CMD
+
+export DEBUGINFOD_CACHE_PATH=${PWD}/.client_cache
+# This variable is essential and ensures no time-race for claiming ports occurs
+# set base to a unique multiple of 100 not used in any other 'run-debuginfod-*' test
+base=9900
+get_ports
+
+# Test when debuginfod hitting X-Forwarded-For hops limit.
+# This test will start two servers (as a loop) with two different hop limits.
+
+tempfiles vlog$PORT1
+errfiles vlog$PORT1
+env LD_LIBRARY_PATH=$ldpath DEBUGINFOD_URLS=http://127.0.0.1:$PORT2 ${abs_builddir}/../debuginfod/debuginfod $VERBOSE -d :memory: --forwarded-ttl-limit 0 -p $PORT1 > vlog$PORT1 2>&1 &
+PID1=$!
+
+tempfiles vlog$PORT2
+errfiles vlog$PORT2
+env LD_LIBRARY_PATH=$ldpath DEBUGINFOD_URLS=http://127.0.0.1:$PORT1 ${abs_builddir}/../debuginfod/debuginfod $VERBOSE -d :memory: --forwarded-ttl-limit 1 -p $PORT2 > vlog$PORT2 2>&1 &
+PID2=$!
+
+wait_ready $PORT1 'ready' 1
+wait_ready $PORT2 'ready' 1
+
+export DEBUGINFOD_URLS="http://127.0.0.1:$PORT1/"
+testrun ${abs_top_builddir}/debuginfod/debuginfod-find debuginfo 01234567 || true
+
+# Use a different buildid to avoid using same cache.
+export DEBUGINFOD_URLS="http://127.0.0.1:$PORT2/"
+testrun ${abs_top_builddir}/debuginfod/debuginfod-find debuginfo 11234567 || true
+
+grep "forwared-ttl-limit reached and will not query the upstream servers" vlog$PORT1
+grep -v "forwared-ttl-limit reached and will not query the upstream servers" vlog$PORT2 | grep "not found" vlog$PORT2
+
+kill $PID1 $PID2
+wait $PID1 $PID2
+
+PID1=0
+PID2=0
+
+exit 0
diff --git a/tests/run-low_high_pc-dw-form-indirect.sh b/tests/run-low_high_pc-dw-form-indirect.sh
new file mode 100755
index 0000000..6902982
--- /dev/null
+++ b/tests/run-low_high_pc-dw-form-indirect.sh
@@ -0,0 +1,23 @@
+#! /bin/sh
+# Copyright (C) 2021 Facebook
+# This file is part of elfutils.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# 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 a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+. $srcdir/test-subr.sh
+
+# See run-readelf-dw-form-indirect
+testfiles testfile-dw-form-indirect
+
+testrun ${abs_builddir}/low_high_pc -e ./testfile-dw-form-indirect
diff --git a/tests/run-nvidia-extended-linemap-libdw.sh b/tests/run-nvidia-extended-linemap-libdw.sh
new file mode 100755
index 0000000..d1df2cf
--- /dev/null
+++ b/tests/run-nvidia-extended-linemap-libdw.sh
@@ -0,0 +1,60 @@
+# Copyright (C) 2011 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 the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# 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 a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+. $srcdir/test-subr.sh
+
+# NOTE: 
+#   the file testfile_nvidia_linemap is a CUDA binary for an NVIDIA A100 generated as follows using CUDA 11.2
+#   nvcc -o main main.cu  -Xcompiler "-g -fopenmp" -O3 -lineinfo -arch sm_80  -lcudart -lcuda -lstdc++ -lm
+#   cuobjdump -xelf all main
+#   mv main.sm_80.cubin testfile_nvidia_linemap
+
+testfiles testfile_nvidia_linemap
+testrun_compare ${abs_top_builddir}/tests/nvidia_extended_linemap_libdw testfile_nvidia_linemap << EOF
+off = 0
+ 18 lines
+0: /home/johnmc/hpctoolkit-gpu-samples/nvidia_extended_linemap4/main.cu:25:0: is_stmt:yes, end_seq:no, bb:no, prologue:no, epilogue:no
+10: /home/johnmc/hpctoolkit-gpu-samples/nvidia_extended_linemap4/main.cu:26:0: is_stmt:yes, end_seq:no, bb:no, prologue:no, epilogue:no
+40: /home/johnmc/hpctoolkit-gpu-samples/nvidia_extended_linemap4/main.cu:27:0: is_stmt:yes, end_seq:no, bb:no, prologue:no, epilogue:no
+90: /home/johnmc/hpctoolkit-gpu-samples/nvidia_extended_linemap4/main.cu:25:0: is_stmt:yes, end_seq:no, bb:no, prologue:no, epilogue:no
+a0: /home/johnmc/hpctoolkit-gpu-samples/nvidia_extended_linemap4/main.cu:28:0: is_stmt:yes, end_seq:no, bb:no, prologue:no, epilogue:no
+100: /home/johnmc/hpctoolkit-gpu-samples/nvidia_extended_linemap4/main.cu:28:0: is_stmt:yes, end_seq:no, bb:no, prologue:no, epilogue:no
+100: /home/johnmc/hpctoolkit-gpu-samples/nvidia_extended_linemap4/main.cu:8:0: is_stmt:yes, end_seq:no, bb:no, prologue:no, epilogue:no
+  foo inlined at /home/johnmc/hpctoolkit-gpu-samples/nvidia_extended_linemap4/main.cu:28
+150: /home/johnmc/hpctoolkit-gpu-samples/nvidia_extended_linemap4/main.cu:9:0: is_stmt:yes, end_seq:no, bb:no, prologue:no, epilogue:no
+  foo inlined at /home/johnmc/hpctoolkit-gpu-samples/nvidia_extended_linemap4/main.cu:28
+1e0: /home/johnmc/hpctoolkit-gpu-samples/nvidia_extended_linemap4/main.cu:31:0: is_stmt:yes, end_seq:no, bb:no, prologue:no, epilogue:no
+1e0: /home/johnmc/hpctoolkit-gpu-samples/nvidia_extended_linemap4/bar.h:6:0: is_stmt:yes, end_seq:no, bb:no, prologue:no, epilogue:no
+  bar inlined at /home/johnmc/hpctoolkit-gpu-samples/nvidia_extended_linemap4/main.cu:31
+1e0: /home/johnmc/hpctoolkit-gpu-samples/nvidia_extended_linemap4/main.cu:8:0: is_stmt:yes, end_seq:no, bb:no, prologue:no, epilogue:no
+  foo inlined at /home/johnmc/hpctoolkit-gpu-samples/nvidia_extended_linemap4/bar.h:6
+    bar inlined at /home/johnmc/hpctoolkit-gpu-samples/nvidia_extended_linemap4/main.cu:31
+220: /home/johnmc/hpctoolkit-gpu-samples/nvidia_extended_linemap4/main.cu:9:0: is_stmt:yes, end_seq:no, bb:no, prologue:no, epilogue:no
+  foo inlined at /home/johnmc/hpctoolkit-gpu-samples/nvidia_extended_linemap4/bar.h:6
+    bar inlined at /home/johnmc/hpctoolkit-gpu-samples/nvidia_extended_linemap4/main.cu:31
+2b0: /home/johnmc/hpctoolkit-gpu-samples/nvidia_extended_linemap4/bar.h:7:0: is_stmt:yes, end_seq:no, bb:no, prologue:no, epilogue:no
+  bar inlined at /home/johnmc/hpctoolkit-gpu-samples/nvidia_extended_linemap4/main.cu:31
+2f0: /home/johnmc/hpctoolkit-gpu-samples/nvidia_extended_linemap4/bar.h:8:0: is_stmt:yes, end_seq:no, bb:no, prologue:no, epilogue:no
+  bar inlined at /home/johnmc/hpctoolkit-gpu-samples/nvidia_extended_linemap4/main.cu:31
+2f0: /home/johnmc/hpctoolkit-gpu-samples/nvidia_extended_linemap4/main.cu:18:0: is_stmt:yes, end_seq:no, bb:no, prologue:no, epilogue:no
+  _Z1aPiS_S_ inlined at /home/johnmc/hpctoolkit-gpu-samples/nvidia_extended_linemap4/bar.h:8
+    bar inlined at /home/johnmc/hpctoolkit-gpu-samples/nvidia_extended_linemap4/main.cu:31
+330: /home/johnmc/hpctoolkit-gpu-samples/nvidia_extended_linemap4/main.cu:19:0: is_stmt:yes, end_seq:no, bb:no, prologue:no, epilogue:no
+  _Z1aPiS_S_ inlined at /home/johnmc/hpctoolkit-gpu-samples/nvidia_extended_linemap4/bar.h:8
+    bar inlined at /home/johnmc/hpctoolkit-gpu-samples/nvidia_extended_linemap4/main.cu:31
+3c0: /home/johnmc/hpctoolkit-gpu-samples/nvidia_extended_linemap4/main.cu:33:0: is_stmt:yes, end_seq:no, bb:no, prologue:no, epilogue:no
+480: /home/johnmc/hpctoolkit-gpu-samples/nvidia_extended_linemap4/main.cu:33:0: is_stmt:yes, end_seq:yes, bb:no, prologue:no, epilogue:no
+EOF
diff --git a/tests/run-nvidia-extended-linemap-readelf.sh b/tests/run-nvidia-extended-linemap-readelf.sh
new file mode 100755
index 0000000..1fa9b7b
--- /dev/null
+++ b/tests/run-nvidia-extended-linemap-readelf.sh
@@ -0,0 +1,120 @@
+# Copyright (C) 2011 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 the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# 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 a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+. $srcdir/test-subr.sh
+
+# NOTE:
+#   the file testfile_nvidia_linemap is a CUDA binary for an NVIDIA A100 generated as follows using CUDA 11.2
+#   nvcc -o main main.cu  -Xcompiler "-g -fopenmp" -O3 -lineinfo -arch sm_80  -lcudart -lcuda -lstdc++ -lm
+#   cuobjdump -xelf all main
+#   mv main.sm_80.cubin testfile_nvidia_linemap
+
+testfiles testfile_nvidia_linemap
+testrun_compare ${abs_top_builddir}/src/readelf --debug-dump=line testfile_nvidia_linemap << EOF
+
+DWARF section [ 5] '.debug_line' at offset 0x3e0:
+
+Table at offset 0:
+
+ Length:                         253
+ DWARF version:                  2
+ Prologue length:                111
+ Address size:                   8
+ Segment selector size:          0
+ Min instruction length:         1
+ Max operations per instruction: 1
+ Initial value if 'is_stmt':     1
+ Line base:                      -5
+ Line range:                     14
+ Opcode base:                    10
+
+Opcodes:
+  [1]  0 arguments
+  [2]  1 argument
+  [3]  1 argument
+  [4]  1 argument
+  [5]  1 argument
+  [6]  0 arguments
+  [7]  0 arguments
+  [8]  0 arguments
+  [9]  1 argument
+
+Directory table:
+ /home/johnmc/hpctoolkit-gpu-samples/nvidia_extended_linemap4
+
+File name table:
+ Entry Dir   Time      Size      Name
+ 1     1     1626104146 1819      main.cu
+ 2     1     1626104111 211       bar.h
+
+Line number statements:
+ [    79] extended opcode 2:  set address to 0 <kernel>
+ [    84] set file to 1
+ [    86] advance line by constant 24 to 25
+ [    88] copy
+ [    89] special opcode 240: address+16 = 0x10 <kernel+0x10>, line+1 = 26
+ [    8a] advance line by constant 1 to 27
+ [    8c] advance address by 48 to 0x40 <kernel+0x40>
+ [    8e] copy
+ [    8f] advance line by constant -2 to 25
+ [    91] advance address by 80 to 0x90 <kernel+0x90>
+ [    94] copy
+ [    95] special opcode 242: address+16 = 0xa0 <kernel+0xa0>, line+3 = 28
+ [    96] advance address by 96 to 0x100 <kernel+0x100>
+ [    99] copy
+ [    9a] extended opcode 144:  set inlined context 6, function name foo (0x0)
+ [    9f] advance line by constant -20 to 8
+ [    a1] copy
+ [    a2] advance line by constant 1 to 9
+ [    a4] advance address by 80 to 0x150 <kernel+0x150>
+ [    a7] copy
+ [    a8] extended opcode 144:  set inlined context 0, function name foo (0x0)
+ [    ad] advance line by constant 22 to 31
+ [    af] advance address by 144 to 0x1e0 <kernel+0x1e0>
+ [    b2] copy
+ [    b3] set file to 2
+ [    b5] extended opcode 144:  set inlined context 9, function name bar (0x4)
+ [    ba] advance line by constant -25 to 6
+ [    bc] copy
+ [    bd] set file to 1
+ [    bf] extended opcode 144:  set inlined context 10, function name foo (0x0)
+ [    c4] advance line by constant 2 to 8
+ [    c6] copy
+ [    c7] advance line by constant 1 to 9
+ [    c9] advance address by 64 to 0x220 <kernel+0x220>
+ [    cc] copy
+ [    cd] set file to 2
+ [    cf] extended opcode 144:  set inlined context 9, function name bar (0x4)
+ [    d4] advance line by constant -2 to 7
+ [    d6] advance address by 144 to 0x2b0 <kernel+0x2b0>
+ [    d9] copy
+ [    da] advance line by constant 1 to 8
+ [    dc] advance address by 64 to 0x2f0 <kernel+0x2f0>
+ [    df] copy
+ [    e0] set file to 1
+ [    e2] extended opcode 144:  set inlined context 14, function name _Z1aPiS_S_ (0x8)
+ [    e7] advance line by constant 10 to 18
+ [    e9] copy
+ [    ea] advance line by constant 1 to 19
+ [    ec] advance address by 64 to 0x330 <kernel+0x330>
+ [    ef] copy
+ [    f0] extended opcode 144:  set inlined context 0, function name foo (0x0)
+ [    f5] advance line by constant 14 to 33
+ [    f7] advance address by 144 to 0x3c0 <kernel+0x3c0>
+ [    fa] copy
+ [    fb] advance address by 192 to 0x480
+ [    fe] extended opcode 1:  end of sequence
+EOF
diff --git a/tests/run-readelf-dw-form-indirect.sh b/tests/run-readelf-dw-form-indirect.sh
new file mode 100755
index 0000000..5883848
--- /dev/null
+++ b/tests/run-readelf-dw-form-indirect.sh
@@ -0,0 +1,678 @@
+#! /bin/sh
+# Copyright (C) 2021 Facebook
+# This file is part of elfutils.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# 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 a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+. $srcdir/test-subr.sh
+
+# // Program processed by https://github.com/facebookincubator/BOLT.
+# // gcc -g -O2 -fno-reorder-blocks-and-partition -Wl,--emit-relocs primes.c -o primes
+# // perf record -e cycles:u -j any,u -o perf.data -- ./primes 1000 > /dev/null
+# // perf2bolt -p perf.data -o perf.fdata ./primes
+# // llvm-bolt primes -o primes.bolt -data=perf.fdata -reorder-blocks=cache+ -reorder-functions=hfsort -split-functions=2 -split-all-cold -split-eh -dyno-stats -update-debug-sections
+#
+# #include <inttypes.h>
+# #include <stdbool.h>
+# #include <stdio.h>
+# #include <stdlib.h>
+# 
+# bool
+# is_prime (uint32_t n)
+# {
+#   if (n < 2)
+#     return false;
+#   if (n == 2)
+#     return true;
+#   if (n % 2 == 0)
+#     return false;
+#   for (uint32_t i = 3; i <= n / 2; i++)
+#     {
+#       if (n % i == 0)
+# 	return false;
+#     }
+#   return true;
+# }
+# 
+# int
+# main (int argc, char *argv[])
+# {
+#   if (argc != 2)
+#     return EXIT_FAILURE;
+#   int n = atoi (argv[1]);
+#   for (uint32_t i = 2; n > 0; i++)
+#     {
+#       if (is_prime (i))
+# 	{
+# 	  printf ("%" PRIu32 "\n", i);
+# 	  n--;
+# 	}
+#     }
+#   return EXIT_SUCCESS;
+# }
+testfiles testfile-dw-form-indirect
+
+testrun_compare ${abs_top_builddir}/src/readelf --debug-dump=info testfile-dw-form-indirect << EOF
+
+DWARF section [33] '.debug_info' at offset 0x801db0:
+ [Offset]
+ Compilation unit at offset 0:
+ Version: 4, Abbreviation section offset: 0, Address size: 8, Offset size: 4
+ [     b]  compile_unit         abbrev: 1
+           producer             (strp) "GNU C17 8.4.1 20200928 (Red Hat 8.4.1-1) -mtune=generic -march=x86-64 -g -O2 -fno-reorder-blocks-and-partition"
+           language             (data1) C99 (12)
+           name                 (strp) "primes.c"
+           comp_dir             (strp) "/home/osandov/bolt"
+           ranges               (sec_offset) range list [    10]
+           low_pc               (addr) 000000000000000000
+           stmt_list            (sec_offset) 0
+ [    29]    base_type            abbrev: 2
+             byte_size            (data1) 1
+             encoding             (data1) unsigned_char (8)
+             name                 (strp) "unsigned char"
+ [    30]    base_type            abbrev: 2
+             byte_size            (data1) 2
+             encoding             (data1) unsigned (7)
+             name                 (strp) "short unsigned int"
+ [    37]    base_type            abbrev: 2
+             byte_size            (data1) 4
+             encoding             (data1) unsigned (7)
+             name                 (strp) "unsigned int"
+ [    3e]    base_type            abbrev: 2
+             byte_size            (data1) 8
+             encoding             (data1) unsigned (7)
+             name                 (strp) "long unsigned int"
+ [    45]    base_type            abbrev: 2
+             byte_size            (data1) 1
+             encoding             (data1) signed_char (6)
+             name                 (strp) "signed char"
+ [    4c]    base_type            abbrev: 2
+             byte_size            (data1) 2
+             encoding             (data1) signed (5)
+             name                 (strp) "short int"
+ [    53]    base_type            abbrev: 3
+             byte_size            (data1) 4
+             encoding             (data1) signed (5)
+             name                 (string) "int"
+ [    5a]    typedef              abbrev: 4
+             name                 (strp) "__uint32_t"
+             decl_file            (data1) types.h (3)
+             decl_line            (data1) 41
+             decl_column          (data1) 22
+             type                 (ref4) [    37]
+ [    66]    base_type            abbrev: 2
+             byte_size            (data1) 8
+             encoding             (data1) signed (5)
+             name                 (strp) "long int"
+ [    6d]    typedef              abbrev: 4
+             name                 (strp) "__off_t"
+             decl_file            (data1) types.h (3)
+             decl_line            (data1) 150
+             decl_column          (data1) 25
+             type                 (ref4) [    66]
+ [    79]    typedef              abbrev: 4
+             name                 (strp) "__off64_t"
+             decl_file            (data1) types.h (3)
+             decl_line            (data1) 151
+             decl_column          (data1) 27
+             type                 (ref4) [    66]
+ [    85]    pointer_type         abbrev: 5
+             byte_size            (data1) 8
+ [    87]    pointer_type         abbrev: 6
+             byte_size            (data1) 8
+             type                 (ref4) [    8d]
+ [    8d]    base_type            abbrev: 2
+             byte_size            (data1) 1
+             encoding             (data1) signed_char (6)
+             name                 (strp) "char"
+ [    94]    const_type           abbrev: 7
+             type                 (ref4) [    8d]
+ [    99]    typedef              abbrev: 4
+             name                 (strp) "uint32_t"
+             decl_file            (data1) stdint-uintn.h (4)
+             decl_line            (data1) 26
+             decl_column          (data1) 20
+             type                 (ref4) [    5a]
+ [    a5]    typedef              abbrev: 4
+             name                 (strp) "size_t"
+             decl_file            (data1) stddef.h (5)
+             decl_line            (data1) 216
+             decl_column          (data1) 23
+             type                 (ref4) [    3e]
+ [    b1]    structure_type       abbrev: 8
+             name                 (strp) "_IO_FILE"
+             byte_size            (data1) 216
+             decl_file            (data1) struct_FILE.h (6)
+             decl_line            (data1) 49
+             decl_column          (data1) 8
+             sibling              (ref4) [   238]
+ [    be]      member               abbrev: 9
+               name                 (strp) "_flags"
+               decl_file            (data1) struct_FILE.h (6)
+               decl_line            (data1) 51
+               decl_column          (data1) 7
+               type                 (ref4) [    53]
+               data_member_location (data1) 0
+ [    cb]      member               abbrev: 9
+               name                 (strp) "_IO_read_ptr"
+               decl_file            (data1) struct_FILE.h (6)
+               decl_line            (data1) 54
+               decl_column          (data1) 9
+               type                 (ref4) [    87]
+               data_member_location (data1) 8
+ [    d8]      member               abbrev: 9
+               name                 (strp) "_IO_read_end"
+               decl_file            (data1) struct_FILE.h (6)
+               decl_line            (data1) 55
+               decl_column          (data1) 9
+               type                 (ref4) [    87]
+               data_member_location (data1) 16
+ [    e5]      member               abbrev: 9
+               name                 (strp) "_IO_read_base"
+               decl_file            (data1) struct_FILE.h (6)
+               decl_line            (data1) 56
+               decl_column          (data1) 9
+               type                 (ref4) [    87]
+               data_member_location (data1) 24
+ [    f2]      member               abbrev: 9
+               name                 (strp) "_IO_write_base"
+               decl_file            (data1) struct_FILE.h (6)
+               decl_line            (data1) 57
+               decl_column          (data1) 9
+               type                 (ref4) [    87]
+               data_member_location (data1) 32
+ [    ff]      member               abbrev: 9
+               name                 (strp) "_IO_write_ptr"
+               decl_file            (data1) struct_FILE.h (6)
+               decl_line            (data1) 58
+               decl_column          (data1) 9
+               type                 (ref4) [    87]
+               data_member_location (data1) 40
+ [   10c]      member               abbrev: 9
+               name                 (strp) "_IO_write_end"
+               decl_file            (data1) struct_FILE.h (6)
+               decl_line            (data1) 59
+               decl_column          (data1) 9
+               type                 (ref4) [    87]
+               data_member_location (data1) 48
+ [   119]      member               abbrev: 9
+               name                 (strp) "_IO_buf_base"
+               decl_file            (data1) struct_FILE.h (6)
+               decl_line            (data1) 60
+               decl_column          (data1) 9
+               type                 (ref4) [    87]
+               data_member_location (data1) 56
+ [   126]      member               abbrev: 9
+               name                 (strp) "_IO_buf_end"
+               decl_file            (data1) struct_FILE.h (6)
+               decl_line            (data1) 61
+               decl_column          (data1) 9
+               type                 (ref4) [    87]
+               data_member_location (data1) 64
+ [   133]      member               abbrev: 9
+               name                 (strp) "_IO_save_base"
+               decl_file            (data1) struct_FILE.h (6)
+               decl_line            (data1) 64
+               decl_column          (data1) 9
+               type                 (ref4) [    87]
+               data_member_location (data1) 72
+ [   140]      member               abbrev: 9
+               name                 (strp) "_IO_backup_base"
+               decl_file            (data1) struct_FILE.h (6)
+               decl_line            (data1) 65
+               decl_column          (data1) 9
+               type                 (ref4) [    87]
+               data_member_location (data1) 80
+ [   14d]      member               abbrev: 9
+               name                 (strp) "_IO_save_end"
+               decl_file            (data1) struct_FILE.h (6)
+               decl_line            (data1) 66
+               decl_column          (data1) 9
+               type                 (ref4) [    87]
+               data_member_location (data1) 88
+ [   15a]      member               abbrev: 9
+               name                 (strp) "_markers"
+               decl_file            (data1) struct_FILE.h (6)
+               decl_line            (data1) 68
+               decl_column          (data1) 22
+               type                 (ref4) [   251]
+               data_member_location (data1) 96
+ [   167]      member               abbrev: 9
+               name                 (strp) "_chain"
+               decl_file            (data1) struct_FILE.h (6)
+               decl_line            (data1) 70
+               decl_column          (data1) 20
+               type                 (ref4) [   257]
+               data_member_location (data1) 104
+ [   174]      member               abbrev: 9
+               name                 (strp) "_fileno"
+               decl_file            (data1) struct_FILE.h (6)
+               decl_line            (data1) 72
+               decl_column          (data1) 7
+               type                 (ref4) [    53]
+               data_member_location (data1) 112
+ [   181]      member               abbrev: 9
+               name                 (strp) "_flags2"
+               decl_file            (data1) struct_FILE.h (6)
+               decl_line            (data1) 73
+               decl_column          (data1) 7
+               type                 (ref4) [    53]
+               data_member_location (data1) 116
+ [   18e]      member               abbrev: 9
+               name                 (strp) "_old_offset"
+               decl_file            (data1) struct_FILE.h (6)
+               decl_line            (data1) 74
+               decl_column          (data1) 11
+               type                 (ref4) [    6d]
+               data_member_location (data1) 120
+ [   19b]      member               abbrev: 9
+               name                 (strp) "_cur_column"
+               decl_file            (data1) struct_FILE.h (6)
+               decl_line            (data1) 77
+               decl_column          (data1) 18
+               type                 (ref4) [    30]
+               data_member_location (data1) 128
+ [   1a8]      member               abbrev: 9
+               name                 (strp) "_vtable_offset"
+               decl_file            (data1) struct_FILE.h (6)
+               decl_line            (data1) 78
+               decl_column          (data1) 15
+               type                 (ref4) [    45]
+               data_member_location (data1) 130
+ [   1b5]      member               abbrev: 9
+               name                 (strp) "_shortbuf"
+               decl_file            (data1) struct_FILE.h (6)
+               decl_line            (data1) 79
+               decl_column          (data1) 8
+               type                 (ref4) [   25d]
+               data_member_location (data1) 131
+ [   1c2]      member               abbrev: 9
+               name                 (strp) "_lock"
+               decl_file            (data1) struct_FILE.h (6)
+               decl_line            (data1) 81
+               decl_column          (data1) 15
+               type                 (ref4) [   26d]
+               data_member_location (data1) 136
+ [   1cf]      member               abbrev: 9
+               name                 (strp) "_offset"
+               decl_file            (data1) struct_FILE.h (6)
+               decl_line            (data1) 89
+               decl_column          (data1) 13
+               type                 (ref4) [    79]
+               data_member_location (data1) 144
+ [   1dc]      member               abbrev: 9
+               name                 (strp) "_codecvt"
+               decl_file            (data1) struct_FILE.h (6)
+               decl_line            (data1) 91
+               decl_column          (data1) 23
+               type                 (ref4) [   278]
+               data_member_location (data1) 152
+ [   1e9]      member               abbrev: 9
+               name                 (strp) "_wide_data"
+               decl_file            (data1) struct_FILE.h (6)
+               decl_line            (data1) 92
+               decl_column          (data1) 25
+               type                 (ref4) [   283]
+               data_member_location (data1) 160
+ [   1f6]      member               abbrev: 9
+               name                 (strp) "_freeres_list"
+               decl_file            (data1) struct_FILE.h (6)
+               decl_line            (data1) 93
+               decl_column          (data1) 20
+               type                 (ref4) [   257]
+               data_member_location (data1) 168
+ [   203]      member               abbrev: 9
+               name                 (strp) "_freeres_buf"
+               decl_file            (data1) struct_FILE.h (6)
+               decl_line            (data1) 94
+               decl_column          (data1) 9
+               type                 (ref4) [    85]
+               data_member_location (data1) 176
+ [   210]      member               abbrev: 9
+               name                 (strp) "__pad5"
+               decl_file            (data1) struct_FILE.h (6)
+               decl_line            (data1) 95
+               decl_column          (data1) 10
+               type                 (ref4) [    a5]
+               data_member_location (data1) 184
+ [   21d]      member               abbrev: 9
+               name                 (strp) "_mode"
+               decl_file            (data1) struct_FILE.h (6)
+               decl_line            (data1) 96
+               decl_column          (data1) 7
+               type                 (ref4) [    53]
+               data_member_location (data1) 192
+ [   22a]      member               abbrev: 9
+               name                 (strp) "_unused2"
+               decl_file            (data1) struct_FILE.h (6)
+               decl_line            (data1) 98
+               decl_column          (data1) 8
+               type                 (ref4) [   289]
+               data_member_location (data1) 196
+ [   238]    typedef              abbrev: 4
+             name                 (strp) "FILE"
+             decl_file            (data1) FILE.h (7)
+             decl_line            (data1) 7
+             decl_column          (data1) 25
+             type                 (ref4) [    b1]
+ [   244]    typedef              abbrev: 10
+             name                 (strp) "_IO_lock_t"
+             decl_file            (data1) struct_FILE.h (6)
+             decl_line            (data1) 43
+             decl_column          (data1) 14
+ [   24c]    structure_type       abbrev: 11
+             name                 (strp) "_IO_marker"
+             declaration          (flag_present) yes
+ [   251]    pointer_type         abbrev: 6
+             byte_size            (data1) 8
+             type                 (ref4) [   24c]
+ [   257]    pointer_type         abbrev: 6
+             byte_size            (data1) 8
+             type                 (ref4) [    b1]
+ [   25d]    array_type           abbrev: 12
+             type                 (ref4) [    8d]
+             sibling              (ref4) [   26d]
+ [   266]      subrange_type        abbrev: 13
+               type                 (ref4) [    3e]
+               upper_bound          (data1) 0
+ [   26d]    pointer_type         abbrev: 6
+             byte_size            (data1) 8
+             type                 (ref4) [   244]
+ [   273]    structure_type       abbrev: 11
+             name                 (strp) "_IO_codecvt"
+             declaration          (flag_present) yes
+ [   278]    pointer_type         abbrev: 6
+             byte_size            (data1) 8
+             type                 (ref4) [   273]
+ [   27e]    structure_type       abbrev: 11
+             name                 (strp) "_IO_wide_data"
+             declaration          (flag_present) yes
+ [   283]    pointer_type         abbrev: 6
+             byte_size            (data1) 8
+             type                 (ref4) [   27e]
+ [   289]    array_type           abbrev: 12
+             type                 (ref4) [    8d]
+             sibling              (ref4) [   299]
+ [   292]      subrange_type        abbrev: 13
+               type                 (ref4) [    3e]
+               upper_bound          (data1) 19
+ [   299]    variable             abbrev: 14
+             name                 (strp) "stdin"
+             decl_file            (data1) stdio.h (8)
+             decl_line            (data1) 137
+             decl_column          (data1) 14
+             type                 (ref4) [   2a5]
+             external             (flag_present) yes
+             declaration          (flag_present) yes
+ [   2a5]    pointer_type         abbrev: 6
+             byte_size            (data1) 8
+             type                 (ref4) [   238]
+ [   2ab]    variable             abbrev: 14
+             name                 (strp) "stdout"
+             decl_file            (data1) stdio.h (8)
+             decl_line            (data1) 138
+             decl_column          (data1) 14
+             type                 (ref4) [   2a5]
+             external             (flag_present) yes
+             declaration          (flag_present) yes
+ [   2b7]    variable             abbrev: 14
+             name                 (strp) "stderr"
+             decl_file            (data1) stdio.h (8)
+             decl_line            (data1) 139
+             decl_column          (data1) 14
+             type                 (ref4) [   2a5]
+             external             (flag_present) yes
+             declaration          (flag_present) yes
+ [   2c3]    variable             abbrev: 14
+             name                 (strp) "sys_nerr"
+             decl_file            (data1) sys_errlist.h (9)
+             decl_line            (data1) 26
+             decl_column          (data1) 12
+             type                 (ref4) [    53]
+             external             (flag_present) yes
+             declaration          (flag_present) yes
+ [   2cf]    array_type           abbrev: 12
+             type                 (ref4) [   2e5]
+             sibling              (ref4) [   2da]
+ [   2d8]      subrange_type        abbrev: 15
+ [   2da]    const_type           abbrev: 7
+             type                 (ref4) [   2cf]
+ [   2df]    pointer_type         abbrev: 6
+             byte_size            (data1) 8
+             type                 (ref4) [    94]
+ [   2e5]    const_type           abbrev: 7
+             type                 (ref4) [   2df]
+ [   2ea]    variable             abbrev: 14
+             name                 (strp) "sys_errlist"
+             decl_file            (data1) sys_errlist.h (9)
+             decl_line            (data1) 27
+             decl_column          (data1) 26
+             type                 (ref4) [   2da]
+             external             (flag_present) yes
+             declaration          (flag_present) yes
+ [   2f6]    base_type            abbrev: 2
+             byte_size            (data1) 8
+             encoding             (data1) signed (5)
+             name                 (strp) "long long int"
+ [   2fd]    base_type            abbrev: 2
+             byte_size            (data1) 8
+             encoding             (data1) unsigned (7)
+             name                 (strp) "long long unsigned int"
+ [   304]    subprogram           abbrev: 16
+             external             (flag_present) yes
+             name                 (strp) "main"
+             decl_file            (data1) primes.c (1)
+             decl_line            (data1) 24
+             decl_column          (data1) 1
+             prototyped           (flag_present) yes
+             type                 (ref4) [    53]
+             ranges               (sec_offset) range list [    50]
+             low_pc               (addr) 000000000000000000
+             frame_base           (exprloc) 
+              [ 0] call_frame_cfa
+             GNU_all_call_sites   (flag_present) yes
+             sibling              (ref4) [   429]
+ [   326]      formal_parameter     abbrev: 17
+               name                 (strp) "argc"
+               decl_file            (data1) primes.c (1)
+               decl_line            (data1) 24
+               decl_column          (data1) 11
+               type                 (ref4) [    53]
+               location             (sec_offset) location list [    10]
+               GNU_locviews         (sec_offset) location list [     0]
+ [   33a]      formal_parameter     abbrev: 17
+               name                 (strp) "argv"
+               decl_file            (data1) primes.c (1)
+               decl_line            (data1) 24
+               decl_column          (data1) 23
+               type                 (ref4) [   429]
+               location             (sec_offset) location list [    72]
+               GNU_locviews         (sec_offset) location list [    3d]
+ [   34e]      variable             abbrev: 18
+               name                 (string) "n"
+               decl_file            (data1) primes.c (1)
+               decl_line            (data1) 28
+               decl_column          (data1) 7
+               type                 (ref4) [    53]
+               location             (sec_offset) location list [    d4]
+               GNU_locviews         (sec_offset) location list [    7a]
+ [   360]      lexical_block        abbrev: 19
+               ranges               (sec_offset) range list [    80]
+               sibling              (ref4) [   3ed]
+ [   369]        variable             abbrev: 18
+                 name                 (string) "i"
+                 decl_file            (data1) primes.c (1)
+                 decl_line            (data1) 29
+                 decl_column          (data1) 17
+                 type                 (ref4) [    99]
+                 location             (sec_offset) location list [   158]
+                 GNU_locviews         (sec_offset) location list [    f5]
+ [   37b]        inlined_subroutine   abbrev: 20
+                 abstract_origin      (ref4) [   42f]
+                 entry_pc             (addr) 0x0000000000400520
+                 GNU_entry_view       (data1) 6
+                 ranges               (sec_offset) range list [    e0]
+                 call_file            (data1) primes.c (1)
+                 call_line            (data1) 31
+                 call_column          (data1) 11
+                 sibling              (ref4) [   3cb]
+ [   394]          formal_parameter     abbrev: 21
+                   abstract_origin      (ref4) [   440]
+                   location             (sec_offset) location list [   1dd]
+                   GNU_locviews         (sec_offset) location list [   186]
+ [   3a1]          inlined_subroutine   abbrev: 22
+                   abstract_origin      (ref4) [   42f]
+                   ranges               (sec_offset) range list [   120]
+                   call_file            (data1) primes.c (1)
+                   call_line            (data1) 7
+                   call_column          (data1) 1
+ [   3ad]            formal_parameter     abbrev: 23
+                     abstract_origin      (ref4) [   440]
+ [   3b2]            lexical_block        abbrev: 24
+                     abstract_origin      (ref4) [   44a]
+                     ranges               (sec_offset) range list [   120]
+ [   3bb]              variable             abbrev: 25
+                       abstract_origin      (ref4) [   44b]
+                       location             (sec_offset) location list [   250]
+                       GNU_locviews         (sec_offset) location list [   203]
+ [   3cb]        GNU_call_site        abbrev: 26
+                 low_pc               (addr) 0x0000000000a000c7 <.annobin_init.c.unlikely.cold.0+0x47>
+                 abstract_origin      (ref4) [   4e2]
+ [   3d8]          GNU_call_site_parameter abbrev: 27
+                   location             (exprloc) 
+                    [ 0] reg5
+                   GNU_call_site_value  (exprloc) 
+                    [ 0] addr 0x400788 <__dso_handle+0x8>
+ [   3e5]          GNU_call_site_parameter abbrev: 27
+                   location             (exprloc) 
+                    [ 0] reg4
+                   GNU_call_site_value  (exprloc) 
+                    [ 0] breg3 -1
+ [   3ed]      inlined_subroutine   abbrev: 28
+               abstract_origin      (ref4) [   45e]
+               entry_pc             (addr) 0x00000000004004fb
+               GNU_entry_view       (data1) 1
+               ranges               (sec_offset) range list [   150]
+               call_file            (data1) primes.c (1)
+               call_line            (data1) 28
+               call_column          (data1) 11
+ [   402]        formal_parameter     abbrev: 21
+                 abstract_origin      (ref4) [   470]
+                 location             (sec_offset) location list [   2ad]
+                 GNU_locviews         (sec_offset) location list [   268]
+ [   40f]        GNU_call_site        abbrev: 26
+                 low_pc               (addr) 0x0000000000a000a4 <.annobin_init.c.unlikely.cold.0+0x24>
+                 abstract_origin      (ref4) [   4ef]
+ [   41c]          GNU_call_site_parameter abbrev: 27
+                   location             (exprloc) 
+                    [ 0] reg4
+                   GNU_call_site_value  (exprloc) 
+                    [ 0] lit0
+ [   421]          GNU_call_site_parameter abbrev: 27
+                   location             (exprloc) 
+                    [ 0] reg1
+                   GNU_call_site_value  (exprloc) 
+                    [ 0] lit10
+ [   429]    pointer_type         abbrev: 6
+             byte_size            (data1) 8
+             type                 (ref4) [    87]
+ [   42f]    subprogram           abbrev: 29
+             external             (flag_present) yes
+             name                 (strp) "is_prime"
+             decl_file            (data1) primes.c (1)
+             decl_line            (data1) 7
+             decl_column          (data1) 1
+             prototyped           (flag_present) yes
+             type                 (ref4) [   457]
+             inline               (data1) inlined (1)
+             sibling              (ref4) [   457]
+ [   440]      formal_parameter     abbrev: 30
+               name                 (string) "n"
+               decl_file            (data1) primes.c (1)
+               decl_line            (data1) 7
+               decl_column          (data1) 20
+               type                 (ref4) [    99]
+ [   44a]      lexical_block        abbrev: 31
+ [   44b]        variable             abbrev: 32
+                 name                 (string) "i"
+                 decl_file            (data1) primes.c (1)
+                 decl_line            (data1) 15
+                 decl_column          (data1) 17
+                 type                 (ref4) [    99]
+ [   457]    base_type            abbrev: 2
+             byte_size            (data1) 1
+             encoding             (data1) boolean (2)
+             name                 (strp) "_Bool"
+ [   45e]    subprogram           abbrev: 33
+             external             (flag_present) yes
+             name                 (strp) "atoi"
+             decl_file            (data1) stdlib.h (2)
+             decl_line            (data2) 361
+             decl_column          (data1) 1
+             prototyped           (flag_present) yes
+             type                 (ref4) [    53]
+             inline               (data1) declared_inlined (3)
+             sibling              (ref4) [   47e]
+ [   470]      formal_parameter     abbrev: 34
+               name                 (strp) "__nptr"
+               decl_file            (data1) stdlib.h (2)
+               decl_line            (data2) 361
+               decl_column          (data1) 1
+               type                 (ref4) [   2df]
+ [   47e]    subprogram           abbrev: 35
+             abstract_origin      (ref4) [   42f]
+             low_pc               (addr) 0x0000000000400680 <is_prime>
+             high_pc              (data8) 101 (0x00000000004006e5)
+             frame_base           (exprloc) 
+              [ 0] call_frame_cfa
+             GNU_all_call_sites   (flag_present) yes
+             sibling              (ref4) [   4e2]
+ [   499]      formal_parameter     abbrev: 36
+               abstract_origin      (ref4) [   440]
+               location             (exprloc) 
+                [ 0] reg5
+ [   4a0]      inlined_subroutine   abbrev: 37
+               abstract_origin      (ref4) [   42f]
+               ranges               (sec_offset) range list [   1a0]
+               low_pc               (addr) 000000000000000000
+               call_file            (data1) primes.c (1)
+               call_line            (data1) 7
+               call_column          (data1) 1
+ [   4b8]        formal_parameter     abbrev: 23
+                 abstract_origin      (ref4) [   440]
+ [   4bd]        lexical_block        abbrev: 38
+                 abstract_origin      (ref4) [   44a]
+                 ranges               (sec_offset) range list [   1a0]
+                 low_pc               (addr) 000000000000000000
+ [   4d2]          variable             abbrev: 25
+                   abstract_origin      (ref4) [   44b]
+                   location             (sec_offset) location list [   2d1]
+                   GNU_locviews         (sec_offset) location list [   28e]
+ [   4e2]    subprogram           abbrev: 39
+             external             (flag_present) yes
+             declaration          (flag_present) yes
+             linkage_name         (strp) "printf"
+             name                 (strp) "printf"
+             decl_file            (data1) stdio.h (8)
+             decl_line            (data2) 332
+             decl_column          (data1) 12
+ [   4ef]    subprogram           abbrev: 40
+             external             (flag_present) yes
+             declaration          (flag_present) yes
+             linkage_name         (strp) "strtol"
+             name                 (strp) "strtol"
+             decl_file            (data1) stdlib.h (2)
+             decl_line            (data1) 176
+             decl_column          (data1) 17
+EOF
diff --git a/tests/run-readelf-fat-lto.sh b/tests/run-readelf-fat-lto.sh
new file mode 100755
index 0000000..e03cec3
--- /dev/null
+++ b/tests/run-readelf-fat-lto.sh
@@ -0,0 +1,53 @@
+. $srcdir/test-subr.sh
+
+# - s.c
+# int main_argc_remaining;
+#
+# int main_argc() {
+#   int result = 0;
+#   if (main_argc_remaining)
+#     result = 0;
+#
+#   return 0;
+# }
+#
+# gcc -gdwarf-5 -c -o testfile-dwarf5-fat-lto.o -flto -O s.c -g -ffat-lto-objects
+
+testfiles testfile-dwarf5-fat-lto.o
+testrun_compare ${abs_top_builddir}/src/readelf --debug-dump=loc --debug-dump=ranges -N -U testfile-dwarf5-fat-lto.o << EOF
+
+DWARF section [26] '.debug_loclists' at offset 0x7db:
+Table at Offset 0x0:
+
+ Length:               24
+ DWARF version:         5
+ Address size:          8
+ Segment size:          0
+ Offset entries:        0
+ CU [     c] base: 000000000000000000
+
+  Offset: c, Index: 0
+    view pair 2, 3
+
+  Offset: e, Index: 2
+    start_length 0x0, 0
+        [ 0] lit0
+        [ 1] stack_value
+    end_of_list
+
+
+DWARF section [30] '.debug_rnglists' at offset 0x827:
+Table at Offset 0x0:
+
+ Length:               19
+ DWARF version:         5
+ Address size:          8
+ Segment size:          0
+ Offset entries:        0
+ CU [     c] base: 000000000000000000
+
+  Offset: c, Index: 0
+    start_length 0x0, 8
+    end_of_list
+
+EOF
diff --git a/tests/run-readelf-multi-noline.sh b/tests/run-readelf-multi-noline.sh
new file mode 100755
index 0000000..d72a9fd
--- /dev/null
+++ b/tests/run-readelf-multi-noline.sh
@@ -0,0 +1,170 @@
+#! /bin/sh
+# Copyright (C) 2021 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 the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# 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 a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+. $srcdir/test-subr.sh
+
+# = a.c =
+# int a;
+
+# = b.c =
+# int b;
+
+# = m.c =
+# int main () { }
+
+# gcc -g -o testfile_multi_noline a.c b.c m.c
+
+testfiles testfile_multi_noline
+
+testrun_compare ${abs_top_builddir}/src/readelf --debug-dump=line testfile_multi_noline <<\EOF
+
+DWARF section [29] '.debug_line' at offset 0x1221:
+
+Table at offset 0:
+
+ Length:                         32
+ DWARF version:                  3
+ Prologue length:                26
+ Address size:                   8
+ Segment selector size:          0
+ Min instruction length:         4
+ Max operations per instruction: 1
+ Initial value if 'is_stmt':     1
+ Line base:                      -5
+ Line range:                     14
+ Opcode base:                    13
+
+Opcodes:
+  [ 1]  0 arguments
+  [ 2]  1 argument
+  [ 3]  1 argument
+  [ 4]  1 argument
+  [ 5]  1 argument
+  [ 6]  0 arguments
+  [ 7]  0 arguments
+  [ 8]  0 arguments
+  [ 9]  1 argument
+  [10]  0 arguments
+  [11]  0 arguments
+  [12]  1 argument
+
+Directory table:
+
+File name table:
+ Entry Dir   Time      Size      Name
+ 1     0     0         0         a.c
+
+No line number statements.
+
+Table at offset 36:
+
+ Length:                         32
+ DWARF version:                  3
+ Prologue length:                26
+ Address size:                   8
+ Segment selector size:          0
+ Min instruction length:         4
+ Max operations per instruction: 1
+ Initial value if 'is_stmt':     1
+ Line base:                      -5
+ Line range:                     14
+ Opcode base:                    13
+
+Opcodes:
+  [ 1]  0 arguments
+  [ 2]  1 argument
+  [ 3]  1 argument
+  [ 4]  1 argument
+  [ 5]  1 argument
+  [ 6]  0 arguments
+  [ 7]  0 arguments
+  [ 8]  0 arguments
+  [ 9]  1 argument
+  [10]  0 arguments
+  [11]  0 arguments
+  [12]  1 argument
+
+Directory table:
+
+File name table:
+ Entry Dir   Time      Size      Name
+ 1     0     0         0         b.c
+
+No line number statements.
+
+Table at offset 72:
+
+ Length:                         54
+ DWARF version:                  3
+ Prologue length:                26
+ Address size:                   8
+ Segment selector size:          0
+ Min instruction length:         4
+ Max operations per instruction: 1
+ Initial value if 'is_stmt':     1
+ Line base:                      -5
+ Line range:                     14
+ Opcode base:                    13
+
+Opcodes:
+  [ 1]  0 arguments
+  [ 2]  1 argument
+  [ 3]  1 argument
+  [ 4]  1 argument
+  [ 5]  1 argument
+  [ 6]  0 arguments
+  [ 7]  0 arguments
+  [ 8]  0 arguments
+  [ 9]  1 argument
+  [10]  0 arguments
+  [11]  0 arguments
+  [12]  1 argument
+
+Directory table:
+
+File name table:
+ Entry Dir   Time      Size      Name
+ 1     0     0         0         m.c
+
+Line number statements:
+ [    6c] set column to 13
+ [    6e] extended opcode 2:  set address to +0x724 <main>
+ [    79] copy
+ [    7a] set column to 15
+ [    7c] special opcode 32: address+4 = +0x728 <main+0x4>, line+0 = 1
+ [    7d] advance address by 4 to +0x72c
+ [    7f] extended opcode 1:  end of sequence
+EOF
+
+testrun_compare ${abs_top_builddir}/src/readelf --debug-dump=decodedline testfile_multi_noline <<\EOF
+
+DWARF section [29] '.debug_line' at offset 0x1221:
+
+ CU [b] a.c
+  line:col SBPE* disc isa op address (Statement Block Prologue Epilogue *End)
+ CU [44] b.c
+  line:col SBPE* disc isa op address (Statement Block Prologue Epilogue *End)
+ CU [7d] m.c
+  line:col SBPE* disc isa op address (Statement Block Prologue Epilogue *End)
+  /tmp/m.c (mtime: 0, length: 0)
+     1:13  S        0   0  0 +0x0000000000000724 <main>
+     1:15  S        0   0  0 +0x0000000000000728 <main+0x4>
+     1:15  S   *    0   0  0 +0x000000000000072b <main+0x7>
+
+EOF
+
+exit 0
diff --git a/tests/run-readelf-types.sh b/tests/run-readelf-types.sh
index a7af573..4f31269 100755
--- a/tests/run-readelf-types.sh
+++ b/tests/run-readelf-types.sh
@@ -97,7 +97,7 @@
              specification        (ref4) [    34]
  Type unit at offset 67:
  Version: 4, Abbreviation section offset: 0, Address size: 8, Offset size: 4
- Type signature: 0x18763953736e2de0, Type offset: 0x25 [25]
+ Type signature: 0x18763953736e2de0, Type offset: 0x25 [68]
  [    5a]  type_unit            abbrev: 1
            language             (data1) C_plus_plus (4)
            GNU_odr_signature    (data8) 16005269134005989797
diff --git a/tests/run-strip-largealign.sh b/tests/run-strip-largealign.sh
new file mode 100755
index 0000000..4f81d3c
--- /dev/null
+++ b/tests/run-strip-largealign.sh
@@ -0,0 +1,35 @@
+#! /bin/sh
+# Copyright (C) 2021 Runsafe Security, Inc.
+# This file is part of elfutils.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# 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 a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+
+. $srcdir/test-subr.sh
+
+# = testfile-largealign.S =
+# section .data
+# align 4096
+# dd 0x12345678
+#
+# nasm -f elf64 -o testfile-largealign.o testfile-largealign.S
+
+infile=testfile-largealign.o
+outfile=$infile.stripped
+
+testfiles $infile
+tempfiles $outfile
+
+testrun ${abs_top_builddir}/src/strip -o $outfile $infile
+testrun ${abs_top_builddir}/src/elflint --gnu $outfile
diff --git a/tests/run-varlocs-vars.sh b/tests/run-varlocs-vars.sh
new file mode 100755
index 0000000..e7598bf
--- /dev/null
+++ b/tests/run-varlocs-vars.sh
@@ -0,0 +1,93 @@
+#! /bin/sh
+# Copyright (C) 2013, 2021 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 the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# 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 a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+. $srcdir/test-subr.sh
+
+# Testfiles generated with:
+#
+# $ cat foo.c
+# int x = 1;
+# int y = 2;
+#
+# for cc in gcc clang; do
+#   for v in 4 5; do
+#     for w in 32 64; do
+#       out="testfile-vars-$cc-dwarf$v-$w.o"
+#       "$cc" -m"$w" -Wall -Wextra -gdwarf-"$v" -c foo.c -o "$out"
+#     done
+#   done
+# done
+
+testfiles testfile-vars-clang-dwarf4-32.o
+testfiles testfile-vars-clang-dwarf4-64.o
+testfiles testfile-vars-clang-dwarf5-32.o
+testfiles testfile-vars-clang-dwarf5-64.o
+testfiles testfile-vars-gcc-dwarf4-32.o
+testfiles testfile-vars-gcc-dwarf4-64.o
+testfiles testfile-vars-gcc-dwarf5-32.o
+testfiles testfile-vars-gcc-dwarf5-64.o
+
+tempfiles varlocs.out
+testrun ${abs_top_builddir}/tests/varlocs --debug --exprlocs -e testfile-vars-clang-dwarf4-32.o | grep exprloc > varlocs.out
+diff -u varlocs.out - <<EOF
+    location (exprloc) {addr(0x0)}
+    location (exprloc) {addr(0x4)}
+EOF
+
+testrun ${abs_top_builddir}/tests/varlocs --debug --exprlocs -e testfile-vars-clang-dwarf4-64.o | grep exprloc > varlocs.out
+diff -u varlocs.out - <<EOF
+    location (exprloc) {addr(0x0)}
+    location (exprloc) {addr(0x4)}
+EOF
+
+testrun ${abs_top_builddir}/tests/varlocs --debug --exprlocs -e testfile-vars-clang-dwarf5-32.o | grep exprloc > varlocs.out
+diff -u varlocs.out - <<EOF
+    location (exprloc) {addr: 0x0}
+    location (exprloc) {addr: 0x4}
+EOF
+
+testrun ${abs_top_builddir}/tests/varlocs --debug --exprlocs -e testfile-vars-clang-dwarf5-32.o | grep exprloc > varlocs.out
+diff -u varlocs.out - <<EOF
+    location (exprloc) {addr: 0x0}
+    location (exprloc) {addr: 0x4}
+EOF
+
+testrun ${abs_top_builddir}/tests/varlocs --debug --exprlocs -e testfile-vars-gcc-dwarf4-32.o | grep exprloc > varlocs.out
+diff -u varlocs.out - <<EOF
+    location (exprloc) {addr(0x0)}
+    location (exprloc) {addr(0x4)}
+EOF
+
+testrun ${abs_top_builddir}/tests/varlocs --debug --exprlocs -e testfile-vars-gcc-dwarf4-64.o | grep exprloc > varlocs.out
+diff -u varlocs.out - <<EOF
+    location (exprloc) {addr(0x0)}
+    location (exprloc) {addr(0x4)}
+EOF
+
+testrun ${abs_top_builddir}/tests/varlocs --debug --exprlocs -e testfile-vars-gcc-dwarf5-32.o | grep exprloc > varlocs.out
+diff -u varlocs.out - <<EOF
+    location (exprloc) {addr(0x0)}
+    location (exprloc) {addr(0x4)}
+EOF
+
+testrun ${abs_top_builddir}/tests/varlocs --debug --exprlocs -e testfile-vars-gcc-dwarf5-64.o | grep exprloc > varlocs.out
+diff -u varlocs.out - <<EOF
+    location (exprloc) {addr(0x0)}
+    location (exprloc) {addr(0x4)}
+EOF
+
+exit 0
diff --git a/tests/show-die-info.c b/tests/show-die-info.c
index 34e27a3..1a3191c 100644
--- a/tests/show-die-info.c
+++ b/tests/show-die-info.c
@@ -97,7 +97,7 @@
   printf ("%*s Attrs     :", n * 5, "");
   for (cnt = 0; cnt < 0xffff; ++cnt)
     if (dwarf_hasattr (die, cnt))
-      printf (" %s", dwarf_attr_string (cnt));
+      printf (" %s", dwarf_attr_string (cnt) ?: "<unknown>");
   puts ("");
 
   if (dwarf_hasattr (die, DW_AT_low_pc) && dwarf_lowpc (die, &addr) == 0)
diff --git a/tests/testfile-dw-form-indirect.bz2 b/tests/testfile-dw-form-indirect.bz2
new file mode 100755
index 0000000..e531c11
--- /dev/null
+++ b/tests/testfile-dw-form-indirect.bz2
Binary files differ
diff --git a/tests/testfile-dwarf5-fat-lto.o.bz2 b/tests/testfile-dwarf5-fat-lto.o.bz2
new file mode 100644
index 0000000..ce3659f
--- /dev/null
+++ b/tests/testfile-dwarf5-fat-lto.o.bz2
Binary files differ
diff --git a/tests/testfile-largealign.o.bz2 b/tests/testfile-largealign.o.bz2
new file mode 100644
index 0000000..324c1ea
--- /dev/null
+++ b/tests/testfile-largealign.o.bz2
Binary files differ
diff --git a/tests/testfile-vars-clang-dwarf4-32.o.bz2 b/tests/testfile-vars-clang-dwarf4-32.o.bz2
new file mode 100644
index 0000000..c1ddf81
--- /dev/null
+++ b/tests/testfile-vars-clang-dwarf4-32.o.bz2
Binary files differ
diff --git a/tests/testfile-vars-clang-dwarf4-64.o.bz2 b/tests/testfile-vars-clang-dwarf4-64.o.bz2
new file mode 100644
index 0000000..df33299
--- /dev/null
+++ b/tests/testfile-vars-clang-dwarf4-64.o.bz2
Binary files differ
diff --git a/tests/testfile-vars-clang-dwarf5-32.o.bz2 b/tests/testfile-vars-clang-dwarf5-32.o.bz2
new file mode 100644
index 0000000..b1d6b6c
--- /dev/null
+++ b/tests/testfile-vars-clang-dwarf5-32.o.bz2
Binary files differ
diff --git a/tests/testfile-vars-clang-dwarf5-64.o.bz2 b/tests/testfile-vars-clang-dwarf5-64.o.bz2
new file mode 100644
index 0000000..adf6c6a
--- /dev/null
+++ b/tests/testfile-vars-clang-dwarf5-64.o.bz2
Binary files differ
diff --git a/tests/testfile-vars-gcc-dwarf4-32.o.bz2 b/tests/testfile-vars-gcc-dwarf4-32.o.bz2
new file mode 100644
index 0000000..da9aac7
--- /dev/null
+++ b/tests/testfile-vars-gcc-dwarf4-32.o.bz2
Binary files differ
diff --git a/tests/testfile-vars-gcc-dwarf4-64.o.bz2 b/tests/testfile-vars-gcc-dwarf4-64.o.bz2
new file mode 100644
index 0000000..2642164
--- /dev/null
+++ b/tests/testfile-vars-gcc-dwarf4-64.o.bz2
Binary files differ
diff --git a/tests/testfile-vars-gcc-dwarf5-32.o.bz2 b/tests/testfile-vars-gcc-dwarf5-32.o.bz2
new file mode 100644
index 0000000..cb1c705
--- /dev/null
+++ b/tests/testfile-vars-gcc-dwarf5-32.o.bz2
Binary files differ
diff --git a/tests/testfile-vars-gcc-dwarf5-64.o.bz2 b/tests/testfile-vars-gcc-dwarf5-64.o.bz2
new file mode 100644
index 0000000..e286f8f
--- /dev/null
+++ b/tests/testfile-vars-gcc-dwarf5-64.o.bz2
Binary files differ
diff --git a/tests/testfile_multi_noline.bz2 b/tests/testfile_multi_noline.bz2
new file mode 100755
index 0000000..39320d1
--- /dev/null
+++ b/tests/testfile_multi_noline.bz2
Binary files differ
diff --git a/tests/testfile_nvidia_linemap.bz2 b/tests/testfile_nvidia_linemap.bz2
new file mode 100644
index 0000000..8a6d09f
--- /dev/null
+++ b/tests/testfile_nvidia_linemap.bz2
Binary files differ
diff --git a/tests/vdsosyms.c b/tests/vdsosyms.c
index 83ab034..ff1a18a 100644
--- a/tests/vdsosyms.c
+++ b/tests/vdsosyms.c
@@ -43,7 +43,7 @@
 {
   /* We can only recognize the vdso by inspecting the "magic name".  */
   printf ("module name: %s\n", name);
-  if (strncmp ("[vdso: ", name, 7) == 0)
+  if (startswith (name, "[vdso: "))
     {
       vdso_syms = dwfl_module_getsymtab (mod);
       printf ("vdso syms: %d\n", vdso_syms);
diff --git a/version.h b/version.h
index 8690a24..99186be 100644
--- a/version.h
+++ b/version.h
@@ -30,7 +30,7 @@
 #ifndef _ELFUTILS_VERSION_H
 #define _ELFUTILS_VERSION_H	1
 
-#define _ELFUTILS_VERSION	183
+#define _ELFUTILS_VERSION	186
 
 #define _ELFUTILS_PREREQ(major, minor) \
   (_ELFUTILS_VERSION >= ((major) * 1000 + (minor)))