summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMark Wielaard <mark@klomp.org>2020-06-11 00:06:30 +0200
committerMark Wielaard <mark@klomp.org>2020-06-11 03:58:27 +0200
commit49f13584d60322578c19b6118393ab04236ca7bf (patch)
tree88c79fbf73c54734c51b6b4a9a2a154e229f30c6
parentc0d643e7d91fc002c9fecd83277c62a0e56ef76f (diff)
parent2c7c40373b68968cce20a60a28234e2a2cbc55cb (diff)
Merge tag 'elfutils-0.178' into mjw/RH-DTSdts-0.178
elfutils 0.178 release Adopt ebl backends loading from trunk.
-rw-r--r--.gitignore1
-rw-r--r--ChangeLog26
-rw-r--r--Makefile.am9
-rw-r--r--NEWS22
-rw-r--r--backends/ChangeLog6
-rw-r--r--backends/Makefile.am132
-rw-r--r--backends/riscv_init.c1
-rw-r--r--config/ChangeLog39
-rw-r--r--config/Makefile.am7
-rw-r--r--config/debuginfod.service15
-rw-r--r--config/debuginfod.sysconfig14
-rw-r--r--config/elfutils.spec.in242
-rw-r--r--config/eu.am10
-rw-r--r--config/libdebuginfod.pc.in12
-rw-r--r--configure.ac91
-rw-r--r--debuginfod/ChangeLog70
-rw-r--r--debuginfod/Makefile.am119
-rw-r--r--debuginfod/debuginfod-client.c754
-rw-r--r--debuginfod/debuginfod-find.c145
-rw-r--r--debuginfod/debuginfod.cxx2688
-rw-r--r--debuginfod/debuginfod.h85
-rw-r--r--debuginfod/libdebuginfod.map10
-rw-r--r--doc/COPYING-GFDL455
-rw-r--r--doc/ChangeLog53
-rw-r--r--doc/Makefile.am24
-rw-r--r--doc/README20
-rw-r--r--doc/debuginfod-find.1144
-rw-r--r--doc/debuginfod.8387
-rw-r--r--doc/debuginfod_begin.31
-rw-r--r--doc/debuginfod_end.31
-rw-r--r--doc/debuginfod_find_debuginfo.3242
-rw-r--r--doc/debuginfod_find_executable.31
-rw-r--r--doc/debuginfod_find_source.31
-rw-r--r--doc/debuginfod_set_progressfn.31
-rw-r--r--doc/elf_begin.337
-rw-r--r--doc/elf_clone.314
-rw-r--r--doc/elf_getdata.328
-rw-r--r--doc/elf_update.314
-rw-r--r--doc/elfclassify.1197
-rw-r--r--doc/readelf.1511
-rw-r--r--lib/ChangeLog11
-rw-r--r--lib/Makefile.am5
-rw-r--r--lib/atomics.h37
-rw-r--r--lib/color.c14
-rw-r--r--lib/color.h2
-rw-r--r--lib/dynamicsizehash_concurrent.c482
-rw-r--r--lib/dynamicsizehash_concurrent.h118
-rw-r--r--lib/stdatomic-fbsd.h442
-rw-r--r--libasm/ChangeLog4
-rw-r--r--libasm/Makefile.am4
-rw-r--r--libcpu/ChangeLog19
-rw-r--r--libcpu/Makefile.am28
-rw-r--r--libcpu/i386_data.h2
-rw-r--r--libcpu/i386_disasm.c14
-rw-r--r--libcpu/riscv_disasm.c1501
-rw-r--r--libdw/ChangeLog60
-rw-r--r--libdw/Makefile.am51
-rw-r--r--libdw/dwarf_abbrev_hash.c2
-rw-r--r--libdw/dwarf_abbrev_hash.h3
-rw-r--r--libdw/dwarf_begin_elf.c36
-rw-r--r--libdw/dwarf_end.c45
-rw-r--r--libdw/dwarf_formref_die.c2
-rw-r--r--libdw/dwarf_getabbrev.c12
-rw-r--r--libdw/dwarf_getcfi.c1
-rw-r--r--libdw/dwarf_sig8_hash.c2
-rw-r--r--libdw/dwarf_sig8_hash.h9
-rw-r--r--libdw/dwarf_tag.c2
-rw-r--r--libdw/libdwP.h33
-rw-r--r--libdw/libdw_alloc.c78
-rw-r--r--libdwelf/Makefile.am2
-rw-r--r--libdwfl/ChangeLog17
-rw-r--r--libdwfl/Makefile.am6
-rw-r--r--libdwfl/debuginfod-client.c131
-rw-r--r--libdwfl/dwfl_build_id_find_elf.c14
-rw-r--r--libdwfl/dwfl_end.c2
-rw-r--r--libdwfl/dwfl_frame.c66
-rw-r--r--libdwfl/find-debuginfo.c8
-rw-r--r--libdwfl/libdwflP.h18
-rw-r--r--libebl/ChangeLog17
-rw-r--r--libebl/Makefile.am52
-rw-r--r--libebl/eblopenbackend.c63
-rw-r--r--libebl/libebl.h8
-rw-r--r--libebl/libeblP.h3
-rw-r--r--libelf/Makefile.am2
-rw-r--r--m4/ChangeLog4
-rw-r--r--m4/Makefile.am2
-rw-r--r--m4/ax_check_compile_flag.m474
-rw-r--r--m4/ax_cxx_compile_stdcxx.m4556
-rw-r--r--po/ChangeLog4
-rw-r--r--po/de.po994
-rw-r--r--po/es.po994
-rw-r--r--po/ja.po994
-rw-r--r--po/pl.po994
-rw-r--r--po/uk.po994
-rw-r--r--src/ChangeLog74
-rw-r--r--src/Makefile.am22
-rw-r--r--src/elflint.c6
-rw-r--r--src/nm.c3
-rw-r--r--src/objdump.c6
-rw-r--r--src/readelf.c30
-rw-r--r--src/unstrip.c83
-rw-r--r--tests/ChangeLog72
-rw-r--r--tests/Makefile.am69
-rwxr-xr-xtests/coverage.sh4
-rw-r--r--tests/debuginfod-rpms/fedora30/hello2-1.0-2.src.rpmbin0 -> 8087 bytes
-rw-r--r--tests/debuginfod-rpms/fedora30/hello2-1.0-2.x86_64.rpmbin0 -> 10448 bytes
-rw-r--r--tests/debuginfod-rpms/fedora30/hello2-debuginfo-1.0-2.x86_64.rpmbin0 -> 11316 bytes
-rw-r--r--tests/debuginfod-rpms/fedora30/hello2-debugsource-1.0-2.x86_64.rpmbin0 -> 7308 bytes
-rw-r--r--tests/debuginfod-rpms/fedora30/hello2-two-1.0-2.x86_64.rpmbin0 -> 10380 bytes
-rw-r--r--tests/debuginfod-rpms/fedora30/hello2-two-debuginfo-1.0-2.x86_64.rpmbin0 -> 10888 bytes
-rw-r--r--tests/debuginfod-rpms/hello2.spec.57
-rw-r--r--tests/debuginfod-rpms/rhel6/hello2-1.0-2.i686.rpmbin0 -> 4112 bytes
-rw-r--r--tests/debuginfod-rpms/rhel6/hello2-1.0-2.src.rpmbin0 -> 3816 bytes
-rw-r--r--tests/debuginfod-rpms/rhel6/hello2-debuginfo-1.0-2.i686.rpmbin0 -> 6060 bytes
-rw-r--r--tests/debuginfod-rpms/rhel6/hello2-two-1.0-2.i686.rpmbin0 -> 4052 bytes
-rw-r--r--tests/debuginfod-rpms/rhel7/hello2-1.0-2.src.rpmbin0 -> 3819 bytes
-rw-r--r--tests/debuginfod-rpms/rhel7/hello2-1.0-2.x86_64.rpmbin0 -> 5156 bytes
-rw-r--r--tests/debuginfod-rpms/rhel7/hello2-debuginfo-1.0-2.x86_64.rpmbin0 -> 6936 bytes
-rw-r--r--tests/debuginfod-rpms/rhel7/hello2-two-1.0-2.x86_64.rpmbin0 -> 5092 bytes
-rw-r--r--tests/debuginfod_build_id_find.c62
-rw-r--r--tests/dwelf_elf_e_machine_string.c1
-rwxr-xr-xtests/run-debuginfod-find.sh324
-rwxr-xr-xtests/run-disasm-riscv64.sh529
-rwxr-xr-xtests/run-large-elf-file.sh4
-rwxr-xr-xtests/run-readelf-s.sh3
-rwxr-xr-xtests/run-readelf-test2.sh7
-rw-r--r--tests/test-subr.sh10
-rw-r--r--tests/testfile-riscv64-dis1.expect.bz2bin0 -> 4603 bytes
-rw-r--r--tests/testfile-riscv64-dis1.o.bz2bin0 -> 1507 bytes
-rw-r--r--tests/testfile45.expect.bz2bin82002 -> 81706 bytes
130 files changed, 14075 insertions, 2958 deletions
diff --git a/.gitignore b/.gitignore
index e8201dcc..72f22855 100644
--- a/.gitignore
+++ b/.gitignore
@@ -56,6 +56,7 @@ Makefile.in
/po/stamp-po
/src/addr2line
/src/ar
+/src/elfclassify
/src/elfcmp
/src/elfcompress
/src/elflint
diff --git a/ChangeLog b/ChangeLog
index bed3999f..0e229622 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,29 @@
+2019-11-26 Mark Wielaard <mark@klomp.org>
+
+ * configure.ac: Set version to 0.178.
+ NEWS: Add 0.178 section.
+
+2019-11-26 Mark Wielaard <mark@klomp.org>
+
+ * configure.ac: Add CXXFLAGS for gcov.
+
+2019-10-28 Aaron Merey <amerey@redhat.com>
+
+ * debuginfod/: New directory for debuginfod code.
+ * Makefile.am (SUBDIRS): Recurse there.
+ * configure.ac (--enable-debuginfod): New flag & checks.
+
+2019-08-25 Jonathon Anderson <jma14@rice.edu>
+
+ * configure.ac: Add new --enable-valgrind-annotations
+ * configure.ac: Add new --with-valgrind (headers only)
+
+2019-07-05 Omar Sandoval <osandov@fb.com>
+
+ * configure.ac: Get rid of --enable-libebl-subdir.
+ * Makefile.am (SUBDIRS): Reorder backends and libcpu before libebl to
+ satisfy build dependencies.
+
2019-08-13 Mark Wielaard <mark@klomp.org>
* configure.ac: Set version to 0.177.
diff --git a/Makefile.am b/Makefile.am
index 2ff444e7..bd8926b5 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -26,9 +26,12 @@ AM_MAKEFLAGS = --no-print-directory
pkginclude_HEADERS = version.h
-# Add doc back when we have some real content.
-SUBDIRS = config m4 lib libelf libebl libdwelf libdwfl libdw libcpu libasm \
- backends src po tests
+SUBDIRS = config m4 lib libelf libcpu backends libebl libdwelf libdwfl libdw \
+ libasm src po doc tests
+
+if DEBUGINFOD
+SUBDIRS += debuginfod
+endif
EXTRA_DIST = elfutils.spec GPG-KEY NOTES CONTRIBUTING \
COPYING COPYING-GPLV2 COPYING-LGPLV3
diff --git a/NEWS b/NEWS
index 2bf19d9c..c147ad3c 100644
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,25 @@
+Version 0.178
+
+debuginfod: New server, client tool and library to index and fetch
+ ELF/DWARF files addressed by build-id through HTTP.
+
+doc: There are now some manual pages for functions and tools.
+
+backends: The libebl libraries are no longer dynamically loaded through
+ dlopen, but are now compiled into libdw.so directly.
+
+readelf: -n, --notes now takes an optional "SECTION" argument.
+ -p and -x now also handle section numbers.
+ New option --dyn-sym to show just the dynamic symbol table.
+
+libcpu: Add RISC-V disassembler.
+
+libdw: Abbrevs and DIEs can now be read concurrently by multiple
+ threads through the same Dwarf handle.
+
+libdwfl: Will try to use debuginfod when installed as fallback to
+ retrieve ELF and DWARF debug data files by build-id.
+
Version 0.177
elfclassify: New tool to analyze ELF objects.
diff --git a/backends/ChangeLog b/backends/ChangeLog
index f1eaf14b..3f5f9bb0 100644
--- a/backends/ChangeLog
+++ b/backends/ChangeLog
@@ -1,3 +1,9 @@
+2019-07-05 Omar Sandoval <osandov@fb.com>
+
+ * Makefile.am: Replace libcpu_{i386,x86_64,bpf}.a with libcpu.a.
+ Replace libcpu.a with libcpu_pic.a.
+ Combine libebl_CPU.so modules into libebl_backends{,_pic}.a.
+
2019-07-13 Mao Han <han_mao@c-sky.com>
* Makefile.am: Add C-SKY.
diff --git a/backends/Makefile.am b/backends/Makefile.am
index 2c0c7f0b..92c50f25 100644
--- a/backends/Makefile.am
+++ b/backends/Makefile.am
@@ -28,123 +28,60 @@
## the GNU Lesser General Public License along with this program. If
## not, see <http://www.gnu.org/licenses/>.
include $(top_srcdir)/config/eu.am
+if BUILD_STATIC
+AM_CFLAGS += $(fpic_CFLAGS)
+endif
AM_CPPFLAGS += -I$(top_srcdir)/libebl -I$(top_srcdir)/libasm \
-I$(top_srcdir)/libelf -I$(top_srcdir)/libdw
+noinst_LIBRARIES = libebl_backends.a libebl_backends_pic.a
modules = i386 sh x86_64 ia64 alpha arm aarch64 sparc ppc ppc64 s390 \
tilegx m68k bpf riscv csky
-libebl_pic = libebl_i386_pic.a libebl_sh_pic.a libebl_x86_64_pic.a \
- libebl_ia64_pic.a libebl_alpha_pic.a libebl_arm_pic.a \
- libebl_aarch64_pic.a libebl_sparc_pic.a libebl_ppc_pic.a \
- libebl_ppc64_pic.a libebl_s390_pic.a libebl_tilegx_pic.a \
- libebl_m68k_pic.a libebl_bpf_pic.a libebl_riscv_pic.a \
- libebl_csky_pic.a
-noinst_LIBRARIES = $(libebl_pic)
-noinst_DATA = $(libebl_pic:_pic.a=.so)
-lib_LIBRARIES = libebl_static_pic.a
-
-
-libelf = ../libelf/libelf.so
-libdw = ../libdw/libdw.so
-libeu = ../lib/libeu.a
-
-# The following is minimal set of backends that we link with libdw to
-# avoid dlopen. Note repeats files below because some backends reuse
-# each others files.
-static_SRCS = i386_init.c i386_symbol.c i386_corenote.c i386_cfi.c \
- i386_retval.c i386_regs.c i386_auxv.c i386_syscall.c \
- i386_initreg.c i386_unwind.c \
- x86_64_init.c x86_64_symbol.c x86_64_corenote.c x86_64_cfi.c \
- x86_64_retval.c x86_64_regs.c x86_64_syscall.c \
- x86_64_initreg.c x86_64_unwind.c x32_corenote.c \
- ia64_init.c ia64_symbol.c ia64_regs.c ia64_retval.c \
- aarch64_init.c aarch64_regs.c aarch64_symbol.c \
- aarch64_corenote.c aarch64_retval.c aarch64_cfi.c \
- aarch64_initreg.c aarch64_unwind.c \
- ppc_init.c ppc_symbol.c ppc_retval.c ppc_regs.c \
- ppc_corenote.c ppc_auxv.c ppc_attrs.c ppc_syscall.c \
- ppc_cfi.c ppc_initreg.c \
- ppc64_init.c ppc64_symbol.c ppc64_retval.c ppc64_corenote.c \
- ppc64_resolve_sym.c ppc64_unwind.c \
- s390_init.c s390_symbol.c s390_regs.c s390_retval.c \
- s390_corenote.c s390x_corenote.c s390_cfi.c s390_initreg.c \
- s390_unwind.c bpf_init.c bpf_regs.c bpf_symbol.c
-
-libebl_static_pic_a_SOURCES = $(static_SRCS)
-am_libebl_static_pic_a_OBJECTS = $(static_SRCS:.c=.os)
i386_SRCS = i386_init.c i386_symbol.c i386_corenote.c i386_cfi.c \
i386_retval.c i386_regs.c i386_auxv.c i386_syscall.c \
i386_initreg.c i386_unwind.c
-cpu_i386 = ../libcpu/libcpu_i386.a
-libebl_i386_pic_a_SOURCES = $(i386_SRCS)
-am_libebl_i386_pic_a_OBJECTS = $(i386_SRCS:.c=.os)
sh_SRCS = sh_init.c sh_symbol.c sh_corenote.c sh_regs.c sh_retval.c
-libebl_sh_pic_a_SOURCES = $(sh_SRCS)
-am_libebl_sh_pic_a_OBJECTS = $(sh_SRCS:.c=.os)
x86_64_SRCS = x86_64_init.c x86_64_symbol.c x86_64_corenote.c x86_64_cfi.c \
- x86_64_retval.c x86_64_regs.c i386_auxv.c x86_64_syscall.c \
- x86_64_initreg.c x86_64_unwind.c x32_corenote.c
-cpu_x86_64 = ../libcpu/libcpu_x86_64.a
-libebl_x86_64_pic_a_SOURCES = $(x86_64_SRCS)
-am_libebl_x86_64_pic_a_OBJECTS = $(x86_64_SRCS:.c=.os)
+ x86_64_retval.c x86_64_regs.c x86_64_syscall.c x86_64_initreg.c \
+ x86_64_unwind.c x32_corenote.c
+
ia64_SRCS = ia64_init.c ia64_symbol.c ia64_regs.c ia64_retval.c
-libebl_ia64_pic_a_SOURCES = $(ia64_SRCS)
-am_libebl_ia64_pic_a_OBJECTS = $(ia64_SRCS:.c=.os)
alpha_SRCS = alpha_init.c alpha_symbol.c alpha_retval.c alpha_regs.c \
alpha_corenote.c alpha_auxv.c
-libebl_alpha_pic_a_SOURCES = $(alpha_SRCS)
-am_libebl_alpha_pic_a_OBJECTS = $(alpha_SRCS:.c=.os)
arm_SRCS = arm_init.c arm_symbol.c arm_regs.c arm_corenote.c \
arm_auxv.c arm_attrs.c arm_retval.c arm_cfi.c arm_initreg.c
-libebl_arm_pic_a_SOURCES = $(arm_SRCS)
-am_libebl_arm_pic_a_OBJECTS = $(arm_SRCS:.c=.os)
aarch64_SRCS = aarch64_init.c aarch64_regs.c aarch64_symbol.c \
aarch64_corenote.c aarch64_retval.c aarch64_cfi.c \
aarch64_initreg.c aarch64_unwind.c
-libebl_aarch64_pic_a_SOURCES = $(aarch64_SRCS)
-am_libebl_aarch64_pic_a_OBJECTS = $(aarch64_SRCS:.c=.os)
sparc_SRCS = sparc_init.c sparc_symbol.c sparc_regs.c sparc_retval.c \
sparc_corenote.c sparc64_corenote.c sparc_auxv.c sparc_attrs.c \
sparc_cfi.c sparc_initreg.c
-libebl_sparc_pic_a_SOURCES = $(sparc_SRCS)
-am_libebl_sparc_pic_a_OBJECTS = $(sparc_SRCS:.c=.os)
ppc_SRCS = ppc_init.c ppc_symbol.c ppc_retval.c ppc_regs.c \
ppc_corenote.c ppc_auxv.c ppc_attrs.c ppc_syscall.c \
ppc_cfi.c ppc_initreg.c
-libebl_ppc_pic_a_SOURCES = $(ppc_SRCS)
-am_libebl_ppc_pic_a_OBJECTS = $(ppc_SRCS:.c=.os)
-ppc64_SRCS = ppc64_init.c ppc64_symbol.c ppc64_retval.c \
- ppc64_corenote.c ppc_regs.c ppc_auxv.c ppc_attrs.c ppc_syscall.c \
- ppc_cfi.c ppc_initreg.c ppc64_unwind.c ppc64_resolve_sym.c
-libebl_ppc64_pic_a_SOURCES = $(ppc64_SRCS)
-am_libebl_ppc64_pic_a_OBJECTS = $(ppc64_SRCS:.c=.os)
+ppc64_SRCS = ppc64_init.c ppc64_symbol.c ppc64_retval.c ppc64_corenote.c \
+ ppc64_unwind.c ppc64_resolve_sym.c
s390_SRCS = s390_init.c s390_symbol.c s390_regs.c s390_retval.c \
s390_corenote.c s390x_corenote.c s390_cfi.c s390_initreg.c \
s390_unwind.c
-libebl_s390_pic_a_SOURCES = $(s390_SRCS)
-am_libebl_s390_pic_a_OBJECTS = $(s390_SRCS:.c=.os)
tilegx_SRCS = tilegx_init.c tilegx_symbol.c tilegx_regs.c \
tilegx_retval.c tilegx_corenote.c
-libebl_tilegx_pic_a_SOURCES = $(tilegx_SRCS)
-am_libebl_tilegx_pic_a_OBJECTS = $(tilegx_SRCS:.c=.os)
m68k_SRCS = m68k_init.c m68k_symbol.c m68k_regs.c \
m68k_retval.c m68k_corenote.c m68k_cfi.c m68k_initreg.c
-libebl_m68k_pic_a_SOURCES = $(m68k_SRCS)
-am_libebl_m68k_pic_a_OBJECTS = $(m68k_SRCS:.c=.os)
# m68k prstatus core notes are described by a packed structure
# which has not naturally aligned fields. Since we don't access
@@ -154,52 +91,23 @@ am_libebl_m68k_pic_a_OBJECTS = $(m68k_SRCS:.c=.os)
m68k_corenote_no_Wpacked_not_aligned = yes
bpf_SRCS = bpf_init.c bpf_regs.c bpf_symbol.c
-cpu_bpf = ../libcpu/libcpu_bpf.a
-libebl_bpf_pic_a_SOURCES = $(bpf_SRCS)
-am_libebl_bpf_pic_a_OBJECTS = $(bpf_SRCS:.c=.os)
riscv_SRCS = riscv_init.c riscv_symbol.c riscv_cfi.c riscv_regs.c \
riscv_initreg.c riscv_corenote.c riscv64_corenote.c riscv_retval.c
-libebl_riscv_pic_a_SOURCES = $(riscv_SRCS)
-am_libebl_riscv_pic_a_OBJECTS = $(riscv_SRCS:.c=.os)
csky_SRCS = csky_attrs.c csky_init.c csky_symbol.c csky_cfi.c \
csky_regs.c csky_initreg.c csky_corenote.c
-libebl_csky_pic_a_SOURCES = $(csky_SRCS)
-am_libebl_csky_pic_a_OBJECTS = $(csky_SRCS:.c=.os)
-
-libebl_%.so libebl_%.map: libebl_%_pic.a $(libelf) $(libdw) $(libeu)
- @rm -f $(@:.so=.map)
- $(AM_V_at)echo 'ELFUTILS_$(PACKAGE_VERSION) { global: $*_init; local: *; };' \
- > $(@:.so=.map)
- $(AM_V_CCLD)$(LINK) $(dso_LDFLAGS) -o $(@:.map=.so) \
- -Wl,--whole-archive $< $(cpu_$*) -Wl,--no-whole-archive \
- -Wl,--version-script,$(@:.so=.map),--no-undefined \
- -Wl,--as-needed $(libelf) $(libdw) $(libeu)
- @$(textrel_check)
-
-libebl_i386.so: $(cpu_i386)
-libebl_x86_64.so: $(cpu_x86_64)
-libebl_bpf.so: $(cpu_bpf)
-
-install: install-am install-ebl-modules
-install-ebl-modules:
- $(mkinstalldirs) $(DESTDIR)$(libdir)/$(LIBEBL_SUBDIR)
- for m in $(modules); do \
- $(INSTALL_PROGRAM) libebl_$${m}.so $(DESTDIR)$(libdir)/$(LIBEBL_SUBDIR)/libebl_$${m}-$(PACKAGE_VERSION).so; \
- ln -fs libebl_$${m}-$(PACKAGE_VERSION).so $(DESTDIR)$(libdir)/$(LIBEBL_SUBDIR)/libebl_$${m}.so; \
- done
-
-uninstall: uninstall-am
- for m in $(modules); do \
- rm -f $(DESTDIR)$(libdir)/$(LIBEBL_SUBDIR)/libebl_$${m}-$(PACKAGE_VERSION).so; \
- rm -f $(DESTDIR)$(libdir)/$(LIBEBL_SUBDIR)/libebl_$${m}.so; \
- done
- rmdir --ignore-fail-on-non-empty $(DESTDIR)$(libdir)/$(LIBEBL_SUBDIR)
+
+libebl_backends_a_CFLAGS = -fPIC $(AM_CFLAGS)
+libebl_backends_a_SOURCES = $(i386_SRCS) $(x86_64_SRCS) \
+ $(ia64_SRCS) $(aarch64_SRCS) $(ppc_SRCS) \
+ $(ppc64_SRCS) $(s390_SRCS) \
+ $(bpf_SRCS)
+
+libebl_backends_pic_a_SOURCES =
+am_libebl_backends_pic_a_OBJECTS = $(libebl_backends_a_SOURCES:.c=.os)
noinst_HEADERS = libebl_CPU.h common-reloc.c linux-core-note.c x86_corenote.c
-EXTRA_DIST = $(foreach m,$(modules),$($(m)_SRCS)) $(modules:=_reloc.def)
+EXTRA_DIST = $(modules:=_reloc.def)
-CLEANFILES += $(foreach m,$(modules),\
- libebl_$(m).map libebl_$(m).so \
- $(am_libebl_$(m)_pic_a_OBJECTS))
+MOSTLYCLEANFILES = $(am_libebl_backends_pic_a_OBJECTS)
diff --git a/backends/riscv_init.c b/backends/riscv_init.c
index 9aaec9ce..9be5c6f2 100644
--- a/backends/riscv_init.c
+++ b/backends/riscv_init.c
@@ -58,6 +58,7 @@ riscv_init (Elf *elf,
HOOK (eh, reloc_simple_type);
HOOK (eh, register_info);
HOOK (eh, abi_cfi);
+ HOOK (eh, disasm);
/* gcc/config/ #define DWARF_FRAME_REGISTERS. */
eh->frame_nregs = 66;
HOOK (eh, check_special_symbol);
diff --git a/config/ChangeLog b/config/ChangeLog
index 65658118..16379207 100644
--- a/config/ChangeLog
+++ b/config/ChangeLog
@@ -1,3 +1,42 @@
+2019-11-26 Mark Wielaard <mark@klomp.org>
+
+ * elfutils.spec.in: Remove Group tags, remove fedora and rhel
+ specifics, introduce elfutils-libs subpackage, move Requires
+ and BuildRequires around for new subpackage, remove dot at end
+ of Summary tags, add post/postun ldconfig for libs and
+ debuginfod-client, remove default defattr(-,root,root) for file
+ lists, order binaries by name.
+
+2019-11-25 Mark Wielaard <mark@klomp.org>
+
+ * elfutils.spec.in: Add BuildRequires curl.
+
+2019-10-28 Frank Ch. Eigler <fche@redhat.com>
+
+ * eu.am (AM_CXXFLAGS): Clone & amend AM_CFLAGS for c++11 code.
+ * debuginfod.service, debuginfod.sysconfig: New files: systemd.
+ * Makefile.am: Install them.
+ * elfutils.spec.in: Add debuginfod and debuginfod-client subrpms.
+
+2019-08-29 Mark Wielaard <mark@klomp.org>
+
+ * elfutils.spec.in (%description devel): Remove libebl text.
+ (%install): Don't touch backend lib.*.so* files.
+ (%files): Remove backends dir and so files.
+ (%files devel): Remove libebl.h and libebl.a
+
+2019-08-28 Mark Wielaard <mark@klomp.org>
+
+ * elfutils.spec.in (License): Add GFDL.
+ (%install): Correct sub-shell syntax, use (), not {}.
+ (%files): Add man1/eu-*.1*.
+ Add eu-stack. Add COPYING-GFDL.
+ (%files libelf-devel): Add man3/elf_*.3*.
+
+2019-08-14 Dmitry V. Levin <ldv@altlinux.org>
+
+ * elfutils.spec.in (%files): Add %{_bindir}/eu-elfclassify.
+
2019-08-13 Mark Wielaard <mark@klomp.org>
* Makefile.am (elfutils.spec.in): Use git --get user.name and
diff --git a/config/Makefile.am b/config/Makefile.am
index 9d292cee..55e895ac 100644
--- a/config/Makefile.am
+++ b/config/Makefile.am
@@ -28,11 +28,12 @@
## the GNU Lesser General Public License along with this program. If
## not, see <http://www.gnu.org/licenses/>.
##
-EXTRA_DIST = elfutils.spec.in known-dwarf.awk 10-default-yama-scope.conf
- libelf.pc.in libdw.pc.in
+EXTRA_DIST = elfutils.spec.in known-dwarf.awk 10-default-yama-scope.conf \
+ libelf.pc.in libdw.pc.in libdebuginfod.pc.in \
+ debuginfod.service debuginfod.sysconfig
pkgconfigdir = $(libdir)/pkgconfig
-pkgconfig_DATA = libelf.pc libdw.pc
+pkgconfig_DATA = libelf.pc libdw.pc libdebuginfod.pc
if MAINTAINER_MODE
$(srcdir)/elfutils.spec.in: $(top_srcdir)/NEWS
diff --git a/config/debuginfod.service b/config/debuginfod.service
new file mode 100644
index 00000000..d8ef072b
--- /dev/null
+++ b/config/debuginfod.service
@@ -0,0 +1,15 @@
+[Unit]
+Description=elfutils debuginfo-over-http server
+Documentation=http://elfutils.org/
+After=network.target
+
+[Service]
+EnvironmentFile=/etc/sysconfig/debuginfod
+User=debuginfod
+Group=debuginfod
+#CacheDirectory=debuginfod
+ExecStart=/usr/bin/debuginfod -d /var/cache/debuginfod/debuginfod.sqlite -p $DEBUGINFOD_PORT $DEBUGINFOD_VERBOSE $DEBUGINFOD_PRAGMAS $DEBUGINFOD_PATHS
+TimeoutStopSec=10
+
+[Install]
+WantedBy=multi-user.target
diff --git a/config/debuginfod.sysconfig b/config/debuginfod.sysconfig
new file mode 100644
index 00000000..c56bcf3f
--- /dev/null
+++ b/config/debuginfod.sysconfig
@@ -0,0 +1,14 @@
+#
+DEBUGINFOD_PORT="8002"
+#DEBUGINFOD_VERBOSE="-v"
+
+# some common places to find trustworthy ELF/DWARF files and RPMs
+DEBUGINFOD_PATHS="-t43200 -F -R /usr/lib/debug /usr/bin /usr/libexec /usr/sbin /usr/lib /usr/lib64 /var/cache/yum /var/cache/dnf"
+
+# prefer reliability/durability over performance
+#DEBUGINFOD_PRAGMAS="-D 'pragma synchronous=full;'"
+
+# upstream debuginfods
+#DEBUGINFOD_URLS="http://secondhost:8002 http://thirdhost:8002"
+#DEBUGINFOD_TIMEOUT="5"
+#DEBUGINFOD_CACHE_DIR=""
diff --git a/config/elfutils.spec.in b/config/elfutils.spec.in
index 19b4229e..46779340 100644
--- a/config/elfutils.spec.in
+++ b/config/elfutils.spec.in
@@ -4,71 +4,94 @@ Name: elfutils
Version: @PACKAGE_VERSION@
Release: 1
URL: http://elfutils.org/
-License: GPLv3+ and (GPLv2+ or LGPLv3+)
-Group: Development/Tools
+License: GPLv3+ and (GPLv2+ or LGPLv3+) and GFDL
Source: ftp://sourceware.org/pub/elfutils/%{version}/elfutils-%{version}.tar.bz2
-Obsoletes: libelf libelf-devel
+
Requires: elfutils-libelf = %{version}-%{release}
-Requires: glibc >= 2.7
-Requires: libstdc++
-Requires: default-yama-scope
+Requires: elfutils-libs = %{version}-%{release}
+# Can be a Recommends if rpm supports that
+Requires: elfutils-debuginfod-client
-# ExcludeArch: xxx
+BuildRequires: gcc
+# For libstdc++ demangle support
+BuildRequires: gcc-c++
-BuildRoot: %{_tmppath}/%{name}-root
-BuildRequires: gcc >= 4.1.2-33
-BuildRequires: glibc >= 2.7
-BuildRequires: bison >= 1.875
-BuildRequires: flex >= 2.5.4a
-BuildRequires: bzip2
-BuildRequires: m4
BuildRequires: gettext
+BuildRequires: bison
+BuildRequires: flex
+
+# Compression support
BuildRequires: zlib-devel
BuildRequires: bzip2-devel
BuildRequires: xz-devel
-BuildRequires: gcc-c++
+
+# For debuginfod
+BuildRequires: pkgconfig(libmicrohttpd) >= 0.9.33
+BuildRequires: pkgconfig(libcurl) >= 7.29.0
+BuildRequires: pkgconfig(sqlite3) >= 3.7.17
+BuildRequires: pkgconfig(libarchive) >= 3.1.2
+
+# For tests need to bunzip2 test files.
+BuildRequires: bzip2
+# For the run-debuginfod-find.sh test case in %check for /usr/sbin/ss
+BuildRequires: iproute
+BuildRequires: curl
%define _gnu %{nil}
%define _programprefix eu-
%description
-
Elfutils is a collection of utilities, including stack (to show
backtraces), nm (for listing symbols from object files), size
(for listing the section sizes of an object or archive file),
strip (for discarding symbols), readelf (to see the raw ELF file
structures), elflint (to check for well-formed ELF files) and
elfcompress (to compress or decompress ELF sections).
-Also included are helper libraries which implement DWARF, ELF,
-and machine-specific ELF handling and process introspection.
+
+%package libs
+Summary: Libraries to handle compiled objects
+License: GPLv2+ or LGPLv3+
+Requires: elfutils-libelf = %{version}-%{release}
+Requires: default-yama-scope
+# Can be a Recommends if rpm supports that
+Requires: elfutils-debuginfod-client
+
+%description libs
+The elfutils-libs package contains libraries which implement DWARF, ELF,
+and machine-specific ELF handling and process introspection. These
+libraries are used by the programs in the elfutils package. The
+elfutils-devel package enables building other programs using these
+libraries.
%package devel
-Summary: Development libraries to handle compiled objects.
-Group: Development/Tools
+Summary: Development libraries to handle compiled objects
License: GPLv2+ or LGPLv3+
-Requires: elfutils = %{version}-%{release}
+Requires: elfutils-libs = %{version}-%{release}
Requires: elfutils-libelf-devel = %{version}-%{release}
+%if 0%{?rhel} >= 8 || 0%{?fedora} >= 20
+Recommends: elfutils-debuginfod-client-devel
+%else
+Requires: elfutils-debuginfod-client-devel
+%endif
%description devel
The elfutils-devel package contains the libraries to create
-applications for handling compiled objects. libebl provides some
-higher-level ELF access functionality. libdw provides access to
-the DWARF debugging information. libasm provides a programmable
+applications for handling compiled objects. libdw provides access
+to the DWARF debugging information. libasm provides a programmable
assembler interface.
%package devel-static
-Summary: Static archives to handle compiled objects.
-Group: Development/Tools
+Summary: Static archives to handle compiled objects
License: GPLv2+ or LGPLv3+
Requires: elfutils-devel = %{version}-%{release}
+Requires: elfutils-libelf-devel-static = %{version}-%{release}
%description devel-static
The elfutils-devel-static archive contains the static archives
with the code the handle compiled objects.
%package libelf
-Summary: Library to read and write ELF files.
-Group: Development/Tools
+Summary: Library to read and write ELF files
License: GPLv2+ or LGPLv3+
%description libelf
@@ -79,7 +102,6 @@ elfutils package use it also to generate new ELF files.
%package libelf-devel
Summary: Development support for libelf
-Group: Development/Tools
License: GPLv2+ or LGPLv3+
Requires: elfutils-libelf = %{version}-%{release}
Conflicts: libelf-devel
@@ -92,7 +114,6 @@ different sections of an ELF file.
%package libelf-devel-static
Summary: Static archive of libelf
-Group: Development/Tools
License: GPLv2+ or LGPLv3+
Requires: elfutils-libelf-devel = %{version}-%{release}
Conflicts: libelf-devel
@@ -103,7 +124,6 @@ for libelf.
%package default-yama-scope
Summary: Default yama attach scope sysctl setting
-Group: Development/Tools
License: GPLv2+ or LGPLv3+
Provides: default-yama-scope
BuildArch: noarch
@@ -117,86 +137,127 @@ interprocess services, communication and introspection
(like synchronisation, signaling, debugging, tracing and
profiling) of processes.
+%package debuginfod-client
+Summary: Library and command line client for build-id HTTP ELF/DWARF server
+License: GPLv3+ and (GPLv2+ or LGPLv3+)
+
+%package debuginfod-client-devel
+Summary: Libraries and headers to build debuginfod client applications
+License: GPLv2+ or LGPLv3+
+
+%package debuginfod
+Summary: HTTP ELF/DWARF file server addressed by build-id
+License: GPLv3+
+BuildRequires: systemd
+Requires(post): systemd
+Requires(preun): systemd
+Requires(postun): systemd
+Requires(pre): shadow-utils
+# For /usr/bin/cpio2rpm
+Requires: rpm
+
+%description debuginfod-client
+The elfutils-debuginfod-client package contains shared libraries
+dynamically loaded from -ldw, which use a debuginfod service
+to look up debuginfo and associated data. Also includes a
+command-line frontend.
+
+%description debuginfod-client-devel
+The elfutils-debuginfod-client-devel package contains the libraries
+to create applications to use the debuginfod service.
+
+%description debuginfod
+The elfutils-debuginfod package contains the debuginfod binary
+and control files for a service that can provide ELF/DWARF
+files to remote clients, based on build-id identification.
+The ELF/DWARF file searching functions in libdwfl can query
+such servers to download those files on demand.
+
%prep
%setup -q
%build
-%configure --program-prefix=%{_programprefix}
-make
+%configure --program-prefix=%{_programprefix} --enable-debuginfod
+make -s %{?_smp_mflags}
%install
rm -rf ${RPM_BUILD_ROOT}
mkdir -p ${RPM_BUILD_ROOT}%{_prefix}
-%makeinstall
+%make_install
chmod +x ${RPM_BUILD_ROOT}%{_prefix}/%{_lib}/lib*.so*
-chmod +x ${RPM_BUILD_ROOT}%{_prefix}/%{_lib}/elfutils/lib*.so*
# XXX Nuke unpackaged files
-{ cd ${RPM_BUILD_ROOT}
+( cd ${RPM_BUILD_ROOT}
rm -f .%{_includedir}/elfutils/libasm.h
rm -f .%{_libdir}/libasm.so
rm -f .%{_libdir}/libasm.a
-}
+)
install -Dm0644 config/10-default-yama-scope.conf ${RPM_BUILD_ROOT}%{_sysctldir}/10-default-yama-scope.conf
-%check
-make check
-
-%clean
-rm -rf ${RPM_BUILD_ROOT}
+install -Dm0644 config/debuginfod.service ${RPM_BUILD_ROOT}%{_unitdir}/debuginfod.service
+install -Dm0644 config/debuginfod.sysconfig ${RPM_BUILD_ROOT}%{_sysconfdir}/sysconfig/debuginfod
+mkdir -p ${RPM_BUILD_ROOT}%{_localstatedir}/cache/debuginfod
+touch ${RPM_BUILD_ROOT}%{_localstatedir}/cache/debuginfod/debuginfod.sqlite
-%post -p /sbin/ldconfig
-
-%postun -p /sbin/ldconfig
+%check
+make -s %{?_smp_mflags} check
+%post libs -p /sbin/ldconfig
+%postun libs -p /sbin/ldconfig
%post libelf -p /sbin/ldconfig
-
%postun libelf -p /sbin/ldconfig
+%post debuginfod-client -p /sbin/ldconfig
+%postun debuginfod-client -p /sbin/ldconfig
%post default-yama-scope
+# Due to circular dependencies might not be installed yet, so double check.
+# (systemd -> elfutils-libs -> default-yama-scope -> systemd)
+if [ -x /usr/lib/systemd/systemd-sysctl ] ; then
%sysctl_apply 10-default-yama-scope.conf
+fi
%files
-%defattr(-,root,root)
-%doc COPYING COPYING-GPLV2 COPYING-LGPLV3 README TODO CONTRIBUTING
+%license COPYING COPYING-GPLV2 COPYING-LGPLV3 doc/COPYING-GFDL
+%doc README TODO CONTRIBUTING
+%{_bindir}/eu-addr2line
+%{_bindir}/eu-ar
+%{_bindir}/eu-elfclassify
+%{_bindir}/eu-elfcmp
+%{_bindir}/eu-elfcompress
%{_bindir}/eu-elflint
+%{_bindir}/eu-findtextrel
+%{_bindir}/eu-make-debug-archive
%{_bindir}/eu-nm
+%{_bindir}/eu-objdump
+%{_bindir}/eu-ranlib
%{_bindir}/eu-readelf
%{_bindir}/eu-size
-%{_bindir}/eu-strip
-%{_bindir}/eu-findtextrel
-%{_bindir}/eu-addr2line
-%{_bindir}/eu-elfcmp
-%{_bindir}/eu-ranlib
+%{_bindir}/eu-stack
%{_bindir}/eu-strings
-%{_bindir}/eu-objdump
-%{_bindir}/eu-ar
+%{_bindir}/eu-strip
%{_bindir}/eu-unstrip
-%{_bindir}/eu-make-debug-archive
-%{_bindir}/eu-elfcompress
+%{_mandir}/man1/eu-*.1*
+
+%files libs
+%license COPYING-GPLV2 COPYING-LGPLV3
%{_libdir}/libasm-%{version}.so
%{_libdir}/libdw-%{version}.so
%{_libdir}/libasm.so.*
%{_libdir}/libdw.so.*
-%dir %{_libdir}/elfutils
-%{_libdir}/elfutils/lib*.so
%files devel
-%defattr(-,root,root)
%{_includedir}/dwarf.h
%dir %{_includedir}/elfutils
%{_includedir}/elfutils/elf-knowledge.h
%{_includedir}/elfutils/known-dwarf.h
#%{_includedir}/elfutils/libasm.h
-%{_includedir}/elfutils/libebl.h
%{_includedir}/elfutils/libdw.h
%{_includedir}/elfutils/libdwfl.h
%{_includedir}/elfutils/libdwelf.h
%{_includedir}/elfutils/version.h
-%{_libdir}/libebl.a
#%{_libdir}/libasm.so
%{_libdir}/libdw.so
%{_libdir}/pkgconfig/libdw.pc
@@ -206,19 +267,18 @@ rm -rf ${RPM_BUILD_ROOT}
#%{_libdir}/libasm.a
%files libelf
-%defattr(-,root,root)
+%license COPYING-GPLV2 COPYING-LGPLV3
%{_libdir}/libelf-%{version}.so
%{_libdir}/libelf.so.*
%{_datadir}/locale/*/LC_MESSAGES/elfutils.mo
%files libelf-devel
-%defattr(-,root,root)
%{_includedir}/libelf.h
%{_includedir}/gelf.h
%{_includedir}/nlist.h
-%{_includedir}/elfutils/version.h
%{_libdir}/libelf.so
%{_libdir}/pkgconfig/libelf.pc
+%{_mandir}/man3/elf_*.3*
%files libelf-devel-static
%{_libdir}/libelf.a
@@ -226,7 +286,59 @@ rm -rf ${RPM_BUILD_ROOT}
%files default-yama-scope
%{_sysctldir}/10-default-yama-scope.conf
+%files debuginfod-client
+%defattr(-,root,root)
+%{_libdir}/libdebuginfod-%{version}.so
+%{_bindir}/debuginfod-find
+%{_mandir}/man1/debuginfod-find.1*
+
+%files debuginfod-client-devel
+%defattr(-,root,root)
+%{_libdir}/pkgconfig/libdebuginfod.pc
+%{_mandir}/man3/debuginfod_*.3*
+%{_includedir}/elfutils/debuginfod.h
+%{_libdir}/libdebuginfod.so*
+
+%files debuginfod
+%defattr(-,root,root)
+%{_bindir}/debuginfod
+%config(noreplace) %verify(not md5 size mtime) %{_sysconfdir}/sysconfig/debuginfod
+%{_unitdir}/debuginfod.service
+%{_sysconfdir}/sysconfig/debuginfod
+%{_mandir}/man8/debuginfod.8*
+
+%dir %attr(0700,debuginfod,debuginfod) %{_localstatedir}/cache/debuginfod
+%verify(not md5 size mtime) %attr(0600,debuginfod,debuginfod) %{_localstatedir}/cache/debuginfod/debuginfod.sqlite
+
+%pre debuginfod
+getent group debuginfod >/dev/null || groupadd -r debuginfod
+getent passwd debuginfod >/dev/null || \
+ useradd -r -g debuginfod -d /var/cache/debuginfod -s /sbin/nologin \
+ -c "elfutils debuginfo server" debuginfod
+exit 0
+
+%post debuginfod
+%systemd_post debuginfod.service
+
+%postun debuginfod
+%systemd_postun_with_restart debuginfod.service
+
%changelog
+* Tue Nov 26 2019 Mark Wielaard <mark@klomp.org> 0.178-1
+- debuginfod: New server, client tool and library to index and fetch
+ ELF/DWARF files addressed by build-id through HTTP.
+- doc: There are now some manual pages for functions and tools.
+- backends: The libebl libraries are no longer dynamically loaded
+ through dlopen, but are now compiled into libdw.so directly.
+- readelf: -n, --notes now takes an optional "SECTION" argument.
+ -p and -x now also handle section numbers.
+ New option --dyn-sym to show just the dynamic symbol table.
+- libcpu: Add RISC-V disassembler.
+- libdw: Abbrevs and DIEs can now be read concurrently by multiple
+ threads through the same Dwarf handle.
+- libdwfl: Will try to use debuginfod when installed as fallback to
+ retrieve ELF and DWARF debug data files by build-id.
+
* Tue Aug 13 2019 Mark Wielaard <mark@klomp.org> 0.177-1
- elfclassify: New tool to analyze ELF objects.
- readelf: Print DW_AT_data_member_location as decimal offset.
diff --git a/config/eu.am b/config/eu.am
index 82acda3a..6c3c444f 100644
--- a/config/eu.am
+++ b/config/eu.am
@@ -79,6 +79,16 @@ AM_CFLAGS = -std=gnu99 -Wall -Wshadow -Wformat=2 \
$(if $($(*F)_no_Wpacked_not_aligned),-Wno-packed-not-aligned,) \
$($(*F)_CFLAGS)
+AM_CXXFLAGS = -std=c++11 -Wall -Wshadow \
+ -Wtrampolines \
+ $(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,) \
+ $($(*F)_CXXFLAGS)
+
COMPILE.os = $(filter-out -fprofile-arcs -ftest-coverage, $(COMPILE))
DEFS.os = -DPIC -DSHARED
diff --git a/config/libdebuginfod.pc.in b/config/libdebuginfod.pc.in
new file mode 100644
index 00000000..46722a76
--- /dev/null
+++ b/config/libdebuginfod.pc.in
@@ -0,0 +1,12 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: debuginfod
+Description: elfutils library to query debuginfo files from debuginfod servers
+Version: @VERSION@
+URL: http://elfutils.org/
+
+Libs: -L${libdir} -ldebuginfod
+Cflags: -I${includedir}
diff --git a/configure.ac b/configure.ac
index 3afc51ea..4ec5dea2 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,7 +1,7 @@
dnl Process this file with autoconf to produce a configure script.
dnl Configure input file for elfutils. -*-autoconf-*-
dnl
-dnl Copyright (C) 1996-2018 Red Hat, Inc.
+dnl Copyright (C) 1996-2019 Red Hat, Inc.
dnl
dnl This file is part of elfutils.
dnl
@@ -17,7 +17,7 @@ dnl GNU General Public License for more details.
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.177],[https://sourceware.org/bugzilla],[elfutils],[http://elfutils.org/])
+AC_INIT([elfutils],[0.178],[https://sourceware.org/bugzilla],[elfutils],[http://elfutils.org/])
dnl Workaround for older autoconf < 2.64
m4_ifndef([AC_PACKAGE_URL],
@@ -66,6 +66,8 @@ AC_CONFIG_FILES([m4/Makefile])
dnl The RPM spec file. We substitute a few values in the file.
AC_CONFIG_FILES([elfutils.spec:config/elfutils.spec.in])
+dnl debuginfo-server client & server parts.
+AC_CONFIG_FILES([debuginfod/Makefile])
AC_CANONICAL_HOST
@@ -232,6 +234,18 @@ LDFLAGS="$save_LDFLAGS"])
AS_IF([test "x$ac_cv_tls" != xyes],
AC_MSG_ERROR([__thread support required]))
+dnl Before 4.9 gcc doesn't ship stdatomic.h, but the nessesary atomics are
+dnl available by (at least) 4.7. So if the system doesn't have a stdatomic.h we
+dnl fall back on one copied from FreeBSD that handles the difference.
+AC_CACHE_CHECK([whether gcc provides stdatomic.h], ac_cv_has_stdatomic,
+ [AC_COMPILE_IFELSE([AC_LANG_SOURCE([[#include <stdatomic.h>]])],
+ ac_cv_has_stdatomic=yes, ac_cv_has_stdatomic=no)])
+AM_CONDITIONAL(HAVE_STDATOMIC_H, test "x$ac_cv_has_stdatomic" = xyes)
+AS_IF([test "x$ac_cv_has_stdatomic" = xyes], [AC_DEFINE(HAVE_STDATOMIC_H)])
+
+AH_TEMPLATE([HAVE_STDATOMIC_H], [Define to 1 if `stdatomic.h` is provided by the
+ system, 0 otherwise.])
+
dnl This test must come as early as possible after the compiler configuration
dnl tests, because the choice of the file model can (in principle) affect
dnl whether functions and headers are available, whether they work, etc.
@@ -291,6 +305,7 @@ AC_ARG_ENABLE([gcov],
AS_HELP_STRING([--enable-gcov],[build binaries with gcov support]), [use_gcov=$enableval], [use_gcov=no])
if test "$use_gcov" = yes; then
CFLAGS="$CFLAGS -fprofile-arcs -ftest-coverage"
+ CXXFLAGS="$CXXFLAGS -fprofile-arcs -ftest-coverage"
LDFLAGS="$LDFLAGS -fprofile-arcs"
fi
AM_CONDITIONAL(GCOV, test "$use_gcov" = yes)
@@ -329,6 +344,35 @@ if test "$use_valgrind" = yes; then
fi
AM_CONDITIONAL(USE_VALGRIND, test "$use_valgrind" = yes)
+AC_ARG_WITH([valgrind],
+AS_HELP_STRING([--with-valgrind],[include directory for Valgrind headers]),
+[with_valgrind_headers=$withval], [with_valgrind_headers=no])
+if test "x$with_valgrind_headers" != xno; then
+ save_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS -I$with_valgrind_headers"
+ AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
+ #include <valgrind/valgrind.h>
+ int main() { return 0; }
+ ]])], [ HAVE_VALGRIND_HEADERS="yes"
+ CFLAGS="$save_CFLAGS -I$with_valgrind_headers" ],
+ [ AC_MSG_ERROR([invalid valgrind include directory: $with_valgrind_headers]) ])
+fi
+
+AC_ARG_ENABLE([valgrind-annotations],
+AS_HELP_STRING([--enable-valgrind-annotations],[insert extra annotations for better valgrind support]),
+[use_vg_annotations=$enableval], [use_vg_annotations=no])
+if test "$use_vg_annotations" = yes; then
+ if test "x$HAVE_VALGRIND_HEADERS" != "xyes"; then
+ AC_MSG_CHECKING([whether Valgrind headers are available])
+ AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
+ #include <valgrind/valgrind.h>
+ int main() { return 0; }
+ ]])], [ AC_MSG_RESULT([yes]) ],
+ [ AC_MSG_ERROR([valgrind annotations requested but no headers are available]) ])
+ fi
+fi
+AM_CONDITIONAL(USE_VG_ANNOTATIONS, test "$use_vg_annotations" = yes)
+
AC_ARG_ENABLE([install-elfh],
AS_HELP_STRING([--enable-install-elfh],[install elf.h in include dir]),
[install_elfh=$enableval], [install_elfh=no])
@@ -342,15 +386,6 @@ AS_HELP_STRING([--enable-tests-rpath],[build $ORIGIN-using rpath into tests]),
[tests_use_rpath=$enableval], [tests_use_rpath=no])
AM_CONDITIONAL(TESTS_RPATH, test "$tests_use_rpath" = yes)
-LIBEBL_SUBDIR="$PACKAGE"
-AC_ARG_ENABLE([libebl-subdir],
-AS_HELP_STRING([--enable-libebl-subdir=DIR],
-[install libebl_CPU modules in $(libdir)/DIR]), [dnl
-LIBEBL_SUBDIR="$enable_libebl_subdir"])
-AC_SUBST([LIBEBL_SUBDIR])
-AC_DEFINE_UNQUOTED(LIBEBL_SUBDIR, "$LIBEBL_SUBDIR")
-AH_TEMPLATE([LIBEBL_SUBDIR], [$libdir subdirectory containing libebl modules.])
-
dnl zlib is mandatory.
save_LIBS="$LIBS"
LIBS=
@@ -503,8 +538,7 @@ AC_SUBST([argp_LDADD])
dnl The directories with content.
dnl Documentation.
-dnl Commented out for now.
-dnl AC_CONFIG_FILES([doc/Makefile])
+AC_CONFIG_FILES([doc/Makefile])
dnl Support library.
AC_CONFIG_FILES([lib/Makefile])
@@ -542,7 +576,7 @@ AM_CONDITIONAL(STANDALONE, false)dnl Used in tests/Makefile.am, which see.
AC_CONFIG_FILES([tests/Makefile])
dnl pkgconfig files
-AC_CONFIG_FILES([config/libelf.pc config/libdw.pc])
+AC_CONFIG_FILES([config/libelf.pc config/libdw.pc config/libdebuginfod.pc])
# Get the definitions necessary to create the Makefiles in the po
# subdirectories. This is a small subset of the gettext rules.
@@ -591,7 +625,7 @@ esac
eu_version=$(( (eu_version + 999) / 1000 ))
dnl Unique ID for this build.
-MODVERSION="Build for ${LIBEBL_SUBDIR} ${eu_version} ${ac_cv_build}"
+MODVERSION="Build for ${eu_version} ${ac_cv_build}"
AC_SUBST([MODVERSION])
AC_DEFINE_UNQUOTED(MODVERSION, "$MODVERSION")
AH_TEMPLATE([MODVERSION], [Identifier for modules in the build.])
@@ -645,6 +679,30 @@ if test "$HAVE_BUNZIP2" = "no"; then
AC_MSG_WARN([No bunzip2, needed to run make check])
fi
+# Look for libmicrohttpd, libcurl, libarchive, sqlite for debuginfo server
+# minimum versions as per rhel7. Single --enable-* option arranges to build
+# both client and server.
+AC_ARG_ENABLE([debuginfod],AC_HELP_STRING([--enable-debuginfod], [Build debuginfod server and client]))
+AC_PROG_CXX
+AX_CXX_COMPILE_STDCXX(11, noext, optional)
+AS_IF([test "x$enable_debuginfod" != "xno"], [
+ AC_MSG_NOTICE([checking debuginfod dependencies, disable to skip])
+ enable_debuginfod=yes # presume success
+ PKG_PROG_PKG_CONFIG
+ if test "x$ac_cv_prog_ac_ct_CXX" = "x"; then enable_debuginfod=no; fi
+ PKG_CHECK_MODULES([libmicrohttpd],[libmicrohttpd >= 0.9.33],[],[enable_debuginfod=no])
+ PKG_CHECK_MODULES([libcurl],[libcurl >= 7.29.0],[],[enable_debuginfod=no])
+ PKG_CHECK_MODULES([sqlite3],[sqlite3 >= 3.7.17],[],[enable_debuginfod=no])
+ PKG_CHECK_MODULES([libarchive],[libarchive >= 3.1.2],[],[enable_debuginfod=no])
+ if test "x$enable_debuginfod" = "xno"; then
+ AC_MSG_ERROR([C++ compiler or dependencies not found, use --disable-debuginfod to disable.])
+ fi
+])
+
+AS_IF([test "x$enable_debuginfod" != "xno"],AC_DEFINE([ENABLE_DEBUGINFOD],[1],[Build debuginfod]))
+AM_CONDITIONAL([DEBUGINFOD],[test "x$enable_debuginfod" = "xyes"])
+
+
AC_OUTPUT
AC_MSG_NOTICE([
@@ -656,7 +714,6 @@ AC_MSG_NOTICE([
Program prefix ("eu-" recommended) : ${program_prefix}
Source code location : ${srcdir}
Maintainer mode : ${enable_maintainer_mode}
- libebl modules subdirectory : ${LIBEBL_SUBDIR}
build arch : ${ac_cv_build}
RECOMMENDED FEATURES (should all be yes)
@@ -674,6 +731,8 @@ AC_MSG_NOTICE([
OTHER FEATURES
Deterministic archives by default : ${default_ar_deterministic}
Native language support : ${USE_NLS}
+ Extra Valgrind annotations : ${use_vg_annotations}
+ Debuginfod client/server support : ${enable_debuginfod}
EXTRA TEST FEATURES (used with make check)
have bunzip2 installed (required) : ${HAVE_BUNZIP2}
diff --git a/debuginfod/ChangeLog b/debuginfod/ChangeLog
new file mode 100644
index 00000000..8aa29443
--- /dev/null
+++ b/debuginfod/ChangeLog
@@ -0,0 +1,70 @@
+2019-11-26 Mark Wielaard <mark@klomp.org>
+
+ * Makefile.am (BUILD_STATIC): Add needed libraries for libdw and
+ libdebuginfod.
+
+2019-11-25 Frank Ch. Eigler <fche@redhat.com>
+
+ * debuginfod.cxx (groom): Add a sqlite3_db_release_memory()
+ at the end of periodic grooming to try to shrink the process.
+
+2019-11-24 Mark Wielaard <mark@klomp.org>
+
+ * debuginfod.cxx (test_webapi_sleep): Removed.
+ (handler_cb): Don't check test_webapi_sleep and sleep.
+ (main): Don't set test_webapi_sleep.
+
+2019-11-24 Mark Wielaard <mark@klomp.org>
+
+ * debuginfod.cxx (add_metric): New function.
+ (scan_source_file_path): Record metrics for
+ found_executable_total, found_debuginfo_total and
+ found_sourcerefs_total.
+ (scan_source_rpm_path): Likewise.
+
+2019-11-07 Frank Ch. Eigler <fche@redhat.com>
+
+ * debuginfod.cxx: Add /metrics endpoint. Add numerous
+ calls to new functions inc_metric/set_metric to populate
+ threadsafe map containing stats. Add http content-type
+ response headers throughout.
+ (thread_main_*): Simplify counter/timer flow.
+ (main): Reorder web service shutdown to leave http running
+ as long as possible.
+ * debuginfod.8: Document it, add security caution.
+
+2019-11-06 Frank Ch. Eigler <fche@redhat.com>
+
+ * debuginfod.cxx: Add new -L (symlink-following) mode.
+ * debuginfod.8: Document it.
+
+2019-11-04 Frank Ch. Eigler <fche@redhat.com>
+
+ * debuginfo-client.c (debuginfod_set_progressfn): New function
+ for progress/interrupt callback.
+ (debuginfod_clean_cache, debuginfod_query_server): Call it.
+ * debuginfo.h: Declare it.
+ * debuginfod_set_progressfn.3, *_find_debuginfo.3: Document it.
+ * Makefile.am: Install it.
+ * libdebuginfod.map: Export it all under ELFUTILS_0.178 symversion.
+
+ * debuginfod-find.c: Add -v option to activate progress cb.
+ * debuginfod-find.1: Document it.
+ * debuginfod.cxx: Add $DEBUGINFOD_TEST_WEBAPI_SLEEP env var
+ to insert sleep in webapi callbacks, to help manual testing.
+
+2019-10-28 Frank Ch. Eigler <fche@redhat.com>
+
+ * debuginfod.cxx: New file: debuginfod server.
+ * debuginfod.8: New file: man page.
+ * Makefile.am: Build it.
+
+2019-10-28 Aaron Merey <amerey@redhat.com>
+
+ * debuginfod-client.c: New file: debuginfod client library.
+ * debuginfod.h: New file: header for same.
+ * libdebuginfod.map: New file: govern its solib exports.
+ * debuginfod-find.c: New file: command line frontend.
+ * debuginfod-find.1, debuginfod_find_source.3,
+ debuginfod_find_executable.3, debuginfod_find_debuginfo.3:
+ New man pages.
diff --git a/debuginfod/Makefile.am b/debuginfod/Makefile.am
new file mode 100644
index 00000000..7ae74e06
--- /dev/null
+++ b/debuginfod/Makefile.am
@@ -0,0 +1,119 @@
+## Makefile.am for libdebuginfod library subdirectory in elfutils.
+##
+## Process this file with automake to create Makefile.in
+##
+## Copyright (C) 2019 Red Hat, Inc.
+## This file is part of elfutils.
+##
+## This file is free software; you can redistribute it and/or modify
+## it under the terms of either
+##
+## * the GNU Lesser General Public License as published by the Free
+## Software Foundation; either version 3 of the License, or (at
+## your option) any later version
+##
+## or
+##
+## * the GNU General Public License as published by the Free
+## Software Foundation; either version 2 of the License, or (at
+## your option) any later version
+##
+## or both in parallel, as here.
+##
+## elfutils is distributed in the hope that it will be useful, but
+## WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+## General Public License for more details.
+##
+## You should have received copies of the GNU General Public License and
+## the GNU Lesser General Public License along with this program. If
+## not, see <http://www.gnu.org/licenses/>.
+##
+include $(top_srcdir)/config/eu.am
+AM_CPPFLAGS += -I$(srcdir) -I$(srcdir)/../libelf -I$(srcdir)/../libebl \
+ -I$(srcdir)/../libdw -I$(srcdir)/../libdwelf \
+ $(libmicrohttpd_CFLAGS) $(libcurl_CFLAGS) $(sqlite3_CFLAGS) \
+ $(libarchive_CFLAGS)
+VERSION = 1
+
+# Disable eu- prefixing for artifacts (binaries & man pages) in this
+# directory, since they do not conflict with binutils tools.
+program_prefix=
+program_transform_name = s,x,x,
+
+if BUILD_STATIC
+libasm = ../libasm/libasm.a
+libdw = ../libdw/libdw.a -lz $(zip_LIBS) $(libelf) $(libebl) -ldl -lpthread
+libelf = ../libelf/libelf.a -lz
+libdebuginfod = ./libdebuginfod.a $(libcurl_LIBS)
+else
+libasm = ../libasm/libasm.so
+libdw = ../libdw/libdw.so
+libelf = ../libelf/libelf.so
+libdebuginfod = ./libdebuginfod.so
+endif
+libebl = ../libebl/libebl.a
+libeu = ../lib/libeu.a
+
+AM_LDFLAGS = -Wl,-rpath-link,../libelf:../libdw:.
+
+bin_PROGRAMS = debuginfod debuginfod-find
+debuginfod_SOURCES = debuginfod.cxx
+debuginfod_LDADD = $(libdw) $(libelf) $(libeu) $(libdebuginfod) $(libmicrohttpd_LIBS) $(libcurl_LIBS) $(sqlite3_LIBS) $(libarchive_LIBS) -lpthread -ldl
+
+debuginfod_find_SOURCES = debuginfod-find.c
+debuginfod_find_LDADD = $(libeu) $(libdebuginfod)
+
+lib_LIBRARIES = libdebuginfod.a
+noinst_LIBRARIES = libdebuginfod_pic.a
+
+libdebuginfod_a_CFLAGS = -fPIC $(AM_CFLAGS)
+libdebuginfod_a_SOURCES = debuginfod-client.c
+libdebuginfod_pic_a_SOURCES = debuginfod-client.c
+am_libdebuginfod_pic_a_OBJECTS = $(libdebuginfod_a_SOURCES:.c=.os)
+
+pkginclude_HEADERS = debuginfod.h
+
+libdebuginfod_so_LIBS = libdebuginfod_pic.a
+libdebuginfod_so_LDLIBS = $(libcurl_LIBS)
+libdebuginfod.so$(EXEEXT): $(srcdir)/libdebuginfod.map $(libdebuginfod_so_LIBS)
+ $(AM_V_CCLD)$(LINK) $(dso_LDFLAGS) -o $@ \
+ -Wl,--soname,$@.$(VERSION) \
+ -Wl,--version-script,$<,--no-undefined \
+ -Wl,--whole-archive $(libdebuginfod_so_LIBS) -Wl,--no-whole-archive \
+ $(libdebuginfod_so_LDLIBS)
+ @$(textrel_check)
+ $(AM_V_at)ln -fs $@ $@.$(VERSION)
+
+install: install-am libdebuginfod.so
+ $(mkinstalldirs) $(DESTDIR)$(libdir)
+ $(INSTALL_PROGRAM) libdebuginfod.so $(DESTDIR)$(libdir)/libdebuginfod-$(PACKAGE_VERSION).so
+ ln -fs libdebuginfod-$(PACKAGE_VERSION).so $(DESTDIR)$(libdir)/libdebuginfod.so.$(VERSION)
+ ln -fs libdebuginfod.so.$(VERSION) $(DESTDIR)$(libdir)/libdebuginfod.so
+
+uninstall: uninstall-am
+ rm -f $(DESTDIR)$(libdir)/libdebuginfod-$(PACKAGE_VERSION).so
+ rm -f $(DESTDIR)$(libdir)/libdebuginfod.so.$(VERSION)
+ rm -f $(DESTDIR)$(libdir)/libdebuginfod.so
+ rmdir --ignore-fail-on-non-empty $(DESTDIR)$(includedir)/elfutils
+
+EXTRA_DIST = libdebuginfod.map
+MOSTLYCLEANFILES = $(am_libdebuginfod_pic_a_OBJECTS) libdebuginfod.so.$(VERSION)
+CLEANFILES += $(am_libdebuginfod_pic_a_OBJECTS) libdebuginfod.so
+
+# automake std-options override: arrange to pass LD_LIBRARY_PATH
+installcheck-binPROGRAMS: $(bin_PROGRAMS)
+ bad=0; pid=$$$$; list="$(bin_PROGRAMS)"; for p in $$list; do \
+ case ' $(AM_INSTALLCHECK_STD_OPTIONS_EXEMPT) ' in \
+ *" $$p "* | *" $(srcdir)/$$p "*) continue;; \
+ esac; \
+ f=`echo "$$p" | \
+ sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
+ for opt in --help --version; do \
+ if LD_LIBRARY_PATH=$(DESTDIR)$(libdir) \
+ $(DESTDIR)$(bindir)/$$f $$opt > c$${pid}_.out 2> c$${pid}_.err \
+ && test -n "`cat c$${pid}_.out`" \
+ && test -z "`cat c$${pid}_.err`"; then :; \
+ else echo "$$f does not support $$opt" 1>&2; bad=1; fi; \
+ done; \
+ done; rm -f c$${pid}_.???; exit $$bad
diff --git a/debuginfod/debuginfod-client.c b/debuginfod/debuginfod-client.c
new file mode 100644
index 00000000..6e62b86c
--- /dev/null
+++ b/debuginfod/debuginfod-client.c
@@ -0,0 +1,754 @@
+/* Retrieve ELF / DWARF / source files from the debuginfod.
+ Copyright (C) 2019 Red Hat, Inc.
+ This file is part of elfutils.
+
+ This file is free software; you can redistribute it and/or modify
+ it under the terms of either
+
+ * the GNU Lesser General Public License as published by the Free
+ Software Foundation; either version 3 of the License, or (at
+ your option) any later version
+
+ or
+
+ * the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at
+ your option) any later version
+
+ or both in parallel, as here.
+
+ elfutils is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received copies of the GNU General Public License and
+ the GNU Lesser General Public License along with this program. If
+ not, see <http://www.gnu.org/licenses/>. */
+
+
+/* cargo-cult from libdwfl linux-kernel-modules.c */
+/* In case we have a bad fts we include this before config.h because it
+ can't handle _FILE_OFFSET_BITS.
+ Everything we need here is fine if its declarations just come first.
+ Also, include sys/types.h before fts. On some systems fts.h is not self
+ contained. */
+#ifdef BAD_FTS
+ #include <sys/types.h>
+ #include <fts.h>
+#endif
+
+#include "config.h"
+#include "debuginfod.h"
+#include <assert.h>
+#include <dirent.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <unistd.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <fts.h>
+#include <string.h>
+#include <stdbool.h>
+#include <linux/limits.h>
+#include <time.h>
+#include <utime.h>
+#include <sys/syscall.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <curl/curl.h>
+
+/* If fts.h is included before config.h, its indirect inclusions may not
+ give us the right LFS aliases of these functions, so map them manually. */
+#ifdef BAD_FTS
+ #ifdef _FILE_OFFSET_BITS
+ #define open open64
+ #define fopen fopen64
+ #endif
+#else
+ #include <sys/types.h>
+ #include <fts.h>
+#endif
+
+struct debuginfod_client
+{
+ /* Progress/interrupt callback function. */
+ debuginfod_progressfn_t progressfn;
+
+ /* 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. */
+};
+
+/* The cache_clean_interval_s file within the debuginfod cache specifies
+ how frequently the cache should be cleaned. The file's st_mtime represents
+ the time of last cleaning. */
+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_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";
+static const time_t cache_default_max_unused_age_s = 604800; /* 1 week */
+
+/* Location of the cache of files downloaded from debuginfods.
+ 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_path_envvar = DEBUGINFOD_CACHE_PATH_ENV_VAR;
+
+/* URLs of debuginfods, separated by url_delim.
+ This env var must be set for debuginfod-client to run. */
+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.
+ This env var must be set for debuginfod-client to run. */
+static const char *server_timeout_envvar = DEBUGINFOD_TIMEOUT_ENV_VAR;
+static int server_timeout = 5;
+
+/* Data associated with a particular CURL easy handle. Passed to
+ the write callback. */
+struct handle_data
+{
+ /* Cache file to be written to in case query is successful. */
+ int fd;
+
+ /* URL queried by this handle. */
+ char url[PATH_MAX];
+
+ /* This handle. */
+ CURL *handle;
+
+ /* Pointer to handle that should write to fd. Initially points to NULL,
+ then points to the first handle that begins writing the target file
+ to the cache. Used to ensure that a file is not downloaded from
+ multiple servers unnecessarily. */
+ CURL **target_handle;
+};
+
+static size_t
+debuginfod_write_callback (char *ptr, size_t size, size_t nmemb, void *data)
+{
+ ssize_t count = size * nmemb;
+
+ struct handle_data *d = (struct handle_data*)data;
+
+ /* Indicate to other handles that they can abort their transfer. */
+ if (*d->target_handle == NULL)
+ *d->target_handle = d->handle;
+
+ /* If this handle isn't the target handle, abort transfer. */
+ if (*d->target_handle != d->handle)
+ return -1;
+
+ return (size_t) write(d->fd, (void*)ptr, count);
+}
+
+/* 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. */
+static int
+debuginfod_init_cache (char *cache_path, char *interval_path, char *maxage_path)
+{
+ struct stat st;
+
+ /* If the cache and config file already exist then we are done. */
+ if (stat(cache_path, &st) == 0 && stat(interval_path, &st) == 0)
+ return 0;
+
+ /* Create the cache and config files as necessary. */
+ if (stat(cache_path, &st) != 0 && mkdir(cache_path, 0777) < 0)
+ return -errno;
+
+ int fd = -1;
+
+ /* init cleaning interval config file. */
+ fd = open(interval_path, O_CREAT | O_RDWR, 0666);
+ if (fd < 0)
+ return -errno;
+
+ if (dprintf(fd, "%ld", cache_clean_default_interval_s) < 0)
+ return -errno;
+
+ /* init max age config file. */
+ if (stat(maxage_path, &st) != 0
+ && (fd = open(maxage_path, O_CREAT | O_RDWR, 0666)) < 0)
+ return -errno;
+
+ if (dprintf(fd, "%ld", cache_default_max_unused_age_s) < 0)
+ return -errno;
+
+ return 0;
+}
+
+
+/* Delete any files that have been unmodied for a period
+ longer than $DEBUGINFOD_CACHE_CLEAN_INTERVAL_S. */
+static int
+debuginfod_clean_cache(debuginfod_client *c,
+ char *cache_path, char *interval_path,
+ char *max_unused_path)
+{
+ 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;
+ }
+
+ /* Check timestamp of interval file to see whether cleaning is necessary. */
+ time_t clean_interval;
+ interval_file = fopen(interval_path, "r");
+ if (fscanf(interval_file, "%ld", &clean_interval) != 1)
+ clean_interval = cache_clean_default_interval_s;
+ fclose(interval_file);
+
+ 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;
+
+ char * const dirs[] = { cache_path, NULL, };
+
+ FTS *fts = fts_open(dirs, 0, NULL);
+ if (fts == NULL)
+ return -errno;
+
+ FTSENT *f;
+ long files = 0;
+ while ((f = fts_read(fts)) != NULL)
+ {
+ files++;
+ if (c->progressfn) /* inform/check progress callback */
+ if ((c->progressfn) (c, files, 0))
+ break;
+
+ 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);
+ break;
+
+ case FTS_DP:
+ /* Remove if empty. */
+ (void) rmdir (f->fts_path);
+ break;
+
+ default:
+ ;
+ }
+ }
+ fts_close(fts);
+
+ /* Update timestamp representing when the cache was last cleaned. */
+ utime (interval_path, NULL);
+ return 0;
+}
+
+
+#define MAX_BUILD_ID_BYTES 64
+
+
+/* Query each of the server URLs found in $DEBUGINFOD_URLS for the file
+ with the specified build-id, type (debuginfo, executable or source)
+ and filename. filename may be NULL. If found, return a file
+ descriptor for the target, otherwise return an error code.
+*/
+static int
+debuginfod_query_server (debuginfod_client *c,
+ const unsigned char *build_id,
+ int build_id_len,
+ const char *type,
+ const char *filename,
+ char **path)
+{
+ char *urls_envvar;
+ char *server_urls;
+ char cache_path[PATH_MAX];
+ char maxage_path[PATH_MAX*3]; /* These *3 multipliers are to shut up gcc -Wformat-truncation */
+ char interval_path[PATH_MAX*4];
+ char target_cache_dir[PATH_MAX*2];
+ char target_cache_path[PATH_MAX*4];
+ char target_cache_tmppath[PATH_MAX*5];
+ char suffix[PATH_MAX*2];
+ char build_id_bytes[MAX_BUILD_ID_BYTES * 2 + 1];
+
+ /* Copy lowercase hex representation of build_id into buf. */
+ if ((build_id_len >= MAX_BUILD_ID_BYTES) ||
+ (build_id_len == 0 &&
+ sizeof(build_id_bytes) > MAX_BUILD_ID_BYTES*2 + 1))
+ return -EINVAL;
+ if (build_id_len == 0) /* expect clean hexadecimal */
+ strcpy (build_id_bytes, (const char *) build_id);
+ else
+ for (int i = 0; i < build_id_len; i++)
+ sprintf(build_id_bytes + (i * 2), "%02x", build_id[i]);
+
+ if (filename != NULL)
+ {
+ if (filename[0] != '/') // must start with /
+ return -EINVAL;
+
+ /* copy the filename to suffix, s,/,#,g */
+ unsigned q = 0;
+ for (unsigned fi=0; q < PATH_MAX-1; fi++)
+ switch (filename[fi])
+ {
+ case '\0':
+ suffix[q] = '\0';
+ q = PATH_MAX-1; /* escape for loop too */
+ break;
+ case '/': /* escape / to prevent dir escape */
+ suffix[q++]='#';
+ suffix[q++]='#';
+ break;
+ case '#': /* escape # to prevent /# vs #/ collisions */
+ suffix[q++]='#';
+ suffix[q++]='_';
+ break;
+ default:
+ suffix[q++]=filename[fi];
+ }
+ suffix[q] = '\0';
+ /* If the DWARF filenames are super long, this could exceed
+ PATH_MAX and truncate/collide. Oh well, that'll teach
+ them! */
+ }
+ else
+ suffix[0] = '\0';
+
+ /* set paths needed to perform the query
+
+ example format
+ cache_path: $HOME/.debuginfod_cache
+ target_cache_dir: $HOME/.debuginfod_cache/0123abcd
+ target_cache_path: $HOME/.debuginfod_cache/0123abcd/debuginfo
+ target_cache_path: $HOME/.debuginfod_cache/0123abcd/source#PATH#TO#SOURCE ?
+ */
+
+ if (getenv(cache_path_envvar))
+ strcpy(cache_path, getenv(cache_path_envvar));
+ else
+ {
+ if (getenv("HOME"))
+ sprintf(cache_path, "%s/%s", getenv("HOME"), cache_default_name);
+ else
+ sprintf(cache_path, "/%s", cache_default_name);
+ }
+
+ /* avoid using snprintf here due to compiler warning. */
+ snprintf(target_cache_dir, sizeof(target_cache_dir), "%s/%s", cache_path, build_id_bytes);
+ snprintf(target_cache_path, sizeof(target_cache_path), "%s/%s%s", target_cache_dir, type, suffix);
+ snprintf(target_cache_tmppath, sizeof(target_cache_tmppath), "%s.XXXXXX", target_cache_path);
+
+ /* XXX combine these */
+ snprintf(interval_path, sizeof(interval_path), "%s/%s", cache_path, cache_clean_interval_filename);
+ snprintf(maxage_path, sizeof(maxage_path), "%s/%s", cache_path, cache_max_unused_age_filename);
+ int rc = debuginfod_init_cache(cache_path, interval_path, maxage_path);
+ if (rc != 0)
+ goto out;
+ rc = debuginfod_clean_cache(c, cache_path, interval_path, maxage_path);
+ if (rc != 0)
+ goto out;
+
+ /* If the target is already in the cache then we are done. */
+ int fd = open (target_cache_path, O_RDONLY);
+ if (fd >= 0)
+ {
+ /* Success!!!! */
+ if (path != NULL)
+ *path = strdup(target_cache_path);
+ return fd;
+ }
+
+
+ urls_envvar = getenv(server_urls_envvar);
+ if (urls_envvar == NULL || urls_envvar[0] == '\0')
+ {
+ rc = -ENOSYS;
+ goto out;
+ }
+
+ if (getenv(server_timeout_envvar))
+ server_timeout = atoi (getenv(server_timeout_envvar));
+
+ /* make a copy of the envvar so it can be safely modified. */
+ server_urls = strdup(urls_envvar);
+ if (server_urls == NULL)
+ {
+ rc = -ENOMEM;
+ goto out;
+ }
+ /* 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)
+ {
+ 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;
+ }
+
+ /* 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++;
+
+ /* 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;
+ struct handle_data *data = malloc(sizeof(struct handle_data) * num_urls);
+
+ /* Initalize handle_data with default values. */
+ for (int i = 0; i < num_urls; i++)
+ {
+ data[i].handle = NULL;
+ data[i].fd = -1;
+ }
+
+ CURLM *curlm = curl_multi_init();
+ if (curlm == NULL)
+ {
+ rc = -ENETUNREACH;
+ goto out0;
+ }
+ /* thereafter, goto out1 on error. */
+
+ 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++)
+ {
+ data[i].fd = fd;
+ data[i].target_handle = &target_handle;
+ data[i].handle = curl_easy_init();
+
+ 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";
+
+ if (filename) /* must start with / */
+ snprintf(data[i].url, PATH_MAX, "%s%s/%s/%s%s", server_url,
+ slashbuildid, build_id_bytes, type, filename);
+ else
+ snprintf(data[i].url, PATH_MAX, "%s%s/%s/%s", server_url,
+ slashbuildid, build_id_bytes, type);
+
+ curl_easy_setopt(data[i].handle, CURLOPT_URL, data[i].url);
+ curl_easy_setopt(data[i].handle,
+ CURLOPT_WRITEFUNCTION,
+ debuginfod_write_callback);
+ curl_easy_setopt(data[i].handle, CURLOPT_WRITEDATA, (void*)&data[i]);
+ curl_easy_setopt(data[i].handle, CURLOPT_TIMEOUT, (long) server_timeout);
+ 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_AUTOREFERER, (long) 1);
+ curl_easy_setopt(data[i].handle, CURLOPT_ACCEPT_ENCODING, "");
+ curl_easy_setopt(data[i].handle, CURLOPT_USERAGENT, (void*) PACKAGE_STRING);
+
+ curl_multi_add_handle(curlm, data[i].handle);
+ server_url = strtok_r(NULL, url_delim, &strtok_saveptr);
+ }
+
+ /* Query servers in parallel. */
+ int still_running;
+ long loops = 0;
+ do
+ {
+ CURLMcode curl_res;
+
+ if (c->progressfn) /* inform/check progress callback */
+ {
+ loops ++;
+ long pa = loops; /* default params for progress callback */
+ long pb = 0;
+ if (target_handle) /* we've committed to a server; report its download progress */
+ {
+#ifdef CURLINFO_SIZE_DOWNLOAD_T
+ curl_off_t dl;
+ curl_res = curl_easy_getinfo(target_handle,
+ CURLINFO_SIZE_DOWNLOAD_T,
+ &dl);
+ if (curl_res == 0 && dl >= 0)
+ pa = (dl > LONG_MAX ? LONG_MAX : (long)dl);
+#else
+ double dl;
+ curl_res = curl_easy_getinfo(target_handle,
+ CURLINFO_SIZE_DOWNLOAD,
+ &dl);
+ if (curl_res == 0)
+ pa = (dl > LONG_MAX ? LONG_MAX : (long)dl);
+#endif
+
+#ifdef CURLINFO_CURLINFO_CONTENT_LENGTH_DOWNLOAD_T
+ curl_off_t cl;
+ curl_res = curl_easy_getinfo(target_handle,
+ CURLINFO_CONTENT_LENGTH_DOWNLOAD_T,
+ &cl);
+ if (curl_res == 0 && cl >= 0)
+ pb = (cl > LONG_MAX ? LONG_MAX : (long)cl);
+#else
+ double cl;
+ curl_res = curl_easy_getinfo(target_handle,
+ CURLINFO_CONTENT_LENGTH_DOWNLOAD,
+ &cl);
+ if (curl_res == 0)
+ pb = (cl > LONG_MAX ? LONG_MAX : (long)cl);
+#endif
+ }
+
+ if ((*c->progressfn) (c, pa, pb))
+ break;
+ }
+
+ /* Wait 1 second, the minimum DEBUGINFOD_TIMEOUT. */
+ curl_multi_wait(curlm, NULL, 0, 1000, NULL);
+
+ /* If the target file has been found, abort the other queries. */
+ if (target_handle != NULL)
+ for (int i = 0; i < num_urls; i++)
+ if (data[i].handle != target_handle)
+ curl_multi_remove_handle(curlm, data[i].handle);
+
+ curl_res = curl_multi_perform(curlm, &still_running);
+ if (curl_res != CURLM_OK)
+ {
+ switch (curl_res)
+ {
+ case CURLM_CALL_MULTI_PERFORM: continue;
+ case CURLM_OUT_OF_MEMORY: rc = -ENOMEM; break;
+ default: rc = -ENETUNREACH; break;
+ }
+ goto out1;
+ }
+ } while (still_running);
+
+ /* Check whether a query was successful. If so, assign its handle
+ to verified_handle. */
+ int num_msg;
+ rc = -ENOENT;
+ CURL *verified_handle = NULL;
+ do
+ {
+ CURLMsg *msg;
+
+ msg = curl_multi_info_read(curlm, &num_msg);
+ if (msg != NULL && msg->msg == CURLMSG_DONE)
+ {
+ if (msg->data.result != CURLE_OK)
+ {
+ /* Unsucessful query, determine error code. */
+ switch (msg->data.result)
+ {
+ case CURLE_COULDNT_RESOLVE_HOST: rc = -EHOSTUNREACH; break; // no NXDOMAIN
+ case CURLE_URL_MALFORMAT: rc = -EINVAL; break;
+ case CURLE_COULDNT_CONNECT: rc = -ECONNREFUSED; break;
+ case CURLE_REMOTE_ACCESS_DENIED: rc = -EACCES; break;
+ case CURLE_WRITE_ERROR: rc = -EIO; break;
+ case CURLE_OUT_OF_MEMORY: rc = -ENOMEM; break;
+ case CURLE_TOO_MANY_REDIRECTS: rc = -EMLINK; break;
+ case CURLE_SEND_ERROR: rc = -ECONNRESET; break;
+ case CURLE_RECV_ERROR: rc = -ECONNRESET; break;
+ case CURLE_OPERATION_TIMEDOUT: rc = -ETIME; break;
+ default: rc = -ENOENT; break;
+ }
+ }
+ else
+ {
+ /* Query completed without an error. Confirm that the
+ response code is 200 and set verified_handle. */
+ long resp_code = 500;
+ CURLcode curl_res;
+
+ curl_res = curl_easy_getinfo(target_handle,
+ CURLINFO_RESPONSE_CODE,
+ &resp_code);
+
+ if (curl_res == CURLE_OK
+ && resp_code == 200
+ && msg->easy_handle != NULL)
+ {
+ verified_handle = msg->easy_handle;
+ break;
+ }
+ }
+ }
+ } while (num_msg > 0);
+
+ if (verified_handle == NULL)
+ goto out1;
+
+ /* we've got one!!!! */
+ time_t mtime;
+ CURLcode curl_res = curl_easy_getinfo(verified_handle, CURLINFO_FILETIME, (void*) &mtime);
+ if (curl_res != CURLE_OK)
+ mtime = time(NULL); /* fall back to current time */
+
+ struct timeval tvs[2];
+ tvs[0].tv_sec = tvs[1].tv_sec = mtime;
+ tvs[0].tv_usec = tvs[1].tv_usec = 0;
+ (void) futimes (fd, tvs); /* best effort */
+
+ /* rename tmp->real */
+ rc = rename (target_cache_tmppath, target_cache_path);
+ if (rc < 0)
+ {
+ rc = -errno;
+ goto out1;
+ /* Perhaps we need not give up right away; could retry or something ... */
+ }
+
+ /* Success!!!! */
+ for (int i = 0; i < num_urls; i++)
+ curl_easy_cleanup(data[i].handle);
+
+ curl_multi_cleanup (curlm);
+ free (data);
+ free (server_urls);
+ /* don't close fd - we're returning it */
+ /* don't unlink the tmppath; it's already been renamed. */
+ if (path != NULL)
+ *path = strdup(target_cache_path);
+
+ return fd;
+
+/* error exits */
+ out1:
+ for (int i = 0; i < num_urls; i++)
+ curl_easy_cleanup(data[i].handle);
+
+ curl_multi_cleanup(curlm);
+ unlink (target_cache_tmppath);
+ (void) rmdir (target_cache_dir); /* nop if not empty */
+ free(data);
+ close (fd);
+
+ out0:
+ free (server_urls);
+
+ out:
+ return rc;
+}
+
+/* See debuginfod.h */
+debuginfod_client *
+debuginfod_begin (void)
+{
+ debuginfod_client *client;
+ size_t size = sizeof (struct debuginfod_client);
+ client = (debuginfod_client *) malloc (size);
+ if (client != NULL)
+ client->progressfn = NULL;
+ return client;
+}
+
+void
+debuginfod_end (debuginfod_client *client)
+{
+ free (client);
+}
+
+int
+debuginfod_find_debuginfo (debuginfod_client *client,
+ const unsigned char *build_id, int build_id_len,
+ char **path)
+{
+ return debuginfod_query_server(client, build_id, build_id_len,
+ "debuginfo", NULL, path);
+}
+
+
+/* See debuginfod.h */
+int
+debuginfod_find_executable(debuginfod_client *client,
+ const unsigned char *build_id, int build_id_len,
+ char **path)
+{
+ return debuginfod_query_server(client, build_id, build_id_len,
+ "executable", NULL, path);
+}
+
+/* See debuginfod.h */
+int debuginfod_find_source(debuginfod_client *client,
+ const unsigned char *build_id, int build_id_len,
+ const char *filename, char **path)
+{
+ return debuginfod_query_server(client, build_id, build_id_len,
+ "source", filename, path);
+}
+
+
+void
+debuginfod_set_progressfn(debuginfod_client *client,
+ debuginfod_progressfn_t fn)
+{
+ client->progressfn = fn;
+}
+
+
+/* NB: these are thread-unsafe. */
+__attribute__((constructor)) attribute_hidden void libdebuginfod_ctor(void)
+{
+ curl_global_init(CURL_GLOBAL_DEFAULT);
+}
+
+/* NB: this is very thread-unsafe: it breaks other threads that are still in libcurl */
+__attribute__((destructor)) attribute_hidden void libdebuginfod_dtor(void)
+{
+ /* ... so don't do this: */
+ /* curl_global_cleanup(); */
+}
diff --git a/debuginfod/debuginfod-find.c b/debuginfod/debuginfod-find.c
new file mode 100644
index 00000000..8bd3a3db
--- /dev/null
+++ b/debuginfod/debuginfod-find.c
@@ -0,0 +1,145 @@
+/* Command-line frontend for retrieving ELF / DWARF / source files
+ from the debuginfod.
+ Copyright (C) 2019 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 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"
+#include "printversion.h"
+#include "debuginfod.h"
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <argp.h>
+
+
+/* Name and version of program. */
+ARGP_PROGRAM_VERSION_HOOK_DEF = print_version;
+
+/* Bug report address. */
+ARGP_PROGRAM_BUG_ADDRESS_DEF = PACKAGE_BUGREPORT;
+
+/* Short description of program. */
+static const char doc[] = N_("Request debuginfo-related content "
+ "from debuginfods listed in $" DEBUGINFOD_URLS_ENV_VAR ".");
+
+/* Strings for arguments in help texts. */
+static const char args_doc[] = N_("debuginfo BUILDID\n"
+ "executable BUILDID\n"
+ "source BUILDID /FILENAME");
+
+/* Definitions of arguments for argp functions. */
+static const struct argp_option options[] =
+ {
+ { "verbose", 'v', NULL, 0, "Increase verbosity.", 0 },
+ { NULL, 0, NULL, 0, NULL, 0 }
+ };
+
+/* debuginfod connection handle. */
+static debuginfod_client *client;
+
+int progressfn(debuginfod_client *c __attribute__((__unused__)),
+ long a, long b)
+{
+ fprintf (stderr, "Progress %ld / %ld\n", a, b);
+ return 0;
+}
+
+
+static error_t parse_opt (int key, char *arg, struct argp_state *state)
+{
+ (void) arg;
+ (void) state;
+ switch (key)
+ {
+ case 'v': debuginfod_set_progressfn (client, & progressfn); break;
+ default: return ARGP_ERR_UNKNOWN;
+ }
+ return 0;
+}
+
+
+/* Data structure to communicate with argp functions. */
+static struct argp argp =
+ {
+ options, parse_opt, args_doc, doc, NULL, NULL, NULL
+ };
+
+
+
+int
+main(int argc, char** argv)
+{
+ client = debuginfod_begin ();
+ if (client == NULL)
+ {
+ fprintf(stderr, "Couldn't create debuginfod client context\n");
+ return 1;
+ }
+
+ int remaining;
+ (void) argp_parse (&argp, argc, argv, ARGP_IN_ORDER|ARGP_NO_ARGS, &remaining, NULL);
+
+ if (argc < 2 || remaining+1 == argc) /* no arguments or at least two non-option words */
+ {
+ argp_help (&argp, stderr, ARGP_HELP_USAGE, argv[0]);
+ return 1;
+ }
+
+ int rc;
+ char *cache_name;
+
+ /* Check whether FILETYPE is valid and call the appropriate
+ debuginfod_find_* function. If FILETYPE is "source"
+ then ensure a FILENAME was also supplied as an argument. */
+ if (strcmp(argv[remaining], "debuginfo") == 0)
+ rc = debuginfod_find_debuginfo(client,
+ (unsigned char *)argv[remaining+1], 0,
+ &cache_name);
+ else if (strcmp(argv[remaining], "executable") == 0)
+ rc = debuginfod_find_executable(client,
+ (unsigned char *)argv[remaining+1], 0,
+ &cache_name);
+ else if (strcmp(argv[remaining], "source") == 0)
+ {
+ if (remaining+2 == argc || argv[3][0] != '/')
+ {
+ fprintf(stderr, "If FILETYPE is \"source\" then absolute /FILENAME must be given\n");
+ return 1;
+ }
+ rc = debuginfod_find_source(client, (unsigned char *)argv[remaining+1],
+ 0, argv[remaining+2], &cache_name);
+ }
+ else
+ {
+ argp_help (&argp, stderr, ARGP_HELP_USAGE, argv[0]);
+ return 1;
+ }
+
+ if (rc < 0)
+ {
+ fprintf(stderr, "Server query failed: %s\n", strerror(-rc));
+ return 1;
+ }
+
+ printf("%s\n", cache_name);
+
+ free (cache_name);
+ debuginfod_end (client);
+
+ return 0;
+}
diff --git a/debuginfod/debuginfod.cxx b/debuginfod/debuginfod.cxx
new file mode 100644
index 00000000..aa7ffcf6
--- /dev/null
+++ b/debuginfod/debuginfod.cxx
@@ -0,0 +1,2688 @@
+/* Debuginfo-over-http server.
+ Copyright (C) 2019 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/>. */
+
+
+/* cargo-cult from libdwfl linux-kernel-modules.c */
+/* In case we have a bad fts we include this before config.h because it
+ can't handle _FILE_OFFSET_BITS.
+ Everything we need here is fine if its declarations just come first.
+ Also, include sys/types.h before fts. On some systems fts.h is not self
+ contained. */
+#ifdef BAD_FTS
+ #include <sys/types.h>
+ #include <fts.h>
+#endif
+
+#ifdef HAVE_CONFIG_H
+ #include "config.h"
+#endif
+
+extern "C" {
+#include "printversion.h"
+}
+
+#include "debuginfod.h"
+#include <dwarf.h>
+
+#include <argp.h>
+#ifdef __GNUC__
+#undef __attribute__ /* glibc bug - rhbz 1763325 */
+#endif
+
+#include <unistd.h>
+#include <stdlib.h>
+#include <error.h>
+// #include <libintl.h> // not until it supports C++ << better
+#include <locale.h>
+#include <pthread.h>
+#include <signal.h>
+#include <sys/stat.h>
+#include <sys/time.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <netdb.h>
+
+
+/* If fts.h is included before config.h, its indirect inclusions may not
+ give us the right LFS aliases of these functions, so map them manually. */
+#ifdef BAD_FTS
+ #ifdef _FILE_OFFSET_BITS
+ #define open open64
+ #define fopen fopen64
+ #endif
+#else
+ #include <sys/types.h>
+ #include <fts.h>
+#endif
+
+#include <cstring>
+#include <vector>
+#include <set>
+#include <map>
+#include <string>
+#include <iostream>
+#include <iomanip>
+#include <ostream>
+#include <sstream>
+#include <mutex>
+#include <condition_variable>
+#include <thread>
+// #include <regex> // on rhel7 gcc 4.8, not competent
+#include <regex.h>
+// #include <algorithm>
+using namespace std;
+
+#include <gelf.h>
+#include <libdwelf.h>
+
+#include <microhttpd.h>
+#include <curl/curl.h>
+#include <archive.h>
+#include <archive_entry.h>
+#include <sqlite3.h>
+
+#ifdef __linux__
+#include <sys/syscall.h>
+#endif
+
+#ifdef __linux__
+#define tid() syscall(SYS_gettid)
+#else
+#define tid() pthread_self()
+#endif
+
+
+// Roll this identifier for every sqlite schema incompatiblity.
+#define BUILDIDS "buildids9"
+
+#if SQLITE_VERSION_NUMBER >= 3008000
+#define WITHOUT_ROWID "without rowid"
+#else
+#define WITHOUT_ROWID ""
+#endif
+
+static const char DEBUGINFOD_SQLITE_DDL[] =
+ "pragma foreign_keys = on;\n"
+ "pragma synchronous = 0;\n" // disable fsync()s - this cache is disposable across a machine crash
+ "pragma journal_mode = wal;\n" // https://sqlite.org/wal.html
+ "pragma wal_checkpoint = truncate;\n" // clean out any preexisting wal file
+ "pragma journal_size_limit = 0;\n" // limit steady state file (between grooming, which also =truncate's)
+ "pragma auto_vacuum = incremental;\n" // https://sqlite.org/pragma.html
+ "pragma busy_timeout = 1000;\n" // https://sqlite.org/pragma.html
+ // NB: all these are overridable with -D option
+
+ // Normalization table for interning file names
+ "create table if not exists " BUILDIDS "_files (\n"
+ " id integer primary key not null,\n"
+ " name text unique not null\n"
+ " );\n"
+ // Normalization table for interning buildids
+ "create table if not exists " BUILDIDS "_buildids (\n"
+ " id integer primary key not null,\n"
+ " hex text unique not null);\n"
+ // Track the completion of scanning of a given file & sourcetype at given time
+ "create table if not exists " BUILDIDS "_file_mtime_scanned (\n"
+ " mtime integer not null,\n"
+ " file integer not null,\n"
+ " size integer not null,\n" // in bytes
+ " sourcetype text(1) not null\n"
+ " check (sourcetype IN ('F', 'R')),\n"
+ " foreign key (file) references " BUILDIDS "_files(id) on update cascade on delete cascade,\n"
+ " primary key (file, mtime, sourcetype)\n"
+ " ) " WITHOUT_ROWID ";\n"
+ "create table if not exists " BUILDIDS "_f_de (\n"
+ " buildid integer not null,\n"
+ " debuginfo_p integer not null,\n"
+ " executable_p integer not null,\n"
+ " file integer not null,\n"
+ " mtime integer not null,\n"
+ " foreign key (file) references " BUILDIDS "_files(id) on update cascade on delete cascade,\n"
+ " foreign key (buildid) references " BUILDIDS "_buildids(id) on update cascade on delete cascade,\n"
+ " primary key (buildid, file, mtime)\n"
+ " ) " WITHOUT_ROWID ";\n"
+ "create table if not exists " BUILDIDS "_f_s (\n"
+ " buildid integer not null,\n"
+ " artifactsrc integer not null,\n"
+ " file integer not null,\n" // NB: not necessarily entered into _mtime_scanned
+ " mtime integer not null,\n"
+ " foreign key (file) references " BUILDIDS "_files(id) on update cascade on delete cascade,\n"
+ " foreign key (artifactsrc) references " BUILDIDS "_files(id) on update cascade on delete cascade,\n"
+ " foreign key (buildid) references " BUILDIDS "_buildids(id) on update cascade on delete cascade,\n"
+ " primary key (buildid, artifactsrc, file, mtime)\n"
+ " ) " WITHOUT_ROWID ";\n"
+ "create table if not exists " BUILDIDS "_r_de (\n"
+ " buildid integer not null,\n"
+ " debuginfo_p integer not null,\n"
+ " executable_p integer not null,\n"
+ " file integer not null,\n"
+ " mtime integer not null,\n"
+ " content integer not null,\n"
+ " foreign key (file) references " BUILDIDS "_files(id) on update cascade on delete cascade,\n"
+ " foreign key (content) references " BUILDIDS "_files(id) on update cascade on delete cascade,\n"
+ " foreign key (buildid) references " BUILDIDS "_buildids(id) on update cascade on delete cascade,\n"
+ " primary key (buildid, debuginfo_p, executable_p, file, content, mtime)\n"
+ " ) " WITHOUT_ROWID ";\n"
+ "create table if not exists " BUILDIDS "_r_sref (\n" // outgoing dwarf sourcefile references from rpm
+ " buildid integer not null,\n"
+ " artifactsrc integer not null,\n"
+ " foreign key (artifactsrc) references " BUILDIDS "_files(id) on update cascade on delete cascade,\n"
+ " foreign key (buildid) references " BUILDIDS "_buildids(id) on update cascade on delete cascade,\n"
+ " primary key (buildid, artifactsrc)\n"
+ " ) " WITHOUT_ROWID ";\n"
+ "create table if not exists " BUILDIDS "_r_sdef (\n" // rpm contents that may satisfy sref
+ " file integer not null,\n"
+ " mtime integer not null,\n"
+ " content integer not null,\n"
+ " foreign key (file) references " BUILDIDS "_files(id) on update cascade on delete cascade,\n"
+ " foreign key (content) references " BUILDIDS "_files(id) on update cascade on delete cascade,\n"
+ " primary key (content, file, mtime)\n"
+ " ) " WITHOUT_ROWID ";\n"
+ // create views to glue together some of the above tables, for webapi D queries
+ "create view if not exists " BUILDIDS "_query_d as \n"
+ "select\n"
+ " b.hex as buildid, n.mtime, 'F' as sourcetype, f0.name as source0, n.mtime as mtime, null as source1\n"
+ " from " BUILDIDS "_buildids b, " BUILDIDS "_files f0, " BUILDIDS "_f_de n\n"
+ " where b.id = n.buildid and f0.id = n.file and n.debuginfo_p = 1\n"
+ "union all select\n"
+ " b.hex as buildid, n.mtime, 'R' as sourcetype, f0.name as source0, n.mtime as mtime, f1.name as source1\n"
+ " from " BUILDIDS "_buildids b, " BUILDIDS "_files f0, " BUILDIDS "_files f1, " BUILDIDS "_r_de n\n"
+ " where b.id = n.buildid and f0.id = n.file and f1.id = n.content and n.debuginfo_p = 1\n"
+ ";"
+ // ... and for E queries
+ "create view if not exists " BUILDIDS "_query_e as \n"
+ "select\n"
+ " b.hex as buildid, n.mtime, 'F' as sourcetype, f0.name as source0, n.mtime as mtime, null as source1\n"
+ " from " BUILDIDS "_buildids b, " BUILDIDS "_files f0, " BUILDIDS "_f_de n\n"
+ " where b.id = n.buildid and f0.id = n.file and n.executable_p = 1\n"
+ "union all select\n"
+ " b.hex as buildid, n.mtime, 'R' as sourcetype, f0.name as source0, n.mtime as mtime, f1.name as source1\n"
+ " from " BUILDIDS "_buildids b, " BUILDIDS "_files f0, " BUILDIDS "_files f1, " BUILDIDS "_r_de n\n"
+ " where b.id = n.buildid and f0.id = n.file and f1.id = n.content and n.executable_p = 1\n"
+ ";"
+ // ... and for S queries
+ "create view if not exists " BUILDIDS "_query_s as \n"
+ "select\n"
+ " b.hex as buildid, fs.name as artifactsrc, 'F' as sourcetype, f0.name as source0, n.mtime as mtime, null as source1, null as source0ref\n"
+ " from " BUILDIDS "_buildids b, " BUILDIDS "_files f0, " BUILDIDS "_files fs, " BUILDIDS "_f_s n\n"
+ " where b.id = n.buildid and f0.id = n.file and fs.id = n.artifactsrc\n"
+ "union all select\n"
+ " b.hex as buildid, f1.name as artifactsrc, 'R' as sourcetype, f0.name as source0, sd.mtime as mtime, f1.name as source1, fsref.name as source0ref\n"
+ " from " BUILDIDS "_buildids b, " BUILDIDS "_files f0, " BUILDIDS "_files f1, " BUILDIDS "_files fsref, "
+ " " BUILDIDS "_r_sdef sd, " BUILDIDS "_r_sref sr, " BUILDIDS "_r_de sde\n"
+ " where b.id = sr.buildid and f0.id = sd.file and fsref.id = sde.file and f1.id = sd.content\n"
+ " and sr.artifactsrc = sd.content and sde.buildid = sr.buildid\n"
+ ";"
+ // and for startup overview counts
+ "drop view if exists " BUILDIDS "_stats;\n"
+ "create view if not exists " BUILDIDS "_stats as\n"
+ " select 'file d/e' as label,count(*) as quantity from " BUILDIDS "_f_de\n"
+ "union all select 'file s',count(*) from " BUILDIDS "_f_s\n"
+ "union all select 'rpm d/e',count(*) from " BUILDIDS "_r_de\n"
+ "union all select 'rpm sref',count(*) from " BUILDIDS "_r_sref\n"
+ "union all select 'rpm sdef',count(*) from " BUILDIDS "_r_sdef\n"
+ "union all select 'buildids',count(*) from " BUILDIDS "_buildids\n"
+ "union all select 'filenames',count(*) from " BUILDIDS "_files\n"
+ "union all select 'files scanned (#)',count(*) from " BUILDIDS "_file_mtime_scanned\n"
+ "union all select 'files scanned (mb)',coalesce(sum(size)/1024/1024,0) from " BUILDIDS "_file_mtime_scanned\n"
+#if SQLITE_VERSION_NUMBER >= 3016000
+ "union all select 'index db size (mb)',page_count*page_size/1024/1024 as size FROM pragma_page_count(), pragma_page_size()\n"
+#endif
+ ";\n"
+
+// schema change history & garbage collection
+//
+// XXX: we could have migration queries here to bring prior-schema
+// data over instead of just dropping it.
+//
+// buildids9: widen the mtime_scanned table
+ "" // <<< we are here
+// buildids8: slim the sref table
+ "drop table if exists buildids8_f_de;\n"
+ "drop table if exists buildids8_f_s;\n"
+ "drop table if exists buildids8_r_de;\n"
+ "drop table if exists buildids8_r_sref;\n"
+ "drop table if exists buildids8_r_sdef;\n"
+ "drop table if exists buildids8_file_mtime_scanned;\n"
+ "drop table if exists buildids8_files;\n"
+ "drop table if exists buildids8_buildids;\n"
+// buildids7: separate _norm table into dense subtype tables
+ "drop table if exists buildids7_f_de;\n"
+ "drop table if exists buildids7_f_s;\n"
+ "drop table if exists buildids7_r_de;\n"
+ "drop table if exists buildids7_r_sref;\n"
+ "drop table if exists buildids7_r_sdef;\n"
+ "drop table if exists buildids7_file_mtime_scanned;\n"
+ "drop table if exists buildids7_files;\n"
+ "drop table if exists buildids7_buildids;\n"
+// buildids6: drop bolo/rfolo again, represent sources / rpmcontents in main table
+ "drop table if exists buildids6_norm;\n"
+ "drop table if exists buildids6_files;\n"
+ "drop table if exists buildids6_buildids;\n"
+ "drop view if exists buildids6;\n"
+// buildids5: redefine srcfile1 column to be '.'-less (for rpms)
+ "drop table if exists buildids5_norm;\n"
+ "drop table if exists buildids5_files;\n"
+ "drop table if exists buildids5_buildids;\n"
+ "drop table if exists buildids5_bolo;\n"
+ "drop table if exists buildids5_rfolo;\n"
+ "drop view if exists buildids5;\n"
+// buildids4: introduce rpmfile RFOLO
+ "drop table if exists buildids4_norm;\n"
+ "drop table if exists buildids4_files;\n"
+ "drop table if exists buildids4_buildids;\n"
+ "drop table if exists buildids4_bolo;\n"
+ "drop table if exists buildids4_rfolo;\n"
+ "drop view if exists buildids4;\n"
+// buildids3*: split out srcfile BOLO
+ "drop table if exists buildids3_norm;\n"
+ "drop table if exists buildids3_files;\n"
+ "drop table if exists buildids3_buildids;\n"
+ "drop table if exists buildids3_bolo;\n"
+ "drop view if exists buildids3;\n"
+// buildids2: normalized buildid and filenames into interning tables;
+ "drop table if exists buildids2_norm;\n"
+ "drop table if exists buildids2_files;\n"
+ "drop table if exists buildids2_buildids;\n"
+ "drop view if exists buildids2;\n"
+ // buildids1: made buildid and artifacttype NULLable, to represent cached-negative
+// lookups from sources, e.g. files or rpms that contain no buildid-indexable content
+ "drop table if exists buildids1;\n"
+// buildids: original
+ "drop table if exists buildids;\n"
+ ;
+
+static const char DEBUGINFOD_SQLITE_CLEANUP_DDL[] =
+ "pragma wal_checkpoint = truncate;\n" // clean out any preexisting wal file
+ ;
+
+
+
+
+/* Name and version of program. */
+/* ARGP_PROGRAM_VERSION_HOOK_DEF = print_version; */ // not this simple for C++
+
+/* Bug report address. */
+ARGP_PROGRAM_BUG_ADDRESS_DEF = PACKAGE_BUGREPORT;
+
+/* Definitions of arguments for argp functions. */
+static const struct argp_option options[] =
+ {
+ { NULL, 0, NULL, 0, "Scanners:", 1 },
+ { "scan-file-dir", 'F', NULL, 0, "Enable ELF/DWARF file scanning threads.", 0 },
+ { "scan-rpm-dir", 'R', NULL, 0, "Enable RPM scanning threads.", 0 },
+ // "source-oci-imageregistry" ...
+
+ { NULL, 0, NULL, 0, "Options:", 2 },
+ { "logical", 'L', NULL, 0, "Follow symlinks, default=ignore.", 0 },
+ { "rescan-time", 't', "SECONDS", 0, "Number of seconds to wait between rescans, 0=disable.", 0 },
+ { "groom-time", 'g', "SECONDS", 0, "Number of seconds to wait between database grooming, 0=disable.", 0 },
+ { "maxigroom", 'G', NULL, 0, "Run a complete database groom/shrink pass at startup.", 0 },
+ { "concurrency", 'c', "NUM", 0, "Limit scanning thread concurrency to NUM.", 0 },
+ { "include", 'I', "REGEX", 0, "Include files matching REGEX, default=all.", 0 },
+ { "exclude", 'X', "REGEX", 0, "Exclude files matching REGEX, default=none.", 0 },
+ { "port", 'p', "NUM", 0, "HTTP port to listen on, default 8002.", 0 },
+ { "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 },
+
+ { NULL, 0, NULL, 0, NULL, 0 }
+ };
+
+/* Short description of program. */
+static const char doc[] = "Serve debuginfo-related content across HTTP from files under PATHs.";
+
+/* Strings for arguments in help texts. */
+static const char args_doc[] = "[PATH ...]";
+
+/* Prototype for option handler. */
+static error_t parse_opt (int key, char *arg, struct argp_state *state);
+
+/* Data structure to communicate with argp functions. */
+static struct argp argp =
+ {
+ options, parse_opt, args_doc, doc, NULL, NULL, NULL
+ };
+
+
+static string db_path;
+static sqlite3 *db;
+static unsigned verbose;
+static volatile sig_atomic_t interrupted = 0;
+static volatile sig_atomic_t sigusr1 = 0;
+static volatile sig_atomic_t sigusr2 = 0;
+static unsigned http_port = 8002;
+static unsigned rescan_s = 300;
+static unsigned groom_s = 86400;
+static unsigned maxigroom = false;
+static unsigned concurrency = std::thread::hardware_concurrency() ?: 1;
+static set<string> source_paths;
+static bool scan_files = false;
+static bool scan_rpms = false;
+static vector<string> extra_ddl;
+static regex_t file_include_regex;
+static regex_t file_exclude_regex;
+static bool traverse_logical;
+
+static void set_metric(const string& key, int64_t value);
+// static void inc_metric(const string& key);
+static void set_metric(const string& metric,
+ const string& lname, const string& lvalue,
+ int64_t value);
+static void inc_metric(const string& metric,
+ const string& lname, const string& lvalue);
+static void add_metric(const string& metric,
+ const string& lname, const string& lvalue,
+ int64_t value);
+
+/* Handle program arguments. */
+static error_t
+parse_opt (int key, char *arg,
+ struct argp_state *state __attribute__ ((unused)))
+{
+ int rc;
+ switch (key)
+ {
+ case 'v': verbose ++; break;
+ case 'd': db_path = string(arg); break;
+ case 'p': http_port = (unsigned) atoi(arg);
+ if (http_port > 65535) argp_failure(state, 1, EINVAL, "port number");
+ break;
+ case 'F': scan_files = true; break;
+ case 'R': scan_rpms = true; break;
+ case 'L':
+ traverse_logical = true;
+ break;
+ case 'D': extra_ddl.push_back(string(arg)); break;
+ case 't':
+ rescan_s = (unsigned) atoi(arg);
+ break;
+ case 'g':
+ groom_s = (unsigned) atoi(arg);
+ break;
+ case 'G':
+ maxigroom = true;
+ break;
+ case 'c':
+ 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
+ regfree (&file_include_regex);
+ rc = regcomp (&file_include_regex, arg, REG_EXTENDED|REG_NOSUB);
+ if (rc != 0)
+ argp_failure(state, 1, EINVAL, "regular expession");
+ break;
+ case 'X':
+ regfree (&file_exclude_regex);
+ rc = regcomp (&file_exclude_regex, arg, REG_EXTENDED|REG_NOSUB);
+ if (rc != 0)
+ argp_failure(state, 1, EINVAL, "regular expession");
+ break;
+ case ARGP_KEY_ARG:
+ source_paths.insert(string(arg));
+ break;
+ // case 'h': argp_state_help (state, stderr, ARGP_HELP_LONG|ARGP_HELP_EXIT_OK);
+ default: return ARGP_ERR_UNKNOWN;
+ }
+
+ return 0;
+}
+
+
+////////////////////////////////////////////////////////////////////////
+
+
+// represent errors that may get reported to an ostream and/or a libmicrohttpd connection
+
+struct reportable_exception
+{
+ int code;
+ string message;
+
+ reportable_exception(int c, const string& m): code(c), message(m) {}
+ reportable_exception(const string& m): code(503), message(m) {}
+ reportable_exception(): code(503), message() {}
+
+ void report(ostream& o) const; // defined under obatched() class below
+
+ int mhd_send_response(MHD_Connection* c) const {
+ MHD_Response* r = MHD_create_response_from_buffer (message.size(),
+ (void*) message.c_str(),
+ MHD_RESPMEM_MUST_COPY);
+ MHD_add_response_header (r, "Content-Type", "text/plain");
+ int rc = MHD_queue_response (c, code, r);
+ MHD_destroy_response (r);
+ return rc;
+ }
+};
+
+
+struct sqlite_exception: public reportable_exception
+{
+ sqlite_exception(int rc, const string& msg):
+ reportable_exception(string("sqlite3 error: ") + msg + ": " + string(sqlite3_errstr(rc) ?: "?")) {}
+};
+
+struct libc_exception: public reportable_exception
+{
+ libc_exception(int rc, const string& msg):
+ reportable_exception(string("libc error: ") + msg + ": " + string(strerror(rc) ?: "?")) {}
+};
+
+
+struct archive_exception: public reportable_exception
+{
+ archive_exception(const string& msg):
+ reportable_exception(string("libarchive error: ") + msg) {}
+ archive_exception(struct archive* a, const string& msg):
+ reportable_exception(string("libarchive error: ") + msg + ": " + string(archive_error_string(a) ?: "?")) {}
+};
+
+
+struct elfutils_exception: public reportable_exception
+{
+ elfutils_exception(int rc, const string& msg):
+ reportable_exception(string("elfutils error: ") + msg + ": " + string(elf_errmsg(rc) ?: "?")) {}
+};
+
+
+////////////////////////////////////////////////////////////////////////
+
+// a c++ counting-semaphore class ... since we're c++11 not c++20
+
+class semaphore
+{
+public:
+ semaphore (unsigned c=1): count(c) {}
+ inline void notify () {
+ unique_lock<mutex> lock(mtx);
+ count++;
+ cv.notify_one();
+ }
+ inline void wait() {
+ unique_lock<mutex> lock(mtx);
+ while (count == 0)
+ cv.wait(lock);
+ count--;
+ }
+private:
+ mutex mtx;
+ condition_variable cv;
+ unsigned count;
+};
+
+
+class semaphore_borrower
+{
+public:
+ semaphore_borrower(semaphore* s): sem(s) { sem->wait(); }
+ ~semaphore_borrower() { sem->notify(); }
+private:
+ semaphore* sem;
+};
+
+
+////////////////////////////////////////////////////////////////////////
+
+
+// Print a standard timestamp.
+static ostream&
+timestamp (ostream &o)
+{
+ char datebuf[80];
+ char *now2 = NULL;
+ time_t now_t = time(NULL);
+ struct tm *now = gmtime (&now_t);
+ if (now)
+ {
+ (void) strftime (datebuf, sizeof (datebuf), "%c", now);
+ now2 = datebuf;
+ }
+
+ return o << "[" << (now2 ? now2 : "") << "] "
+ << "(" << getpid () << "/" << tid() << "): ";
+}
+
+
+// A little class that impersonates an ostream to the extent that it can
+// take << streaming operations. It batches up the bits into an internal
+// stringstream until it is destroyed; then flushes to the original ostream.
+// It adds a timestamp
+class obatched
+{
+private:
+ ostream& o;
+ stringstream stro;
+ static mutex lock;
+public:
+ obatched(ostream& oo, bool timestamp_p = true): o(oo)
+ {
+ if (timestamp_p)
+ timestamp(stro);
+ }
+ ~obatched()
+ {
+ unique_lock<mutex> do_not_cross_the_streams(obatched::lock);
+ o << stro.str();
+ o.flush();
+ }
+ operator ostream& () { return stro; }
+ template <typename T> ostream& operator << (const T& t) { stro << t; return stro; }
+};
+mutex obatched::lock; // just the one, since cout/cerr iostreams are not thread-safe
+
+
+void reportable_exception::report(ostream& o) const {
+ obatched(o) << message << endl;
+}
+
+
+////////////////////////////////////////////////////////////////////////
+
+
+// RAII style sqlite prepared-statement holder that matches { } block lifetime
+
+struct sqlite_ps
+{
+private:
+ sqlite3* db;
+ const string nickname;
+ const string sql;
+ sqlite3_stmt *pp;
+
+ sqlite_ps(const sqlite_ps&); // make uncopyable
+ sqlite_ps& operator=(const sqlite_ps &); // make unassignable
+
+public:
+ sqlite_ps (sqlite3* d, const string& n, const string& s): db(d), nickname(n), sql(s) {
+ if (verbose > 4)
+ obatched(clog) << nickname << " prep " << sql << endl;
+ int rc = sqlite3_prepare_v2 (db, sql.c_str(), -1 /* to \0 */, & this->pp, NULL);
+ if (rc != SQLITE_OK)
+ throw sqlite_exception(rc, "prepare " + sql);
+ }
+
+ sqlite_ps& reset()
+ {
+ sqlite3_reset(this->pp);
+ return *this;
+ }
+
+ sqlite_ps& bind(int parameter, const string& str)
+ {
+ if (verbose > 4)
+ obatched(clog) << nickname << " bind " << parameter << "=" << str << endl;
+ int rc = sqlite3_bind_text (this->pp, parameter, str.c_str(), -1, SQLITE_TRANSIENT);
+ if (rc != SQLITE_OK)
+ throw sqlite_exception(rc, "sqlite3 bind");
+ return *this;
+ }
+
+ sqlite_ps& bind(int parameter, int64_t value)
+ {
+ if (verbose > 4)
+ obatched(clog) << nickname << " bind " << parameter << "=" << value << endl;
+ int rc = sqlite3_bind_int64 (this->pp, parameter, value);
+ if (rc != SQLITE_OK)
+ throw sqlite_exception(rc, "sqlite3 bind");
+ return *this;
+ }
+
+ sqlite_ps& bind(int parameter)
+ {
+ if (verbose > 4)
+ obatched(clog) << nickname << " bind " << parameter << "=" << "NULL" << endl;
+ int rc = sqlite3_bind_null (this->pp, parameter);
+ if (rc != SQLITE_OK)
+ throw sqlite_exception(rc, "sqlite3 bind");
+ return *this;
+ }
+
+
+ void step_ok_done() {
+ int rc = sqlite3_step (this->pp);
+ if (verbose > 4)
+ obatched(clog) << nickname << " step-ok-done(" << sqlite3_errstr(rc) << ") " << sql << endl;
+ if (rc != SQLITE_OK && rc != SQLITE_DONE && rc != SQLITE_ROW)
+ throw sqlite_exception(rc, "sqlite3 step");
+ (void) sqlite3_reset (this->pp);
+ }
+
+
+ int step() {
+ int rc = sqlite3_step (this->pp);
+ if (verbose > 4)
+ obatched(clog) << nickname << " step(" << sqlite3_errstr(rc) << ") " << sql << endl;
+ return rc;
+ }
+
+
+
+ ~sqlite_ps () { sqlite3_finalize (this->pp); }
+ operator sqlite3_stmt* () { return this->pp; }
+};
+
+
+////////////////////////////////////////////////////////////////////////
+
+// RAII style templated autocloser
+
+template <class Payload, class Ignore>
+struct defer_dtor
+{
+public:
+ typedef Ignore (*dtor_fn) (Payload);
+
+private:
+ Payload p;
+ dtor_fn fn;
+
+public:
+ defer_dtor(Payload _p, dtor_fn _fn): p(_p), fn(_fn) {}
+ ~defer_dtor() { (void) (*fn)(p); }
+
+private:
+ defer_dtor(const defer_dtor<Payload,Ignore>&); // make uncopyable
+ defer_dtor& operator=(const defer_dtor<Payload,Ignore> &); // make unassignable
+};
+
+
+
+////////////////////////////////////////////////////////////////////////
+
+
+
+
+
+static string
+conninfo (struct MHD_Connection * conn)
+{
+ char hostname[256]; // RFC1035
+ char servname[256];
+ int sts = -1;
+
+ if (conn == 0)
+ return "internal";
+
+ /* Look up client address data. */
+ const union MHD_ConnectionInfo *u = MHD_get_connection_info (conn,
+ MHD_CONNECTION_INFO_CLIENT_ADDRESS);
+ struct sockaddr *so = u ? u->client_addr : 0;
+
+ if (so && so->sa_family == AF_INET) {
+ sts = getnameinfo (so, sizeof (struct sockaddr_in), hostname, sizeof (hostname), servname,
+ sizeof (servname), NI_NUMERICHOST | NI_NUMERICSERV);
+ } else if (so && so->sa_family == AF_INET6) {
+ sts = getnameinfo (so, sizeof (struct sockaddr_in6), hostname, sizeof (hostname),
+ servname, sizeof (servname), NI_NUMERICHOST | NI_NUMERICSERV);
+ }
+ if (sts != 0) {
+ hostname[0] = servname[0] = '\0';
+ }
+
+ return string(hostname) + string(":") + string(servname);
+}
+
+
+
+////////////////////////////////////////////////////////////////////////
+
+static void
+add_mhd_last_modified (struct MHD_Response *resp, time_t mtime)
+{
+ struct tm *now = gmtime (&mtime);
+ if (now != NULL)
+ {
+ char datebuf[80];
+ size_t rc = strftime (datebuf, sizeof (datebuf), "%a, %d %b %Y %T GMT", now);
+ if (rc > 0 && rc < sizeof (datebuf))
+ (void) MHD_add_response_header (resp, "Last-Modified", datebuf);
+ }
+
+ (void) MHD_add_response_header (resp, "Cache-Control", "public");
+}
+
+
+
+static struct MHD_Response*
+handle_buildid_f_match (int64_t b_mtime,
+ const string& b_source0,
+ int *result_fd)
+{
+ int fd = open(b_source0.c_str(), O_RDONLY);
+ if (fd < 0)
+ {
+ if (verbose)
+ obatched(clog) << "cannot open " << b_source0 << endl;
+ // if still missing, a periodic groom pass will delete this buildid record
+ return 0;
+ }
+
+ // NB: use manual close(2) in error case instead of defer_dtor, because
+ // in the normal case, we want to hand the fd over to libmicrohttpd for
+ // file transfer.
+
+ struct stat s;
+ int rc = fstat(fd, &s);
+ if (rc < 0)
+ {
+ if (verbose)
+ clog << "cannot fstat " << b_source0 << endl;
+ close(fd);
+ return 0;
+ }
+
+ if ((int64_t) s.st_mtime != b_mtime)
+ {
+ if (verbose)
+ obatched(clog) << "mtime mismatch for " << b_source0 << endl;
+ close(fd);
+ return 0;
+ }
+
+ inc_metric ("http_responses_total","result","file");
+ struct MHD_Response* r = MHD_create_response_from_fd ((uint64_t) s.st_size, fd);
+ if (r == 0)
+ {
+ if (verbose)
+ obatched(clog) << "cannot create fd-response for " << b_source0 << endl;
+ close(fd);
+ }
+ else
+ {
+ MHD_add_response_header (r, "Content-Type", "application/octet-stream");
+ add_mhd_last_modified (r, s.st_mtime);
+ if (verbose > 1)
+ obatched(clog) << "serving file " << b_source0 << endl;
+ /* libmicrohttpd will close it. */
+ if (result_fd)
+ *result_fd = fd;
+ }
+
+ return r;
+}
+
+
+// quote all questionable characters of str for safe passage through a sh -c expansion.
+static string
+shell_escape(const string& str)
+{
+ string y;
+ for (auto&& x : str)
+ {
+ if (! isalnum(x) && x != '/')
+ y += "\\";
+ y += x;
+ }
+ return y;
+}
+
+
+static struct MHD_Response*
+handle_buildid_r_match (int64_t b_mtime,
+ const string& b_source0,
+ const string& b_source1,
+ int *result_fd)
+{
+ struct stat fs;
+ int rc = stat (b_source0.c_str(), &fs);
+ if (rc != 0)
+ throw libc_exception (errno, string("stat ") + b_source0);
+
+ if ((int64_t) fs.st_mtime != b_mtime)
+ {
+ if (verbose)
+ obatched(clog) << "mtime mismatch for " << b_source0 << endl;
+ return 0;
+ }
+
+ string popen_cmd = string("rpm2cpio " + shell_escape(b_source0));
+ FILE* fp = popen (popen_cmd.c_str(), "r"); // "e" O_CLOEXEC?
+ if (fp == NULL)
+ throw libc_exception (errno, string("popen ") + popen_cmd);
+ defer_dtor<FILE*,int> fp_closer (fp, pclose);
+
+ struct archive *a;
+ a = archive_read_new();
+ if (a == NULL)
+ throw archive_exception("cannot create archive reader");
+ defer_dtor<struct archive*,int> archive_closer (a, archive_read_free);
+
+ rc = archive_read_support_format_cpio(a);
+ if (rc != ARCHIVE_OK)
+ throw archive_exception(a, "cannot select cpio format");
+ rc = archive_read_support_filter_all(a);
+ if (rc != ARCHIVE_OK)
+ throw archive_exception(a, "cannot select all filters");
+
+ rc = archive_read_open_FILE (a, fp);
+ if (rc != ARCHIVE_OK)
+ throw archive_exception(a, "cannot open archive from rpm2cpio pipe");
+
+ while(1) // parse cpio archive entries
+ {
+ struct archive_entry *e;
+ rc = archive_read_next_header (a, &e);
+ if (rc != ARCHIVE_OK)
+ break;
+
+ if (! S_ISREG(archive_entry_mode (e))) // skip non-files completely
+ continue;
+
+ string fn = archive_entry_pathname (e);
+ if (fn != string(".")+b_source1)
+ continue;
+
+ // extract this file to a temporary file
+ char tmppath[PATH_MAX] = "/tmp/debuginfod.XXXXXX"; // XXX: $TMP_DIR etc.
+ int fd = mkstemp (tmppath);
+ if (fd < 0)
+ throw libc_exception (errno, "cannot create temporary file");
+ unlink (tmppath); // unlink now so OS will release the file as soon as we close the fd
+
+ rc = archive_read_data_into_fd (a, fd);
+ if (rc != ARCHIVE_OK)
+ {
+ close (fd);
+ throw archive_exception(a, "cannot extract file");
+ }
+
+ inc_metric ("http_responses_total","result","rpm");
+ struct MHD_Response* r = MHD_create_response_from_fd (archive_entry_size(e), fd);
+ if (r == 0)
+ {
+ if (verbose)
+ obatched(clog) << "cannot create fd-response for " << b_source0 << endl;
+ close(fd);
+ break; // assume no chance of better luck around another iteration
+ }
+ else
+ {
+ MHD_add_response_header (r, "Content-Type", "application/octet-stream");
+ add_mhd_last_modified (r, archive_entry_mtime(e));
+ if (verbose > 1)
+ obatched(clog) << "serving rpm " << b_source0 << " file " << b_source1 << endl;
+ /* libmicrohttpd will close it. */
+ if (result_fd)
+ *result_fd = fd;
+ return r;
+ }
+ }
+
+ // XXX: rpm/file not found: delete this R entry?
+ return 0;
+}
+
+
+static struct MHD_Response*
+handle_buildid_match (int64_t b_mtime,
+ const string& b_stype,
+ const string& b_source0,
+ const string& b_source1,
+ int *result_fd)
+{
+ if (b_stype == "F")
+ return handle_buildid_f_match(b_mtime, b_source0, result_fd);
+ else if (b_stype == "R")
+ return handle_buildid_r_match(b_mtime, b_source0, b_source1, result_fd);
+ else
+ return 0;
+}
+
+
+static int
+debuginfod_find_progress (debuginfod_client *, long a, long b)
+{
+ if (verbose > 4)
+ obatched(clog) << "federated debuginfod progress=" << a << "/" << b << endl;
+
+ return interrupted;
+}
+
+
+static struct MHD_Response* handle_buildid (const string& buildid /* unsafe */,
+ const string& artifacttype /* unsafe */,
+ const string& suffix /* unsafe */,
+ int *result_fd
+ )
+{
+ // validate artifacttype
+ string atype_code;
+ 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");
+
+ if (atype_code == "S" && suffix == "")
+ throw reportable_exception("invalid source suffix");
+
+ // validate buildid
+ if ((buildid.size() < 2) || // not empty
+ (buildid.size() % 2) || // even number
+ (buildid.find_first_not_of("0123456789abcdef") != string::npos)) // pure tasty lowercase hex
+ throw reportable_exception("invalid buildid");
+
+ if (verbose > 1)
+ obatched(clog) << "searching for buildid=" << buildid << " artifacttype=" << artifacttype
+ << " suffix=" << suffix << endl;
+
+ sqlite_ps *pp = 0;
+
+ if (atype_code == "D")
+ {
+ pp = new sqlite_ps (db, "mhd-query-d",
+ "select mtime, sourcetype, source0, source1 from " BUILDIDS "_query_d where buildid = ? "
+ "order by mtime desc");
+ pp->reset();
+ pp->bind(1, buildid);
+ }
+ else if (atype_code == "E")
+ {
+ pp = new sqlite_ps (db, "mhd-query-e",
+ "select mtime, sourcetype, source0, source1 from " BUILDIDS "_query_e where buildid = ? "
+ "order by mtime desc");
+ pp->reset();
+ pp->bind(1, buildid);
+ }
+ else if (atype_code == "S")
+ {
+ pp = new sqlite_ps (db, "mhd-query-s",
+ "select mtime, sourcetype, source0, source1 from " BUILDIDS "_query_s where buildid = ? and artifactsrc = ? "
+ "order by sharedprefix(source0,source0ref) desc, mtime desc");
+ pp->reset();
+ pp->bind(1, buildid);
+ pp->bind(2, suffix);
+ }
+ unique_ptr<sqlite_ps> ps_closer(pp); // release pp if exception or return
+
+ // consume all the rows
+ while (1)
+ {
+ int rc = pp->step();
+ if (rc == SQLITE_DONE) break;
+ if (rc != SQLITE_ROW)
+ throw sqlite_exception(rc, "step");
+
+ int64_t b_mtime = sqlite3_column_int64 (*pp, 0);
+ string b_stype = string((const char*) sqlite3_column_text (*pp, 1) ?: ""); /* by DDL may not be NULL */
+ string b_source0 = string((const char*) sqlite3_column_text (*pp, 2) ?: ""); /* may be NULL */
+ string b_source1 = string((const char*) sqlite3_column_text (*pp, 3) ?: ""); /* may be NULL */
+
+ if (verbose > 1)
+ obatched(clog) << "found mtime=" << b_mtime << " stype=" << b_stype
+ << " source0=" << b_source0 << " source1=" << b_source1 << endl;
+
+ // Try accessing the located match.
+ // XXX: in case of multiple matches, attempt them in parallel?
+ auto r = handle_buildid_match (b_mtime, b_stype, b_source0, b_source1, result_fd);
+ if (r)
+ return r;
+ }
+
+ // We couldn't find it in the database. Last ditch effort
+ // is to defer to other debuginfo servers.
+
+ int fd = -1;
+ debuginfod_client *client = debuginfod_begin ();
+ if (client != NULL)
+ {
+ debuginfod_set_progressfn (client, & debuginfod_find_progress);
+
+ if (artifacttype == "debuginfo")
+ fd = debuginfod_find_debuginfo (client,
+ (const unsigned char*) buildid.c_str(),
+ 0, NULL);
+ else if (artifacttype == "executable")
+ fd = debuginfod_find_executable (client,
+ (const unsigned char*) buildid.c_str(),
+ 0, NULL);
+ else if (artifacttype == "source")
+ fd = debuginfod_find_source (client,
+ (const unsigned char*) buildid.c_str(),
+ 0, suffix.c_str(), NULL);
+ }
+ else
+ fd = -errno; /* Set by debuginfod_begin. */
+ debuginfod_end (client);
+
+ if (fd >= 0)
+ {
+ inc_metric ("http_responses_total","result","upstream");
+ struct stat s;
+ int rc = fstat (fd, &s);
+ if (rc == 0)
+ {
+ auto r = MHD_create_response_from_fd ((uint64_t) s.st_size, fd);
+ if (r)
+ {
+ MHD_add_response_header (r, "Content-Type", "application/octet-stream");
+ add_mhd_last_modified (r, s.st_mtime);
+ if (verbose > 1)
+ obatched(clog) << "serving file from upstream debuginfod/cache" << endl;
+ if (result_fd)
+ *result_fd = fd;
+ return r; // NB: don't close fd; libmicrohttpd will
+ }
+ }
+ close (fd);
+ }
+ else if (fd != -ENOSYS) // no DEBUGINFOD_URLS configured
+ throw libc_exception(-fd, "upstream debuginfod query failed");
+
+ throw reportable_exception(MHD_HTTP_NOT_FOUND, "not found");
+}
+
+
+////////////////////////////////////////////////////////////////////////
+
+static map<string,int64_t> metrics; // arbitrary data for /metrics query
+// NB: store int64_t since all our metrics are integers; prometheus accepts double
+static mutex metrics_lock;
+
+// utility function for assembling prometheus-compatible
+// name="escaped-value" strings
+// https://prometheus.io/docs/instrumenting/exposition_formats/
+static string
+metric_label(const string& name, const string& value)
+{
+ string x = name + "=\"";
+ for (auto&& c : value)
+ switch(c)
+ {
+ case '\\': x += "\\\\"; break;
+ case '\"': x += "\\\""; break;
+ case '\n': x += "\\n"; break;
+ default: x += c; break;
+ }
+ x += "\"";
+ return x;
+}
+
+
+// add prometheus-format metric name + label tuple (if any) + value
+
+static void
+set_metric(const string& metric, int64_t value)
+{
+ unique_lock<mutex> lock(metrics_lock);
+ metrics[metric] = value;
+}
+#if 0 /* unused */
+static void
+inc_metric(const string& metric)
+{
+ unique_lock<mutex> lock(metrics_lock);
+ metrics[metric] ++;
+}
+#endif
+static void
+set_metric(const string& metric,
+ const string& lname, const string& lvalue,
+ int64_t value)
+{
+ string key = (metric + "{" + metric_label(lname, lvalue) + "}");
+ unique_lock<mutex> lock(metrics_lock);
+ metrics[key] = value;
+}
+
+static void
+inc_metric(const string& metric,
+ const string& lname, const string& lvalue)
+{
+ string key = (metric + "{" + metric_label(lname, lvalue) + "}");
+ unique_lock<mutex> lock(metrics_lock);
+ metrics[key] ++;
+}
+static void
+add_metric(const string& metric,
+ const string& lname, const string& lvalue,
+ int64_t value)
+{
+ string key = (metric + "{" + metric_label(lname, lvalue) + "}");
+ unique_lock<mutex> lock(metrics_lock);
+ metrics[key] += value;
+}
+
+
+// and more for higher arity labels if needed
+
+
+static struct MHD_Response*
+handle_metrics ()
+{
+ stringstream o;
+ {
+ unique_lock<mutex> lock(metrics_lock);
+ for (auto&& i : metrics)
+ o << i.first << " " << i.second << endl;
+ }
+ const string& os = o.str();
+ MHD_Response* r = MHD_create_response_from_buffer (os.size(),
+ (void*) os.c_str(),
+ MHD_RESPMEM_MUST_COPY);
+ MHD_add_response_header (r, "Content-Type", "text/plain");
+ return r;
+}
+
+
+////////////////////////////////////////////////////////////////////////
+
+
+/* libmicrohttpd callback */
+static int
+handler_cb (void * /*cls*/,
+ struct MHD_Connection *connection,
+ const char *url,
+ const char *method,
+ const char * /*version*/,
+ const char * /*upload_data*/,
+ size_t * /*upload_data_size*/,
+ void ** /*con_cls*/)
+{
+ struct MHD_Response *r = NULL;
+ string url_copy = url;
+
+ if (verbose)
+ obatched(clog) << conninfo(connection) << " " << method << " " << url << endl;
+
+ try
+ {
+ if (string(method) != "GET")
+ throw reportable_exception(400, "we support GET only");
+
+ /* Start decoding the URL. */
+ size_t slash1 = url_copy.find('/', 1);
+ string url1 = url_copy.substr(0, slash1); // ok even if slash1 not found
+
+ if (slash1 != string::npos && url1 == "/buildid")
+ {
+ size_t slash2 = url_copy.find('/', slash1+1);
+ if (slash2 == string::npos)
+ throw reportable_exception("/buildid/ webapi error, need buildid");
+
+ 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);
+ suffix = "";
+ }
+ else
+ {
+ artifacttype = url_copy.substr(slash2+1, slash3-slash2-1);
+ suffix = url_copy.substr(slash3); // include the slash in the suffix
+ }
+
+ inc_metric("http_requests_total", "type", artifacttype);
+ r = handle_buildid(buildid, artifacttype, suffix, 0); // NB: don't care about result-fd
+ }
+ else if (url1 == "/metrics")
+ {
+ inc_metric("http_requests_total", "type", "metrics");
+ r = handle_metrics();
+ }
+ else
+ throw reportable_exception("webapi error, unrecognized /operation");
+
+ if (r == 0)
+ throw reportable_exception("internal error, missing response");
+
+ int rc = MHD_queue_response (connection, MHD_HTTP_OK, r);
+ MHD_destroy_response (r);
+ return rc;
+ }
+ catch (const reportable_exception& e)
+ {
+ inc_metric("http_responses_total","result","error");
+ e.report(clog);
+ return e.mhd_send_response (connection);
+ }
+}
+
+
+////////////////////////////////////////////////////////////////////////
+// borrowed originally from src/nm.c get_local_names()
+
+static void
+dwarf_extract_source_paths (Elf *elf, set<string>& debug_sourcefiles)
+ noexcept // no exceptions - so we can simplify the altdbg resource release at end
+{
+ Dwarf* dbg = dwarf_begin_elf (elf, DWARF_C_READ, NULL);
+ if (dbg == NULL)
+ return;
+
+ Dwarf* altdbg = NULL;
+ int altdbg_fd = -1;
+
+ // DWZ handling: if we have an unsatisfied debug-alt-link, add an
+ // empty string into the outgoing sourcefiles set, so the caller
+ // should know that our data is incomplete.
+ const char *alt_name_p;
+ const void *alt_build_id; // elfutils-owned memory
+ ssize_t sz = dwelf_dwarf_gnu_debugaltlink (dbg, &alt_name_p, &alt_build_id);
+ if (sz > 0) // got one!
+ {
+ string buildid;
+ unsigned char* build_id_bytes = (unsigned char*) alt_build_id;
+ for (ssize_t idx=0; idx<sz; idx++)
+ {
+ buildid += "0123456789abcdef"[build_id_bytes[idx] >> 4];
+ buildid += "0123456789abcdef"[build_id_bytes[idx] & 0xf];
+ }
+
+ if (verbose > 3)
+ obatched(clog) << "Need altdebug buildid=" << buildid << endl;
+
+ // but is it unsatisfied the normal elfutils ways?
+ Dwarf* alt = dwarf_getalt (dbg);
+ if (alt == NULL)
+ {
+ // Yup, unsatisfied the normal way. Maybe we can satisfy it
+ // from our own debuginfod database.
+ int alt_fd;
+ struct MHD_Response *r = 0;
+ try
+ {
+ r = handle_buildid (buildid, "debuginfo", "", &alt_fd);
+ }
+ catch (const reportable_exception& e)
+ {
+ // swallow exceptions
+ }
+
+ // NB: this is not actually recursive! This invokes the web-query
+ // path, which cannot get back into the scan code paths.
+ if (r)
+ {
+ // Found it!
+ altdbg_fd = dup(alt_fd); // ok if this fails, downstream failures ok
+ alt = altdbg = dwarf_begin (altdbg_fd, DWARF_C_READ);
+ // NB: must close this dwarf and this fd at the bottom of the function!
+ MHD_destroy_response (r); // will close alt_fd
+ if (alt)
+ dwarf_setalt (dbg, alt);
+ }
+ }
+ else
+ {
+ // NB: dwarf_setalt(alt) inappropriate - already done!
+ // NB: altdbg will stay 0 so nothing tries to redundantly dealloc.
+ }
+
+ if (alt)
+ {
+ if (verbose > 3)
+ obatched(clog) << "Resolved altdebug buildid=" << buildid << endl;
+ }
+ else // (alt == NULL) - signal possible presence of poor debuginfo
+ {
+ debug_sourcefiles.insert("");
+ if (verbose > 3)
+ obatched(clog) << "Unresolved altdebug buildid=" << buildid << endl;
+ }
+ }
+
+ Dwarf_Off offset = 0;
+ Dwarf_Off old_offset;
+ size_t hsize;
+
+ while (dwarf_nextcu (dbg, old_offset = offset, &offset, &hsize, NULL, NULL, NULL) == 0)
+ {
+ Dwarf_Die cudie_mem;
+ Dwarf_Die *cudie = dwarf_offdie (dbg, old_offset + hsize, &cudie_mem);
+
+ if (cudie == NULL)
+ continue;
+ if (dwarf_tag (cudie) != DW_TAG_compile_unit)
+ continue;
+
+ const char *cuname = dwarf_diename(cudie) ?: "unknown";
+
+ Dwarf_Files *files;
+ size_t nfiles;
+ if (dwarf_getsrcfiles (cudie, &files, &nfiles) != 0)
+ continue;
+
+ // extract DW_AT_comp_dir to resolve relative file names
+ const char *comp_dir = "";
+ const char *const *dirs;
+ size_t ndirs;
+ if (dwarf_getsrcdirs (files, &dirs, &ndirs) == 0 &&
+ dirs[0] != NULL)
+ comp_dir = dirs[0];
+ if (comp_dir == NULL)
+ comp_dir = "";
+
+ if (verbose > 3)
+ obatched(clog) << "searching for sources for cu=" << cuname << " comp_dir=" << comp_dir
+ << " #files=" << nfiles << " #dirs=" << ndirs << endl;
+
+ if (comp_dir[0] == '\0' && cuname[0] != '/')
+ {
+ // This is a common symptom for dwz-compressed debug files,
+ // where the altdebug file cannot be resolved.
+ if (verbose > 3)
+ obatched(clog) << "skipping cu=" << cuname << " due to empty comp_dir" << endl;
+ continue;
+ }
+
+ for (size_t f = 1; f < nfiles; f++)
+ {
+ const char *hat = dwarf_filesrc (files, f, NULL, NULL);
+ if (hat == NULL)
+ continue;
+
+ if (string(hat) == "<built-in>") // gcc intrinsics, don't bother record
+ continue;
+
+ string waldo;
+ if (hat[0] == '/') // absolute
+ waldo = (string (hat));
+ else if (comp_dir[0] != '\0') // comp_dir relative
+ waldo = (string (comp_dir) + string("/") + string (hat));
+ else
+ {
+ obatched(clog) << "skipping hat=" << hat << " due to empty comp_dir" << endl;
+ continue;
+ }
+
+ // NB: this is the 'waldo' that a dbginfo client will have
+ // to supply for us to give them the file The comp_dir
+ // prefixing is a definite complication. Otherwise we'd
+ // have to return a setof comp_dirs (one per CU!) with
+ // corresponding filesrc[] names, instead of one absolute
+ // resoved set. Maybe we'll have to do that anyway. XXX
+
+ if (verbose > 4)
+ obatched(clog) << waldo
+ << (debug_sourcefiles.find(waldo)==debug_sourcefiles.end() ? " new" : " dup") << endl;
+
+ debug_sourcefiles.insert (waldo);
+ }
+ }
+
+ dwarf_end(dbg);
+ if (altdbg)
+ dwarf_end(altdbg);
+ if (altdbg_fd >= 0)
+ close(altdbg_fd);
+}
+
+
+
+static void
+elf_classify (int fd, bool &executable_p, bool &debuginfo_p, string &buildid, set<string>& debug_sourcefiles)
+{
+ Elf *elf = elf_begin (fd, ELF_C_READ_MMAP_PRIVATE, NULL);
+ if (elf == NULL)
+ return;
+
+ try // catch our types of errors and clean up the Elf* object
+ {
+ if (elf_kind (elf) != ELF_K_ELF)
+ {
+ elf_end (elf);
+ return;
+ }
+
+ GElf_Ehdr ehdr_storage;
+ GElf_Ehdr *ehdr = gelf_getehdr (elf, &ehdr_storage);
+ if (ehdr == NULL)
+ {
+ elf_end (elf);
+ return;
+ }
+ auto elf_type = ehdr->e_type;
+
+ const void *build_id; // elfutils-owned memory
+ ssize_t sz = dwelf_elf_gnu_build_id (elf, & build_id);
+ if (sz <= 0)
+ {
+ // It's not a diagnostic-worthy error for an elf file to lack build-id.
+ // It might just be very old.
+ elf_end (elf);
+ return;
+ }
+
+ // build_id is a raw byte array; convert to hexadecimal *lowercase*
+ unsigned char* build_id_bytes = (unsigned char*) build_id;
+ for (ssize_t idx=0; idx<sz; idx++)
+ {
+ buildid += "0123456789abcdef"[build_id_bytes[idx] >> 4];
+ buildid += "0123456789abcdef"[build_id_bytes[idx] & 0xf];
+ }
+
+ // now decide whether it's an executable - namely, any allocatable section has
+ // PROGBITS;
+ if (elf_type == ET_EXEC || elf_type == ET_DYN)
+ {
+ size_t shnum;
+ int rc = elf_getshdrnum (elf, &shnum);
+ if (rc < 0)
+ throw elfutils_exception(rc, "getshdrnum");
+
+ executable_p = false;
+ for (size_t sc = 0; sc < shnum; sc++)
+ {
+ Elf_Scn *scn = elf_getscn (elf, sc);
+ if (scn == NULL)
+ continue;
+
+ GElf_Shdr shdr_mem;
+ GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem);
+ if (shdr == NULL)
+ continue;
+
+ // allocated (loadable / vm-addr-assigned) section with available content?
+ if ((shdr->sh_type == SHT_PROGBITS) && (shdr->sh_flags & SHF_ALLOC))
+ {
+ if (verbose > 4)
+ obatched(clog) << "executable due to SHF_ALLOC SHT_PROGBITS sc=" << sc << endl;
+ executable_p = true;
+ break; // no need to keep looking for others
+ }
+ } // iterate over sections
+ } // executable_p classification
+
+ // now decide whether it's a debuginfo - namely, if it has any .debug* or .zdebug* sections
+ // logic mostly stolen from fweimer@redhat.com's elfclassify drafts
+ size_t shstrndx;
+ int rc = elf_getshdrstrndx (elf, &shstrndx);
+ if (rc < 0)
+ throw elfutils_exception(rc, "getshdrstrndx");
+
+ Elf_Scn *scn = NULL;
+ while (true)
+ {
+ scn = elf_nextscn (elf, scn);
+ if (scn == NULL)
+ break;
+ GElf_Shdr shdr_storage;
+ GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_storage);
+ if (shdr == NULL)
+ break;
+ 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)
+ {
+ 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)
+ {
+ debuginfo_p = true;
+ // NB: don't break; need to parse .debug_line for sources
+ }
+ }
+ }
+ catch (const reportable_exception& e)
+ {
+ e.report(clog);
+ }
+ elf_end (elf);
+}
+
+
+static semaphore* scan_concurrency_sem = 0; // used to implement -c load limiting
+
+
+static void
+scan_source_file_path (const string& dir)
+{
+ obatched(clog) << "fts/file traversing " << dir << endl;
+
+ struct timeval tv_start, tv_end;
+ gettimeofday (&tv_start, NULL);
+
+ sqlite_ps ps_upsert_buildids (db, "file-buildids-intern", "insert or ignore into " BUILDIDS "_buildids VALUES (NULL, ?);");
+ sqlite_ps ps_upsert_files (db, "file-files-intern", "insert or ignore into " BUILDIDS "_files VALUES (NULL, ?);");
+ sqlite_ps ps_upsert_de (db, "file-de-upsert",
+ "insert or ignore into " BUILDIDS "_f_de "
+ "(buildid, debuginfo_p, executable_p, file, mtime) "
+ "values ((select id from " BUILDIDS "_buildids where hex = ?),"
+ " ?,?,"
+ " (select id from " BUILDIDS "_files where name = ?), ?);");
+ sqlite_ps ps_upsert_s (db, "file-s-upsert",
+ "insert or ignore into " BUILDIDS "_f_s "
+ "(buildid, artifactsrc, file, mtime) "
+ "values ((select id from " BUILDIDS "_buildids where hex = ?),"
+ " (select id from " BUILDIDS "_files where name = ?),"
+ " (select id from " BUILDIDS "_files where name = ?),"
+ " ?);");
+ sqlite_ps ps_query (db, "file-negativehit-find",
+ "select 1 from " BUILDIDS "_file_mtime_scanned where sourcetype = 'F' and file = (select id from " BUILDIDS "_files where name = ?) and mtime = ?;");
+ sqlite_ps ps_scan_done (db, "file-scanned",
+ "insert or ignore into " BUILDIDS "_file_mtime_scanned (sourcetype, file, mtime, size)"
+ "values ('F', (select id from " BUILDIDS "_files where name = ?), ?, ?);");
+
+
+ char * const dirs[] = { (char*) dir.c_str(), NULL };
+
+ unsigned fts_scanned=0, fts_regex=0, fts_cached=0, fts_debuginfo=0, fts_executable=0, fts_sourcefiles=0;
+
+ FTS *fts = fts_open (dirs,
+ (traverse_logical ? FTS_LOGICAL : FTS_PHYSICAL|FTS_XDEV)
+ | FTS_NOCHDIR /* multithreaded */,
+ NULL);
+ if (fts == NULL)
+ {
+ obatched(cerr) << "cannot fts_open " << dir << endl;
+ return;
+ }
+
+ FTSENT *f;
+ while ((f = fts_read (fts)) != NULL)
+ {
+ semaphore_borrower handle_one_file (scan_concurrency_sem);
+
+ fts_scanned ++;
+ if (interrupted)
+ break;
+
+ if (verbose > 2)
+ obatched(clog) << "fts/file traversing " << f->fts_path << endl;
+
+ try
+ {
+ /* Found a file. Convert it to an absolute path, so
+ the buildid database does not have relative path
+ names that are unresolvable from a subsequent run
+ in a different cwd. */
+ char *rp = realpath(f->fts_path, NULL);
+ if (rp == NULL)
+ continue; // ignore dangling symlink or such
+ string rps = string(rp);
+ free (rp);
+
+ bool ri = !regexec (&file_include_regex, rps.c_str(), 0, 0, 0);
+ bool rx = !regexec (&file_exclude_regex, rps.c_str(), 0, 0, 0);
+ if (!ri || rx)
+ {
+ if (verbose > 3)
+ obatched(clog) << "fts/file skipped by regex " << (!ri ? "I" : "") << (rx ? "X" : "") << endl;
+ fts_regex ++;
+ continue;
+ }
+
+ switch (f->fts_info)
+ {
+ case FTS_D:
+ break;
+
+ case FTS_DP:
+ break;
+
+ case FTS_F:
+ {
+ /* See if we know of it already. */
+ int rc = ps_query
+ .reset()
+ .bind(1, rps)
+ .bind(2, f->fts_statp->st_mtime)
+ .step();
+ ps_query.reset();
+ if (rc == SQLITE_ROW) // i.e., a result, as opposed to DONE (no results)
+ // no need to recheck a file/version we already know
+ // specifically, no need to elf-begin a file we already determined is non-elf
+ // (so is stored with buildid=NULL)
+ {
+ fts_cached ++;
+ continue;
+ }
+
+ bool executable_p = false, debuginfo_p = false; // E and/or D
+ string buildid;
+ set<string> sourcefiles;
+
+ int fd = open (rps.c_str(), O_RDONLY);
+ try
+ {
+ if (fd >= 0)
+ elf_classify (fd, executable_p, debuginfo_p, buildid, sourcefiles);
+ else
+ throw libc_exception(errno, string("open ") + rps);
+ inc_metric ("scanned_total","source","file");
+ }
+
+ // NB: we catch exceptions here too, so that we can
+ // cache the corrupt-elf case (!executable_p &&
+ // !debuginfo_p) just below, just as if we had an
+ // EPERM error from open(2).
+
+ catch (const reportable_exception& e)
+ {
+ e.report(clog);
+ }
+
+ if (fd >= 0)
+ close (fd);
+
+ // register this file name in the interning table
+ ps_upsert_files
+ .reset()
+ .bind(1, rps)
+ .step_ok_done();
+
+ if (buildid == "")
+ {
+ // no point storing an elf file without buildid
+ executable_p = false;
+ debuginfo_p = false;
+ }
+ else
+ {
+ // register this build-id in the interning table
+ ps_upsert_buildids
+ .reset()
+ .bind(1, buildid)
+ .step_ok_done();
+ }
+
+ if (executable_p)
+ fts_executable ++;
+ if (debuginfo_p)
+ fts_debuginfo ++;
+ if (executable_p || debuginfo_p)
+ {
+ ps_upsert_de
+ .reset()
+ .bind(1, buildid)
+ .bind(2, debuginfo_p ? 1 : 0)
+ .bind(3, executable_p ? 1 : 0)
+ .bind(4, rps)
+ .bind(5, f->fts_statp->st_mtime)
+ .step_ok_done();
+ }
+ if (executable_p)
+ inc_metric("found_executable_total","source","files");
+ if (debuginfo_p)
+ inc_metric("found_debuginfo_total","source","files");
+
+ if (sourcefiles.size() && buildid != "")
+ {
+ fts_sourcefiles += sourcefiles.size();
+
+ for (auto&& dwarfsrc : sourcefiles)
+ {
+ char *srp = realpath(dwarfsrc.c_str(), NULL);
+ if (srp == NULL) // also if DWZ unresolved dwarfsrc=""
+ continue; // unresolvable files are not a serious problem
+ // throw libc_exception(errno, "fts/file realpath " + srcpath);
+ string srps = string(srp);
+ free (srp);
+
+ struct stat sfs;
+ rc = stat(srps.c_str(), &sfs);
+ if (rc != 0)
+ continue;
+
+ if (verbose > 2)
+ obatched(clog) << "recorded buildid=" << buildid << " file=" << srps
+ << " mtime=" << sfs.st_mtime
+ << " as source " << dwarfsrc << endl;
+
+ ps_upsert_files
+ .reset()
+ .bind(1, srps)
+ .step_ok_done();
+
+ // register the dwarfsrc name in the interning table too
+ ps_upsert_files
+ .reset()
+ .bind(1, dwarfsrc)
+ .step_ok_done();
+
+ ps_upsert_s
+ .reset()
+ .bind(1, buildid)
+ .bind(2, dwarfsrc)
+ .bind(3, srps)
+ .bind(4, sfs.st_mtime)
+ .step_ok_done();
+
+ inc_metric("found_sourcerefs_total","source","files");
+ }
+ }
+
+ ps_scan_done
+ .reset()
+ .bind(1, rps)
+ .bind(2, f->fts_statp->st_mtime)
+ .bind(3, f->fts_statp->st_size)
+ .step_ok_done();
+
+ if (verbose > 2)
+ obatched(clog) << "recorded buildid=" << buildid << " file=" << rps
+ << " mtime=" << f->fts_statp->st_mtime << " atype="
+ << (executable_p ? "E" : "")
+ << (debuginfo_p ? "D" : "") << endl;
+ }
+ break;
+
+ case FTS_ERR:
+ case FTS_NS:
+ throw libc_exception(f->fts_errno, string("fts/file traversal ") + string(f->fts_path));
+
+ default:
+ case FTS_SL: /* ignore symlinks; seen in non-L mode only */
+ break;
+ }
+
+ if ((verbose && f->fts_info == FTS_DP) ||
+ (verbose > 1 && f->fts_info == FTS_F))
+ obatched(clog) << "fts/file traversing " << rps << ", scanned=" << fts_scanned
+ << ", regex-skipped=" << fts_regex
+ << ", cached=" << fts_cached << ", debuginfo=" << fts_debuginfo
+ << ", executable=" << fts_executable << ", source=" << fts_sourcefiles << endl;
+ }
+ catch (const reportable_exception& e)
+ {
+ e.report(clog);
+ }
+ }
+ fts_close (fts);
+
+ gettimeofday (&tv_end, NULL);
+ double deltas = (tv_end.tv_sec - tv_start.tv_sec) + (tv_end.tv_usec - tv_start.tv_usec)*0.000001;
+
+ obatched(clog) << "fts/file traversed " << dir << " in " << deltas << "s, scanned=" << fts_scanned
+ << ", regex-skipped=" << fts_regex
+ << ", cached=" << fts_cached << ", debuginfo=" << fts_debuginfo
+ << ", executable=" << fts_executable << ", source=" << fts_sourcefiles << endl;
+}
+
+
+static void*
+thread_main_scan_source_file_path (void* arg)
+{
+ string dir = string((const char*) arg);
+
+ unsigned rescan_timer = 0;
+ sig_atomic_t forced_rescan_count = 0;
+ set_metric("thread_timer_max", "file", dir, rescan_s);
+ set_metric("thread_tid", "file", dir, tid());
+ while (! interrupted)
+ {
+ set_metric("thread_timer", "file", dir, rescan_timer);
+ set_metric("thread_forced_total", "file", dir, forced_rescan_count);
+ if (rescan_s && rescan_timer > rescan_s)
+ rescan_timer = 0;
+ if (sigusr1 != forced_rescan_count)
+ {
+ forced_rescan_count = sigusr1;
+ rescan_timer = 0;
+ }
+ if (rescan_timer == 0)
+ try
+ {
+ set_metric("thread_working", "file", dir, time(NULL));
+ inc_metric("thread_work_total", "file", dir);
+ scan_source_file_path (dir);
+ set_metric("thread_working", "file", dir, 0);
+ }
+ catch (const sqlite_exception& e)
+ {
+ obatched(cerr) << e.message << endl;
+ }
+ sleep (1);
+ rescan_timer ++;
+ }
+
+ return 0;
+}
+
+
+////////////////////////////////////////////////////////////////////////
+
+
+
+
+// Analyze given *.rpm file of given age; record buildids / exec/debuginfo-ness of its
+// constituent files with given upsert statements.
+static void
+rpm_classify (const string& rps, sqlite_ps& ps_upsert_buildids, sqlite_ps& ps_upsert_files,
+ sqlite_ps& ps_upsert_de, sqlite_ps& ps_upsert_sref, sqlite_ps& ps_upsert_sdef,
+ time_t mtime,
+ unsigned& fts_executable, unsigned& fts_debuginfo, unsigned& fts_sref, unsigned& fts_sdef,
+ bool& fts_sref_complete_p)
+{
+ string popen_cmd = string("rpm2cpio " + shell_escape(rps));
+ FILE* fp = popen (popen_cmd.c_str(), "r"); // "e" O_CLOEXEC?
+ if (fp == NULL)
+ throw libc_exception (errno, string("popen ") + popen_cmd);
+ defer_dtor<FILE*,int> fp_closer (fp, pclose);
+
+ struct archive *a;
+ a = archive_read_new();
+ if (a == NULL)
+ throw archive_exception("cannot create archive reader");
+ defer_dtor<struct archive*,int> archive_closer (a, archive_read_free);
+
+ int rc = archive_read_support_format_cpio(a);
+ if (rc != ARCHIVE_OK)
+ throw archive_exception(a, "cannot select cpio format");
+ rc = archive_read_support_filter_all(a);
+ if (rc != ARCHIVE_OK)
+ throw archive_exception(a, "cannot select all filters");
+
+ rc = archive_read_open_FILE (a, fp);
+ if (rc != ARCHIVE_OK)
+ throw archive_exception(a, "cannot open archive from rpm2cpio pipe");
+
+ if (verbose > 3)
+ obatched(clog) << "rpm2cpio|libarchive scanning " << rps << endl;
+
+ while(1) // parse cpio archive entries
+ {
+ try
+ {
+ struct archive_entry *e;
+ rc = archive_read_next_header (a, &e);
+ if (rc != ARCHIVE_OK)
+ break;
+
+ if (! S_ISREG(archive_entry_mode (e))) // skip non-files completely
+ continue;
+
+ string fn = archive_entry_pathname (e);
+ if (fn.size() > 1 && fn[0] == '.')
+ fn = fn.substr(1); // trim off the leading '.'
+
+ if (verbose > 3)
+ obatched(clog) << "rpm2cpio|libarchive checking " << fn << endl;
+
+ // extract this file to a temporary file
+ const char *tmpdir_env = getenv ("TMPDIR") ?: "/tmp";
+ char* tmppath = NULL;
+ rc = asprintf (&tmppath, "%s/debuginfod.XXXXXX", tmpdir_env);
+ if (rc < 0)
+ throw libc_exception (ENOMEM, "cannot allocate tmppath");
+ defer_dtor<void*,void> tmmpath_freer (tmppath, free);
+ int fd = mkstemp (tmppath);
+ if (fd < 0)
+ throw libc_exception (errno, "cannot create temporary file");
+ unlink (tmppath); // unlink now so OS will release the file as soon as we close the fd
+ defer_dtor<int,int> minifd_closer (fd, close);
+
+ rc = archive_read_data_into_fd (a, fd);
+ if (rc != ARCHIVE_OK)
+ throw archive_exception(a, "cannot extract file");
+
+ // finally ... time to run elf_classify on this bad boy and update the database
+ bool executable_p = false, debuginfo_p = false;
+ string buildid;
+ set<string> sourcefiles;
+ elf_classify (fd, executable_p, debuginfo_p, buildid, sourcefiles);
+ // NB: might throw
+
+ if (buildid != "") // intern buildid
+ {
+ ps_upsert_buildids
+ .reset()
+ .bind(1, buildid)
+ .step_ok_done();
+ }
+
+ ps_upsert_files // register this rpm constituent file name in interning table
+ .reset()
+ .bind(1, fn)
+ .step_ok_done();
+
+ if (sourcefiles.size() > 0) // sref records needed
+ {
+ // NB: we intern each source file once. Once raw, as it
+ // appears in the DWARF file list coming back from
+ // elf_classify() - because it'll end up in the
+ // _norm.artifactsrc column. We don't also put another
+ // version with a '.' at the front, even though that's
+ // how rpm/cpio packs names, because we hide that from
+ // the database for storage efficiency.
+
+ for (auto&& s : sourcefiles)
+ {
+ if (s == "")
+ {
+ fts_sref_complete_p = false;
+ continue;
+ }
+
+ ps_upsert_files
+ .reset()
+ .bind(1, s)
+ .step_ok_done();
+
+ ps_upsert_sref
+ .reset()
+ .bind(1, buildid)
+ .bind(2, s)
+ .step_ok_done();
+
+ fts_sref ++;
+ }
+ }
+
+ if (executable_p)
+ fts_executable ++;
+ if (debuginfo_p)
+ fts_debuginfo ++;
+
+ if (executable_p || debuginfo_p)
+ {
+ ps_upsert_de
+ .reset()
+ .bind(1, buildid)
+ .bind(2, debuginfo_p ? 1 : 0)
+ .bind(3, executable_p ? 1 : 0)
+ .bind(4, rps)
+ .bind(5, mtime)
+ .bind(6, fn)
+ .step_ok_done();
+ }
+ else // potential source - sdef record
+ {
+ fts_sdef ++;
+ ps_upsert_sdef
+ .reset()
+ .bind(1, rps)
+ .bind(2, mtime)
+ .bind(3, fn)
+ .step_ok_done();
+ }
+
+ if ((verbose > 2) && (executable_p || debuginfo_p))
+ obatched(clog) << "recorded buildid=" << buildid << " rpm=" << rps << " file=" << fn
+ << " mtime=" << mtime << " atype="
+ << (executable_p ? "E" : "")
+ << (debuginfo_p ? "D" : "")
+ << " sourcefiles=" << sourcefiles.size() << endl;
+
+ }
+ catch (const reportable_exception& e)
+ {
+ e.report(clog);
+ }
+ }
+}
+
+
+
+// scan for *.rpm files
+static void
+scan_source_rpm_path (const string& dir)
+{
+ obatched(clog) << "fts/rpm traversing " << dir << endl;
+
+ sqlite_ps ps_upsert_buildids (db, "rpm-buildid-intern", "insert or ignore into " BUILDIDS "_buildids VALUES (NULL, ?);");
+ sqlite_ps ps_upsert_files (db, "rpm-file-intern", "insert or ignore into " BUILDIDS "_files VALUES (NULL, ?);");
+ sqlite_ps ps_upsert_de (db, "rpm-de-insert",
+ "insert or ignore into " BUILDIDS "_r_de (buildid, debuginfo_p, executable_p, file, mtime, content) values ("
+ "(select id from " BUILDIDS "_buildids where hex = ?), ?, ?, "
+ "(select id from " BUILDIDS "_files where name = ?), ?, "
+ "(select id from " BUILDIDS "_files where name = ?));");
+ sqlite_ps ps_upsert_sref (db, "rpm-sref-insert",
+ "insert or ignore into " BUILDIDS "_r_sref (buildid, artifactsrc) values ("
+ "(select id from " BUILDIDS "_buildids where hex = ?), "
+ "(select id from " BUILDIDS "_files where name = ?));");
+ sqlite_ps ps_upsert_sdef (db, "rpm-sdef-insert",
+ "insert or ignore into " BUILDIDS "_r_sdef (file, mtime, content) values ("
+ "(select id from " BUILDIDS "_files where name = ?), ?,"
+ "(select id from " BUILDIDS "_files where name = ?));");
+ sqlite_ps ps_query (db, "rpm-negativehit-query",
+ "select 1 from " BUILDIDS "_file_mtime_scanned where "
+ "sourcetype = 'R' and file = (select id from " BUILDIDS "_files where name = ?) and mtime = ?;");
+ sqlite_ps ps_scan_done (db, "rpm-scanned",
+ "insert or ignore into " BUILDIDS "_file_mtime_scanned (sourcetype, file, mtime, size)"
+ "values ('R', (select id from " BUILDIDS "_files where name = ?), ?, ?);");
+
+ char * const dirs[] = { (char*) dir.c_str(), NULL };
+
+ struct timeval tv_start, tv_end;
+ gettimeofday (&tv_start, NULL);
+ unsigned fts_scanned=0, fts_regex=0, fts_cached=0, fts_debuginfo=0;
+ unsigned fts_executable=0, fts_rpm = 0, fts_sref=0, fts_sdef=0;
+
+ FTS *fts = fts_open (dirs,
+ (traverse_logical ? FTS_LOGICAL : FTS_PHYSICAL|FTS_XDEV)
+ | FTS_NOCHDIR /* multithreaded */,
+ NULL);
+ if (fts == NULL)
+ {
+ obatched(cerr) << "cannot fts_open " << dir << endl;
+ return;
+ }
+
+ FTSENT *f;
+ while ((f = fts_read (fts)) != NULL)
+ {
+ semaphore_borrower handle_one_file (scan_concurrency_sem);
+
+ fts_scanned ++;
+ if (interrupted)
+ break;
+
+ if (verbose > 2)
+ obatched(clog) << "fts/rpm traversing " << f->fts_path << endl;
+
+ try
+ {
+ /* Found a file. Convert it to an absolute path, so
+ the buildid database does not have relative path
+ names that are unresolvable from a subsequent run
+ in a different cwd. */
+ char *rp = realpath(f->fts_path, NULL);
+ if (rp == NULL)
+ continue; // ignore dangling symlink or such
+ string rps = string(rp);
+ free (rp);
+
+ bool ri = !regexec (&file_include_regex, rps.c_str(), 0, 0, 0);
+ bool rx = !regexec (&file_exclude_regex, rps.c_str(), 0, 0, 0);
+ if (!ri || rx)
+ {
+ if (verbose > 3)
+ obatched(clog) << "fts/rpm skipped by regex " << (!ri ? "I" : "") << (rx ? "X" : "") << endl;
+ fts_regex ++;
+ continue;
+ }
+
+ switch (f->fts_info)
+ {
+ case FTS_D:
+ break;
+
+ case FTS_DP:
+ break;
+
+ case FTS_F:
+ {
+ // heuristic: reject if file name does not end with ".rpm"
+ // (alternative: try opening with librpm etc., caching)
+ string suffix = ".rpm";
+ if (rps.size() < suffix.size() ||
+ rps.substr(rps.size()-suffix.size()) != suffix)
+ continue;
+ fts_rpm ++;
+
+ /* See if we know of it already. */
+ int rc = ps_query
+ .reset()
+ .bind(1, rps)
+ .bind(2, f->fts_statp->st_mtime)
+ .step();
+ ps_query.reset();
+ if (rc == SQLITE_ROW) // i.e., a result, as opposed to DONE (no results)
+ // no need to recheck a file/version we already know
+ // specifically, no need to parse this rpm again, since we already have
+ // it as a D or E or S record,
+ // (so is stored with buildid=NULL)
+ {
+ fts_cached ++;
+ continue;
+ }
+
+ // intern the rpm file name
+ ps_upsert_files
+ .reset()
+ .bind(1, rps)
+ .step_ok_done();
+
+ // extract the rpm contents via popen("rpm2cpio") | libarchive | loop-of-elf_classify()
+ unsigned my_fts_executable = 0, my_fts_debuginfo = 0, my_fts_sref = 0, my_fts_sdef = 0;
+ bool my_fts_sref_complete_p = true;
+ try
+ {
+ rpm_classify (rps,
+ ps_upsert_buildids, ps_upsert_files,
+ ps_upsert_de, ps_upsert_sref, ps_upsert_sdef, // dalt
+ f->fts_statp->st_mtime,
+ my_fts_executable, my_fts_debuginfo, my_fts_sref, my_fts_sdef,
+ my_fts_sref_complete_p);
+ inc_metric ("scanned_total","source","rpm");
+ add_metric("found_debuginfo_total","source","rpm",
+ my_fts_debuginfo);
+ add_metric("found_executable_total","source","rpm",
+ my_fts_executable);
+ add_metric("found_sourcerefs_total","source","rpm",
+ my_fts_sref);
+ }
+ catch (const reportable_exception& e)
+ {
+ e.report(clog);
+ }
+
+ if (verbose > 2)
+ obatched(clog) << "scanned rpm=" << rps
+ << " mtime=" << f->fts_statp->st_mtime
+ << " executables=" << my_fts_executable
+ << " debuginfos=" << my_fts_debuginfo
+ << " srefs=" << my_fts_sref
+ << " sdefs=" << my_fts_sdef
+ << endl;
+
+ fts_executable += my_fts_executable;
+ fts_debuginfo += my_fts_debuginfo;
+ fts_sref += my_fts_sref;
+ fts_sdef += my_fts_sdef;
+
+ if (my_fts_sref_complete_p) // leave incomplete?
+ ps_scan_done
+ .reset()
+ .bind(1, rps)
+ .bind(2, f->fts_statp->st_mtime)
+ .bind(3, f->fts_statp->st_size)
+ .step_ok_done();
+ }
+ break;
+
+ case FTS_ERR:
+ case FTS_NS:
+ throw libc_exception(f->fts_errno, string("fts/rpm traversal ") + string(f->fts_path));
+
+ default:
+ case FTS_SL: /* ignore symlinks; seen in non-L mode only */
+ break;
+ }
+
+ if ((verbose && f->fts_info == FTS_DP) ||
+ (verbose > 1 && f->fts_info == FTS_F))
+ obatched(clog) << "fts/rpm traversing " << rps << ", scanned=" << fts_scanned
+ << ", regex-skipped=" << fts_regex
+ << ", rpm=" << fts_rpm << ", cached=" << fts_cached << ", debuginfo=" << fts_debuginfo
+ << ", executable=" << fts_executable
+ << ", sourcerefs=" << fts_sref << ", sourcedefs=" << fts_sdef << endl;
+ }
+ catch (const reportable_exception& e)
+ {
+ e.report(clog);
+ }
+ }
+ fts_close (fts);
+
+ gettimeofday (&tv_end, NULL);
+ double deltas = (tv_end.tv_sec - tv_start.tv_sec) + (tv_end.tv_usec - tv_start.tv_usec)*0.000001;
+
+ obatched(clog) << "fts/rpm traversed " << dir << " in " << deltas << "s, scanned=" << fts_scanned
+ << ", regex-skipped=" << fts_regex
+ << ", rpm=" << fts_rpm << ", cached=" << fts_cached << ", debuginfo=" << fts_debuginfo
+ << ", executable=" << fts_executable
+ << ", sourcerefs=" << fts_sref << ", sourcedefs=" << fts_sdef << endl;
+}
+
+
+
+static void*
+thread_main_scan_source_rpm_path (void* arg)
+{
+ string dir = string((const char*) arg);
+
+ unsigned rescan_timer = 0;
+ sig_atomic_t forced_rescan_count = 0;
+ set_metric("thread_timer_max", "rpm", dir, rescan_s);
+ set_metric("thread_tid", "rpm", dir, tid());
+ while (! interrupted)
+ {
+ set_metric("thread_timer", "rpm", dir, rescan_timer);
+ set_metric("thread_forced_total", "rpm", dir, forced_rescan_count);
+ if (rescan_s && rescan_timer > rescan_s)
+ rescan_timer = 0;
+ if (sigusr1 != forced_rescan_count)
+ {
+ forced_rescan_count = sigusr1;
+ rescan_timer = 0;
+ }
+ if (rescan_timer == 0)
+ try
+ {
+ set_metric("thread_working", "rpm", dir, time(NULL));
+ inc_metric("thread_work_total", "rpm", dir);
+ scan_source_rpm_path (dir);
+ set_metric("thread_working", "rpm", dir, 0);
+ }
+ catch (const sqlite_exception& e)
+ {
+ obatched(cerr) << e.message << endl;
+ }
+ sleep (1);
+ rescan_timer ++;
+ }
+
+ return 0;
+}
+
+
+////////////////////////////////////////////////////////////////////////
+
+static void
+database_stats_report()
+{
+ sqlite_ps ps_query (db, "database-overview",
+ "select label,quantity from " BUILDIDS "_stats");
+
+ obatched(clog) << "database record counts:" << endl;
+ while (1)
+ {
+ int rc = sqlite3_step (ps_query);
+ if (rc == SQLITE_DONE) break;
+ if (rc != SQLITE_ROW)
+ throw sqlite_exception(rc, "step");
+
+ obatched(clog)
+ << right << setw(20) << ((const char*) sqlite3_column_text(ps_query, 0) ?: (const char*) "NULL")
+ << " "
+ << (sqlite3_column_text(ps_query, 1) ?: (const unsigned char*) "NULL")
+ << endl;
+
+ set_metric("groom", "statistic",
+ ((const char*) sqlite3_column_text(ps_query, 0) ?: (const char*) "NULL"),
+ (sqlite3_column_double(ps_query, 1)));
+ }
+}
+
+
+// Do a round of database grooming that might take many minutes to run.
+void groom()
+{
+ obatched(clog) << "grooming database" << endl;
+
+ struct timeval tv_start, tv_end;
+ gettimeofday (&tv_start, NULL);
+
+ // 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 = ?");
+ files.reset();
+ while(1)
+ {
+ int rc = files.step();
+ if (rc != SQLITE_ROW)
+ break;
+
+ int64_t mtime = sqlite3_column_int64 (files, 0);
+ int64_t fileid = sqlite3_column_int64 (files, 1);
+ const char* filename = ((const char*) sqlite3_column_text (files, 2) ?: "");
+ struct stat s;
+ rc = stat(filename, &s);
+ if (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();
+ }
+ }
+ files.reset();
+
+ // 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",
+ "delete from " BUILDIDS "_buildids "
+ "where not exists (select 1 from " BUILDIDS "_f_de d where " BUILDIDS "_buildids.id = d.buildid) "
+ "and not exists (select 1 from " BUILDIDS "_r_de d where " BUILDIDS "_buildids.id = d.buildid)");
+ buildids_del.reset().step_ok_done();
+
+ // NB: "vacuum" is too heavy for even daily runs: it rewrites the entire db, so is done as maxigroom -G
+ sqlite_ps g1 (db, "incremental vacuum", "pragma incremental_vacuum");
+ g1.reset().step_ok_done();
+ sqlite_ps g2 (db, "optimize", "pragma optimize");
+ g2.reset().step_ok_done();
+ sqlite_ps g3 (db, "wal checkpoint", "pragma wal_checkpoint=truncate");
+ g3.reset().step_ok_done();
+
+ database_stats_report();
+
+ sqlite3_db_release_memory(db); // shrink the process if possible
+
+ gettimeofday (&tv_end, NULL);
+ double deltas = (tv_end.tv_sec - tv_start.tv_sec) + (tv_end.tv_usec - tv_start.tv_usec)*0.000001;
+
+ obatched(clog) << "groomed database in " << deltas << "s" << endl;
+}
+
+
+static void*
+thread_main_groom (void* /*arg*/)
+{
+ unsigned groom_timer = 0;
+ sig_atomic_t forced_groom_count = 0;
+ set_metric("thread_timer_max", "role", "groom", groom_s);
+ set_metric("thread_tid", "role", "groom", tid());
+ while (! interrupted)
+ {
+ set_metric("thread_timer", "role", "groom", groom_timer);
+ set_metric("thread_forced_total", "role", "groom", forced_groom_count);
+ if (groom_s && groom_timer > groom_s)
+ groom_timer = 0;
+ if (sigusr2 != forced_groom_count)
+ {
+ forced_groom_count = sigusr2;
+ groom_timer = 0;
+ }
+ if (groom_timer == 0)
+ try
+ {
+ set_metric("thread_working", "role", "groom", time(NULL));
+ inc_metric("thread_work_total", "role", "groom");
+ groom ();
+ set_metric("thread_working", "role", "groom", 0);
+ }
+ catch (const sqlite_exception& e)
+ {
+ obatched(cerr) << e.message << endl;
+ }
+ sleep (1);
+ groom_timer ++;
+ }
+
+ return 0;
+}
+
+
+////////////////////////////////////////////////////////////////////////
+
+
+static void
+signal_handler (int /* sig */)
+{
+ interrupted ++;
+
+ if (db)
+ sqlite3_interrupt (db);
+
+ // NB: don't do anything else in here
+}
+
+static void
+sigusr1_handler (int /* sig */)
+{
+ sigusr1 ++;
+ // NB: don't do anything else in here
+}
+
+static void
+sigusr2_handler (int /* sig */)
+{
+ sigusr2 ++;
+ // NB: don't do anything else in here
+}
+
+
+
+
+
+// A user-defined sqlite function, to score the sharedness of the
+// prefix of two strings. This is used to compare candidate debuginfo
+// / source-rpm names, so that the closest match
+// (directory-topology-wise closest) is found. This is important in
+// case the same sref (source file name) is in many -debuginfo or
+// -debugsource RPMs, such as when multiple versions/releases of the
+// same package are in the database.
+
+static void sqlite3_sharedprefix_fn (sqlite3_context* c, int argc, sqlite3_value** argv)
+{
+ if (argc != 2)
+ sqlite3_result_error(c, "expect 2 string arguments", -1);
+ else if ((sqlite3_value_type(argv[0]) != SQLITE_TEXT) ||
+ (sqlite3_value_type(argv[1]) != SQLITE_TEXT))
+ sqlite3_result_null(c);
+ else
+ {
+ const unsigned char* a = sqlite3_value_text (argv[0]);
+ const unsigned char* b = sqlite3_value_text (argv[1]);
+ int i = 0;
+ while (*a++ == *b++)
+ i++;
+ sqlite3_result_int (c, i);
+ }
+}
+
+
+int
+main (int argc, char *argv[])
+{
+ (void) setlocale (LC_ALL, "");
+ (void) bindtextdomain (PACKAGE_TARNAME, LOCALEDIR);
+ (void) textdomain (PACKAGE_TARNAME);
+
+ /* Tell the library which version we are expecting. */
+ elf_version (EV_CURRENT);
+
+ /* Set computed default values. */
+ db_path = string(getenv("HOME") ?: "/") + string("/.debuginfod.sqlite"); /* XDG? */
+ int rc = regcomp (& file_include_regex, ".*", REG_EXTENDED|REG_NOSUB); // match everything
+ if (rc != 0)
+ error (EXIT_FAILURE, 0, "regcomp failure: %d", rc);
+ rc = regcomp (& file_exclude_regex, "^$", REG_EXTENDED|REG_NOSUB); // match nothing
+ if (rc != 0)
+ error (EXIT_FAILURE, 0, "regcomp failure: %d", rc);
+
+ /* Parse and process arguments. */
+ int remaining;
+ argp_program_version_hook = print_version; // this works
+ (void) argp_parse (&argp, argc, argv, ARGP_IN_ORDER, &remaining, NULL);
+ if (remaining != argc)
+ error (EXIT_FAILURE, 0,
+ "unexpected argument: %s", argv[remaining]);
+
+ if (!scan_rpms && !scan_files && source_paths.size()>0)
+ obatched(clog) << "warning: without -F and/or -R, ignoring PATHs" << endl;
+
+ (void) signal (SIGPIPE, SIG_IGN); // microhttpd can generate it incidentally, ignore
+ (void) signal (SIGINT, signal_handler); // ^C
+ (void) signal (SIGHUP, signal_handler); // EOF
+ (void) signal (SIGTERM, signal_handler); // systemd
+ (void) signal (SIGUSR1, sigusr1_handler); // end-user
+ (void) signal (SIGUSR2, sigusr2_handler); // end-user
+
+ // do this before any threads start
+ scan_concurrency_sem = new semaphore(concurrency);
+
+ /* Get database ready. */
+ rc = sqlite3_open_v2 (db_path.c_str(), &db, (SQLITE_OPEN_READWRITE
+ |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));
+ }
+
+ obatched(clog) << "opened database " << db_path << endl;
+ obatched(clog) << "sqlite version " << sqlite3_version << endl;
+
+ // add special string-prefix-similarity function used in rpm sref/sdef resolution
+ rc = sqlite3_create_function(db, "sharedprefix", 2, SQLITE_UTF8, NULL,
+ & sqlite3_sharedprefix_fn, NULL, NULL);
+ if (rc != SQLITE_OK)
+ error (EXIT_FAILURE, 0,
+ "cannot create sharedprefix( function: %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
+ // case the host only has one protocol stack.
+ MHD_Daemon *d4 = MHD_start_daemon (MHD_USE_THREAD_PER_CONNECTION
+#if MHD_VERSION >= 0x00095300
+ | MHD_USE_INTERNAL_POLLING_THREAD
+#else
+ | MHD_USE_SELECT_INTERNALLY
+#endif
+ | MHD_USE_DEBUG, /* report errors to stderr */
+ http_port,
+ NULL, NULL, /* default accept policy */
+ handler_cb, NULL, /* handler callback */
+ MHD_OPTION_END);
+ MHD_Daemon *d6 = MHD_start_daemon (MHD_USE_THREAD_PER_CONNECTION
+#if MHD_VERSION >= 0x00095300
+ | MHD_USE_INTERNAL_POLLING_THREAD
+#else
+ | MHD_USE_SELECT_INTERNALLY
+#endif
+ | MHD_USE_IPv6
+ | MHD_USE_DEBUG, /* report errors to stderr */
+ http_port,
+ NULL, NULL, /* default accept policy */
+ handler_cb, NULL, /* handler callback */
+ MHD_OPTION_END);
+
+ if (d4 == NULL && d6 == NULL) // neither ipv4 nor ipv6? boo
+ {
+ sqlite3 *database = db;
+ db = 0; // for signal_handler not to freak
+ sqlite3_close (database);
+ error (EXIT_FAILURE, 0, "cannot start http server at port %d", http_port);
+ }
+
+ obatched(clog) << "started http server on "
+ << (d4 != NULL ? "IPv4 " : "")
+ << (d6 != NULL ? "IPv6 " : "")
+ << "port=" << http_port << endl;
+
+ // add maxigroom sql if -G given
+ if (maxigroom)
+ {
+ obatched(clog) << "maxigrooming database, please wait." << endl;
+ extra_ddl.push_back("create index if not exists " BUILDIDS "_r_sref_arc on " BUILDIDS "_r_sref(artifactsrc);");
+ extra_ddl.push_back("delete from " BUILDIDS "_r_sdef where not exists (select 1 from " BUILDIDS "_r_sref b where " BUILDIDS "_r_sdef.content = b.artifactsrc);");
+ extra_ddl.push_back("drop index if exists " BUILDIDS "_r_sref_arc;");
+
+ // NB: we don't maxigroom the _files interning table. It'd require a temp index on all the
+ // tables that have file foreign-keys, which is a lot.
+
+ // NB: with =delete, may take up 3x disk space total during vacuum process
+ // vs. =off (only 2x but may corrupt database if program dies mid-vacuum)
+ // vs. =wal (>3x observed, but safe)
+ extra_ddl.push_back("pragma journal_mode=delete;");
+ extra_ddl.push_back("vacuum;");
+ extra_ddl.push_back("pragma journal_mode=wal;");
+ }
+
+ // 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 (maxigroom)
+ obatched(clog) << "maxigroomed database" << endl;
+
+
+ obatched(clog) << "search concurrency " << concurrency << endl;
+ obatched(clog) << "rescan time " << rescan_s << endl;
+ obatched(clog) << "groom time " << groom_s << endl;
+ const char* du = getenv(DEBUGINFOD_URLS_ENV_VAR);
+ if (du && du[0] != '\0') // set to non-empty string?
+ obatched(clog) << "upstream debuginfod servers: " << du << endl;
+
+ vector<pthread_t> source_file_scanner_threads;
+ vector<pthread_t> source_rpm_scanner_threads;
+ pthread_t groom_thread;
+
+ rc = pthread_create (& groom_thread, NULL, thread_main_groom, NULL);
+ if (rc < 0)
+ error (0, 0, "warning: cannot spawn thread (%d) to groom database\n", rc);
+
+ if (scan_files) for (auto&& it : source_paths)
+ {
+ pthread_t pt;
+ rc = pthread_create (& pt, NULL, thread_main_scan_source_file_path, (void*) it.c_str());
+ if (rc < 0)
+ error (0, 0, "warning: cannot spawn thread (%d) to scan source files %s\n", rc, it.c_str());
+ else
+ source_file_scanner_threads.push_back(pt);
+ }
+
+ if (scan_rpms) for (auto&& it : source_paths)
+ {
+ pthread_t pt;
+ rc = pthread_create (& pt, NULL, thread_main_scan_source_rpm_path, (void*) it.c_str());
+ if (rc < 0)
+ error (0, 0, "warning: cannot spawn thread (%d) to scan source rpms %s\n", rc, it.c_str());
+ else
+ source_rpm_scanner_threads.push_back(pt);
+ }
+
+ /* Trivial main loop! */
+ set_metric("ready", 1);
+ while (! interrupted)
+ pause ();
+ set_metric("ready", 0);
+
+ if (verbose)
+ obatched(clog) << "stopping" << endl;
+
+ /* Join any source scanning threads. */
+ for (auto&& it : source_file_scanner_threads)
+ pthread_join (it, NULL);
+ for (auto&& it : source_rpm_scanner_threads)
+ pthread_join (it, NULL);
+ pthread_join (groom_thread, NULL);
+
+ /* Stop all the web service threads. */
+ if (d4) MHD_stop_daemon (d4);
+ if (d6) MHD_stop_daemon (d6);
+
+ /* With all threads known dead, we can clean up the global resources. */
+ delete scan_concurrency_sem;
+ 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
+ (void) regfree (& file_include_regex);
+ (void) regfree (& file_exclude_regex);
+
+ sqlite3 *database = db;
+ db = 0; // for signal_handler not to freak
+ (void) sqlite3_close (database);
+
+ return 0;
+}
diff --git a/debuginfod/debuginfod.h b/debuginfod/debuginfod.h
new file mode 100644
index 00000000..6b1b1cc3
--- /dev/null
+++ b/debuginfod/debuginfod.h
@@ -0,0 +1,85 @@
+/* External declarations for the libdebuginfod client library.
+ Copyright (C) 2019 Red Hat, Inc.
+ This file is part of elfutils.
+
+ This file is free software; you can redistribute it and/or modify
+ it under the terms of either
+
+ * the GNU Lesser General Public License as published by the Free
+ Software Foundation; either version 3 of the License, or (at
+ your option) any later version
+
+ or
+
+ * the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at
+ your option) any later version
+
+ or both in parallel, as here.
+
+ elfutils is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received copies of the GNU General Public License and
+ the GNU Lesser General Public License along with this program. If
+ not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _DEBUGINFOD_CLIENT_H
+#define _DEBUGINFOD_CLIENT_H 1
+
+/* Names of environment variables that control the client logic. */
+#define DEBUGINFOD_URLS_ENV_VAR "DEBUGINFOD_URLS"
+#define DEBUGINFOD_CACHE_PATH_ENV_VAR "DEBUGINFOD_CACHE_PATH"
+#define DEBUGINFOD_TIMEOUT_ENV_VAR "DEBUGINFOD_TIMEOUT"
+
+/* Handle for debuginfod-client connection. */
+typedef struct debuginfod_client debuginfod_client;
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Create a handle for a new debuginfod-client session. */
+debuginfod_client *debuginfod_begin (void);
+
+/* Query the urls contained in $DEBUGINFOD_URLS for a file with
+ the specified type and build id. If build_id_len == 0, the
+ build_id is supplied as a lowercase hexadecimal string; otherwise
+ it is a binary blob of given legnth.
+
+ If successful, return a file descriptor to the target, otherwise
+ return a posix error code. If successful, set *path to a
+ strdup'd copy of the name of the same file in the cache.
+ Caller must free() it later. */
+
+int debuginfod_find_debuginfo (debuginfod_client *client,
+ const unsigned char *build_id,
+ int build_id_len,
+ char **path);
+
+int debuginfod_find_executable (debuginfod_client *client,
+ const unsigned char *build_id,
+ int build_id_len,
+ char **path);
+
+int debuginfod_find_source (debuginfod_client *client,
+ const unsigned char *build_id,
+ int build_id_len,
+ const char *filename,
+ char **path);
+
+typedef int (*debuginfod_progressfn_t)(debuginfod_client *c, long a, long b);
+void debuginfod_set_progressfn(debuginfod_client *c,
+ debuginfod_progressfn_t fn);
+
+/* Release debuginfod client connection context handle. */
+void debuginfod_end (debuginfod_client *client);
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* _DEBUGINFOD_CLIENT_H */
diff --git a/debuginfod/libdebuginfod.map b/debuginfod/libdebuginfod.map
new file mode 100644
index 00000000..0d26f93e
--- /dev/null
+++ b/debuginfod/libdebuginfod.map
@@ -0,0 +1,10 @@
+ELFUTILS_0 { };
+ELFUTILS_0.178 {
+ global:
+ debuginfod_begin;
+ debuginfod_end;
+ debuginfod_find_debuginfo;
+ debuginfod_find_executable;
+ debuginfod_find_source;
+ debuginfod_set_progressfn;
+} ELFUTILS_0;
diff --git a/doc/COPYING-GFDL b/doc/COPYING-GFDL
new file mode 100644
index 00000000..98310abe
--- /dev/null
+++ b/doc/COPYING-GFDL
@@ -0,0 +1,455 @@
+This license applies to the eu-readelf.1 man page which was forked
+from the binutils readelf version of the man page. The rest of the
+documentation is provided under the license found in the top level
+directory.
+
+ GNU Free Documentation License
+ Version 1.3, 3 November 2008
+
+
+ Copyright (C) 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
+ <https://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+0. PREAMBLE
+
+The purpose of this License is to make a manual, textbook, or other
+functional and useful document "free" in the sense of freedom: to
+assure everyone the effective freedom to copy and redistribute it,
+with or without modifying it, either commercially or noncommercially.
+Secondarily, this License preserves for the author and publisher a way
+to get credit for their work, while not being considered responsible
+for modifications made by others.
+
+This License is a kind of "copyleft", which means that derivative
+works of the document must themselves be free in the same sense. It
+complements the GNU General Public License, which is a copyleft
+license designed for free software.
+
+We have designed this License in order to use it for manuals for free
+software, because free software needs free documentation: a free
+program should come with manuals providing the same freedoms that the
+software does. But this License is not limited to software manuals;
+it can be used for any textual work, regardless of subject matter or
+whether it is published as a printed book. We recommend this License
+principally for works whose purpose is instruction or reference.
+
+
+1. APPLICABILITY AND DEFINITIONS
+
+This License applies to any manual or other work, in any medium, that
+contains a notice placed by the copyright holder saying it can be
+distributed under the terms of this License. Such a notice grants a
+world-wide, royalty-free license, unlimited in duration, to use that
+work under the conditions stated herein. The "Document", below,
+refers to any such manual or work. Any member of the public is a
+licensee, and is addressed as "you". You accept the license if you
+copy, modify or distribute the work in a way requiring permission
+under copyright law.
+
+A "Modified Version" of the Document means any work containing the
+Document or a portion of it, either copied verbatim, or with
+modifications and/or translated into another language.
+
+A "Secondary Section" is a named appendix or a front-matter section of
+the Document that deals exclusively with the relationship of the
+publishers or authors of the Document to the Document's overall
+subject (or to related matters) and contains nothing that could fall
+directly within that overall subject. (Thus, if the Document is in
+part a textbook of mathematics, a Secondary Section may not explain
+any mathematics.) The relationship could be a matter of historical
+connection with the subject or with related matters, or of legal,
+commercial, philosophical, ethical or political position regarding
+them.
+
+The "Invariant Sections" are certain Secondary Sections whose titles
+are designated, as being those of Invariant Sections, in the notice
+that says that the Document is released under this License. If a
+section does not fit the above definition of Secondary then it is not
+allowed to be designated as Invariant. The Document may contain zero
+Invariant Sections. If the Document does not identify any Invariant
+Sections then there are none.
+
+The "Cover Texts" are certain short passages of text that are listed,
+as Front-Cover Texts or Back-Cover Texts, in the notice that says that
+the Document is released under this License. A Front-Cover Text may
+be at most 5 words, and a Back-Cover Text may be at most 25 words.
+
+A "Transparent" copy of the Document means a machine-readable copy,
+represented in a format whose specification is available to the
+general public, that is suitable for revising the document
+straightforwardly with generic text editors or (for images composed of
+pixels) generic paint programs or (for drawings) some widely available
+drawing editor, and that is suitable for input to text formatters or
+for automatic translation to a variety of formats suitable for input
+to text formatters. A copy made in an otherwise Transparent file
+format whose markup, or absence of markup, has been arranged to thwart
+or discourage subsequent modification by readers is not Transparent.
+An image format is not Transparent if used for any substantial amount
+of text. A copy that is not "Transparent" is called "Opaque".
+
+Examples of suitable formats for Transparent copies include plain
+ASCII without markup, Texinfo input format, LaTeX input format, SGML
+or XML using a publicly available DTD, and standard-conforming simple
+HTML, PostScript or PDF designed for human modification. Examples of
+transparent image formats include PNG, XCF and JPG. Opaque formats
+include proprietary formats that can be read and edited only by
+proprietary word processors, SGML or XML for which the DTD and/or
+processing tools are not generally available, and the
+machine-generated HTML, PostScript or PDF produced by some word
+processors for output purposes only.
+
+The "Title Page" means, for a printed book, the title page itself,
+plus such following pages as are needed to hold, legibly, the material
+this License requires to appear in the title page. For works in
+formats which do not have any title page as such, "Title Page" means
+the text near the most prominent appearance of the work's title,
+preceding the beginning of the body of the text.
+
+The "publisher" means any person or entity that distributes copies of
+the Document to the public.
+
+A section "Entitled XYZ" means a named subunit of the Document whose
+title either is precisely XYZ or contains XYZ in parentheses following
+text that translates XYZ in another language. (Here XYZ stands for a
+specific section name mentioned below, such as "Acknowledgements",
+"Dedications", "Endorsements", or "History".) To "Preserve the Title"
+of such a section when you modify the Document means that it remains a
+section "Entitled XYZ" according to this definition.
+
+The Document may include Warranty Disclaimers next to the notice which
+states that this License applies to the Document. These Warranty
+Disclaimers are considered to be included by reference in this
+License, but only as regards disclaiming warranties: any other
+implication that these Warranty Disclaimers may have is void and has
+no effect on the meaning of this License.
+
+2. VERBATIM COPYING
+
+You may copy and distribute the Document in any medium, either
+commercially or noncommercially, provided that this License, the
+copyright notices, and the license notice saying this License applies
+to the Document are reproduced in all copies, and that you add no
+other conditions whatsoever to those of this License. You may not use
+technical measures to obstruct or control the reading or further
+copying of the copies you make or distribute. However, you may accept
+compensation in exchange for copies. If you distribute a large enough
+number of copies you must also follow the conditions in section 3.
+
+You may also lend copies, under the same conditions stated above, and
+you may publicly display copies.
+
+
+3. COPYING IN QUANTITY
+
+If you publish printed copies (or copies in media that commonly have
+printed covers) of the Document, numbering more than 100, and the
+Document's license notice requires Cover Texts, you must enclose the
+copies in covers that carry, clearly and legibly, all these Cover
+Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
+the back cover. Both covers must also clearly and legibly identify
+you as the publisher of these copies. The front cover must present
+the full title with all words of the title equally prominent and
+visible. You may add other material on the covers in addition.
+Copying with changes limited to the covers, as long as they preserve
+the title of the Document and satisfy these conditions, can be treated
+as verbatim copying in other respects.
+
+If the required texts for either cover are too voluminous to fit
+legibly, you should put the first ones listed (as many as fit
+reasonably) on the actual cover, and continue the rest onto adjacent
+pages.
+
+If you publish or distribute Opaque copies of the Document numbering
+more than 100, you must either include a machine-readable Transparent
+copy along with each Opaque copy, or state in or with each Opaque copy
+a computer-network location from which the general network-using
+public has access to download using public-standard network protocols
+a complete Transparent copy of the Document, free of added material.
+If you use the latter option, you must take reasonably prudent steps,
+when you begin distribution of Opaque copies in quantity, to ensure
+that this Transparent copy will remain thus accessible at the stated
+location until at least one year after the last time you distribute an
+Opaque copy (directly or through your agents or retailers) of that
+edition to the public.
+
+It is requested, but not required, that you contact the authors of the
+Document well before redistributing any large number of copies, to
+give them a chance to provide you with an updated version of the
+Document.
+
+
+4. MODIFICATIONS
+
+You may copy and distribute a Modified Version of the Document under
+the conditions of sections 2 and 3 above, provided that you release
+the Modified Version under precisely this License, with the Modified
+Version filling the role of the Document, thus licensing distribution
+and modification of the Modified Version to whoever possesses a copy
+of it. In addition, you must do these things in the Modified Version:
+
+A. Use in the Title Page (and on the covers, if any) a title distinct
+ from that of the Document, and from those of previous versions
+ (which should, if there were any, be listed in the History section
+ of the Document). You may use the same title as a previous version
+ if the original publisher of that version gives permission.
+B. List on the Title Page, as authors, one or more persons or entities
+ responsible for authorship of the modifications in the Modified
+ Version, together with at least five of the principal authors of the
+ Document (all of its principal authors, if it has fewer than five),
+ unless they release you from this requirement.
+C. State on the Title page the name of the publisher of the
+ Modified Version, as the publisher.
+D. Preserve all the copyright notices of the Document.
+E. Add an appropriate copyright notice for your modifications
+ adjacent to the other copyright notices.
+F. Include, immediately after the copyright notices, a license notice
+ giving the public permission to use the Modified Version under the
+ terms of this License, in the form shown in the Addendum below.
+G. Preserve in that license notice the full lists of Invariant Sections
+ and required Cover Texts given in the Document's license notice.
+H. Include an unaltered copy of this License.
+I. Preserve the section Entitled "History", Preserve its Title, and add
+ to it an item stating at least the title, year, new authors, and
+ publisher of the Modified Version as given on the Title Page. If
+ there is no section Entitled "History" in the Document, create one
+ stating the title, year, authors, and publisher of the Document as
+ given on its Title Page, then add an item describing the Modified
+ Version as stated in the previous sentence.
+J. Preserve the network location, if any, given in the Document for
+ public access to a Transparent copy of the Document, and likewise
+ the network locations given in the Document for previous versions
+ it was based on. These may be placed in the "History" section.
+ You may omit a network location for a work that was published at
+ least four years before the Document itself, or if the original
+ publisher of the version it refers to gives permission.
+K. For any section Entitled "Acknowledgements" or "Dedications",
+ Preserve the Title of the section, and preserve in the section all
+ the substance and tone of each of the contributor acknowledgements
+ and/or dedications given therein.
+L. Preserve all the Invariant Sections of the Document,
+ unaltered in their text and in their titles. Section numbers
+ or the equivalent are not considered part of the section titles.
+M. Delete any section Entitled "Endorsements". Such a section
+ may not be included in the Modified Version.
+N. Do not retitle any existing section to be Entitled "Endorsements"
+ or to conflict in title with any Invariant Section.
+O. Preserve any Warranty Disclaimers.
+
+If the Modified Version includes new front-matter sections or
+appendices that qualify as Secondary Sections and contain no material
+copied from the Document, you may at your option designate some or all
+of these sections as invariant. To do this, add their titles to the
+list of Invariant Sections in the Modified Version's license notice.
+These titles must be distinct from any other section titles.
+
+You may add a section Entitled "Endorsements", provided it contains
+nothing but endorsements of your Modified Version by various
+parties--for example, statements of peer review or that the text has
+been approved by an organization as the authoritative definition of a
+standard.
+
+You may add a passage of up to five words as a Front-Cover Text, and a
+passage of up to 25 words as a Back-Cover Text, to the end of the list
+of Cover Texts in the Modified Version. Only one passage of
+Front-Cover Text and one of Back-Cover Text may be added by (or
+through arrangements made by) any one entity. If the Document already
+includes a cover text for the same cover, previously added by you or
+by arrangement made by the same entity you are acting on behalf of,
+you may not add another; but you may replace the old one, on explicit
+permission from the previous publisher that added the old one.
+
+The author(s) and publisher(s) of the Document do not by this License
+give permission to use their names for publicity for or to assert or
+imply endorsement of any Modified Version.
+
+
+5. COMBINING DOCUMENTS
+
+You may combine the Document with other documents released under this
+License, under the terms defined in section 4 above for modified
+versions, provided that you include in the combination all of the
+Invariant Sections of all of the original documents, unmodified, and
+list them all as Invariant Sections of your combined work in its
+license notice, and that you preserve all their Warranty Disclaimers.
+
+The combined work need only contain one copy of this License, and
+multiple identical Invariant Sections may be replaced with a single
+copy. If there are multiple Invariant Sections with the same name but
+different contents, make the title of each such section unique by
+adding at the end of it, in parentheses, the name of the original
+author or publisher of that section if known, or else a unique number.
+Make the same adjustment to the section titles in the list of
+Invariant Sections in the license notice of the combined work.
+
+In the combination, you must combine any sections Entitled "History"
+in the various original documents, forming one section Entitled
+"History"; likewise combine any sections Entitled "Acknowledgements",
+and any sections Entitled "Dedications". You must delete all sections
+Entitled "Endorsements".
+
+
+6. COLLECTIONS OF DOCUMENTS
+
+You may make a collection consisting of the Document and other
+documents released under this License, and replace the individual
+copies of this License in the various documents with a single copy
+that is included in the collection, provided that you follow the rules
+of this License for verbatim copying of each of the documents in all
+other respects.
+
+You may extract a single document from such a collection, and
+distribute it individually under this License, provided you insert a
+copy of this License into the extracted document, and follow this
+License in all other respects regarding verbatim copying of that
+document.
+
+
+7. AGGREGATION WITH INDEPENDENT WORKS
+
+A compilation of the Document or its derivatives with other separate
+and independent documents or works, in or on a volume of a storage or
+distribution medium, is called an "aggregate" if the copyright
+resulting from the compilation is not used to limit the legal rights
+of the compilation's users beyond what the individual works permit.
+When the Document is included in an aggregate, this License does not
+apply to the other works in the aggregate which are not themselves
+derivative works of the Document.
+
+If the Cover Text requirement of section 3 is applicable to these
+copies of the Document, then if the Document is less than one half of
+the entire aggregate, the Document's Cover Texts may be placed on
+covers that bracket the Document within the aggregate, or the
+electronic equivalent of covers if the Document is in electronic form.
+Otherwise they must appear on printed covers that bracket the whole
+aggregate.
+
+
+8. TRANSLATION
+
+Translation is considered a kind of modification, so you may
+distribute translations of the Document under the terms of section 4.
+Replacing Invariant Sections with translations requires special
+permission from their copyright holders, but you may include
+translations of some or all Invariant Sections in addition to the
+original versions of these Invariant Sections. You may include a
+translation of this License, and all the license notices in the
+Document, and any Warranty Disclaimers, provided that you also include
+the original English version of this License and the original versions
+of those notices and disclaimers. In case of a disagreement between
+the translation and the original version of this License or a notice
+or disclaimer, the original version will prevail.
+
+If a section in the Document is Entitled "Acknowledgements",
+"Dedications", or "History", the requirement (section 4) to Preserve
+its Title (section 1) will typically require changing the actual
+title.
+
+
+9. TERMINATION
+
+You may not copy, modify, sublicense, or distribute the Document
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense, or distribute it is void, and
+will automatically terminate your rights under this License.
+
+However, if you cease all violation of this License, then your license
+from a particular copyright holder is reinstated (a) provisionally,
+unless and until the copyright holder explicitly and finally
+terminates your license, and (b) permanently, if the copyright holder
+fails to notify you of the violation by some reasonable means prior to
+60 days after the cessation.
+
+Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, receipt of a copy of some or all of the same material does
+not give you any rights to use it.
+
+
+10. FUTURE REVISIONS OF THIS LICENSE
+
+The Free Software Foundation may publish new, revised versions of the
+GNU Free Documentation License from time to time. Such new versions
+will be similar in spirit to the present version, but may differ in
+detail to address new problems or concerns. See
+https://www.gnu.org/licenses/.
+
+Each version of the License is given a distinguishing version number.
+If the Document specifies that a particular numbered version of this
+License "or any later version" applies to it, you have the option of
+following the terms and conditions either of that specified version or
+of any later version that has been published (not as a draft) by the
+Free Software Foundation. If the Document does not specify a version
+number of this License, you may choose any version ever published (not
+as a draft) by the Free Software Foundation. If the Document
+specifies that a proxy can decide which future versions of this
+License can be used, that proxy's public statement of acceptance of a
+version permanently authorizes you to choose that version for the
+Document.
+
+11. RELICENSING
+
+"Massive Multiauthor Collaboration Site" (or "MMC Site") means any
+World Wide Web server that publishes copyrightable works and also
+provides prominent facilities for anybody to edit those works. A
+public wiki that anybody can edit is an example of such a server. A
+"Massive Multiauthor Collaboration" (or "MMC") contained in the site
+means any set of copyrightable works thus published on the MMC site.
+
+"CC-BY-SA" means the Creative Commons Attribution-Share Alike 3.0
+license published by Creative Commons Corporation, a not-for-profit
+corporation with a principal place of business in San Francisco,
+California, as well as future copyleft versions of that license
+published by that same organization.
+
+"Incorporate" means to publish or republish a Document, in whole or in
+part, as part of another Document.
+
+An MMC is "eligible for relicensing" if it is licensed under this
+License, and if all works that were first published under this License
+somewhere other than this MMC, and subsequently incorporated in whole or
+in part into the MMC, (1) had no cover texts or invariant sections, and
+(2) were thus incorporated prior to November 1, 2008.
+
+The operator of an MMC Site may republish an MMC contained in the site
+under CC-BY-SA on the same site at any time before August 1, 2009,
+provided the MMC is eligible for relicensing.
+
+
+ADDENDUM: How to use this License for your documents
+
+To use this License in a document you have written, include a copy of
+the License in the document and put the following copyright and
+license notices just after the title page:
+
+ Copyright (c) YEAR YOUR NAME.
+ Permission is granted to copy, distribute and/or modify this document
+ under the terms of the GNU Free Documentation License, Version 1.3
+ or any later version published by the Free Software Foundation;
+ with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+ A copy of the license is included in the section entitled "GNU
+ Free Documentation License".
+
+If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
+replace the "with...Texts." line with this:
+
+ with the Invariant Sections being LIST THEIR TITLES, with the
+ Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST.
+
+If you have Invariant Sections without Cover Texts, or some other
+combination of the three, merge those two alternatives to suit the
+situation.
+
+If your document contains nontrivial examples of program code, we
+recommend releasing these examples in parallel under your choice of
+free software license, such as the GNU General Public License,
+to permit their use in free software.
diff --git a/doc/ChangeLog b/doc/ChangeLog
index 380a0cd7..00a61ac3 100644
--- a/doc/ChangeLog
+++ b/doc/ChangeLog
@@ -1,3 +1,56 @@
+2019-09-02 Mark Wielaard <mark@klomp.org>
+
+ * readelf.1 (symbols): Add optional section name.
+ (dyn-sym): Document new option.
+
+2019-08-28 Mark Wielaard <mark@klomp.org>
+
+ * COPYING: Rename to...
+ * COPYING-GFDL: ... this.
+
+2019-08-23 Ben Woodard <woodard@redhat.com>
+
+ * Updated the eu-readelf man page to make it match the options
+ that eu-readelf actually supports.
+
+2019-08-22 Ben Woodard <woodard@redhat.com>S
+
+ * Move the .1 man pages to the correct place.
+
+2019-08-21 Ben Woodard <woodard@redhat.com>
+
+ * Updated Changelog
+ * Added README
+
+2019-08-20 Ben Woodard <woodard@redhat.com>
+
+ * Added eu-elfclassify.1 man page based upon --help
+ * Forked binutils readelf page to make eu-readelf.1 man page
+ * Modified eu-readelf.1 to add -n:: option.
+ * Disabled sgml file building per mjw.
+ * Added man pages to Makefile.am
+
+2019-06-20 Ben Woodard <woodard@redhat.com>
+
+ * Added the beginnings of some man pages
+
+2019-08-21 Ben Woodard <woodard@redhat.com>
+
+ * Updated Changelog
+ * Added README
+
+2019-08-20 Ben Woodard <woodard@redhat.com>
+
+ * Added eu-elfclassify.1 man page based upon --help
+ * Forked binutils readelf page to make eu-readelf.1 man page
+ * Modified eu-readelf.1 to add -n:: option.
+ * Disabled sgml file building per mjw.
+ * Added man pages to Makefile.am
+
+2019-06-20 Ben Woodard <woodard@redhat.com>
+
+ * Added the beginnings of some man pages
+
2005-04-29 Ulrich Drepper <drepper@redhat.com>
* elfutils.sgml: Some typo fixes and a few extensions.
diff --git a/doc/Makefile.am b/doc/Makefile.am
index 44f0c11a..b5db01ff 100644
--- a/doc/Makefile.am
+++ b/doc/Makefile.am
@@ -1,7 +1,7 @@
## Process this file with automake to create Makefile.in
## Configure input file for elfutils.
##
-## Copyright (C) 1996-2001, 2002, 2005 Red Hat, Inc.
+## Copyright (C) 1996-2001, 2002, 2005, 2019 Red Hat, Inc.
## This file is part of elfutils.
##
## This file is free software; you can redistribute it and/or modify
@@ -16,17 +16,15 @@
##
## You should have received a copy of the GNU General Public License
## along with this program. If not, see <http://www.gnu.org/licenses/>.
-EXTRA_DIST = elfutils.sgml
+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_man8_MANS=
+notrans_dist_man1_MANS=
-CLEANFILES = elfutils.dvi
+if DEBUGINFOD
+notrans_dist_man8_MANS += debuginfod.8
+notrans_dist_man3_MANS += debuginfod_find_debuginfo.3 debuginfod_find_source.3 debuginfod_find_executable.3 debuginfod_set_progressfn.3
+notrans_dist_man1_MANS += debuginfod-find.1
+endif
-# We need only a few special rules to generate the various output formats
-# from the SGML sources.
-.PHONY: dvi pdf html
-pdf: $(srcdir)elfutils.pdf
-dvi: $(srcdir)elfutils.dvi
-
-$(srcdir)%.dvi: %.sgml
- db2dvi $^
-$(srcdir)%.pdf: %.sgml
- db2pdf $^
diff --git a/doc/README b/doc/README
new file mode 100644
index 00000000..67f61fac
--- /dev/null
+++ b/doc/README
@@ -0,0 +1,20 @@
+The elfutils documentation is very much a work in
+progress. Contributions are welcome.
+Please reports bugs at https://sourceware.org/bugzilla/
+Please send additions and patches to: elfutils-devel@sourceware.org
+
+The elfutils utilities are a new implementation of many of the
+utilities found in binutils and consequently, the documentation for
+most of the tools has been the the man pages for binutils. For example
+you could refer to readelf's man page for instructions on
+eu-readelf. This has been fine up until this point but as tools gain
+new capabilities, they will need to have their own individual man
+page. Forking the man pages from binutils is acceptable and the
+current plan of action.
+
+New utilities that do not have an analog in binutils can have their
+initial man pages generated using a tool like help2man.
+
+The C language interfaces for libelf, libdw, and libdwfl are in
+particular need of documentation. The aspirational goal is write these
+in sphinx. \ No newline at end of file
diff --git a/doc/debuginfod-find.1 b/doc/debuginfod-find.1
new file mode 100644
index 00000000..a759ecba
--- /dev/null
+++ b/doc/debuginfod-find.1
@@ -0,0 +1,144 @@
+'\"! tbl | nroff \-man
+'\" t macro stdmacro
+
+.de SAMPLE
+.br
+.RS 0
+.nf
+.nh
+..
+.de ESAMPLE
+.hy
+.fi
+.RE
+..
+
+.TH DEBUGINFOD-FIND 1
+.SH NAME
+debuginfod-find \- request debuginfo-related data
+
+.SH SYNOPSIS
+.B debuginfod-find [\fIOPTION\fP]... debuginfo \fIBUILDID\fP
+
+.B debuginfod-find [\fIOPTION\fP]... executable \fIBUILDID\fP
+
+.B debuginfod-find [\fIOPTION\fP]... source \fIBUILDID\fP \fI/FILENAME\fP
+
+.SH DESCRIPTION
+\fBdebuginfod-find\fP queries one or more \fBdebuginfod\fP servers for
+debuginfo-related data. In case of a match, it saves the the
+requested file into a local cache, prints the file name to standard
+output, and exits with a success status of 0. In case of any error,
+it exits with a failure status and an error message to standard error.
+
+.\" Much of the following text is duplicated with debuginfod.8
+
+The debuginfod system uses buildids to identify debuginfo-related data.
+These are stored as binary notes in ELF/DWARF files, and are
+represented as lowercase hexadecimal. For example, for a program
+/bin/ls, look at the ELF note GNU_BUILD_ID:
+
+.SAMPLE
+% readelf -n /bin/ls | grep -A4 build.id
+Note section [ 4] '.note.gnu.buildid' of 36 bytes at offset 0x340:
+Owner Data size Type
+GNU 20 GNU_BUILD_ID
+Build ID: 8713b9c3fb8a720137a4a08b325905c7aaf8429d
+.ESAMPLE
+
+Then the hexadecimal BUILDID is simply:
+
+.SAMPLE
+8713b9c3fb8a720137a4a08b325905c7aaf8429d
+.ESAMPLE
+
+.SS debuginfo \fIBUILDID\fP
+
+If the given buildid is known to a server, this request will result
+in a binary object that contains the customary \fB.*debug_*\fP
+sections. This may be a split debuginfo file as created by
+\fBstrip\fP, or it may be an original unstripped executable.
+
+.SS executable \fIBUILDID\fP
+
+If the given buildid is known to the server, this request will result
+in a binary object that contains the normal executable segments. This
+may be a executable stripped by \fBstrip\fP, or it may be an original
+unstripped executable. \fBET_DYN\fP shared libraries are considered
+to be a type of executable.
+
+.SS source \fIBUILDID\fP \fI/SOURCE/FILE\fP
+
+If the given buildid is known to the server, this request will result
+in a binary object that contains the source file mentioned. The path
+should be absolute. Relative path names commonly appear in the DWARF
+file's source directory, but these paths are relative to
+individual compilation unit AT_comp_dir paths, and yet an executable
+is made up of multiple CUs. Therefore, to disambiguate, debuginfod
+expects source queries to prefix relative path names with the CU
+compilation-directory, followed by a mandatory "/".
+
+Note: the user should not elide \fB../\fP or \fB/./\fP or extraneous
+\fB///\fP sorts of path components in the directory names, because if
+this is how those names appear in the DWARF files, that is what
+debuginfod needs to see too.
+
+For example:
+.TS
+l l.
+#include <stdio.h> source BUILDID /usr/include/stdio.h
+/path/to/foo.c source BUILDID /path/to/foo.c
+\../bar/foo.c AT_comp_dir=/zoo/ source BUILDID /zoo//../bar/foo.c
+.TE
+
+.SH "OPTIONS"
+
+.TP
+.B "\-v"
+Increase verbosity, including printing frequent download-progress messages.
+
+
+.SH "SECURITY"
+
+debuginfod-find \fBdoes not\fP include any particular security
+features. It trusts that the binaries returned by the debuginfod(s)
+are accurate. Therefore, the list of servers should include only
+trustworthy ones. If accessed across HTTP rather than HTTPS, the
+network should be trustworthy. Authentication information through
+the internal \fIlibcurl\fP library is not currently enabled, except
+for the basic plaintext \%\fIhttp[s]://userid:password@hostname/\fP style.
+(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 respond within this many seconds
+is skipped. The default is 5.
+
+.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
+
+.SH "SEE ALSO"
+.I "debuginfod(8)"
+.I "debuginfod_find_debuginfod(3)"
diff --git a/doc/debuginfod.8 b/doc/debuginfod.8
new file mode 100644
index 00000000..210550e8
--- /dev/null
+++ b/doc/debuginfod.8
@@ -0,0 +1,387 @@
+'\"! tbl | nroff \-man
+'\" t macro stdmacro
+
+.de SAMPLE
+.br
+.RS 0
+.nf
+.nh
+..
+.de ESAMPLE
+.hy
+.fi
+.RE
+..
+
+.TH DEBUGINFOD 8
+.SH NAME
+debuginfod \- debuginfo-related http file-server daemon
+
+.SH SYNOPSIS
+.B debuginfod
+[\fIOPTION\fP]... [\fIPATH\fP]...
+
+.SH DESCRIPTION
+\fBdebuginfod\fP serves debuginfo-related artifacts over HTTP. It
+periodically scans a set of directories for ELF/DWARF files and their
+associated source code, as well as RPM files containing the above, to
+build an index by their buildid. This index is used when remote
+clients use the HTTP webapi, to fetch these files by the same buildid.
+
+If a debuginfod cannot service a given buildid artifact request
+itself, and it is configured with information about upstream
+debuginfod servers, it queries them for the same information, just as
+\fBdebuginfod-find\fP would. If successful, it locally caches then
+relays the file content to the original requester.
+
+If the \fB\-F\fP option is given, each listed PATH creates a thread to
+scan for matching ELF/DWARF/source files under the given physical
+directory. Source files are matched with DWARF files based on the
+AT_comp_dir (compilation directory) attributes inside it. Duplicate
+directories are ignored. You may use a file name for a PATH, but
+source code indexing may be incomplete; prefer using a directory that
+contains the binaries. Caution: source files listed in the DWARF may
+be a path \fIanywhere\fP in the file system, and debuginfod will
+readily serve their content on demand. (Imagine a doctored DWARF file
+that lists \fI/etc/passwd\fP as a source file.) If this is a concern,
+audit your binaries with tools such as:
+
+.SAMPLE
+% eu-readelf -wline BINARY | sed -n '/^Directory.table/,/^File.name.table/p'
+or
+% eu-readelf -wline BINARY | sed -n '/^Directory.table/,/^Line.number/p'
+or even use debuginfod itself:
+% debuginfod -vvv -d :memory: -F BINARY 2>&1 | grep 'recorded.*source'
+^C
+.ESAMPLE
+
+If the \fB\-R\fP option is given each listed PATH creates a thread to
+scan for ELF/DWARF/source files contained in matching RPMs under the
+given physical directory. Duplicate directories are ignored. You may
+use a file name for a PATH, but source code indexing may be
+incomplete; prefer using a directory that contains normal RPMs
+alongside debuginfo/debugsource RPMs. Because of complications such
+as DWZ-compressed debuginfo, may require \fItwo\fP scan passes to
+identify all source code. Source files for RPMs are only served
+from other RPMs, so the caution for \-F does not apply.
+
+If no PATH is listed, or neither \-F nor \-R option is given, then
+\fBdebuginfod\fP will simply serve content that it scanned into its
+index in previous runs: the data is cumulative.
+
+File names must match extended regular expressions given by the \-I
+option and not the \-X option (if any) in order to be considered.
+
+
+.SH OPTIONS
+
+.TP
+.B "\-F"
+Activate ELF/DWARF file scanning threads. The default is off.
+
+.TP
+.B "\-R"
+Activate RPM file scanning threads. The default is off.
+
+.TP
+.B "\-d FILE" "\-\-database=FILE"
+Set the path of the sqlite database used to store the index. This
+file is disposable in the sense that a later rescan will repopulate
+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 filesytem. It should not be shared across
+machines or users, to maximize sqlite locking performance. The
+default database file is $HOME/.debuginfod.sqlite.
+
+.TP
+.B "\-D SQL" "\-\-ddl=SQL"
+Execute given sqlite statement after the database is opened and
+initialized as extra DDL (SQL data definition language). This may be
+useful to tune performance-related pragmas or indexes. May be
+repeated. The default is nothing extra.
+
+.TP
+.B "\-p NUM" "\-\-port=NUM"
+Set the TCP port number on which debuginfod should listen, to service
+HTTP requests. Both IPv4 and IPV6 sockets are opened, if possible.
+The webapi is documented below. The default port number is 8002.
+
+.TP
+.B "\-I REGEX" "\-\-include=REGEX" "\-X REGEX" "\-\-exclude=REGEX"
+Govern the inclusion and exclusion of file names under the search
+paths. The regular expressions are interpreted as unanchored POSIX
+extended REs, thus may include alternation. They are evaluated
+against the full path of each file, based on its \fBrealpath(3)\fP
+canonicalization. By default, all files are included and none are
+excluded. A file that matches both include and exclude REGEX is
+excluded. (The \fIcontents\fP of RPM files are not subject to
+inclusion or exclusion filtering: they are all processed.)
+
+.TP
+.B "\-t SECONDS" "\-\-rescan\-time=SECONDS"
+Set the rescan time for the file and RPM directories. This is the
+amount of time the scanning threads will wait after finishing a scan,
+before doing it again. A rescan for unchanged files is fast (because
+the index also stores the file mtimes). A time of zero is acceptable,
+and means that only one initial scan should performed. The default
+rescan time is 300 seconds. Receiving a SIGUSR1 signal triggers a new
+scan, independent of the rescan time (including if it was zero).
+
+.TP
+.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
+doing it again. A groom operation quickly rescans all previously
+scanned files, only to see if they are still present and current, so
+it can deindex obsolete files. See also the \fIDATA MANAGEMENT\fP
+section. The default groom time is 86400 seconds (1 day). A time of
+zero is acceptable, and means that only one initial groom should be
+performed. Receiving a SIGUSR2 signal triggers a new grooming pass,
+independent of the groom time (including if it was zero).
+
+.TP
+.B "\-G"
+Run an extraordinary maximal-grooming pass at debuginfod startup.
+This pass can take considerable time, because it tries to remove any
+debuginfo-unrelated content from the RPM-related parts of the index.
+It should not be run if any recent RPM-related indexing operations
+were aborted early. It can take considerable space, because it
+finishes up with an sqlite "vacuum" operation, which repacks the
+database file by triplicating it temporarily. The default is not to
+do maximal-grooming. See also the \fIDATA MANAGEMENT\fP section.
+
+.TP
+.B "\-c NUM" "\-\-concurrency=NUM"
+Set the concurrency limit for all the scanning threads. While many
+threads may be spawned to cover all the given PATHs, only NUM may
+concurrently do CPU-intensive operations like parsing an ELF file
+or an RPM. The default is the number of processors on the system;
+the minimum is 1.
+
+.TP
+.B "\-L"
+Traverse symbolic links encountered during traversal of the PATHs,
+including across devices - as in \fIfind\ -L\fP. The default is to
+traverse the physical directory structure only, stay on the same
+device, and ignore symlinks - as in \fIfind\ -P\ -xdev\fP. Caution: a
+loops in the symbolic directory tree might lead to \fIinfinite
+traversal\fP.
+
+.TP
+.B "\-v"
+Increase verbosity of logging to the standard error file descriptor.
+May be repeated to increase details. The default verbosity is 0.
+
+.SH WEBAPI
+
+.\" Much of the following text is duplicated with debuginfod-find.1
+
+debuginfod's webapi resembles ordinary file service, where a GET
+request with a path containing a known buildid results in a file.
+Unknown buildid / request combinations result in HTTP error codes.
+This file service resemblance is intentional, so that an installation
+can take advantage of standard HTTP management infrastructure.
+
+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:
+
+.SAMPLE
+% readelf -n /bin/ls | grep -A4 build.id
+Note section [ 4] '.note.gnu.buildid' of 36 bytes at offset 0x340:
+Owner Data size Type
+GNU 20 GNU_BUILD_ID
+Build ID: 8713b9c3fb8a720137a4a08b325905c7aaf8429d
+.ESAMPLE
+
+Then the hexadecimal BUILDID is simply:
+
+.SAMPLE
+8713b9c3fb8a720137a4a08b325905c7aaf8429d
+.ESAMPLE
+
+.SS /buildid/\fIBUILDID\fP/debuginfo
+
+If the given buildid is known to the server, this request will result
+in a binary object that contains the customary \fB.*debug_*\fP
+sections. This may be a split debuginfo file as created by
+\fBstrip\fP, or it may be an original unstripped executable.
+
+.SS /buildid/\fIBUILDID\fP/executable
+
+If the given buildid is known to the server, this request will result
+in a binary object that contains the normal executable segments. This
+may be a executable stripped by \fBstrip\fP, or it may be an original
+unstripped executable. \fBET_DYN\fP shared libraries are considered
+to be a type of executable.
+
+.SS /buildid/\fIBUILDID\fP/source\fI/SOURCE/FILE\fP
+
+If the given buildid is known to the server, this request will result
+in a binary object that contains the source file mentioned. The path
+should be absolute. Relative path names commonly appear in the DWARF
+file's source directory, but these paths are relative to
+individual compilation unit AT_comp_dir paths, and yet an executable
+is made up of multiple CUs. Therefore, to disambiguate, debuginfod
+expects source queries to prefix relative path names with the CU
+compilation-directory, followed by a mandatory "/".
+
+Note: contrary to RFC 3986, the client should not elide \fB../\fP or
+\fB/./\fP or extraneous \fB///\fP sorts of path components in the
+directory names, because if this is how those names appear in the
+DWARF files, that is what debuginfod needs to see too.
+
+For example:
+.TS
+l l.
+#include <stdio.h> /buildid/BUILDID/source/usr/include/stdio.h
+/path/to/foo.c /buildid/BUILDID/source/path/to/foo.c
+\../bar/foo.c AT_comp_dir=/zoo/ /buildid/BUILDID/source/zoo//../bar/foo.c
+.TE
+
+.SS /metrics
+
+This endpoint returns a Prometheus formatted text/plain dump of a
+variety of statistics about the operation of the debuginfod server.
+The exact set of metrics and their meanings may change in future
+versions. Caution: configuration information (path names, versions)
+may be disclosed.
+
+.SH DATA MANAGEMENT
+
+debuginfod stores its index in an sqlite database in a densely packed
+set of interlinked tables. While the representation is as efficient
+as we have been able to make it, it still takes a considerable amount
+of data to record all debuginfo-related data of potentially a great
+many files. This section offers some advice about the implications.
+
+As a general explanation for size, consider that debuginfod indexes
+ELF/DWARF files, it stores their names and referenced source file
+names, and buildids will be stored. When indexing RPMs, it stores
+every file name \fIof or in\fP an RPM, every buildid, plus every
+source file name referenced from a DWARF file. (Indexing RPMs takes
+more space because the source files often reside in separate
+subpackages that may not be indexed at the same pass, so extra
+metadata has to be kept.)
+
+Getting down to numbers, in the case of Fedora RPMs (essentially,
+gzip-compressed cpio files), the sqlite index database tends to be
+from 0.5% to 3% of their size. It's larger for binaries that are
+assembled out of a great many source files, or packages that carry
+much debuginfo-unrelated content. It may be even larger during the
+indexing phase due to temporary sqlite write-ahead-logging files;
+these are checkpointed (cleaned out and removed) at shutdown. It may
+be helpful to apply tight \-I or \-X regular-expression constraints to
+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
+RPM content index such as file names found in RPMs ("rpm sdef"
+records) that are not referred to as source files from any binaries
+find in RPMs ("rpm 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 RPM traversals were interrupted, so the 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
+other errors, debuginfod will resume when resources permit.) If
+necessary, debuginfod can be stopped, the database file moved or
+removed, and debuginfod restarted.
+
+sqlite offers several performance-related options in the form of
+pragmas. Some may be useful to fine-tune the defaults plus the
+debuginfod extras. The \-D option may be useful to tell debuginfod to
+execute the given bits of SQL after the basic schema creation
+commands. For example, the "synchronous", "cache_size",
+"auto_vacuum", "threads", "journal_mode" pragmas may be fun to tweak
+via \-D, if you're searching for peak performance. The "optimize",
+"wal_checkpoint" pragmas may be useful to run periodically, outside
+debuginfod. The default settings are performance- rather than
+reliability-oriented, so a hardware crash might corrupt the database.
+In these cases, it may be necessary to manually delete the sqlite
+database and start over.
+
+As debuginfod changes in the future, we may have no choice but to
+change the database schema in an incompatible manner. If this
+happens, new versions of debuginfod will issue SQL statements to
+\fIdrop\fP all prior schema & data, and start over. So, disk space
+will not be wasted for retaining a no-longer-useable dataset.
+
+In summary, if your system can bear a 0.5%-3% index-to-RPM-dataset
+size ratio, and slow growth afterwards, you should not need to
+worry about disk space. If a system crash corrupts the database,
+or you want to force debuginfod to reset and start over, simply
+erase the sqlite file before restarting debuginfod.
+
+
+.SH SECURITY
+
+debuginfod \fBdoes not\fP include any particular security features.
+While it is robust with respect to inputs, some abuse is possible. It
+forks a new thread for each incoming HTTP request, which could lead to
+a denial-of-service in terms of RAM, CPU, disk I/O, or network I/O.
+If this is a problem, users are advised to install debuginfod with a
+HTTPS reverse-proxy front-end that enforces site policies for
+firewalling, authentication, integrity, authorization, and load
+control. The \fI/metrics\fP webapi endpoint is probably not
+appropriate for disclosure to the public.
+
+When relaying queries to upstream debuginfods, debuginfod \fBdoes not\fP
+include any particular security features. It trusts that the binaries
+returned by the debuginfods are accurate. Therefore, the list of
+servers should include only trustworthy ones. If accessed across HTTP
+rather than HTTPS, the network should be trustworthy. Authentication
+information through the internal \fIlibcurl\fP library is not currently
+enabled.
+
+
+.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.
+Avoid referential loops that cause a server to contact itself, directly
+or indirectly - the results would be hilarious.
+
+.TP 21
+.B DEBUGINFOD_TIMEOUT
+This environment variable governs the timeout for each debuginfod HTTP
+connection. A server that fails to respond within this many seconds
+is skipped. The default is 5.
+
+.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. The default is $HOME/.debuginfod_client_cache.
+.\" XXX describe cache eviction policy
+
+.SH FILES
+.LP
+.PD .1v
+.TP 20
+.B $HOME/.debuginfod.sqlite
+Default database file.
+.PD
+
+.TP 20
+.B $HOME/.debuginfod_client_cache
+Default cache directory for content from upstream debuginfods.
+.PD
+
+
+.SH "SEE ALSO"
+.I "debuginfod-find(1)"
+.I "sqlite3(1)"
+.I \%https://prometheus.io/docs/instrumenting/exporters/
diff --git a/doc/debuginfod_begin.3 b/doc/debuginfod_begin.3
new file mode 100644
index 00000000..16279936
--- /dev/null
+++ b/doc/debuginfod_begin.3
@@ -0,0 +1 @@
+.so man3/debuginfod_find_debuginfo.3
diff --git a/doc/debuginfod_end.3 b/doc/debuginfod_end.3
new file mode 100644
index 00000000..16279936
--- /dev/null
+++ b/doc/debuginfod_end.3
@@ -0,0 +1 @@
+.so man3/debuginfod_find_debuginfo.3
diff --git a/doc/debuginfod_find_debuginfo.3 b/doc/debuginfod_find_debuginfo.3
new file mode 100644
index 00000000..be8eed09
--- /dev/null
+++ b/doc/debuginfod_find_debuginfo.3
@@ -0,0 +1,242 @@
+'\"! tbl | nroff \-man
+'\" t macro stdmacro
+
+.de SAMPLE
+.br
+.RS 0
+.nf
+.nh
+..
+.de ESAMPLE
+.hy
+.fi
+.RE
+..
+
+.TH DEBUGINFOD_FIND_* 3
+.SH NAME
+debuginfod_find_debuginfo \- request debuginfo from debuginfod
+
+.SH SYNOPSIS
+.nf
+.B #include <elfutils/debuginfod.h>
+.PP
+.BI "debuginfod_client *debuginfod_begin(void);"
+.BI "void debuginfod_end(debuginfod_client *" client ");"
+
+.BI "int debuginfod_find_debuginfo(debuginfod_client *" client ","
+.BI " const unsigned char *" build_id ","
+.BI " int " build_id_len ","
+.BI " char ** " path ");"
+.BI "int debuginfod_find_executable(debuginfod_client *" client ","
+.BI " const unsigned char *" build_id ","
+.BI " int " build_id_len ","
+.BI " char ** " path ");"
+.BI "int debuginfod_find_source(debuginfod_client *" client ","
+.BI " const unsigned char *" build_id ","
+.BI " int " build_id_len ","
+.BI " const char *" filename ","
+.BI " char ** " path ");"
+
+.BI "typedef int (*debuginfo_progressfn_t)(debuginfod_client *" client ","
+.BI " long a, long b);"
+.BI "void debuginfod_set_progressfn(debuginfod_client *" client ","
+.BI " debuginfo_progressfn_t " progressfn ");"
+
+Link with \fB-ldebuginfod\fP.
+
+.SH DESCRIPTION
+
+.BR debuginfod_begin ()
+creates a \fBdebuginfod_client\fP connection handle that should be used
+with all other calls.
+.BR debuginfod_end ()
+should be called on the \fBclient\fP handle to release all state and
+storage when done.
+
+.BR debuginfod_find_debuginfo (),
+.BR debuginfod_find_executable (),
+and
+.BR debuginfod_find_source ()
+query the debuginfod server URLs contained in
+.BR $DEBUGINFOD_URLS
+(see below) for the debuginfo, executable or source file with the
+given \fIbuild_id\fP. \fIbuild_id\fP should be a pointer to either
+a null-terminated, lowercase hex string or a binary blob. If
+\fIbuild_id\fP is given as a hex string, \fIbuild_id_len\fP should
+be 0. Otherwise \fIbuild_id_len\fP should be the number of bytes in
+the binary blob.
+
+.BR debuginfod_find_source ()
+also requries a \fIfilename\fP in order to specify a particular
+source file. \fIfilename\fP should be an absolute path that includes
+the compilation directory of the CU associated with the source file.
+Relative path names commonly appear in the DWARF file's source directory,
+but these paths are relative to individual compilation unit AT_comp_dir
+paths, and yet an executable is made up of multiple CUs. Therefore, to
+disambiguate, debuginfod expects source queries to prefix relative path
+names with the CU compilation-directory, followed by a mandatory "/".
+
+Note: the caller should not elide \fB../\fP or \fB/./\fP or extraneous
+\fB///\fP sorts of path components in the directory names, because if
+this is how those names appear in the DWARF files, that is what
+debuginfod needs to see too.
+
+If \fIpath\fP is not NULL and the query is successful, \fIpath\fP is set
+to the path of the file in the cache. The caller must \fBfree\fP() this value.
+
+The URLs in \fB$DEBUGINFOD_URLS\fP may be queried in parallel. As soon
+as a debuginfod server begins transferring the target file all of the
+connections to the other servers are closed.
+
+A \fBclient\fP handle should be used from only one thread at a time.
+
+.SH "RETURN VALUE"
+
+\fBdebuginfod_begin\fP returns the \fBdebuginfod_client\fP handle to
+use with all other calls. On error \fBNULL\fP will be returned and
+\fBerrno\fP will be set.
+
+If a find family function is successful, the resulting file is saved
+to the client cache and a file descriptor to that file is returned.
+The caller needs to \fBclose\fP() this descriptor. Otherwise, a
+negative error code is returned.
+
+.SH "PROGRESS CALLBACK"
+
+As the \fBdebuginfod_find_*\fP() functions may block for seconds or
+longer, a progress callback function is called periodically, if
+configured with
+.BR debuginfod_set_progressfn ().
+This function sets a new progress callback function (or NULL) for the
+client handle.
+
+The given callback function is called from the context of each thread
+that is invoking any of the other lookup functions. It is given two
+numeric parameters that, if thought of as a numerator \fIa\fP and
+denominator \fIb\fP, together represent a completion fraction
+\fIa/b\fP. The denominator may be zero initially, until a quantity
+such as an exact download size becomes known.
+
+The progress callback function is also the supported way to
+\fIinterrupt\fP the download operation. (The library does \fInot\fP
+modify or trigger signals.) The progress callback must return 0 to
+continue the work, or any other value to stop work as soon as
+possible. Consequently, the \fBdebuginfod_find_*\fP() function will
+likely return with an error, but might still succeed.
+
+
+.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 "SECURITY"
+.BR debuginfod_find_debuginfo (),
+.BR debuginfod_find_executable (),
+and
+.BR debuginfod_find_source ()
+\fBdo not\fP include any particular security
+features. They trust that the binaries returned by the debuginfod(s)
+are accurate. Therefore, the list of servers should include only
+trustworthy ones. If accessed across HTTP rather than HTTPS, the
+network should be trustworthy. Passing user authentication information
+through the internal \fIlibcurl\fP library is not currently enabled, except
+for the basic plaintext \%\fIhttp[s]://userid:password@hostname/\fP style.
+(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 respond within this many seconds
+is skipped. The default is 5.
+
+.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. The default is $HOME/.debuginfod_client_cache.
+
+.SH "ERRORS"
+The following list is not comprehensive. Error codes may also
+originate from calls to various C Library functions.
+
+.TP
+.BR EACCESS
+Denied access to resource located at the URL.
+
+.TP
+.BR ECONNREFUSED
+Unable to connect to remote host.
+
+.TP
+.BR ECONNRESET
+Unable to either send or recieve network data.
+
+.TP
+.BR EHOSTUNREACH
+Unable to resolve remote host.
+
+.TP
+.BR EINVAL
+One or more arguments are incorrectly formatted. \fIbuild_id\fP may
+be too long (greater than 256 characters), \fIfilename\fP may not
+be an absolute path or a debuginfod URL is malformed.
+
+.TP
+.BR EIO
+Unable to write data received from server to local file.
+
+.TP
+.BR EMLINK
+Too many HTTP redirects.
+
+.TP
+.BR ENETUNREACH
+Unable to initialize network connection.
+
+.TP
+.BR ENOENT
+Could not find the resource located at URL. Often this error code
+indicates that a debuginfod server was successfully contacted but
+the server could not find the target file.
+
+.TP
+.BR ENOMEM
+System is unable to allocate resources.
+
+.TP
+.BR ENOSYS
+\fB$DEBUGINFOD_URLS\fP is not defined.
+
+.TP
+.BR ETIME
+Query failed due to timeout. \fB$DEBUGINFOD_TIMEOUT\fP controls
+the timeout duration. See debuginfod(8) for more information.
+
+.SH "FILES"
+.LP
+.PD .1v
+.TP 20
+.B $HOME/.debuginfod_client_cache
+Default cache directory.
+.PD
+
+.SH "SEE ALSO"
+.I "debuginfod(8)"
diff --git a/doc/debuginfod_find_executable.3 b/doc/debuginfod_find_executable.3
new file mode 100644
index 00000000..16279936
--- /dev/null
+++ b/doc/debuginfod_find_executable.3
@@ -0,0 +1 @@
+.so man3/debuginfod_find_debuginfo.3
diff --git a/doc/debuginfod_find_source.3 b/doc/debuginfod_find_source.3
new file mode 100644
index 00000000..16279936
--- /dev/null
+++ b/doc/debuginfod_find_source.3
@@ -0,0 +1 @@
+.so man3/debuginfod_find_debuginfo.3
diff --git a/doc/debuginfod_set_progressfn.3 b/doc/debuginfod_set_progressfn.3
new file mode 100644
index 00000000..16279936
--- /dev/null
+++ b/doc/debuginfod_set_progressfn.3
@@ -0,0 +1 @@
+.so man3/debuginfod_find_debuginfo.3
diff --git a/doc/elf_begin.3 b/doc/elf_begin.3
new file mode 100644
index 00000000..6a1d0c27
--- /dev/null
+++ b/doc/elf_begin.3
@@ -0,0 +1,37 @@
+.\" Modified Thu Sep 5 2017 by Ben Woodard <woodard@redhat.com>
+.\"
+.TH ELF_BEGIN 3 2017-09-05 "Libelf" "Libelf Programmer's Manual"
+.SH NAME
+elf_begin \- Return descriptor for ELF file.
+.nf
+.SH SYNOPSIS
+.B #include <libelf.h>
+.sp
+.BI "Elf *elf_begin (int " filedes ", Elf_Cmd " cmd ", Elf *" ref ");"
+.BI "Elf *elf_clone (int " filedes ", Elf_Cmd " cmd ");"
+.BI "int elf_end (Elf *" elf ");"
+.fi
+.SH DESCRIPTION
+The
+.BR elf_begin ()
+.SH RETURN VALUE
+.SH ERRORS
+elf_begin ELF_E_NO_VERSION ELF_E_INVALID_FILE ELF_E_INVALID_CMD ELF_E_NOMEM
+elf_clone ELF_E_NOMEM
+elf_end
+.SH ATTRIBUTES
+For an explanation of the terms used in this section, see
+.BR attributes (7).
+.TS
+allbox;
+lbw29 lb lb
+l l l.
+Interface Attribute Value
+T{
+.BR elf_begin (),
+.BR elf_clone (),
+.BR elf_end ()
+T} Thread safety MT-Safe
+.TE
+
+.SH SEE ALSO
diff --git a/doc/elf_clone.3 b/doc/elf_clone.3
new file mode 100644
index 00000000..38ec9217
--- /dev/null
+++ b/doc/elf_clone.3
@@ -0,0 +1,14 @@
+.\" Modified Thu Sep 5 2017 by Ben Woodard <woodard@redhat.com>
+.\"
+.TH ELF_CLONE 3 2017-09-05 "Libelf" "Libelf Programmer's Manual"
+.SH NAME
+elf_clone \- Create a clone of an existing ELF descriptor.
+.nf
+.SH SYNOPSIS
+.B #include <libelf.h>
+.sp
+.BI "Elf *elf_clone (int " filedes ", Elf_Cmd " cmd ");"
+.fi
+.SH DESCRIPTION
+The
+.BR elf_clone ()
diff --git a/doc/elf_getdata.3 b/doc/elf_getdata.3
new file mode 100644
index 00000000..44d9304e
--- /dev/null
+++ b/doc/elf_getdata.3
@@ -0,0 +1,28 @@
+.\" Modified Thu Aug 17 2017 by Ben Woodard <woodard@redhat.com>
+.\"
+.TH ELF_GETDATA 3 2017-08-17 "Libelf" "Libelf Programmer's Manual"
+.SH NAME
+elf_getdata \- Get washed data of section
+.nf
+.SH SYNOPSIS
+.B #include <libelf.h>
+.sp
+.BI "Elf_Data * elf_getdata (Elf_Scn *" scn ", Elf_Data *" data ");"
+.fi
+.SH DESCRIPTION
+The
+.BR elf_getdata ()
+function allows the user to retrieve the data buffers of the section
+.I scn
+ . There can be more than one buffer if the user explicitly added them.
+When a file is read the libelf library creates exactly one data buffer.
+
+The first buffer in the list can be obtained by passing a null pointer in the
+parameter data. To get the next data buffer the previously returned value must
+be passed in the data parameter. If there are no more buffer left in the list a
+null pointer is returned.
+
+If the data parameter is not a null pointer it must be a descriptor for a
+buffer associated with the section scn . If this is not the case a null pointer
+is returned. To facilitate error handling elf_getdata also returns a null
+pointer if the scn parameter is a null pointer.
diff --git a/doc/elf_update.3 b/doc/elf_update.3
new file mode 100644
index 00000000..d0a7ab10
--- /dev/null
+++ b/doc/elf_update.3
@@ -0,0 +1,14 @@
+.\" Modified Thu Sep 5 2017 by Ben Woodard <woodard@redhat.com>
+.\"
+.TH ELF_UPDATE 3 2017-09-05 "Libelf" "Libelf Programmer's Manual"
+.SH NAME
+elf_update \- update an ELF descriptor
+.nf
+.SH SYNOPSIS
+.B #include <libelf.h>
+.sp
+.BI "off_t elf_update (Elf *" elf ", Elf_Cmd " cmd ");"
+.fi
+.SH DESCRIPTION
+The
+.BR elf_update ()
diff --git a/doc/elfclassify.1 b/doc/elfclassify.1
new file mode 100644
index 00000000..cbfdae48
--- /dev/null
+++ b/doc/elfclassify.1
@@ -0,0 +1,197 @@
+.\" Copyright 2019 Red Hat Inc.
+.\" Tue 2019-Aug 20 Ben Woodard <woodard@redhat.com>
+.\" Florian Wiemer <fwiemer@redhat.com>
+.\" Mark Wielaard <mjw@redhat.com>
+.\" Contact elfutils-devel@sourceware.org to correct errors or typos.
+.TH EU-ELFCLASSIFY 1 "2019-Aug-20" "elfutils"
+.SH "NAME"
+eu-elfclassify \- Determine the type of an ELF file.
+.SH "SYNOPSIS"
+.IX Header "SYNOPSIS"
+eu-elfclassify [\fB\-\-core\fR]
+ [\fB\-\-debug-only\fR]
+ [\fB\-\-elf\fR]
+ [\fB\-\-elf\-archive\fR]
+ [\fB\-\-elf\-file\fR]
+ [\fB\-\-executable\fR]
+ [\fB\-\-library\fR]
+ [\fB\-\-linux\-kernel\-module\fR]
+ [\fB\-\-loadable\fR]
+ [\fB\-\-program\fR]
+ [\fB\-\-shared\fR]
+ [\fB\-\-unstripped\fR]
+ [\fB\-f\fR|\fB \-\-file\fR]
+ [\fB\-\-no\-stdin\fR]
+ [\fB\-\-stdin\fR]
+ [\fB\-\-stdin0\fR]
+ [\fB\-z\fR|\fB \-\-compressed\fR]
+ [\fB\-\-matching\fR]
+ [\fB\-\-no\-print\fR]
+ [\fB\-\-not\-matching\fR]
+ [\fB\-\-print\fR]
+ [\fB\-\-print0\fR]
+ [\fB\-q\fR|\fB \-\-quiet\fR]
+ [\fB\-v\fR|\fB \-\-verbose\fR]
+ [\fB\-?\fR|\fB \-\-help\fR]
+ [\fB\-\-usage\fR]
+ [\fB\-V\fR|\fB \-\-version\fR]
+ \fIelffile\fR...
+.SH "DESCRIPTION"
+.IX Header "DESCRIPTION"
+\&\fBeu-elfclassify\fR identifies the primary purpose of a particular kind of
+ \s-1ELF\s0 file or files
+.SH "OPTIONS"
+.IX Header "OPTIONS"
+The long and short forms of options, shown here as alternatives, are
+equivalent. All of the classification options must apply at the same time to a
+particular file. Classification options can be negated using a
+\fB\-\-not\-\fR prefix.
+.SS "Classification Options"
+.IX Subsection "Classification Options"
+.IP "\fB\-\-core\fR" 4
+.IX Item "--core"
+.PD
+File is an ELF core dump file.
+.IP "\FB\-\-debug\-only\fR" 4
+.IX Item "--debug-only"
+.PD
+File is a debug only ELF file (separate .debug, .dwo or dwz multi-file).
+.IP "\fB\-\-elf\fR" 4
+.IX Item "--elf"
+.PD
+File looks like an ELF object or archive/static library (default).
+.IP "\fB\-\-elf\-archive\fR" 4
+.IX Item "--elf-archive"
+.PD
+File is an ELF archive or static library.
+.IP "\fB\-\-elf\-file\fR" 4
+.IX Item "--elf-file"
+.PD
+File is an regular ELF object (not an archive/static library).
+.IP "\fB\-\-executable\fR" 4
+.IX Item "--executable"
+.PD
+File is (primarily) an ELF program executable (not primarily a DS.O)
+.IP "\fB\-\-library\fR" 4
+.IX Item "--library"
+.PD
+File is an ELF shared object (DSO) (might also be an executable).
+.IP "\fB\-\-linux\-kernel\-module\fR" 4
+.IX Item "--linux-kernel-module"
+.PD
+File is a linux kernel module.
+.IP "\fB\-\-loadable\fR" 4
+.IX Item "--loadable"
+.PD
+File is a loadable ELF object (program or shared object).
+.IP "\fB\--program\fR" 4
+.IX Item "--program"
+.PD
+File is an ELF program executable (might also be a DSO).
+.IP "\fB\-\-shared\fR" 4
+.IX Item "--shared"
+.PD
+File is (primarily) an ELF shared object (DSO) (not primarily an executable).
+.IP "\fB\-\-unstripped\fR" 4
+.IX Item "--unstripped"
+.PD
+File is an ELF file with symbol table or .debug_* sections and can be stripped
+further.
+.SS "Input flags"
+.IX Subsection "Input flags"
+.IP "\fB\-f\fR" 4
+.IX Item "-f"
+.PD 0
+.IP "\fB\-\-file\fR" 4
+.IX Item "--file"
+.PD
+Only classify regular (not symlink nor special device) files.
+.IP "\fB\-\-no\-stdin\fR" 4
+.IX Item "--no-stdin"
+.PD
+Do not read files from standard input (default).
+.IP "\fB\-\-stdin\fR" 4
+.IX Item "--stdin"
+.PD
+Also read file names to process from standard input, separated by newlines.
+.IP "\fB\-\-stdin0\fR" 4
+.IX Item "--stdin0"
+.PD
+Also read file names to process from standard input, separated by ASCII NUL
+bytes.
+.IP "\fB\-z\fR" 4
+.IX Item "-z"
+.PD 0
+.IP "\fB\-\-compressed\fR" 4
+.IX Item "--compressed"
+.PD
+Try to open compressed files or embedded (kernel) ELF images.
+.SS "Output flags"
+.IX Subsection "Output flags"
+.IP "\fB\-\-matching\fR" 4
+.IX Item "--matching"
+.PD
+If printing file names, print matching files (default).
+.IP "\fB\-\-no\-print\fR" 4
+.IX Item "--no-print"
+.PD
+Do not output file names.
+.IP "\fB\-\-not\-matching\fR" 4
+.IX Item "--not-matching"
+.PD
+If printing file names, print files that do not match.
+.IP "\fB\-\-print\fR" 4
+.IX Item "--print"
+.PD
+Output names of files, separated by newline.
+.IP "\fB\-\-print0\fR" 4
+.IX Item "--print0"
+.PD
+Output names of files, separated by ASCII NUL.
+.SS " Additional flags"
+.IX Subsection " Additional flags"
+.IP "\fB\-q\fR" 4
+.IX Item "-q,"
+.PD
+.IP "\fB\-\-quiet\fR" 4
+.IX Item "--quiet"
+.PD
+Suppress some error output (counterpart to --verbose).
+.IP "\fB\-v\fR" 4
+.IX Item "-v"
+.PD
+.IP "\fB\-\-verbose\fR" 4
+.IX Item "--verbose"
+.PD
+Output additional information (can be specified multiple times).
+.IP "\fB\-?\fR" 4
+.IX Item "-?"
+.PD
+.IP "\fB\-\-help\fR" 4
+.IX Item "--help"
+.PD
+Give this help list.
+.IP "\fB\-\-usage\fR" 4
+.IX Item "--usage"
+.PD
+Give a short usage message.
+.IP "\fB\-V\fR" 4
+.IX Item "-V"
+.PD
+.IP "\fB\-\-version\fR" 4
+.IX Item "--version"
+.PD
+Print program version.
+
+.SH "AUTHOR"
+.IX Header "AUTHOR"
+Written by Florian Wiemer.
+.SH "REPORTING BUGS"
+.IX Header "REPORTING BUGS"
+Please reports bugs at https://sourceware.org/bugzilla/
+.SH "COPYRIGHT"
+.IX Header "COPYRIGHT"
+Copyright © 2019 Red Hat Inc. License GPLv3+: GNU GPL version 3 or
+later <https://gnu.org/licenses/gpl.html>. This is free software: you
+are free to change and redistribute it. There is NO WARRANTY, to the
+extent permitted by law.
diff --git a/doc/readelf.1 b/doc/readelf.1
new file mode 100644
index 00000000..33263819
--- /dev/null
+++ b/doc/readelf.1
@@ -0,0 +1,511 @@
+.\" Modified from readelf.1 man page
+.\" Tue 2019-Aug 20 by Ben Woodard <woodard@redhat.com>
+.\" Contact elfutils-devel@sourceware.org to correct errors or typos.
+.\"
+.\" Standard preamble:
+.\" ========================================================================
+.de Sp \" Vertical space (when we can't use .PP)
+.if t .sp .5v
+.if n .sp
+..
+.de Vb \" Begin verbatim text
+.ft CW
+.nf
+.ne \\$1q
+..
+.de Ve \" End verbatim text
+.ft R
+.fi
+..
+.\" Set up some character translations and predefined strings. \*(-- will
+.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
+.\" double quote, and \*(R" will give a right double quote. \*(C+ will
+.\" give a nicer C++. Capital omega is used to do unbreakable dashes and
+.\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff,
+.\" nothing in troff, for use with C<>.
+.tr \(*W-
+.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
+.ie n \{\
+. ds -- \(*W-
+. ds PI pi
+. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
+. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch
+. ds L" ""
+. ds R" ""
+. ds C` ""
+. ds C' ""
+'br\}
+.el\{\
+. ds -- \|\(em\|
+. ds PI \(*p
+. ds L" ``
+. ds R" ''
+. ds C`
+. ds C'
+'br\}
+.\"
+.\" Escape single quotes in literal strings from groff's Unicode transform.
+.ie \n(.g .ds Aq \(aq
+.el .ds Aq '
+.\"
+.\" If the F register is >0, we'll generate index entries on stderr for
+.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
+.\" entries marked with X<> in POD. Of course, you'll have to process the
+.\" output yourself in some meaningful fashion.
+.\"
+.\" Avoid warning from groff about undefined register 'F'.
+.de IX
+..
+.if !\nF .nr F 0
+.if \nF>0 \{\
+. de IX
+. tm Index:\\$1\t\\n%\t"\\$2"
+..
+. if !\nF==2 \{\
+. nr % 0
+. nr F 2
+. \}
+.\}
+.\"
+.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
+.\" Fear. Run. Save yourself. No user-serviceable parts.
+. \" fudge factors for nroff and troff
+.if n \{\
+. ds #H 0
+. ds #V .8m
+. ds #F .3m
+. ds #[ \f1
+. ds #] \fP
+.\}
+.if t \{\
+. ds #H ((1u-(\\\\n(.fu%2u))*.13m)
+. ds #V .6m
+. ds #F 0
+. ds #[ \&
+. ds #] \&
+.\}
+. \" simple accents for nroff and troff
+.if n \{\
+. ds ' \&
+. ds ` \&
+. ds ^ \&
+. ds , \&
+. ds ~ ~
+. ds /
+.\}
+.if t \{\
+. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
+. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
+. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
+. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
+. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
+. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
+.\}
+. \" troff and (daisy-wheel) nroff accents
+.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
+.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
+.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
+.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
+.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
+.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
+.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
+.ds ae a\h'-(\w'a'u*4/10)'e
+.ds Ae A\h'-(\w'A'u*4/10)'E
+. \" corrections for vroff
+.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
+.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
+. \" for low resolution devices (crt and lpr)
+.if \n(.H>23 .if \n(.V>19 \
+\{\
+. ds : e
+. ds 8 ss
+. ds o a
+. ds d- d\h'-1'\(ga
+. ds D- D\h'-1'\(hy
+. ds th \o'bp'
+. ds Th \o'LP'
+. ds ae ae
+. ds Ae AE
+.\}
+.rm #[ #] #H #V #F C
+.\" ========================================================================
+.\"
+.IX Title "EU-READELF 1"
+.TH EU-READELF 1 "2019-Aug-20" "elfutils"
+.\" For nroff, turn off justification. Always turn off hyphenation; it makes
+.\" way too many mistakes in technical documents.
+.if n .ad l
+.nh
+.SH "NAME"
+eu-readelf \- Displays information about ELF files.
+.SH "SYNOPSIS"
+.IX Header "SYNOPSIS"
+eu-readelf [\fB\-a\fR|\fB\-\-all\fR]
+ [\fB\-h\fR|\fB\-\-file\-header\fR]
+ [\fB\-l\fR|\fB\-\-program\-headers\fR|\fB\-\-segments\fR]
+ [\fB\-S\fR|\fB\-\-section\-headers\fR|\fB\-\-sections\fR]
+ [\fB\-g\fR|\fB\-\-section\-groups\fR]
+ [\fB\-e\fR|\fB\-\-exception\fR]
+ [\fB\-s\fR|\fB\-\-symbols\fR] [section name] ]
+ [\fB\-\-dyn-syms\fR]
+ [\fB\-n\fR|\fB\-\-notes\fR [section name] ]
+ [\fB\-r\fR|\fB\-\-relocs\fR]
+ [\fB\-d\fR|\fB\-\-dynamic\fR]
+ [\fB\-V\fR|\fB\-\-version\-info\fR]
+ [\fB\-A\fR|\fB\-\-arch\-specific\fR]
+ [\fB\-x\fR <number or name>|\fB\-\-hex\-dump=\fR<number or name>]
+ [\fB\-p\fR <number or name>|\fB\-\-string\-dump=\fR<number or name>]
+ [\fB\-z\fR|\fB\-\-decompress\fR]
+ [\fB\-c\fR|\fB\-\-archive\-index\fR]
+ [\fB\-\-dwarf\-skeleton\fR <file> ]
+ [\fB\-\-elf\-section\fR [section] ]
+ [\fB\-w\fR|
+ \fB\-\-debug\-dump\fR[=line,=decodedline,=info,=info+,=abbrev,=pubnames,=aranges,=macro,=frames,=str,=loc,=ranges,=gdb_index,=addr]]
+ [\fB\-I\fR|\fB\-\-histogram\fR]
+ [\fB\-v\fR|\fB\-\-version\fR]
+ [\fB\-W\fR|\fB\-\-wide\fR]
+ [\fB\-H\fR|\fB\-\-help\fR]
+ \fIelffile\fR...
+.SH "DESCRIPTION"
+.IX Header "DESCRIPTION"
+\&\fBeu-readelf\fR displays information about one or more \s-1ELF\s0 format object
+files. The options control what particular information to display.
+.PP
+\&\fIelffile\fR... are the object files to be examined. 32\-bit and
+64\-bit \s-1ELF\s0 files are supported, as are archives containing \s-1ELF\s0 files.
+.PP
+This program performs a similar function to \fBobjdump\fR but it
+goes into more detail and it exists independently of the \s-1BFD\s0
+library, so if there is a bug in \s-1BFD\s0 then readelf will not be
+affected.
+.SH "OPTIONS"
+.IX Header "OPTIONS"
+The long and short forms of options, shown here as alternatives, are
+equivalent. At least one option in addition to \fB\-v\fR or \fB\-H\fR must be
+given.
+.SS "ELF Input Selection"
+.IX Subsection "ELF Input Selection"
+.IP "\fB\-\-dwarf\-skeleton <file>\fR" 4
+.IX Item "--dwarf-skeleton <file>"
+.PD
+Used with -w to find the skeleton Compile Units in FILE associated
+with the Split Compile units in a .dwo input file.
+.IP "\fB\-\-elf\-section [section]\fR" 4
+.IX Item "--elf-section [section]"
+.PD
+Use the named SECTION (default .gnu_debugdata) as (compressed) ELF input data
+.SS "ELF Output Selection"
+.IX Subsection "ELF Output Selection"
+.IP "\fB\-a\fR" 4
+.IX Item "-a"
+.PD 0
+.IP "\fB\-\-all\fR" 4
+.IX Item "--all"
+.PD
+Equivalent to specifying \fB\-\-file\-header\fR,
+\&\fB\-\-program\-headers\fR, \fB\-\-sections\fR, \fB\-\-symbols\fR,
+\&\fB\-\-relocs\fR, \fB\-\-dynamic\fR, \fB\-\-notes\fR,
+\&\fB\-\-version\-info\fR, \fB\-\-arch\-specific\fR,
+\&\fB\-\-section\-groups\fR and \fB\-\-histogram\fR.
+.Sp
+.IP "\fB\-h\fR" 4
+.IX Item "-h"
+.PD 0
+.IP "\fB\-\-file\-header\fR" 4
+.IX Item "--file-header"
+.PD
+Displays the information contained in the \s-1ELF\s0 header at the start of the
+file.
+.IP "\fB\-l\fR" 4
+.IX Item "-l"
+.PD 0
+.IP "\fB\-\-program\-headers\fR" 4
+.IX Item "--program-headers"
+.IP "\fB\-\-segments\fR" 4
+.IX Item "--segments"
+.PD
+Displays the information contained in the file's segment headers, if it
+has any.
+.IP "\fB\-S\fR" 4
+.IX Item "-S"
+.PD 0
+.IP "\fB\-\-sections\fR" 4
+.IX Item "--sections"
+.IP "\fB\-\-section\-headers\fR" 4
+.IX Item "--section-headers"
+.PD
+Displays the information contained in the file's section headers, if it
+has any.
+.IP "\fB\-g\fR" 4
+.IX Item "-g"
+.PD 0
+.IP "\fB\-\-section\-groups\fR" 4
+.IX Item "--section-groups"
+.PD
+Displays the information contained in the file's section groups, if it
+has any.
+.IP "\fB\-I\fR" 4
+.IX Item "-I"
+.PD 0
+.IP "\fB\-\-histogram\fR" 4
+.IX Item "--histogram"
+.PD
+Display a histogram of bucket list lengths when displaying the contents
+of the symbol tables.
+.IP "\fB\-s\fR" 4
+.IX Item "-s"
+.PD 0
+.IP "\fB\-\-symbols\fR [section name]" 4
+.IX Item "--symbols"
+.PD
+Displays the entries in symbol table section of the file, if it has one.
+If a symbol has version information associated with it then this is
+displayed as well. The version string is displayed as a suffix to the
+symbol name, preceeded by an @ character. For example
+\&\fBfoo@VER_1\fR. If the version is the default version to be used
+when resolving unversioned references to the symbol then it is
+displayed as a suffix preceeded by two @ characters. For example
+\&\fBfoo@@VER_2\fR.
+.IP "\fB\-\-dyn-syms\fR" 4
+.IX Item "--dyn-syms"
+.PD
+Display (only) the dynamic symbol table.
+.IP "\fB\-e\fR" 4
+.IX Item "-e"
+.PD 0
+.IP "\fB\-\-exception\fR" 4
+.IX Item "--exception"
+.PD
+Display sections for exception handling.
+.IP "\fB\-n\fR" 4
+.IX Item "-n [section name]"
+.PD 0
+.IP "\fB\-\-notes [section name]\fR" 4
+.IX Item "--notes"
+.PD
+Displays the contents of the \s-1NOTE\s0 segments and/or sections, if any.
+.IP "\fB\-r\fR" 4
+.IX Item "-r"
+.PD 0
+.IP "\fB\-\-relocs\fR" 4
+.IX Item "--relocs"
+.PD
+Displays the contents of the file's relocation section, if it has one.
+.IP "\fB\-d\fR" 4
+.IX Item "-d"
+.PD 0
+.IP "\fB\-\-dynamic\fR" 4
+.IX Item "--dynamic"
+.PD
+Displays the contents of the file's dynamic section, if it has one.
+.IP "\fB\-V\fR" 4
+.IX Item "-V"
+.PD 0
+.IP "\fB\-\-version\-info\fR" 4
+.IX Item "--version-info"
+.PD
+Displays the contents of the version sections in the file, it they
+exist.
+.IP "\fB\-A\fR" 4
+.IX Item "-A"
+.PD 0
+.IP "\fB\-\-arch\-specific\fR" 4
+.IX Item "--arch-specific"
+.PD
+Displays architecture-specific information in the file, if there
+is any.
+.SS "Additional output selection"
+.IX Subsection "Additional output selection"
+.IP "\fB\-x <name>\fR" 4
+.IX Item "-x <name>"
+.PD 0
+.IP "\fB\-\-hex\-dump=<name>\fR" 4
+.IX Item "--hex-dump=<name>"
+.PD
+Displays the contents of the indicated section name as a hexadecimal bytes.
+.IP "\fB\-w\fR" 4
+.IX Item "-w"
+.PD 0
+.IP "\fB\-\-debug\-dump[=decodedline,=info,=info+,=abbrev,=pubnames,=aranges,=macro,=frames,=str,=loc,=ranges,=gdb_index,=addr]\fR" 4
+.IX Item "--debug-dump[=line,=decodedline,=info,=info+,=abbrev,=pubnames,=aranges,=macro,=frames,=str,=loc,=ranges,=gdb_index,=addr]"
+.PD
+Displays the contents of the \s-1DWARF\s0 debug sections in the file, if any
+are present. Compressed debug sections are automatically decompressed
+(temporarily) before they are displayed. If one or more of the
+optional letters or words follows the switch then only those type(s)
+of data will be dumped. The letters and words refer to the following
+information:
+.RS 4
+.PD 0
+.ie n .IP """=abbrev""" 4
+.el .IP "\f(CW=abbrev\fR" 4
+.IX Item "=abbrev"
+.PD
+Displays the contents of the \fB.debug_abbrev\fR section.
+.PD 0
+.ie n .IP """=addr""" 4
+.el .IP "\f(CW=addr\fR" 4
+.IX Item "=addr"
+.PD
+Displays the contents of the \fB.debug_addr\fR section.
+.PD 0
+.ie n .IP """=frames""" 4
+.el .IP "\f(CW=frames\fR" 4
+.IX Item "=frames"
+.PD
+Display the raw contents of a \fB.debug_frame\fR section.
+.PD 0
+.ie n .IP """=gdb_index""" 4
+.el .IP "\f(CW=gdb_index\fR" 4
+.IX Item "=gdb_index"
+.PD
+Displays the contents of the \fB.gdb_index\fR and/or
+\&\fB.debug_names\fR sections.
+.PD 0
+.ie n .IP """=info""" 4
+.el .IP "\f(CW=info\fR" 4
+.IX Item "=info"
+.PD
+Displays the contents of the \fB.debug_info\fR section.
+.PD 0
+.ie n .IP """=info+""" 4
+.el .IP "\f(CW=info+\fR" 4
+.IX Item "=info+"
+.PD
+Displays the contents of the \fB.debug_info\fR section, plus any skeleton
+unit will be immediately followed by the corresponding split compile unit
+(from the .dwo file). To show the difference between "regular" CUs and
+split CUs print offsets and references between { and } instead of [ and ].
+.PD 0
+.ie n .IP """=decodedline""" 4
+.el .IP "\f(CW=decodedline\fR" 4
+.IX Item "=decodedline"
+.PD
+Displays the interpreted contents of the \fB.debug_line\fR section.
+.PD 0
+.ie n .IP """=macro""" 4
+.el .IP "\f(CW=macro\fR" 4
+.IX Item "=macro"
+.PD
+Displays the contents of the \fB.debug_macro\fR and/or
+\&\fB.debug_macinfo\fR sections.
+.PD 0
+.ie n .IP """=loc""" 4
+.el .IP "\f(CW=loc\fR" 4
+.IX Item "=loc"
+.PD
+Displays the contents of the \fB.debug_loc\fR and/or
+\&\fB.debug_loclists\fR sections.
+.PD 0
+.ie n .IP """=pubnames""" 4
+.el .IP "\f(CW=pubnames\fR" 4
+.IX Item "=pubnames"
+.PD
+Displays the contents of the \fB.debug_pubnames\fR and/or
+\&\fB.debug_gnu_pubnames\fR sections.
+.PD 0
+.ie n .IP """=aranges""" 4
+.el .IP "\f(CW=aranges\fR" 4
+.IX Item "=aranges"
+.PD
+Displays the contents of the \fB.debug_aranges\fR section.
+.PD 0
+.ie n .IP """=ranges""" 4
+.el .IP "\f(CW=ranges\fR" 4
+.IX Item "=ranges"
+.PD
+Displays the contents of the \fB.debug_ranges\fR and/or
+\&\fB.debug_rnglists\fR sections.
+.PD 0
+.ie n .IP """=str""" 4
+.el .IP "\f(CW=str\fR" 4
+.IX Item "=str"
+.PD
+Displays the contents of the \fB.debug_str\fR, \fB.debug_line_str\fR
+and/or \fB.debug_str_offsets\fR sections.
+.PD 0
+.RS 4
+.Sp
+Note: displaying the contents of \fB.debug_static_funcs\fR,
+\&\fB.debug_static_vars\fR and \fBdebug_weaknames\fR sections is not
+currently supported.
+.RE
+.IP "\fB\-p <number or name>\fR" 4
+.IX Item "-p <number or name>"
+.PD 0
+.IP "\fB\-\-string\-dump=<number or name>\fR" 4
+.IX Item "--string-dump=<number or name>"
+.PD
+Displays the contents of the indicated section as printable strings.
+A number identifies a particular section by index in the section table;
+any other string identifies all sections with that name in the object file.
+.IP "\fB\-c\fR" 4
+.IX Item "-c"
+.PD 0
+.IP "\fB\-\-archive\-index\fR" 4
+.IX Item "--archive-index"
+.PD
+Displays the file symbol index information contained in the header part
+of binary archives. Performs the same function as the \fBt\fR
+command to \fBar\fR, but without using the \s-1BFD\s0 library.
+.SS "Output control"
+.IX Subsection "Output control"
+.IP "\fB\-z\fR" 4
+.IX Item "-z"
+.PD 0
+.IP "\fB\-\-decompress\fR" 4
+.IX Item "--decompress"
+.PD
+Requests that the section(s) being dumped by \fBx\fR, \fBR\fR or
+\&\fBp\fR options are decompressed before being displayed. If the
+section(s) are not compressed then they are displayed as is.
+.IP "\fB\-v\fR" 4
+.IX Item "-v"
+.PD 0
+.IP "\fB\-\-version\fR" 4
+.IX Item "--version"
+.PD
+Display the version number of eu-readelf.
+.IP "\fB\-W\fR" 4
+.IX Item "-W"
+.PD 0
+.IP "\fB\-\-wide\fR" 4
+.IX Item "--wide"
+.PD
+Ignored for compatibility (lines always wide).
+.IP "\fB\-H\fR" 4
+.IX Item "-H"
+.PD 0
+.IP "\fB\-\-help\fR" 4
+.IX Item "--help"
+.PD
+Display the command line options understood by \fBeu-readelf\fR.
+.IP "\fB@\fR\fIfile\fR" 4
+.IX Item "@file"
+Read command-line options from \fIfile\fR. The options read are
+inserted in place of the original @\fIfile\fR option. If \fIfile\fR
+does not exist, or cannot be read, then the option will be treated
+literally, and not removed.
+.Sp
+Options in \fIfile\fR are separated by whitespace. A whitespace
+character may be included in an option by surrounding the entire
+option in either single or double quotes. Any character (including a
+backslash) may be included by prefixing the character to be included
+with a backslash. The \fIfile\fR may itself contain additional
+@\fIfile\fR options; any such options will be processed recursively.
+.SH "SEE ALSO"
+.IX Header "SEE ALSO"
+\&\fIobjdump\fR\|(1), \fIreadelf\fR\|(1) and the Info entries for
+\fIbinutils\fR.
+.SH "COPYRIGHT"
+.IX Header "COPYRIGHT"
+Copyright (c) 1991\-2018 Free Software Foundation, Inc.
+
+Copyright (c) 2019 Red Hat Inc.
+.PP
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the \s-1GNU\s0 Free Documentation License, Version 1.3
+or any later version published by the Free Software Foundation;
+with no Invariant Sections, with no Front-Cover Texts, and with no
+Back-Cover Texts. A copy of the license is included in the
+section entitled \*(L"\s-1GNU\s0 Free Documentation License\*(R".
diff --git a/lib/ChangeLog b/lib/ChangeLog
index 7381860c..51c79841 100644
--- a/lib/ChangeLog
+++ b/lib/ChangeLog
@@ -1,3 +1,14 @@
+2019-08-25 Srđan Milaković <sm108@rice.edu>
+
+ * dynamicsizehash_concurrent.{c,h}: New files.
+ * Makefile.am (noinst_HEADERS): Added dynamicsizehash_concurrent.h.
+
+2019-08-25 Jonathon Anderson <jma14@rice.edu>
+
+ * stdatomic-fbsd.h: New file, taken from FreeBSD.
+ * atomics.h: New file.
+ * Makefile.am (noinst_HEADERS): Added *.h above.
+
2019-05-03 Rosen Penev <rosenp@gmail.com>
* color.c (parse_opt): Cast program_invocation_short_name to char *.
diff --git a/lib/Makefile.am b/lib/Makefile.am
index 36d21a07..97bf7329 100644
--- a/lib/Makefile.am
+++ b/lib/Makefile.am
@@ -38,8 +38,9 @@ libeu_a_SOURCES = xstrdup.c xstrndup.c xmalloc.c next_prime.c \
color.c printversion.c
noinst_HEADERS = fixedsizehash.h libeu.h system.h dynamicsizehash.h list.h \
- eu-config.h color.h printversion.h bpf.h
-EXTRA_DIST = dynamicsizehash.c
+ eu-config.h color.h printversion.h bpf.h \
+ atomics.h stdatomic-fbsd.h dynamicsizehash_concurrent.h
+EXTRA_DIST = dynamicsizehash.c dynamicsizehash_concurrent.c
if !GPROF
xmalloc_CFLAGS = -ffunction-sections
diff --git a/lib/atomics.h b/lib/atomics.h
new file mode 100644
index 00000000..ffd12f87
--- /dev/null
+++ b/lib/atomics.h
@@ -0,0 +1,37 @@
+/* Conditional wrapper header for C11-style atomics.
+ Copyright (C) 2019-2019 Red Hat, Inc.
+ This file is part of elfutils.
+
+ This file is free software; you can redistribute it and/or modify
+ it under the terms of either
+
+ * the GNU Lesser General Public License as published by the Free
+ Software Foundation; either version 3 of the License, or (at
+ your option) any later version
+
+ or
+
+ * the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at
+ your option) any later version
+
+ or both in parallel, as here.
+
+ elfutils is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received copies of the GNU General Public License and
+ the GNU Lesser General Public License along with this program. If
+ not, see <http://www.gnu.org/licenses/>. */
+
+#include "config.h"
+
+#if HAVE_STDATOMIC_H
+/* If possible, use the compiler's preferred atomics. */
+# include <stdatomic.h>
+#else
+/* Otherwise, try to use the builtins provided by this compiler. */
+# include "stdatomic-fbsd.h"
+#endif /* HAVE_STDATOMIC_H */
diff --git a/lib/color.c b/lib/color.c
index 20b9698a..2cb41eba 100644
--- a/lib/color.c
+++ b/lib/color.c
@@ -72,6 +72,8 @@ char *color_operand = NULL;
char *color_operand1 = "";
char *color_operand2 = "";
char *color_operand3 = "";
+char *color_operand4 = "";
+char *color_operand5 = "";
char *color_label = "";
char *color_undef = "";
char *color_undef_tls = "";
@@ -167,8 +169,10 @@ valid arguments are:\n\
E (m, mnemonic),
E (o, operand),
E (o1, operand1),
- E (o1, operand2),
- E (o1, operand3),
+ E (o2, operand2),
+ E (o3, operand3),
+ E (o4, operand4),
+ E (o5, operand5),
E (l, label),
E (u, undef),
E (ut, undef_tls),
@@ -205,6 +209,10 @@ valid arguments are:\n\
color_operand2 = color_operand;
if (color_operand3[0] == '\0')
color_operand3 = color_operand;
+ if (color_operand4[0] == '\0')
+ color_operand4 = color_operand;
+ if (color_operand5[0] == '\0')
+ color_operand5 = color_operand;
}
}
#if 0
@@ -216,7 +224,7 @@ valid arguments are:\n\
color_mnemonic = xstrdup ("\e[38;5;202;1m");
color_operand1 = xstrdup ("\e[38;5;220m");
color_operand2 = xstrdup ("\e[38;5;48m");
- color_operand3 = xstrdup ("\e[38;5;112m");
+ color_operand = xstrdup ("\e[38;5;112m");
color_label = xstrdup ("\e[38;5;21m");
}
#endif
diff --git a/lib/color.h b/lib/color.h
index 3872eb0a..cb241435 100644
--- a/lib/color.h
+++ b/lib/color.h
@@ -50,6 +50,8 @@ extern char *color_mnemonic;
extern char *color_operand1;
extern char *color_operand2;
extern char *color_operand3;
+extern char *color_operand4;
+extern char *color_operand5;
extern char *color_label;
extern char *color_undef;
extern char *color_undef_tls;
diff --git a/lib/dynamicsizehash_concurrent.c b/lib/dynamicsizehash_concurrent.c
new file mode 100644
index 00000000..2d53bec6
--- /dev/null
+++ b/lib/dynamicsizehash_concurrent.c
@@ -0,0 +1,482 @@
+/* Copyright (C) 2000-2019 Red Hat, Inc.
+ This file is part of elfutils.
+ Written by Srdan Milakovic <sm108@rice.edu>, 2019.
+ Derived from Ulrich Drepper <drepper@redhat.com>, 2000.
+
+ 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 <assert.h>
+#include <stdlib.h>
+#include <system.h>
+#include <pthread.h>
+
+/* Before including this file the following macros must be defined:
+
+ NAME name of the hash table structure.
+ TYPE data type of the hash table entries
+ */
+
+
+static size_t
+lookup (NAME *htab, HASHTYPE hval)
+{
+ /* First hash function: simply take the modul but prevent zero. Small values
+ can skip the division, which helps performance when this is common. */
+ size_t idx = 1 + (hval < htab->size ? hval : hval % htab->size);
+
+ HASHTYPE hash;
+
+ hash = atomic_load_explicit(&htab->table[idx].hashval,
+ memory_order_acquire);
+ if (hash == hval)
+ return idx;
+ else if (hash == 0)
+ return 0;
+
+ /* Second hash function as suggested in [Knuth]. */
+ HASHTYPE second_hash = 1 + hval % (htab->size - 2);
+
+ for(;;)
+ {
+ if (idx <= second_hash)
+ idx = htab->size + idx - second_hash;
+ else
+ idx -= second_hash;
+
+ hash = atomic_load_explicit(&htab->table[idx].hashval,
+ memory_order_acquire);
+ if (hash == hval)
+ return idx;
+ else if (hash == 0)
+ return 0;
+ }
+}
+
+static int
+insert_helper (NAME *htab, HASHTYPE hval, TYPE val)
+{
+ /* First hash function: simply take the modul but prevent zero. Small values
+ can skip the division, which helps performance when this is common. */
+ size_t idx = 1 + (hval < htab->size ? hval : hval % htab->size);
+
+ TYPE val_ptr;
+ HASHTYPE hash;
+
+ hash = atomic_load_explicit(&htab->table[idx].hashval,
+ memory_order_acquire);
+ if (hash == hval)
+ return -1;
+ else if (hash == 0)
+ {
+ val_ptr = NULL;
+ atomic_compare_exchange_strong_explicit(&htab->table[idx].val_ptr,
+ (uintptr_t *) &val_ptr,
+ (uintptr_t) val,
+ memory_order_acquire,
+ memory_order_acquire);
+
+ if (val_ptr == NULL)
+ {
+ atomic_store_explicit(&htab->table[idx].hashval, hval,
+ memory_order_release);
+ return 0;
+ }
+ else
+ {
+ do
+ {
+ hash = atomic_load_explicit(&htab->table[idx].hashval,
+ memory_order_acquire);
+ }
+ while (hash == 0);
+ if (hash == hval)
+ return -1;
+ }
+ }
+
+ /* Second hash function as suggested in [Knuth]. */
+ HASHTYPE second_hash = 1 + hval % (htab->size - 2);
+
+ for(;;)
+ {
+ if (idx <= second_hash)
+ idx = htab->size + idx - second_hash;
+ else
+ idx -= second_hash;
+
+ hash = atomic_load_explicit(&htab->table[idx].hashval,
+ memory_order_acquire);
+ if (hash == hval)
+ return -1;
+ else if (hash == 0)
+ {
+ val_ptr = NULL;
+ atomic_compare_exchange_strong_explicit(&htab->table[idx].val_ptr,
+ (uintptr_t *) &val_ptr,
+ (uintptr_t) val,
+ memory_order_acquire,
+ memory_order_acquire);
+
+ if (val_ptr == NULL)
+ {
+ atomic_store_explicit(&htab->table[idx].hashval, hval,
+ memory_order_release);
+ return 0;
+ }
+ else
+ {
+ do
+ {
+ hash = atomic_load_explicit(&htab->table[idx].hashval,
+ memory_order_acquire);
+ }
+ while (hash == 0);
+ if (hash == hval)
+ return -1;
+ }
+ }
+ }
+}
+
+#define NO_RESIZING 0u
+#define ALLOCATING_MEMORY 1u
+#define MOVING_DATA 3u
+#define CLEANING 2u
+
+#define STATE_BITS 2u
+#define STATE_INCREMENT (1u << STATE_BITS)
+#define STATE_MASK (STATE_INCREMENT - 1)
+#define GET_STATE(A) ((A) & STATE_MASK)
+
+#define IS_NO_RESIZE_OR_CLEANING(A) (((A) & 0x1u) == 0)
+
+#define GET_ACTIVE_WORKERS(A) ((A) >> STATE_BITS)
+
+#define INITIALIZATION_BLOCK_SIZE 256
+#define MOVE_BLOCK_SIZE 256
+#define CEIL(A, B) (((A) + (B) - 1) / (B))
+
+/* Initializes records and copies the data from the old table.
+ It can share work with other threads */
+static void resize_helper(NAME *htab, int blocking)
+{
+ size_t num_old_blocks = CEIL(htab->old_size, MOVE_BLOCK_SIZE);
+ size_t num_new_blocks = CEIL(htab->size, INITIALIZATION_BLOCK_SIZE);
+
+ size_t my_block;
+ size_t num_finished_blocks = 0;
+
+ while ((my_block = atomic_fetch_add_explicit(&htab->next_init_block, 1,
+ memory_order_acquire))
+ < num_new_blocks)
+ {
+ size_t record_it = my_block * INITIALIZATION_BLOCK_SIZE;
+ size_t record_end = (my_block + 1) * INITIALIZATION_BLOCK_SIZE;
+ if (record_end > htab->size)
+ record_end = htab->size;
+
+ while (record_it++ != record_end)
+ {
+ atomic_init(&htab->table[record_it].hashval, (uintptr_t) NULL);
+ atomic_init(&htab->table[record_it].val_ptr, (uintptr_t) NULL);
+ }
+
+ num_finished_blocks++;
+ }
+
+ atomic_fetch_add_explicit(&htab->num_initialized_blocks,
+ num_finished_blocks, memory_order_release);
+ while (atomic_load_explicit(&htab->num_initialized_blocks,
+ memory_order_acquire) != num_new_blocks);
+
+ /* All block are initialized, start moving */
+ num_finished_blocks = 0;
+ while ((my_block = atomic_fetch_add_explicit(&htab->next_move_block, 1,
+ memory_order_acquire))
+ < num_old_blocks)
+ {
+ size_t record_it = my_block * MOVE_BLOCK_SIZE;
+ size_t record_end = (my_block + 1) * MOVE_BLOCK_SIZE;
+ if (record_end > htab->old_size)
+ record_end = htab->old_size;
+
+ while (record_it++ != record_end)
+ {
+ TYPE val_ptr = (TYPE) atomic_load_explicit(
+ &htab->old_table[record_it].val_ptr,
+ memory_order_acquire);
+ if (val_ptr == NULL)
+ continue;
+
+ HASHTYPE hashval = atomic_load_explicit(
+ &htab->old_table[record_it].hashval,
+ memory_order_acquire);
+ assert(hashval);
+
+ insert_helper(htab, hashval, val_ptr);
+ }
+
+ num_finished_blocks++;
+ }
+
+ atomic_fetch_add_explicit(&htab->num_moved_blocks, num_finished_blocks,
+ memory_order_release);
+
+ if (blocking)
+ while (atomic_load_explicit(&htab->num_moved_blocks,
+ memory_order_acquire) != num_old_blocks);
+}
+
+static void
+resize_master(NAME *htab)
+{
+ htab->old_size = htab->size;
+ htab->old_table = htab->table;
+
+ htab->size = next_prime(htab->size * 2);
+ htab->table = malloc((1 + htab->size) * sizeof(htab->table[0]));
+ assert(htab->table);
+
+ /* Change state from ALLOCATING_MEMORY to MOVING_DATA */
+ atomic_fetch_xor_explicit(&htab->resizing_state,
+ ALLOCATING_MEMORY ^ MOVING_DATA,
+ memory_order_release);
+
+ resize_helper(htab, 1);
+
+ /* Change state from MOVING_DATA to CLEANING */
+ size_t resize_state = atomic_fetch_xor_explicit(&htab->resizing_state,
+ MOVING_DATA ^ CLEANING,
+ memory_order_acq_rel);
+ while (GET_ACTIVE_WORKERS(resize_state) != 0)
+ resize_state = atomic_load_explicit(&htab->resizing_state,
+ memory_order_acquire);
+
+ /* There are no more active workers */
+ atomic_store_explicit(&htab->next_init_block, 0, memory_order_relaxed);
+ atomic_store_explicit(&htab->num_initialized_blocks, 0,
+ memory_order_relaxed);
+
+ atomic_store_explicit(&htab->next_move_block, 0, memory_order_relaxed);
+ atomic_store_explicit(&htab->num_moved_blocks, 0, memory_order_relaxed);
+
+ free(htab->old_table);
+
+ /* Change state to NO_RESIZING */
+ atomic_fetch_xor_explicit(&htab->resizing_state, CLEANING ^ NO_RESIZING,
+ memory_order_relaxed);
+
+}
+
+static void
+resize_worker(NAME *htab)
+{
+ size_t resize_state = atomic_load_explicit(&htab->resizing_state,
+ memory_order_acquire);
+
+ /* If the resize has finished */
+ if (IS_NO_RESIZE_OR_CLEANING(resize_state))
+ return;
+
+ /* Register as worker and check if the resize has finished in the meantime*/
+ resize_state = atomic_fetch_add_explicit(&htab->resizing_state,
+ STATE_INCREMENT,
+ memory_order_acquire);
+ if (IS_NO_RESIZE_OR_CLEANING(resize_state))
+ {
+ atomic_fetch_sub_explicit(&htab->resizing_state, STATE_INCREMENT,
+ memory_order_relaxed);
+ return;
+ }
+
+ /* Wait while the new table is being allocated. */
+ while (GET_STATE(resize_state) == ALLOCATING_MEMORY)
+ resize_state = atomic_load_explicit(&htab->resizing_state,
+ memory_order_acquire);
+
+ /* Check if the resize is done */
+ assert(GET_STATE(resize_state) != NO_RESIZING);
+ if (GET_STATE(resize_state) == CLEANING)
+ {
+ atomic_fetch_sub_explicit(&htab->resizing_state, STATE_INCREMENT,
+ memory_order_relaxed);
+ return;
+ }
+
+ resize_helper(htab, 0);
+
+ /* Deregister worker */
+ atomic_fetch_sub_explicit(&htab->resizing_state, STATE_INCREMENT,
+ memory_order_release);
+}
+
+
+int
+#define INIT(name) _INIT (name)
+#define _INIT(name) \
+ name##_init
+INIT(NAME) (NAME *htab, size_t init_size)
+{
+ /* We need the size to be a prime. */
+ init_size = next_prime (init_size);
+
+ /* Initialize the data structure. */
+ htab->size = init_size;
+ atomic_init(&htab->filled, 0);
+ atomic_init(&htab->resizing_state, 0);
+
+ atomic_init(&htab->next_init_block, 0);
+ atomic_init(&htab->num_initialized_blocks, 0);
+
+ atomic_init(&htab->next_move_block, 0);
+ atomic_init(&htab->num_moved_blocks, 0);
+
+ pthread_rwlock_init(&htab->resize_rwl, NULL);
+
+ htab->table = (void *) malloc ((init_size + 1) * sizeof (htab->table[0]));
+ if (htab->table == NULL)
+ return -1;
+
+ for (size_t i = 0; i <= init_size; i++)
+ {
+ atomic_init(&htab->table[i].hashval, (uintptr_t) NULL);
+ atomic_init(&htab->table[i].val_ptr, (uintptr_t) NULL);
+ }
+
+ return 0;
+}
+
+
+int
+#define FREE(name) _FREE (name)
+#define _FREE(name) \
+name##_free
+FREE(NAME) (NAME *htab)
+{
+ pthread_rwlock_destroy(&htab->resize_rwl);
+ free (htab->table);
+ return 0;
+}
+
+
+int
+#define INSERT(name) _INSERT (name)
+#define _INSERT(name) \
+name##_insert
+INSERT(NAME) (NAME *htab, HASHTYPE hval, TYPE data)
+{
+ int incremented = 0;
+
+ for(;;)
+ {
+ while (pthread_rwlock_tryrdlock(&htab->resize_rwl) != 0)
+ resize_worker(htab);
+
+ size_t filled;
+ if (!incremented)
+ {
+ filled = atomic_fetch_add_explicit(&htab->filled, 1,
+ memory_order_acquire);
+ incremented = 1;
+ }
+ else
+ {
+ filled = atomic_load_explicit(&htab->filled,
+ memory_order_acquire);
+ }
+
+
+ if (100 * filled > 90 * htab->size)
+ {
+ /* Table is filled more than 90%. Resize the table. */
+
+ size_t resizing_state = atomic_load_explicit(&htab->resizing_state,
+ memory_order_acquire);
+ if (resizing_state == 0 &&
+ atomic_compare_exchange_strong_explicit(&htab->resizing_state,
+ &resizing_state,
+ ALLOCATING_MEMORY,
+ memory_order_acquire,
+ memory_order_acquire))
+ {
+ /* Master thread */
+ pthread_rwlock_unlock(&htab->resize_rwl);
+
+ pthread_rwlock_wrlock(&htab->resize_rwl);
+ resize_master(htab);
+ pthread_rwlock_unlock(&htab->resize_rwl);
+
+ }
+ else
+ {
+ /* Worker thread */
+ pthread_rwlock_unlock(&htab->resize_rwl);
+ resize_worker(htab);
+ }
+ }
+ else
+ {
+ /* Lock acquired, no need for resize*/
+ break;
+ }
+ }
+
+ int ret_val = insert_helper(htab, hval, data);
+ if (ret_val == -1)
+ atomic_fetch_sub_explicit(&htab->filled, 1, memory_order_relaxed);
+ pthread_rwlock_unlock(&htab->resize_rwl);
+ return ret_val;
+}
+
+
+
+TYPE
+#define FIND(name) _FIND (name)
+#define _FIND(name) \
+ name##_find
+FIND(NAME) (NAME *htab, HASHTYPE hval)
+{
+ while (pthread_rwlock_tryrdlock(&htab->resize_rwl) != 0)
+ resize_worker(htab);
+
+ size_t idx;
+
+ /* Make the hash data nonzero. */
+ hval = hval ?: 1;
+ idx = lookup(htab, hval);
+
+ if (idx == 0)
+ {
+ pthread_rwlock_unlock(&htab->resize_rwl);
+ return NULL;
+ }
+
+ /* get a copy before unlocking the lock */
+ TYPE ret_val = (TYPE) atomic_load_explicit(&htab->table[idx].val_ptr,
+ memory_order_relaxed);
+
+ pthread_rwlock_unlock(&htab->resize_rwl);
+ return ret_val;
+}
diff --git a/lib/dynamicsizehash_concurrent.h b/lib/dynamicsizehash_concurrent.h
new file mode 100644
index 00000000..73e66e91
--- /dev/null
+++ b/lib/dynamicsizehash_concurrent.h
@@ -0,0 +1,118 @@
+/* Copyright (C) 2000-2019 Red Hat, Inc.
+ This file is part of elfutils.
+ Written by Srdan Milakovic <sm108@rice.edu>, 2019.
+ Derived from Ulrich Drepper <drepper@redhat.com>, 2000.
+
+ 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 <stddef.h>
+#include <pthread.h>
+#include "atomics.h"
+/* Before including this file the following macros must be defined:
+
+ NAME name of the hash table structure.
+ TYPE data type of the hash table entries
+
+ The following macros if present select features:
+
+ ITERATE iterating over the table entries is possible
+ HASHTYPE integer type for hash values, default unsigned long int
+ */
+
+
+
+#ifndef HASHTYPE
+# define HASHTYPE unsigned long int
+#endif
+
+#ifndef RESIZE_BLOCK_SIZE
+# define RESIZE_BLOCK_SIZE 256
+#endif
+
+/* Defined separately. */
+extern size_t next_prime (size_t seed);
+
+
+/* Table entry type. */
+#define _DYNHASHCONENTTYPE(name) \
+ typedef struct name##_ent \
+ { \
+ _Atomic(HASHTYPE) hashval; \
+ atomic_uintptr_t val_ptr; \
+ } name##_ent
+#define DYNHASHENTTYPE(name) _DYNHASHCONENTTYPE (name)
+DYNHASHENTTYPE (NAME);
+
+/* Type of the dynamic hash table data structure. */
+#define _DYNHASHCONTYPE(name) \
+typedef struct \
+{ \
+ size_t size; \
+ size_t old_size; \
+ atomic_size_t filled; \
+ name##_ent *table; \
+ name##_ent *old_table; \
+ atomic_size_t resizing_state; \
+ atomic_size_t next_init_block; \
+ atomic_size_t num_initialized_blocks; \
+ atomic_size_t next_move_block; \
+ atomic_size_t num_moved_blocks; \
+ pthread_rwlock_t resize_rwl; \
+} name
+#define DYNHASHTYPE(name) _DYNHASHCONTYPE (name)
+DYNHASHTYPE (NAME);
+
+
+
+#define _FUNCTIONS(name) \
+/* Initialize the hash table. */ \
+extern int name##_init (name *htab, size_t init_size); \
+ \
+/* Free resources allocated for hash table. */ \
+extern int name##_free (name *htab); \
+ \
+/* Insert new entry. */ \
+extern int name##_insert (name *htab, HASHTYPE hval, TYPE data); \
+ \
+/* Find entry in hash table. */ \
+extern TYPE name##_find (name *htab, HASHTYPE hval);
+#define FUNCTIONS(name) _FUNCTIONS (name)
+FUNCTIONS (NAME)
+
+
+#ifndef NO_UNDEF
+# undef DYNHASHENTTYPE
+# undef DYNHASHTYPE
+# undef FUNCTIONS
+# undef _FUNCTIONS
+# undef XFUNCTIONS
+# undef _XFUNCTIONS
+# undef NAME
+# undef TYPE
+# undef ITERATE
+# undef COMPARE
+# undef FIRST
+# undef NEXT
+#endif
diff --git a/lib/stdatomic-fbsd.h b/lib/stdatomic-fbsd.h
new file mode 100644
index 00000000..49626662
--- /dev/null
+++ b/lib/stdatomic-fbsd.h
@@ -0,0 +1,442 @@
+/*-
+ * Copyright (c) 2011 Ed Schouten <ed@FreeBSD.org>
+ * David Chisnall <theraven@FreeBSD.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _STDATOMIC_H_
+#define _STDATOMIC_H_
+
+#include <stddef.h>
+#include <stdint.h>
+
+#if !defined(__has_feature)
+#define __has_feature(x) 0
+#endif
+#if !defined(__has_builtin)
+#define __has_builtin(x) 0
+#endif
+#if !defined(__GNUC_PREREQ__)
+#if defined(__GNUC__) && defined(__GNUC_MINOR__)
+#define __GNUC_PREREQ__(maj, min) \
+ ((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min))
+#else
+#define __GNUC_PREREQ__(maj, min) 0
+#endif
+#endif
+
+#if !defined(__CLANG_ATOMICS) && !defined(__GNUC_ATOMICS)
+#if __has_feature(c_atomic)
+#define __CLANG_ATOMICS
+#elif __GNUC_PREREQ__(4, 7)
+#define __GNUC_ATOMICS
+#elif !defined(__GNUC__)
+#error "stdatomic.h does not support your compiler"
+#endif
+#endif
+
+/*
+ * language independent type to represent a Boolean value
+ */
+
+typedef int __Bool;
+
+/*
+ * 7.17.1 Atomic lock-free macros.
+ */
+
+#ifdef __GCC_ATOMIC_BOOL_LOCK_FREE
+#define ATOMIC_BOOL_LOCK_FREE __GCC_ATOMIC_BOOL_LOCK_FREE
+#endif
+#ifdef __GCC_ATOMIC_CHAR_LOCK_FREE
+#define ATOMIC_CHAR_LOCK_FREE __GCC_ATOMIC_CHAR_LOCK_FREE
+#endif
+#ifdef __GCC_ATOMIC_CHAR16_T_LOCK_FREE
+#define ATOMIC_CHAR16_T_LOCK_FREE __GCC_ATOMIC_CHAR16_T_LOCK_FREE
+#endif
+#ifdef __GCC_ATOMIC_CHAR32_T_LOCK_FREE
+#define ATOMIC_CHAR32_T_LOCK_FREE __GCC_ATOMIC_CHAR32_T_LOCK_FREE
+#endif
+#ifdef __GCC_ATOMIC_WCHAR_T_LOCK_FREE
+#define ATOMIC_WCHAR_T_LOCK_FREE __GCC_ATOMIC_WCHAR_T_LOCK_FREE
+#endif
+#ifdef __GCC_ATOMIC_SHORT_LOCK_FREE
+#define ATOMIC_SHORT_LOCK_FREE __GCC_ATOMIC_SHORT_LOCK_FREE
+#endif
+#ifdef __GCC_ATOMIC_INT_LOCK_FREE
+#define ATOMIC_INT_LOCK_FREE __GCC_ATOMIC_INT_LOCK_FREE
+#endif
+#ifdef __GCC_ATOMIC_LONG_LOCK_FREE
+#define ATOMIC_LONG_LOCK_FREE __GCC_ATOMIC_LONG_LOCK_FREE
+#endif
+#ifdef __GCC_ATOMIC_LLONG_LOCK_FREE
+#define ATOMIC_LLONG_LOCK_FREE __GCC_ATOMIC_LLONG_LOCK_FREE
+#endif
+#ifdef __GCC_ATOMIC_POINTER_LOCK_FREE
+#define ATOMIC_POINTER_LOCK_FREE __GCC_ATOMIC_POINTER_LOCK_FREE
+#endif
+
+#if !defined(__CLANG_ATOMICS)
+#define _Atomic(T) struct { volatile __typeof__(T) __val; }
+#endif
+
+/*
+ * 7.17.2 Initialization.
+ */
+
+#if defined(__CLANG_ATOMICS)
+#define ATOMIC_VAR_INIT(value) (value)
+#define atomic_init(obj, value) __c11_atomic_init(obj, value)
+#else
+#define ATOMIC_VAR_INIT(value) { .__val = (value) }
+#define atomic_init(obj, value) ((void)((obj)->__val = (value)))
+#endif
+
+/*
+ * Clang and recent GCC both provide predefined macros for the memory
+ * orderings. If we are using a compiler that doesn't define them, use the
+ * clang values - these will be ignored in the fallback path.
+ */
+
+#ifndef __ATOMIC_RELAXED
+#define __ATOMIC_RELAXED 0
+#endif
+#ifndef __ATOMIC_CONSUME
+#define __ATOMIC_CONSUME 1
+#endif
+#ifndef __ATOMIC_ACQUIRE
+#define __ATOMIC_ACQUIRE 2
+#endif
+#ifndef __ATOMIC_RELEASE
+#define __ATOMIC_RELEASE 3
+#endif
+#ifndef __ATOMIC_ACQ_REL
+#define __ATOMIC_ACQ_REL 4
+#endif
+#ifndef __ATOMIC_SEQ_CST
+#define __ATOMIC_SEQ_CST 5
+#endif
+
+/*
+ * 7.17.3 Order and consistency.
+ *
+ * The memory_order_* constants that denote the barrier behaviour of the
+ * atomic operations.
+ */
+
+typedef enum {
+ memory_order_relaxed = __ATOMIC_RELAXED,
+ memory_order_consume = __ATOMIC_CONSUME,
+ memory_order_acquire = __ATOMIC_ACQUIRE,
+ memory_order_release = __ATOMIC_RELEASE,
+ memory_order_acq_rel = __ATOMIC_ACQ_REL,
+ memory_order_seq_cst = __ATOMIC_SEQ_CST
+} memory_order;
+
+/*
+ * 7.17.4 Fences.
+ */
+
+//#define __unused
+
+//static __inline void
+//atomic_thread_fence(memory_order __order __unused)
+//{
+//
+//#ifdef __CLANG_ATOMICS
+// __c11_atomic_thread_fence(__order);
+//#elif defined(__GNUC_ATOMICS)
+// __atomic_thread_fence(__order);
+//#else
+// __sync_synchronize();
+//#endif
+//}
+//
+//static __inline void
+//atomic_signal_fence(memory_order __order __unused)
+//{
+//
+//#ifdef __CLANG_ATOMICS
+// __c11_atomic_signal_fence(__order);
+//#elif defined(__GNUC_ATOMICS)
+// __atomic_signal_fence(__order);
+//#else
+// __asm volatile ("" ::: "memory");
+//#endif
+//}
+
+//#undef __unused
+
+/*
+ * 7.17.5 Lock-free property.
+ */
+
+#if defined(_KERNEL)
+/* Atomics in kernelspace are always lock-free. */
+#define atomic_is_lock_free(obj) \
+ ((void)(obj), (__Bool)1)
+#elif defined(__CLANG_ATOMICS)
+#define atomic_is_lock_free(obj) \
+ __atomic_is_lock_free(sizeof(*(obj)), obj)
+#elif defined(__GNUC_ATOMICS)
+#define atomic_is_lock_free(obj) \
+ __atomic_is_lock_free(sizeof((obj)->__val), &(obj)->__val)
+#else
+#define atomic_is_lock_free(obj) \
+ ((void)(obj), sizeof((obj)->__val) <= sizeof(void *))
+#endif
+
+/*
+ * 7.17.6 Atomic integer types.
+ */
+
+typedef _Atomic(__Bool) atomic_bool;
+typedef _Atomic(char) atomic_char;
+typedef _Atomic(signed char) atomic_schar;
+typedef _Atomic(unsigned char) atomic_uchar;
+typedef _Atomic(short) atomic_short;
+typedef _Atomic(unsigned short) atomic_ushort;
+typedef _Atomic(int) atomic_int;
+typedef _Atomic(unsigned int) atomic_uint;
+typedef _Atomic(long) atomic_long;
+typedef _Atomic(unsigned long) atomic_ulong;
+typedef _Atomic(long long) atomic_llong;
+typedef _Atomic(unsigned long long) atomic_ullong;
+#if 0
+typedef _Atomic(char16_t) atomic_char16_t;
+typedef _Atomic(char32_t) atomic_char32_t;
+#endif
+typedef _Atomic(wchar_t) atomic_wchar_t;
+typedef _Atomic(int_least8_t) atomic_int_least8_t;
+typedef _Atomic(uint_least8_t) atomic_uint_least8_t;
+typedef _Atomic(int_least16_t) atomic_int_least16_t;
+typedef _Atomic(uint_least16_t) atomic_uint_least16_t;
+typedef _Atomic(int_least32_t) atomic_int_least32_t;
+typedef _Atomic(uint_least32_t) atomic_uint_least32_t;
+typedef _Atomic(int_least64_t) atomic_int_least64_t;
+typedef _Atomic(uint_least64_t) atomic_uint_least64_t;
+typedef _Atomic(int_fast8_t) atomic_int_fast8_t;
+typedef _Atomic(uint_fast8_t) atomic_uint_fast8_t;
+typedef _Atomic(int_fast16_t) atomic_int_fast16_t;
+typedef _Atomic(uint_fast16_t) atomic_uint_fast16_t;
+typedef _Atomic(int_fast32_t) atomic_int_fast32_t;
+typedef _Atomic(uint_fast32_t) atomic_uint_fast32_t;
+typedef _Atomic(int_fast64_t) atomic_int_fast64_t;
+typedef _Atomic(uint_fast64_t) atomic_uint_fast64_t;
+typedef _Atomic(intptr_t) atomic_intptr_t;
+typedef _Atomic(uintptr_t) atomic_uintptr_t;
+typedef _Atomic(size_t) atomic_size_t;
+typedef _Atomic(ptrdiff_t) atomic_ptrdiff_t;
+typedef _Atomic(intmax_t) atomic_intmax_t;
+typedef _Atomic(uintmax_t) atomic_uintmax_t;
+
+/*
+ * 7.17.7 Operations on atomic types.
+ */
+
+/*
+ * Compiler-specific operations.
+ */
+
+#if defined(__CLANG_ATOMICS)
+#define atomic_compare_exchange_strong_explicit(object, expected, \
+ desired, success, failure) \
+ __c11_atomic_compare_exchange_strong(object, expected, desired, \
+ success, failure)
+#define atomic_compare_exchange_weak_explicit(object, expected, \
+ desired, success, failure) \
+ __c11_atomic_compare_exchange_weak(object, expected, desired, \
+ success, failure)
+#define atomic_exchange_explicit(object, desired, order) \
+ __c11_atomic_exchange(object, desired, order)
+#define atomic_fetch_add_explicit(object, operand, order) \
+ __c11_atomic_fetch_add(object, operand, order)
+#define atomic_fetch_and_explicit(object, operand, order) \
+ __c11_atomic_fetch_and(object, operand, order)
+#define atomic_fetch_or_explicit(object, operand, order) \
+ __c11_atomic_fetch_or(object, operand, order)
+#define atomic_fetch_sub_explicit(object, operand, order) \
+ __c11_atomic_fetch_sub(object, operand, order)
+#define atomic_fetch_xor_explicit(object, operand, order) \
+ __c11_atomic_fetch_xor(object, operand, order)
+#define atomic_load_explicit(object, order) \
+ __c11_atomic_load(object, order)
+#define atomic_store_explicit(object, desired, order) \
+ __c11_atomic_store(object, desired, order)
+#elif defined(__GNUC_ATOMICS)
+#define atomic_compare_exchange_strong_explicit(object, expected, \
+ desired, success, failure) \
+ __atomic_compare_exchange_n(&(object)->__val, expected, \
+ desired, 0, success, failure)
+#define atomic_compare_exchange_weak_explicit(object, expected, \
+ desired, success, failure) \
+ __atomic_compare_exchange_n(&(object)->__val, expected, \
+ desired, 1, success, failure)
+#define atomic_exchange_explicit(object, desired, order) \
+ __atomic_exchange_n(&(object)->__val, desired, order)
+#define atomic_fetch_add_explicit(object, operand, order) \
+ __atomic_fetch_add(&(object)->__val, operand, order)
+#define atomic_fetch_and_explicit(object, operand, order) \
+ __atomic_fetch_and(&(object)->__val, operand, order)
+#define atomic_fetch_or_explicit(object, operand, order) \
+ __atomic_fetch_or(&(object)->__val, operand, order)
+#define atomic_fetch_sub_explicit(object, operand, order) \
+ __atomic_fetch_sub(&(object)->__val, operand, order)
+#define atomic_fetch_xor_explicit(object, operand, order) \
+ __atomic_fetch_xor(&(object)->__val, operand, order)
+#define atomic_load_explicit(object, order) \
+ __atomic_load_n(&(object)->__val, order)
+#define atomic_store_explicit(object, desired, order) \
+ __atomic_store_n(&(object)->__val, desired, order)
+#else
+#define __atomic_apply_stride(object, operand) \
+ (((__typeof__((object)->__val))0) + (operand))
+#define atomic_compare_exchange_strong_explicit(object, expected, \
+ desired, success, failure) __extension__ ({ \
+ __typeof__(expected) __ep = (expected); \
+ __typeof__(*__ep) __e = *__ep; \
+ (void)(success); (void)(failure); \
+ (__Bool)((*__ep = __sync_val_compare_and_swap(&(object)->__val, \
+ __e, desired)) == __e); \
+})
+#define atomic_compare_exchange_weak_explicit(object, expected, \
+ desired, success, failure) \
+ atomic_compare_exchange_strong_explicit(object, expected, \
+ desired, success, failure)
+#if __has_builtin(__sync_swap)
+/* Clang provides a full-barrier atomic exchange - use it if available. */
+#define atomic_exchange_explicit(object, desired, order) \
+ ((void)(order), __sync_swap(&(object)->__val, desired))
+#else
+/*
+ * __sync_lock_test_and_set() is only an acquire barrier in theory (although in
+ * practice it is usually a full barrier) so we need an explicit barrier before
+ * it.
+ */
+#define atomic_exchange_explicit(object, desired, order) \
+__extension__ ({ \
+ __typeof__(object) __o = (object); \
+ __typeof__(desired) __d = (desired); \
+ (void)(order); \
+ __sync_synchronize(); \
+ __sync_lock_test_and_set(&(__o)->__val, __d); \
+})
+#endif
+#define atomic_fetch_add_explicit(object, operand, order) \
+ ((void)(order), __sync_fetch_and_add(&(object)->__val, \
+ __atomic_apply_stride(object, operand)))
+#define atomic_fetch_and_explicit(object, operand, order) \
+ ((void)(order), __sync_fetch_and_and(&(object)->__val, operand))
+#define atomic_fetch_or_explicit(object, operand, order) \
+ ((void)(order), __sync_fetch_and_or(&(object)->__val, operand))
+#define atomic_fetch_sub_explicit(object, operand, order) \
+ ((void)(order), __sync_fetch_and_sub(&(object)->__val, \
+ __atomic_apply_stride(object, operand)))
+#define atomic_fetch_xor_explicit(object, operand, order) \
+ ((void)(order), __sync_fetch_and_xor(&(object)->__val, operand))
+#define atomic_load_explicit(object, order) \
+ ((void)(order), __sync_fetch_and_add(&(object)->__val, 0))
+#define atomic_store_explicit(object, desired, order) \
+ ((void)atomic_exchange_explicit(object, desired, order))
+#endif
+
+/*
+ * Convenience functions.
+ *
+ * Don't provide these in kernel space. In kernel space, we should be
+ * disciplined enough to always provide explicit barriers.
+ */
+
+#ifndef _KERNEL
+#define atomic_compare_exchange_strong(object, expected, desired) \
+ atomic_compare_exchange_strong_explicit(object, expected, \
+ desired, memory_order_seq_cst, memory_order_seq_cst)
+#define atomic_compare_exchange_weak(object, expected, desired) \
+ atomic_compare_exchange_weak_explicit(object, expected, \
+ desired, memory_order_seq_cst, memory_order_seq_cst)
+#define atomic_exchange(object, desired) \
+ atomic_exchange_explicit(object, desired, memory_order_seq_cst)
+#define atomic_fetch_add(object, operand) \
+ atomic_fetch_add_explicit(object, operand, memory_order_seq_cst)
+#define atomic_fetch_and(object, operand) \
+ atomic_fetch_and_explicit(object, operand, memory_order_seq_cst)
+#define atomic_fetch_or(object, operand) \
+ atomic_fetch_or_explicit(object, operand, memory_order_seq_cst)
+#define atomic_fetch_sub(object, operand) \
+ atomic_fetch_sub_explicit(object, operand, memory_order_seq_cst)
+#define atomic_fetch_xor(object, operand) \
+ atomic_fetch_xor_explicit(object, operand, memory_order_seq_cst)
+#define atomic_load(object) \
+ atomic_load_explicit(object, memory_order_seq_cst)
+#define atomic_store(object, desired) \
+ atomic_store_explicit(object, desired, memory_order_seq_cst)
+#endif /* !_KERNEL */
+
+/*
+ * 7.17.8 Atomic flag type and operations.
+ *
+ * XXX: Assume atomic_bool can be used as an atomic_flag. Is there some
+ * kind of compiler built-in type we could use?
+ */
+
+typedef struct {
+ atomic_bool __flag;
+} atomic_flag;
+
+#define ATOMIC_FLAG_INIT { ATOMIC_VAR_INIT(0) }
+
+static __inline __Bool
+atomic_flag_test_and_set_explicit(volatile atomic_flag *__object,
+ memory_order __order)
+{
+ return (atomic_exchange_explicit(&__object->__flag, 1, __order));
+}
+
+static __inline void
+atomic_flag_clear_explicit(volatile atomic_flag *__object, memory_order __order)
+{
+
+ atomic_store_explicit(&__object->__flag, 0, __order);
+}
+
+#ifndef _KERNEL
+static __inline __Bool
+atomic_flag_test_and_set(volatile atomic_flag *__object)
+{
+
+ return (atomic_flag_test_and_set_explicit(__object,
+ memory_order_seq_cst));
+}
+
+static __inline void
+atomic_flag_clear(volatile atomic_flag *__object)
+{
+
+ atomic_flag_clear_explicit(__object, memory_order_seq_cst);
+}
+#endif /* !_KERNEL */
+
+#endif /* !_STDATOMIC_H_ */ \ No newline at end of file
diff --git a/libasm/ChangeLog b/libasm/ChangeLog
index 05b830c8..a1abac88 100644
--- a/libasm/ChangeLog
+++ b/libasm/ChangeLog
@@ -1,3 +1,7 @@
+2019-08-28 Mark Wielaard <mark@klomp.org>
+
+ * Makefile.am (libasm_so_DEPS): Replace libebl.a with libebl_pic.a.
+
2019-03-06 Mark Wielaard <mark@klomp.org>
* asm_end.c (binary_end): Check return value of gelf_update_ehdr.
diff --git a/libasm/Makefile.am b/libasm/Makefile.am
index fcc7ffc9..a92b63ad 100644
--- a/libasm/Makefile.am
+++ b/libasm/Makefile.am
@@ -38,7 +38,7 @@ noinst_LIBRARIES = libasm_pic.a
noinst_PROGRAMS = $(noinst_LIBRARIES:_pic.a=.so)
pkginclude_HEADERS = libasm.h
-libasm_a_CFLAGS = -fPIC -fvisibility=hidden $(AM_CFLAGS)
+libasm_a_CFLAGS = -fPIC $(AM_CFLAGS)
libasm_a_SOURCES = asm_begin.c asm_abort.c asm_end.c asm_error.c \
asm_getelf.c asm_newscn.c asm_newscn_ingrp.c \
asm_newsubscn.c asm_newsym.c asm_newcomsym.c \
@@ -56,7 +56,7 @@ libasm_a_SOURCES = asm_begin.c asm_abort.c asm_end.c asm_error.c \
libasm_pic_a_SOURCES =
am_libasm_pic_a_OBJECTS = $(libasm_a_SOURCES:.c=.os)
-libasm_so_DEPS = ../lib/libeu.a ../libebl/libebl.a ../libelf/libelf.so ../libdw/libdw.so
+libasm_so_DEPS = ../lib/libeu.a ../libebl/libebl_pic.a ../libelf/libelf.so ../libdw/libdw.so
libasm_so_LDLIBS = $(libasm_so_DEPS)
if USE_LOCKS
libasm_so_LDLIBS += -lpthread
diff --git a/libcpu/ChangeLog b/libcpu/ChangeLog
index adebbef8..52567be8 100644
--- a/libcpu/ChangeLog
+++ b/libcpu/ChangeLog
@@ -1,3 +1,22 @@
+2019-10-17 Mark Wielaard <mark@klomp.org>
+
+ * i386_data.h (FCT_sel): Check for param_start + 2 >= end instead
+ of just >.
+ * i386_disasm.c (i386_disasm): Check param_start < end. Don't
+ assert, but assign INVALID to str. Make sure we get past any
+ unrecognized opcode.
+
+2019-09-07 Mark Wielaard <mark@klomp.org>
+
+ * riscv_disasm.c (riscv_disasm): Use UINT64_C to make calculation
+ unsigned.
+
+2019-07-05 Omar Sandoval <osandov@fb.com>
+
+ * Makefile.am: Combine libcpu_{i386,x86_64,bpf}.a into libcpu.a.
+ Make libcpu.a non-PIC by default.
+ Add libcpu_pic.a.
+
2018-11-04 Mark Wielaard <mark@klomp.org>
* bpf_disasm.c (bpf_disasm): Recognize BPF_JLT, BPF_JLE, BPF_JSLT
diff --git a/libcpu/Makefile.am b/libcpu/Makefile.am
index f0a1cb83..03c71ea3 100644
--- a/libcpu/Makefile.am
+++ b/libcpu/Makefile.am
@@ -30,35 +30,34 @@
include $(top_srcdir)/config/eu.am
AM_CPPFLAGS += -I$(srcdir)/../libelf -I$(srcdir)/../libebl \
-I$(srcdir)/../libdw -I$(srcdir)/../libasm
-AM_CFLAGS += $(fpic_CFLAGS) -fdollars-in-identifiers
+if BUILD_STATIC
+AM_CFLAGS += $(fpic_CFLAGS)
+endif
+AM_CFLAGS += -fdollars-in-identifiers
LEXCOMPILE = $(LEX) $(LFLAGS) $(AM_LFLAGS) -P$(<F:lex.l=)
LEX_OUTPUT_ROOT = lex.$(<F:lex.l=)
AM_YFLAGS = -p$(<F:parse.y=)
-noinst_LIBRARIES = libcpu_i386.a libcpu_x86_64.a
-lib_LIBRARIES = libcpu_static_pic.a
+noinst_LIBRARIES = libcpu.a libcpu_pic.a
+
+noinst_HEADERS = i386_dis.h x86_64_dis.h
+
+libcpu_a_SOURCES = i386_disasm.c x86_64_disasm.c bpf_disasm.c riscv_disasm.c
-libcpu_i386_a_SOURCES = i386_disasm.c i386_dis.h
-libcpu_x86_64_a_SOURCES = x86_64_disasm.c x86_64_dis.h
-libcpu_static_pic_a_SOURCES = $(libcpu_i386_a_SOURCES) $(libcpu_x86_64_a_SOURCES)
+libcpu_pic_a_SOURCES =
+am_libcpu_pic_a_OBJECTS = $(libcpu_a_SOURCES:.c=.os)
i386_gendis_SOURCES = i386_gendis.c i386_lex.l i386_parse.y
i386_disasm.o: i386.mnemonics $(srcdir)/i386_dis.h
x86_64_disasm.o: x86_64.mnemonics $(srcdir)/x86_64_dis.h
-noinst_LIBRARIES += libcpu_bpf.a
-libcpu_bpf_a_SOURCES = bpf_disasm.c
-libcpu_bpf_a_CFLAGS = $(AM_CFLAGS) -Wno-format-nonliteral
-libcpu_static_pic_a_SOURCES += $(libcpu_bpf_a_SOURCES)
-bpf_disasm_CFLAGS = -fPIC -Wno-format-nonliteral
-
%_defs: $(srcdir)/defs/i386
$(AM_V_GEN)m4 -D$* -DDISASSEMBLER $< > $@T
$(AM_V_at)mv -f $@T $@
if MAINTAINER_MODE
-noinst_HEADERS = memory-access.h i386_parse.h i386_data.h
+noinst_HEADERS += memory-access.h i386_parse.h i386_data.h
noinst_PROGRAMS = i386_gendis$(EXEEXT)
@@ -90,7 +89,10 @@ i386_gendis_LDADD = $(libeu) -lm
i386_parse.h: i386_parse.c ;
+bpf_disasm_CFLAGS = -Wno-format-nonliteral
+
EXTRA_DIST = defs/i386
+MOSTLYCLEANFILES = $(am_libcpu_pic_a_OBJECTS)
CLEANFILES += $(foreach P,i386 x86_64,$P_defs $P.mnemonics)
MAINTAINERCLEANFILES = $(foreach P,i386 x86_64, $P_dis.h)
diff --git a/libcpu/i386_data.h b/libcpu/i386_data.h
index b8a34c3e..06356b8a 100644
--- a/libcpu/i386_data.h
+++ b/libcpu/i386_data.h
@@ -1336,7 +1336,7 @@ FCT_sel (struct output_data *d)
{
assert (d->opoff1 % 8 == 0);
assert (d->opoff1 / 8 == 5);
- if (*d->param_start + 2 > d->end)
+ if (*d->param_start + 2 >= d->end)
return -1;
*d->param_start += 2;
uint16_t absval = read_2ubyte_unaligned (&d->data[5]);
diff --git a/libcpu/i386_disasm.c b/libcpu/i386_disasm.c
index a7e03f95..4422ffa2 100644
--- a/libcpu/i386_disasm.c
+++ b/libcpu/i386_disasm.c
@@ -610,7 +610,9 @@ i386_disasm (Ebl *ebl __attribute__((unused)),
/* Account for displacement. */
if ((modrm & 0xc7) == 5 || (modrm & 0xc0) == 0x80
- || ((modrm & 0xc7) == 0x4 && (codep[0] & 0x7) == 0x5))
+ || ((modrm & 0xc7) == 0x4
+ && param_start < end
+ && (codep[0] & 0x7) == 0x5))
param_start += 4;
else if ((modrm & 0xc0) == 0x40)
param_start += 1;
@@ -821,7 +823,8 @@ i386_disasm (Ebl *ebl __attribute__((unused)),
}
FALLTHROUGH;
default:
- assert (! "INVALID not handled");
+ str = "INVALID not handled";
+ break;
}
}
else
@@ -1030,7 +1033,7 @@ i386_disasm (Ebl *ebl __attribute__((unused)),
string_end_idx = bufcnt;
}
else
- bufcnt = string_end_idx;
+ start_idx = bufcnt = string_end_idx;
break;
case 'e':
@@ -1124,8 +1127,9 @@ i386_disasm (Ebl *ebl __attribute__((unused)),
/* Invalid (or at least unhandled) opcode. */
if (prefixes != 0)
goto print_prefix;
- assert (*startp == data);
- ++data;
+ /* Make sure we get past the unrecognized opcode if we haven't yet. */
+ if (*startp == data)
+ ++data;
ADD_STRING ("(bad)");
addr += data - begin;
diff --git a/libcpu/riscv_disasm.c b/libcpu/riscv_disasm.c
new file mode 100644
index 00000000..bc0d8f37
--- /dev/null
+++ b/libcpu/riscv_disasm.c
@@ -0,0 +1,1501 @@
+/* Disassembler for RISC-V.
+ Copyright (C) 2019 Red Hat, Inc.
+ This file is part of elfutils.
+ Written by Ulrich Drepper <drepper@redhat.com>, 2019.
+
+ 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 <assert.h>
+#include <ctype.h>
+#include <errno.h>
+#include <inttypes.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "../libebl/libeblP.h"
+
+#define MACHINE_ENCODING __LITTLE_ENDIAN
+#include "memory-access.h"
+
+
+#define ADD_CHAR(ch) \
+ do { \
+ if (unlikely (bufcnt == bufsize)) \
+ goto enomem; \
+ buf[bufcnt++] = (ch); \
+ } while (0)
+
+#define ADD_STRING(str) \
+ do { \
+ const char *_str0 = (str); \
+ size_t _len0 = strlen (_str0); \
+ ADD_NSTRING (_str0, _len0); \
+ } while (0)
+
+#define ADD_NSTRING(str, len) \
+ do { \
+ const char *_str = (str); \
+ size_t _len = (len); \
+ if (unlikely (bufcnt + _len > bufsize)) \
+ goto enomem; \
+ memcpy (buf + bufcnt, _str, _len); \
+ bufcnt += _len; \
+ } while (0)
+
+
+static const char *regnames[32] =
+ {
+ "zero", "ra", "sp", "gp", "tp", "t0", "t1", "t2",
+ "s0", "s1", "a0", "a1", "a2", "a3", "a4", "a5",
+ "a6", "a7", "s2", "s3", "s4", "s5", "s6", "s7",
+ "s8", "s9", "s10", "s11", "t3", "t4", "t5", "t6"
+ };
+#define REG(nr) ((char *) regnames[nr])
+#define REGP(nr) REG (8 + (nr))
+
+
+static const char *fregnames[32] =
+ {
+ "ft0", "ft1", "ft2", "ft3", "ft4", "ft5", "ft6", "ft7",
+ "fs0", "fs1", "fa0", "fa1", "fa2", "fa3", "fa4", "fa5",
+ "fa6", "fa7", "fs2", "fs3", "fs4", "fs5", "fs6", "fs7",
+ "fs8", "fs9", "fs10", "fs11", "ft8", "ft9", "ft10", "ft11"
+ };
+#define FREG(nr) ((char *) fregnames[nr])
+#define FREGP(nr) FREG (8 + (nr))
+
+
+struct known_csrs
+ {
+ uint16_t nr;
+ const char *name;
+ };
+
+static int compare_csr (const void *a, const void *b)
+{
+ const struct known_csrs *ka = (const struct known_csrs *) a;
+ const struct known_csrs *kb = (const struct known_csrs *) b;
+ if (ka->nr < kb->nr)
+ return -1;
+ return ka->nr == kb->nr ? 0 : 1;
+}
+
+
+int
+riscv_disasm (Ebl *ebl,
+ const uint8_t **startp, const uint8_t *end, GElf_Addr addr,
+ const char *fmt, DisasmOutputCB_t outcb,
+ DisasmGetSymCB_t symcb __attribute__((unused)),
+ void *outcbarg, void *symcbarg __attribute__((unused)))
+{
+ const char *const save_fmt = fmt;
+
+#define BUFSIZE 512
+ char initbuf[BUFSIZE];
+ size_t bufcnt;
+ size_t bufsize = BUFSIZE;
+ char *buf = initbuf;
+
+ int retval = 0;
+ while (1)
+ {
+ const uint8_t *data = *startp;
+ assert (data <= end);
+ if (data + 2 > end)
+ {
+ if (data != end)
+ retval = -1;
+ break;
+ }
+ uint16_t first = read_2ubyte_unaligned (data);
+
+ // Determine length.
+ size_t length;
+ if ((first & 0x3) != 0x3)
+ length = 2;
+ else if ((first & 0x1f) != 0x1f)
+ length = 4;
+ else if ((first & 0x3f) != 0x3f)
+ length = 6;
+ else if ((first & 0x7f) != 0x7f)
+ length = 8;
+ else
+ {
+ uint16_t nnn = (first >> 12) & 0x7;
+ if (nnn != 0x7)
+ length = 10 + 2 * nnn;
+ else
+ // This is invalid as of the RISC-V spec on 2019-06-21.
+ // The instruction is at least 192 bits in size so use
+ // this minimum size.
+ length = 24;
+ }
+ if (data + length > end)
+ {
+ retval = -1;
+ break;
+ }
+
+ char *mne = NULL;
+ char mnebuf[32];
+ char *op[5] = { NULL, NULL, NULL, NULL, NULL };
+ char immbuf[32];
+ size_t len;
+ char *strp = NULL;
+ char addrbuf[32];
+ bufcnt = 0;
+ int64_t opaddr;
+ if (length == 2)
+ {
+ size_t idx = (first >> 13) * 3 + (first & 0x3);
+ switch (idx)
+ {
+ uint16_t rd;
+ uint16_t rs1;
+ uint16_t rs2;
+
+ case 0:
+ if ((first & 0x1fe0) != 0)
+ {
+ mne = "addi";
+ op[0] = REGP ((first & 0x1c) >> 2);
+ op[1] = REG (2);
+ opaddr = (((first >> 1) & 0x3c0)
+ | ((first >> 7) & 0x30)
+ | ((first >> 2) & 0x8)
+ | ((first >> 4) & 0x4));
+ snprintf (addrbuf, sizeof (addrbuf), "%" PRIu64, opaddr);
+ op[2] = addrbuf;
+ }
+ else if (first == 0)
+ mne = "unimp";
+ break;
+ case 1:
+ rs1 = (first >> 7) & 0x1f;
+ int16_t nzimm = ((0 - ((first >> 7) & 0x20))
+ | ((first >> 2) & 0x1f));
+ if (rs1 == 0)
+ mne = nzimm == 0 ? "nop" : "c.nop";
+ else
+ {
+ mne = nzimm == 0 ? "c.addi" : "addi";
+ op[0] = op[1] = REG (rs1);
+ snprintf (addrbuf, sizeof (addrbuf), "%" PRId16, nzimm);
+ op[2] = addrbuf;
+ }
+ break;
+ case 2:
+ rs1 = (first >> 7) & 0x1f;
+ op[0] = op[1] = REG (rs1);
+ opaddr = ((first >> 7) & 0x20) | ((first >> 2) & 0x1f);
+ snprintf (addrbuf, sizeof (addrbuf), "0x%" PRIx64, opaddr);
+ op[2] = addrbuf;
+ mne = rs1 == 0 ? "c.slli" : "slli";
+ break;
+ case 3:
+ op[0] = FREGP ((first >> 2) & 0x7);
+ opaddr = ((first << 1) & 0xc0) | ((first >> 7) & 0x38);
+ snprintf (addrbuf, sizeof (addrbuf), "%" PRIu64 "(%s)",
+ opaddr, REGP ((first >> 7) & 0x7));
+ op[1] = addrbuf;
+ mne = "fld";
+ break;
+ case 4:
+ if (ebl->class == ELFCLASS32)
+ {
+ mne = "jal";
+ opaddr = (((first << 3) & 0x20) | ((first >> 2) & 0xe)
+ | ((first << 1) & 0x80) | ((first >> 1) | 0x40)
+ | ((first << 2) & 0x400) | (first & 0xb00)
+ | ((first >> 6) & 0x10));
+ snprintf (addrbuf, sizeof (addrbuf), "0x%" PRIx64, opaddr);
+ op[0] = addrbuf;
+ }
+ else
+ {
+ int32_t imm = (((UINT32_C (0) - ((first >> 12) & 0x1)) << 5)
+ | ((first >> 2) & 0x1f));
+ uint16_t reg = (first >> 7) & 0x1f;
+ if (reg == 0)
+ {
+ // Reserved
+ len = snprintf (addrbuf, sizeof (addrbuf), "0x%" PRIx16, first);
+ strp = addrbuf;
+ }
+ else
+ {
+ if (imm == 0)
+ mne = "sext.w";
+ else
+ {
+ mne = "addiw";
+ snprintf (addrbuf, sizeof (addrbuf), "%" PRId32, imm);
+ op[2] = addrbuf;
+ }
+ op[0] = op[1] = REG (reg);
+ }
+ }
+ break;
+ case 5:
+ op[0] = FREG ((first >> 7) & 0x1f);
+ opaddr = ((first << 4) & 0x1c0) | ((first >> 7) & 0x20) | ((first >> 2) & 0x18);
+ snprintf (addrbuf, sizeof (addrbuf), "%" PRIu64 "(%s)", opaddr, REG (2));
+ op[1] = addrbuf;
+ mne = "fld";
+ break;
+ case 6:
+ case 18:
+ mne = idx == 6 ? "lw" : "sw";
+ op[0] = REGP ((first >> 2) & 0x7);
+ opaddr = (((first >> 7) & 0x38) | ((first << 1) & 0x40)
+ | ((first >> 4) & 0x4));
+ snprintf (addrbuf, sizeof (addrbuf), "%" PRId64 "(%s)",
+ opaddr, REGP ((first >> 7) & 0x7));
+ op[1] = addrbuf;
+ break;
+ case 7:
+ mne = (first & 0xf80) == 0 ? "c.li" : "li";
+ op[0] = REG((first >> 7) & 0x1f);
+ snprintf (addrbuf, sizeof (addrbuf), "%" PRId16,
+ (UINT16_C (0) - ((first >> 7) & 0x20)) | ((first >> 2) & 0x1f));
+ op[1] = addrbuf;
+ break;
+ case 8:
+ rd = ((first >> 7) & 0x1f);
+ if (rd == 0)
+ {
+ len = snprintf (addrbuf, sizeof (addrbuf), "0x%" PRIx16, first);
+ strp = addrbuf;
+ }
+ else
+ {
+ uint16_t uimm = (((first << 4) & 0xc0)
+ | ((first >> 7) & 0x20)
+ | ((first >> 2) & 0x1c));
+ mne = "lw";
+ op[0] = REG (rd);
+ snprintf (addrbuf, sizeof (addrbuf), "%" PRIu16 "(%s)", uimm, REG (2));
+ op[1] = addrbuf;
+ }
+ break;
+ case 9:
+ if (ebl->class == ELFCLASS32)
+ {
+ mne = "flw";
+ op[0] = FREGP ((first >> 2) & 0x7);
+ opaddr = (((first << 1) & 0x40)
+ | ((first >> 7) & 0x38)
+ | ((first >> 4) & 0x4));
+ }
+ else
+ {
+ mne = "ld";
+ op[0] = REGP ((first >> 2) & 0x7);
+ opaddr = ((first >> 7) & 0x38) | ((first << 1) & 0xc0);
+ }
+ snprintf (addrbuf, sizeof (addrbuf), "%" PRId64 "(%s)",
+ opaddr, REGP ((first >> 7) & 0x7));
+ op[1] = addrbuf;
+ break;
+ case 10:
+ if ((first & 0xf80) == (2 << 7))
+ {
+ mne = "addi";
+ op[0] = op[1] = REG (2);
+ opaddr = (((first >> 2) & 0x10) | ((first << 3) & 0x20)
+ | ((first << 1) & 0x40) | ((first << 4) & 0x180)
+ | ((UINT64_C (0) - ((first >> 12) & 0x1)) << 9));
+ snprintf (addrbuf, sizeof (addrbuf), "%" PRId64, opaddr);
+ op[2] = addrbuf;
+ }
+ else
+ {
+ mne = "lui";
+ op[0] = REG((first & 0xf80) >> 7);
+ opaddr = (((UINT64_C (0) - ((first >> 12) & 0x1)) & ~0x1f)
+ | ((first >> 2) & 0x1f));
+ snprintf (addrbuf, sizeof (addrbuf), "0x%" PRIx64, opaddr & 0xfffff);
+ op[1] = addrbuf;
+ }
+ break;
+ case 11:
+ if (ebl->class == ELFCLASS32)
+ {
+ mne = "flw";
+ op[0] = FREG ((first >> 7) & 0x1f);
+ opaddr = (((first << 4) & 0xc0)
+ | ((first >> 7) & 0x20)
+ | ((first >> 2) & 0x1c));
+ }
+ else
+ {
+ mne = "ld";
+ op[0] = REG ((first >> 7) & 0x1f);
+ opaddr = (((first << 4) & 0x1c0)
+ | ((first >> 7) & 0x20)
+ | ((first >> 2) & 0x18));
+ }
+ snprintf (addrbuf, sizeof (addrbuf), "%" PRId64 "(%s)", opaddr, REG (2));
+ op[1] = addrbuf;
+ break;
+ case 13:
+ if ((first & 0xc00) != 0xc00)
+ {
+ int16_t imm = ((first >> 7) & 0x20) | ((first >> 2) & 0x1f);
+ if ((first & 0xc00) == 0x800)
+ {
+ imm |= 0 - (imm & 0x20);
+ mne = "andi";
+ snprintf (addrbuf, sizeof (addrbuf), "%" PRId16, imm);
+ }
+ else
+ {
+ if (ebl->class != ELFCLASS32 || imm < 32)
+ {
+ mne = (first & 0x400) ? "srai" : "srli";
+ if (imm == 0)
+ {
+ strcpy (stpcpy (mnebuf, "c."), mne);
+ mne = mnebuf;
+ }
+ }
+ snprintf (addrbuf, sizeof (addrbuf), "0x%" PRIx16, imm);
+ }
+ op[2] = addrbuf;
+ }
+ else
+ {
+ op[2] = REGP ((first >> 2) & 0x7);
+ static const char *const arithmne[8] =
+ {
+ "sub", "xor", "or", "and", "subw", "addw", NULL, NULL
+ };
+ mne = (char *) arithmne[((first >> 10) & 0x4) | ((first >> 5) & 0x3)];
+ }
+ op[0] = op[1] = REGP ((first >> 7) & 0x7);
+ break;
+ case 14:
+ rs1 = (first >> 7) & 0x1f;
+ rs2 = (first >> 2) & 0x1f;
+ op[0] = REG (rs1);
+ if ((first & 0x1000) == 0)
+ {
+ if (rs2 == 0)
+ {
+ op[1] = NULL;
+ if (rs1 == 1)
+ {
+ mne = "ret";
+ op[0] = NULL;
+ }
+ else
+ mne = "jr";
+ }
+ else
+ {
+ mne = rs1 != 0 ? "mv" : "c.mv";
+ op[1] = REG (rs2);
+ }
+ }
+ else
+ {
+ if (rs2 == 0)
+ {
+ if (rs1 == 0)
+ {
+ mne = "ebreak";
+ op[0] = op[1] = NULL;
+ }
+ else
+ mne = "jalr";
+ }
+ else
+ {
+ mne = rs1 != 0 ? "add" : "c.add";
+ op[2] = REG (rs2);
+ op[1] = op[0];
+ }
+ }
+ break;
+ case 15:
+ op[0] = FREGP ((first >> 2) & 0x7);
+ opaddr = ((first << 1) & 0xc0) | ((first >> 7) & 0x38);
+ snprintf (addrbuf, sizeof (addrbuf), "%" PRIu64 "(%s)",
+ opaddr, REGP ((first >> 7) & 0x7));
+ op[1] = addrbuf;
+ mne = "fsd";
+ break;
+ case 16:
+ opaddr = (((UINT64_C (0) - ((first >> 12) & 0x1)) << 11)
+ | ((first << 2) & 0x400)
+ | ((first >> 1) & 0x300)
+ | ((first << 1) & 0x80)
+ | ((first >> 1) & 0x40)
+ | ((first << 3) & 0x20)
+ | ((first >> 7) & 0x10)
+ | ((first >> 2) & 0xe));
+ mne = "j";
+ // TODO translate address
+ snprintf (addrbuf, sizeof (addrbuf), "0x%" PRIx64, addr + opaddr);
+ op[0] = addrbuf;
+ break;
+ case 17:
+ op[0] = FREG ((first >> 2) & 0x1f);
+ opaddr = ((first >> 1) & 0x1c0) | ((first >> 7) & 0x38);
+ snprintf (addrbuf, sizeof (addrbuf), "%" PRIu64 "(%s)", opaddr, REG (2));
+ op[1] = addrbuf;
+ mne = "fsd";
+ break;
+ case 19:
+ case 22:
+ mne = idx == 19 ? "beqz" : "bnez";
+ op[0] = REG (8 + ((first >> 7) & 0x7));
+ opaddr = addr + (((UINT64_C (0) - ((first >> 12) & 0x1)) & ~0xff)
+ | ((first << 1) & 0xc0) | ((first << 3) & 0x20)
+ | ((first >> 7) & 0x18) | ((first >> 2) & 0x6));
+ // TODO translate address
+ snprintf (addrbuf, sizeof (addrbuf), "0x%" PRIx64, opaddr);
+ op[1] = addrbuf;
+ break;
+ case 20:
+ op[0] = REG ((first >> 2) & 0x1f);
+ opaddr = ((first >> 1) & 0xc0) | ((first >> 7) & 0x3c);
+ snprintf (addrbuf, sizeof (addrbuf), "%" PRId64 "(%s)", opaddr, REG (2));
+ op[1] = addrbuf;
+ mne = "sw";
+ break;
+ case 21:
+ if (idx == 18 || ebl->class == ELFCLASS32)
+ {
+ mne = "fsw";
+ op[0] = FREGP ((first >> 2) & 0x7);
+ opaddr = (((first >> 7) & 0x38) | ((first << 1) & 0x40)
+ | ((first >> 4) & 0x4));
+ }
+ else
+ {
+ mne = "sd";
+ op[0] = REGP ((first >> 2) & 0x7);
+ opaddr = ((first >> 7) & 0x38) | ((first << 1) & 0xc0);
+ }
+ snprintf (addrbuf, sizeof (addrbuf), "%" PRId64 "(%s)",
+ opaddr, REGP ((first >> 7) & 0x7));
+ op[1] = addrbuf;
+ break;
+ case 23:
+ if (idx == 18 || ebl->class == ELFCLASS32)
+ {
+ mne = "fsw";
+ op[0] = FREG ((first & 0x7c) >> 2);
+ opaddr = ((first & 0x1e00) >> 7) | ((first & 0x180) >> 1);
+ }
+ else
+ {
+ mne = "sd";
+ op[0] = REG ((first & 0x7c) >> 2);
+ opaddr = ((first & 0x1c00) >> 7) | ((first & 0x380) >> 1);
+ }
+ snprintf (addrbuf, sizeof (addrbuf), "%" PRId64 "(%s)", opaddr, REG (2));
+ op[1] = addrbuf;
+ break;
+ default:
+ break;
+ }
+
+ if (strp == NULL && mne == NULL)
+ {
+ len = snprintf (immbuf, sizeof (immbuf), "0x%04" PRIx16, first);
+ strp = immbuf;
+ }
+ }
+ else if (length == 4)
+ {
+ uint32_t word = read_4ubyte_unaligned (data);
+ size_t idx = (word >> 2) & 0x1f;
+
+ switch (idx)
+ {
+ static const char widthchar[4] = { 's', 'd', '\0', 'q' };
+ static const char intwidthchar[4] = { 'w', 'd', '\0', 'q' };
+ static const char *const rndmode[8] = { "rne", "rtz", "rdn", "rup", "rmm", "???", "???", "dyn" };
+ uint32_t rd;
+ uint32_t rs1;
+ uint32_t rs2;
+ uint32_t rs3;
+ uint32_t func;
+
+ case 0x00:
+ case 0x01:
+ // LOAD and LOAD-FP
+ rd = (word >> 7) & 0x1f;
+ op[0] = idx == 0x00 ? REG (rd) : FREG (rd);
+ opaddr = ((int32_t) word) >> 20;
+ snprintf (addrbuf, sizeof (addrbuf), "%" PRId64 "(%s)",
+ opaddr, REG ((word >> 15) & 0x1f));
+ op[1] = addrbuf;
+ func = (word >> 12) & 0x7;
+ static const char *const loadmne[8] =
+ {
+ "lb", "lh", "lw", "ld", "lbu", "lhu", "lwu", NULL
+ };
+ static const char *const floadmne[8] =
+ {
+ NULL, NULL, "flw", "fld", "flq", NULL, NULL, NULL
+ };
+ mne = (char *) (idx == 0x00 ? loadmne[func] : floadmne[func]);
+ break;
+ case 0x03:
+ // MISC-MEM
+ rd = (word >> 7) & 0x1f;
+ rs1 = (word >> 15) & 0x1f;
+ func = (word >> 12) & 0x7;
+
+ if (word == 0x8330000f)
+ mne = "fence.tso";
+ else if (word == 0x0000100f)
+ mne = "fence.i";
+ else if (func == 0 && rd == 0 && rs1 == 0 && (word & 0xf0000000) == 0)
+ {
+ static const char *const order[16] =
+ {
+ "unknown", "w", "r", "rw", "o", "ow", "or", "orw",
+ "i", "iw", "ir", "irw", "io", "iow", "ior", "iorw"
+ };
+ uint32_t pred = (word >> 20) & 0xf;
+ uint32_t succ = (word >> 24) & 0xf;
+ if (pred != 0xf || succ != 0xf)
+ {
+ op[0] = (char *) order[succ];
+ op[1] = (char *) order[pred];
+ }
+ mne = "fence";
+ }
+ break;
+ case 0x04:
+ case 0x06:
+ // OP-IMM and OP-IMM32
+ rd = (word >> 7) & 0x1f;
+ op[0] = REG (rd);
+ rs1 = (word >> 15) & 0x1f;
+ op[1] = REG (rs1);
+ opaddr = ((int32_t) word) >> 20;
+ static const char *const opimmmne[8] =
+ {
+ "addi", NULL, "slti", "sltiu", "xori", NULL, "ori", "andi"
+ };
+ func = (word >> 12) & 0x7;
+ mne = (char *) opimmmne[func];
+ if (mne == NULL)
+ {
+ const uint64_t shiftmask = ebl->class == ELFCLASS32 ? 0x1f : 0x3f;
+ if (func == 0x1 && (opaddr & ~shiftmask) == 0)
+ mne = "slli";
+ else if (func == 0x5 && (opaddr & ~shiftmask) == 0)
+ mne = "srli";
+ else if (func == 0x5 && (opaddr & ~shiftmask) == 0x400)
+ mne = "srai";
+ snprintf (addrbuf, sizeof (addrbuf), "0x%" PRIx64, opaddr & shiftmask);
+ op[2] = addrbuf;
+ }
+ else if (func == 0x0 && (rd != 0 || idx == 0x06) && rs1 == 0 && rd != 0)
+ {
+ mne = "li";
+ snprintf (addrbuf, sizeof (addrbuf), "%" PRId64, opaddr);
+ op[1] = addrbuf;
+ }
+ else if (func == 0x00 && opaddr == 0)
+ {
+ if (idx == 0x06)
+ mne ="sext.";
+ else if (rd == 0)
+ {
+ mne = "nop";
+ op[0] = op[1] = NULL;
+ }
+ else
+ mne = "mv";
+ }
+ else if (func == 0x3 && opaddr == 1)
+ mne = "seqz";
+ else if (func == 0x4 && opaddr == -1)
+ {
+ mne = "not";
+ op[2] = NULL;
+ }
+ else
+ {
+ snprintf (addrbuf, sizeof (addrbuf), "%" PRId64, opaddr);
+ op[2] = addrbuf;
+
+ if (func == 0x0 && rs1 == 0 && rd != 0)
+ {
+ op[1] = op[2];
+ op[2] = NULL;
+ mne = "li";
+ }
+ }
+ if (mne != NULL && idx == 0x06)
+ {
+ mne = strcpy (mnebuf, mne);
+ strcat (mnebuf, "w");
+ }
+ break;
+ case 0x05:
+ case 0x0d:
+ // LUI and AUIPC
+ mne = idx == 0x05 ? "auipc" : "lui";
+ op[0] = REG ((word >> 7) & 0x1f);
+ opaddr = word >> 12;
+ snprintf (addrbuf, sizeof (addrbuf), "0x%" PRIx64, opaddr);
+ op[1] = addrbuf;
+ break;
+ case 0x08:
+ case 0x09:
+ // STORE and STORE-FP
+ rs2 = (word >> 20) & 0x1f;
+ op[0] = idx == 0x08 ? REG (rs2) : FREG (rs2);
+ opaddr = ((((int64_t) ((int32_t) word) >> 20)) & ~0x1f) | ((word >> 7) & 0x1f);
+ snprintf (addrbuf, sizeof (addrbuf), "%" PRId64 "(%s)",
+ opaddr, REG ((word >> 15) & 0x1f));
+ op[1] = addrbuf;
+ func = (word >> 12) & 0x7;
+ static const char *const storemne[8] =
+ {
+ "sb", "sh", "sw", "sd", NULL, NULL, NULL, NULL
+ };
+ static const char *const fstoremne[8] =
+ {
+ NULL, NULL, "fsw", "fsd", "fsq", NULL, NULL, NULL
+ };
+ mne = (char *) (idx == 0x08 ? storemne[func] : fstoremne[func]);
+ break;
+ case 0x0b:
+ // AMO
+ op[0] = REG ((word >> 7) & 0x1f);
+ rs1 = (word >> 15) & 0x1f;
+ rs2 = (word >> 20) & 0x1f;
+ snprintf (addrbuf, sizeof (addrbuf), "(%s)", REG (rs1));
+ op[2] = addrbuf;
+ size_t width = (word >> 12) & 0x7;
+ func = word >> 27;
+ static const char *const amomne[32] =
+ {
+ "amoadd", "amoswap", "lr", "sc", "amoxor", NULL, NULL, NULL,
+ "amoor", NULL, NULL, NULL, "amoand", NULL, NULL, NULL,
+ "amomin", NULL, NULL, NULL, "amomax", NULL, NULL, NULL,
+ "amominu", NULL, NULL, NULL, "amomaxu", NULL, NULL, NULL
+ };
+ if (amomne[func] != NULL && width >= 2 && width <= 3
+ && (func != 0x02 || rs2 == 0))
+ {
+ if (func == 0x02)
+ {
+ op[1] = op[2];
+ op[2] = NULL;
+ }
+ else
+ op[1] = REG (rs2);
+
+ char *cp = stpcpy (mnebuf, amomne[func]);
+ *cp++ = '.';
+ *cp++ = " wd "[width];
+ assert (cp[-1] != ' ');
+ static const char *const aqrlstr[4] =
+ {
+ "", ".rl", ".aq", ".aqrl"
+ };
+ strcpy (cp, aqrlstr[(word >> 25) & 0x3]);
+ mne = mnebuf;
+ }
+ break;
+ case 0x0c:
+ case 0x0e:
+ // OP and OP-32
+ if ((word & 0xbc000000) == 0)
+ {
+ rs1 = (word >> 15) & 0x1f;
+ rs2 = (word >> 20) & 0x1f;
+ op[0] = REG ((word >> 7) & 0x1f);
+ func = ((word >> 21) & 0x10) | ((word >> 27) & 0x8) | ((word >> 12) & 0x7);
+ static const char *const arithmne2[32] =
+ {
+ "add", "sll", "slt", "sltu", "xor", "srl", "or", "and",
+ "sub", NULL, NULL, NULL, NULL, "sra", NULL, NULL,
+ "mul", "mulh", "mulhsu", "mulhu", "div", "divu", "rem", "remu",
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
+ };
+ static const char *const arithmne3[32] =
+ {
+ "addw", "sllw", NULL, NULL, NULL, "srlw", NULL, NULL,
+ "subw", NULL, NULL, NULL, NULL, "sraw", NULL, NULL,
+ "mulw", NULL, NULL, NULL, "divw", "divuw", "remw", "remuw",
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
+ };
+ if (func == 8 && rs1 == 0)
+ {
+ mne = idx == 0x0c ? "neg" : "negw";
+ op[1] = REG (rs2);
+ }
+ else if (idx == 0x0c && rs2 == 0 && func == 2)
+ {
+ op[1] = REG (rs1);
+ mne = "sltz";
+ }
+ else if (idx == 0x0c && rs1 == 0 && (func == 2 || func == 3))
+ {
+ op[1] = REG (rs2);
+ mne = func == 2 ? "sgtz" : "snez";
+ }
+ else
+ {
+ mne = (char *) (idx == 0x0c ? arithmne2[func] : arithmne3[func]);
+ op[1] = REG (rs1);
+ op[2] = REG (rs2);
+ }
+ }
+ break;
+ case 0x10:
+ case 0x11:
+ case 0x12:
+ case 0x13:
+ // MADD, MSUB, NMSUB, NMADD
+ if ((word & 0x06000000) != 0x04000000)
+ {
+ rd = (word >> 7) & 0x1f;
+ rs1 = (word >> 15) & 0x1f;
+ rs2 = (word >> 20) & 0x1f;
+ rs3 = (word >> 27) & 0x1f;
+ uint32_t rm = (word >> 12) & 0x7;
+ width = (word >> 25) & 0x3;
+
+ static const char *const fmamne[4] =
+ {
+ "fmadd.", "fmsub.", "fnmsub.", "fnmadd."
+ };
+ char *cp = stpcpy (mnebuf, fmamne[idx & 0x3]);
+ *cp++ = widthchar[width];
+ *cp = '\0';
+ mne = mnebuf;
+ op[0] = FREG (rd);
+ op[1] = FREG (rs1);
+ op[2] = FREG (rs2);
+ op[3] = FREG (rs3);
+ if (rm != 0x7)
+ op[4] = (char *) rndmode[rm];
+ }
+ break;
+ case 0x14:
+ // OP-FP
+ if ((word & 0x06000000) != 0x04000000)
+ {
+ width = (word >> 25) & 0x3;
+ rd = (word >> 7) & 0x1f;
+ rs1 = (word >> 15) & 0x1f;
+ rs2 = (word >> 20) & 0x1f;
+ func = word >> 27;
+ uint32_t rm = (word >> 12) & 0x7;
+ if (func < 4)
+ {
+ static const char *const fpop[4] =
+ {
+ "fadd", "fsub", "fmul", "fdiv"
+ };
+ char *cp = stpcpy (mnebuf, fpop[func]);
+ *cp++ = '.';
+ *cp++ = widthchar[width];
+ *cp = '\0';
+ mne = mnebuf;
+ op[0] = FREG (rd);
+ op[1] = FREG (rs1);
+ op[2] = FREG (rs2);
+ if (rm != 0x7)
+ op[3] = (char *) rndmode[rm];
+ }
+ else if (func == 0x1c && width != 2 && rs2 == 0 && rm <= 1)
+ {
+ char *cp;
+ if (rm == 0)
+ {
+ cp = stpcpy (mnebuf, "fmv.x.");
+ *cp++ = intwidthchar[width];
+ }
+ else
+ {
+ cp = stpcpy (mnebuf, "fclass.");
+ *cp++ = widthchar[width];
+ }
+ *cp = '\0';
+ mne = mnebuf;
+ op[0] = REG (rd);
+ op[1] = FREG (rs1);
+ }
+ else if (func == 0x1e && width != 2 && rs2 == 0 && rm == 0)
+ {
+ char *cp = stpcpy (mnebuf, "fmv.");
+ *cp++ = intwidthchar[width];
+ strcpy (cp, ".x");
+ mne = mnebuf;
+ op[0] = FREG (rd);
+ op[1] = REG (rs1);
+ }
+ else if (func == 0x14)
+ {
+ uint32_t cmpop = (word >> 12) & 0x7;
+ if (cmpop < 3)
+ {
+ static const char *const mnefpcmp[3] =
+ {
+ "fle", "flt", "feq"
+ };
+ char *cp = stpcpy (mnebuf, mnefpcmp[cmpop]);
+ *cp++ = '.';
+ *cp++ = widthchar[width];
+ *cp = '\0';
+ mne = mnebuf;
+ op[0] = REG (rd);
+ op[1] = FREG (rs1);
+ op[2] = FREG (rs2);
+ }
+ }
+ else if (func == 0x04)
+ {
+ uint32_t cmpop = (word >> 12) & 0x7;
+ if (cmpop < 3)
+ {
+ op[0] = FREG (rd);
+ op[1] = FREG (rs1);
+
+ static const char *const mnefpcmp[3] =
+ {
+ "fsgnj.", "fsgnjn.", "fsgnjx."
+ };
+ static const char *const altsignmne[3] =
+ {
+ "fmv.", "fneg.", "fabs."
+ };
+ char *cp = stpcpy (mnebuf, rs1 == rs2 ? altsignmne[cmpop] : mnefpcmp[cmpop]);
+ *cp++ = widthchar[width];
+ *cp = '\0';
+ mne = mnebuf;
+
+ if (rs1 != rs2)
+ op[2] = FREG (rs2);
+ }
+ }
+ else if (func == 0x08 && width != 2 && rs2 <= 3 && rs2 != 2 && rs2 != width)
+ {
+ op[0] = FREG (rd);
+ op[1] = FREG (rs1);
+ char *cp = stpcpy (mnebuf, "fcvt.");
+ *cp++ = widthchar[width];
+ *cp++ = '.';
+ *cp++ = widthchar[rs2];
+ *cp = '\0';
+ mne = mnebuf;
+ }
+ else if ((func & 0x1d) == 0x18 && width != 2 && rs2 < 4)
+ {
+ char *cp = stpcpy (mnebuf, "fcvt.");
+ if (func == 0x18)
+ {
+ *cp++ = rs2 >= 2 ? 'l' : 'w';
+ if ((rs2 & 1) == 1)
+ *cp++ = 'u';
+ *cp++ = '.';
+ *cp++ = widthchar[width];
+ *cp = '\0';
+ op[0] = REG (rd);
+ op[1] = FREG (rs1);
+ }
+ else
+ {
+ *cp++ = widthchar[width];
+ *cp++ = '.';
+ *cp++ = rs2 >= 2 ? 'l' : 'w';
+ if ((rs2 & 1) == 1)
+ *cp++ = 'u';
+ *cp = '\0';
+ op[0] = FREG (rd);
+ op[1] = REG (rs1);
+ }
+ mne = mnebuf;
+ if (rm != 0x7 && (func == 0x18 || width == 0 || rs2 >= 2))
+ op[2] = (char *) rndmode[rm];
+ }
+ else if (func == 0x0b && rs2 == 0)
+ {
+ op[0] = FREG (rd);
+ op[1] = FREG (rs1);
+ char *cp = stpcpy (mnebuf, "fsqrt.");
+ *cp++ = widthchar[width];
+ *cp = '\0';
+ mne = mnebuf;
+ if (rm != 0x7)
+ op[2] = (char *) rndmode[rm];
+ }
+ else if (func == 0x05 && rm < 2)
+ {
+ op[0] = FREG (rd);
+ op[1] = FREG (rs1);
+ op[2] = FREG (rs2);
+ char *cp = stpcpy (mnebuf, rm == 0 ? "fmin." : "fmax.");
+ *cp++ = widthchar[width];
+ *cp = '\0';
+ mne = mnebuf;
+ }
+ else if (func == 0x14 && rm <= 0x2)
+ {
+ op[0] = REG (rd);
+ op[1] = FREG (rs1);
+ op[2] = FREG (rs2);
+ static const char *const fltcmpmne[3] =
+ {
+ "fle.", "flt.", "feq."
+ };
+ char *cp = stpcpy (mnebuf, fltcmpmne[rm]);
+ *cp++ = widthchar[width];
+ *cp = '\0';
+ mne = mnebuf;
+ }
+ }
+ break;
+ case 0x18:
+ // BRANCH
+ rs1 = (word >> 15) & 0x1f;
+ op[0] = REG (rs1);
+ rs2 = (word >> 20) & 0x1f;
+ op[1] = REG (rs2);
+ opaddr = addr + (((UINT64_C (0) - (word >> 31)) << 12)
+ + ((word << 4) & 0x800)
+ + ((word >> 20) & 0x7e0)
+ + ((word >> 7) & 0x1e));
+ // TODO translate address
+ snprintf (addrbuf, sizeof (addrbuf), "0x%" PRIx64, opaddr);
+ op[2] = addrbuf;
+ static const char *const branchmne[8] =
+ {
+ "beq", "bne", NULL, NULL, "blt", "bge", "bltu", "bgeu"
+ };
+ func = (word >> 12) & 0x7;
+ mne = (char *) branchmne[func];
+ if (rs1 == 0 && func == 5)
+ {
+ op[0] = op[1];
+ op[1] = op[2];
+ op[2] = NULL;
+ mne = "blez";
+ }
+ else if (rs1 == 0 && func == 4)
+ {
+ op[0] = op[1];
+ op[1] = op[2];
+ op[2] = NULL;
+ mne = "bgtz";
+ }
+ else if (rs2 == 0)
+ {
+ if (func == 0 || func == 1 || func == 4 || func == 5)
+ {
+ op[1] = op[2];
+ op[2] = NULL;
+ strcpy (stpcpy (mnebuf, mne), "z");
+ mne = mnebuf;
+ }
+ }
+ else if (func == 5 || func == 7)
+ {
+ // binutils use these opcodes and the reverse parameter order
+ char *tmp = op[0];
+ op[0] = op[1];
+ op[1] = tmp;
+ mne = func == 5 ? "ble" : "bleu";
+ }
+ break;
+ case 0x19:
+ // JALR
+ if ((word & 0x7000) == 0)
+ {
+ rd = (word >> 7) & 0x1f;
+ rs1 = (word >> 15) & 0x1f;
+ opaddr = (int32_t) word >> 20;
+ size_t next = 0;
+ if (rd > 1)
+ op[next++] = REG (rd);
+ if (opaddr == 0)
+ {
+ if (rs1 != 0 || next == 0)
+ op[next] = REG (rs1);
+ }
+ else
+ {
+ snprintf (addrbuf, sizeof (addrbuf), "%" PRId64 "(%s)", opaddr, REG (rs1));
+ op[next] = addrbuf;
+ }
+ mne = rd == 0 ? "jr" : "jalr";
+ }
+ break;
+ case 0x1b:
+ // JAL
+ rd = (word >> 7) & 0x1f;
+ if (rd != 0)
+ op[0] = REG (rd);
+ opaddr = addr + ((UINT64_C (0) - ((word >> 11) & 0x100000))
+ | (word & 0xff000)
+ | ((word >> 9) & 0x800)
+ | ((word >> 20) & 0x7fe));
+ // TODO translate address
+ snprintf (addrbuf, sizeof (addrbuf), "0x%" PRIx64, opaddr);
+ op[rd != 0] = addrbuf;
+ mne = rd == 0 ? "j" : "jal";
+ break;
+ case 0x1c:
+ // SYSTEM
+ rd = (word >> 7) & 0x1f;
+ rs1 = (word >> 15) & 0x1f;
+ if (word == 0x00000073)
+ mne = "ecall";
+ else if (word == 0x00100073)
+ mne = "ebreak";
+ else if (word == 0x00200073)
+ mne = "uret";
+ else if (word == 0x10200073)
+ mne = "sret";
+ else if (word == 0x30200073)
+ mne = "mret";
+ else if (word == 0x10500073)
+ mne = "wfi";
+ else if ((word & 0x3000) == 0x2000 && rs1 == 0)
+ {
+ uint32_t csr = word >> 20;
+ if (/* csr >= 0x000 && */ csr <= 0x007)
+ {
+ static const char *const unprivrw[4] =
+ {
+ NULL, "frflags", "frrm", "frsr",
+ };
+ mne = (char *) unprivrw[csr - 0x000];
+ }
+ else if (csr >= 0xc00 && csr <= 0xc03)
+ {
+ static const char *const unprivrolow[3] =
+ {
+ "rdcycle", "rdtime", "rdinstret"
+ };
+ mne = (char *) unprivrolow[csr - 0xc00];
+ }
+ op[0] = REG ((word >> 7) & 0x1f);
+ }
+ else if ((word & 0x3000) == 0x1000 && rd == 0)
+ {
+ uint32_t csr = word >> 20;
+ if (/* csr >= 0x000 && */ csr <= 0x003)
+ {
+ static const char *const unprivrs[4] =
+ {
+ NULL, "fsflags", "fsrm", "fssr",
+ };
+ static const char *const unprivrsi[4] =
+ {
+ NULL, "fsflagsi", "fsrmi", NULL
+ };
+ mne = (char *) ((word & 0x4000) == 0 ? unprivrs : unprivrsi)[csr - 0x000];
+
+ if ((word & 0x4000) == 0)
+ op[0] = REG ((word >> 15) & 0x1f);
+ else
+ {
+ snprintf (immbuf, sizeof (immbuf), "%" PRIu32, (word >> 15) & 0x1f);
+ op[0] = immbuf;
+ }
+ }
+ }
+ if (mne == NULL && (word & 0x3000) != 0)
+ {
+ static const char *const mnecsr[8] =
+ {
+ NULL, "csrrw", "csrrs", "csrrc",
+ NULL, "csrrwi", "csrrsi", "csrrci"
+ };
+ static const struct known_csrs known[] =
+ {
+ // This list must remain sorted by NR.
+ { 0x000, "ustatus" },
+ { 0x001, "fflags" },
+ { 0x002, "fram" },
+ { 0x003, "fcsr" },
+ { 0x004, "uie" },
+ { 0x005, "utvec" },
+ { 0x040, "uscratch" },
+ { 0x041, "uepc" },
+ { 0x042, "ucause" },
+ { 0x043, "utval" },
+ { 0x044, "uip" },
+ { 0x100, "sstatus" },
+ { 0x102, "sedeleg" },
+ { 0x103, "sideleg" },
+ { 0x104, "sie" },
+ { 0x105, "stvec" },
+ { 0x106, "scounteren" },
+ { 0x140, "sscratch" },
+ { 0x141, "sepc" },
+ { 0x142, "scause" },
+ { 0x143, "stval" },
+ { 0x144, "sip" },
+ { 0x180, "satp" },
+ { 0x200, "vsstatus" },
+ { 0x204, "vsie" },
+ { 0x205, "vstvec" },
+ { 0x240, "vsscratch" },
+ { 0x241, "vsepc" },
+ { 0x242, "vscause" },
+ { 0x243, "vstval" },
+ { 0x244, "vsip" },
+ { 0x280, "vsatp" },
+ { 0x600, "hstatus" },
+ { 0x602, "hedeleg" },
+ { 0x603, "hideleg" },
+ { 0x605, "htimedelta" },
+ { 0x606, "hcounteren" },
+ { 0x615, "htimedeltah" },
+ { 0x680, "hgatp" },
+ { 0xc00, "cycle" },
+ { 0xc01, "time" },
+ { 0xc02, "instret" },
+ { 0xc03, "hpmcounter3" },
+ { 0xc04, "hpmcounter4" },
+ { 0xc05, "hpmcounter5" },
+ { 0xc06, "hpmcounter6" },
+ { 0xc07, "hpmcounter7" },
+ { 0xc08, "hpmcounter8" },
+ { 0xc09, "hpmcounter9" },
+ { 0xc0a, "hpmcounter10" },
+ { 0xc0b, "hpmcounter11" },
+ { 0xc0c, "hpmcounter12" },
+ { 0xc0d, "hpmcounter13" },
+ { 0xc0e, "hpmcounter14" },
+ { 0xc0f, "hpmcounter15" },
+ { 0xc10, "hpmcounter16" },
+ { 0xc11, "hpmcounter17" },
+ { 0xc12, "hpmcounter18" },
+ { 0xc13, "hpmcounter19" },
+ { 0xc14, "hpmcounter20" },
+ { 0xc15, "hpmcounter21" },
+ { 0xc16, "hpmcounter22" },
+ { 0xc17, "hpmcounter23" },
+ { 0xc18, "hpmcounter24" },
+ { 0xc19, "hpmcounter25" },
+ { 0xc1a, "hpmcounter26" },
+ { 0xc1b, "hpmcounter27" },
+ { 0xc1c, "hpmcounter28" },
+ { 0xc1d, "hpmcounter29" },
+ { 0xc1e, "hpmcounter30" },
+ { 0xc1f, "hpmcounter31" },
+ { 0xc80, "cycleh" },
+ { 0xc81, "timeh" },
+ { 0xc82, "instreth" },
+ { 0xc83, "hpmcounter3h" },
+ { 0xc84, "hpmcounter4h" },
+ { 0xc85, "hpmcounter5h" },
+ { 0xc86, "hpmcounter6h" },
+ { 0xc87, "hpmcounter7h" },
+ { 0xc88, "hpmcounter8h" },
+ { 0xc89, "hpmcounter9h" },
+ { 0xc8a, "hpmcounter10h" },
+ { 0xc8b, "hpmcounter11h" },
+ { 0xc8c, "hpmcounter12h" },
+ { 0xc8d, "hpmcounter13h" },
+ { 0xc8e, "hpmcounter14h" },
+ { 0xc8f, "hpmcounter15h" },
+ { 0xc90, "hpmcounter16h" },
+ { 0xc91, "hpmcounter17h" },
+ { 0xc92, "hpmcounter18h" },
+ { 0xc93, "hpmcounter19h" },
+ { 0xc94, "hpmcounter20h" },
+ { 0xc95, "hpmcounter21h" },
+ { 0xc96, "hpmcounter22h" },
+ { 0xc97, "hpmcounter23h" },
+ { 0xc98, "hpmcounter24h" },
+ { 0xc99, "hpmcounter25h" },
+ { 0xc9a, "hpmcounter26h" },
+ { 0xc9b, "hpmcounter27h" },
+ { 0xc9c, "hpmcounter28h" },
+ { 0xc9d, "hpmcounter29h" },
+ { 0xc9e, "hpmcounter30h" },
+ { 0xc9f, "hpmcounter31h" },
+ };
+ uint32_t csr = word >> 20;
+ uint32_t instr = (word >> 12) & 0x7;
+ size_t last = 0;
+ if (rd != 0)
+ op[last++] = REG (rd);
+ struct known_csrs key = { csr, NULL };
+ struct known_csrs *found = bsearch (&key, known,
+ sizeof (known) / sizeof (known[0]),
+ sizeof (known[0]),
+ compare_csr);
+ if (found)
+ op[last] = (char *) found->name;
+ else
+ {
+ snprintf (addrbuf, sizeof (addrbuf), "0x%" PRIx32, csr);
+ op[last] = addrbuf;
+ }
+ ++last;
+ if ((word & 0x4000) == 0)
+ op[last] = REG ((word >> 15) & 0x1f);
+ else
+ {
+ snprintf (immbuf, sizeof (immbuf), "%" PRIu32, (word >> 15) & UINT32_C(0x1f));
+ op[last] = immbuf;
+ }
+ if (instr == 1 && rd == 0)
+ mne = "csrw";
+ else if (instr == 2 && rd == 0)
+ mne = "csrs";
+ else if (instr == 6 && rd == 0)
+ mne = "csrsi";
+ else if (instr == 2 && rs1 == 0)
+ mne = "csrr";
+ else if (instr == 3 && rd == 0)
+ mne = "csrc";
+ else
+ mne = (char *) mnecsr[instr];
+ }
+ break;
+ default:
+ break;
+ }
+
+ if (strp == NULL && mne == NULL)
+ {
+ len = snprintf (addrbuf, sizeof (addrbuf), "0x%08" PRIx32, word);
+ strp = addrbuf;
+ }
+ }
+ else
+ {
+ // No instruction encodings defined for these sizes yet.
+ char *cp = stpcpy (mnebuf, "0x");
+ assert (length % 2 == 0);
+ for (size_t i = 0; i < length; i += 2)
+ cp += snprintf (cp, mnebuf + sizeof (mnebuf) - cp, "%04" PRIx16,
+ read_2ubyte_unaligned (data + i));
+ strp = mnebuf;
+ len = cp - mnebuf;
+ }
+
+ if (strp == NULL)
+ {
+
+ if (0)
+ {
+ /* Resize the buffer. */
+ char *oldbuf;
+ enomem:
+ oldbuf = buf;
+ if (buf == initbuf)
+ buf = malloc (2 * bufsize);
+ else
+ buf = realloc (buf, 2 * bufsize);
+ if (buf == NULL)
+ {
+ buf = oldbuf;
+ retval = ENOMEM;
+ goto do_ret;
+ }
+ bufsize *= 2;
+
+ bufcnt = 0;
+ }
+
+ unsigned long string_end_idx = 0;
+ fmt = save_fmt;
+ const char *deferred_start = NULL;
+ size_t deferred_len = 0;
+ // XXX Can we get this from color.c?
+ static const char color_off[] = "\e[0m";
+ while (*fmt != '\0')
+ {
+ if (*fmt != '%')
+ {
+ char ch = *fmt++;
+ if (ch == '\\')
+ {
+ switch ((ch = *fmt++))
+ {
+ case '0' ... '7':
+ {
+ int val = ch - '0';
+ ch = *fmt;
+ if (ch >= '0' && ch <= '7')
+ {
+ val *= 8;
+ val += ch - '0';
+ ch = *++fmt;
+ if (ch >= '0' && ch <= '7' && val < 32)
+ {
+ val *= 8;
+ val += ch - '0';
+ ++fmt;
+ }
+ }
+ ch = val;
+ }
+ break;
+
+ case 'n':
+ ch = '\n';
+ break;
+
+ case 't':
+ ch = '\t';
+ break;
+
+ default:
+ retval = EINVAL;
+ goto do_ret;
+ }
+ }
+ else if (ch == '\e' && *fmt == '[')
+ {
+ deferred_start = fmt - 1;
+ do
+ ++fmt;
+ while (*fmt != 'm' && *fmt != '\0');
+
+ if (*fmt == 'm')
+ {
+ deferred_len = ++fmt - deferred_start;
+ continue;
+ }
+
+ fmt = deferred_start + 1;
+ deferred_start = NULL;
+ }
+ ADD_CHAR (ch);
+ continue;
+ }
+ ++fmt;
+
+ int width = 0;
+ while (isdigit (*fmt))
+ width = width * 10 + (*fmt++ - '0');
+
+ int prec = 0;
+ if (*fmt == '.')
+ while (isdigit (*++fmt))
+ prec = prec * 10 + (*fmt - '0');
+
+ size_t start_idx = bufcnt;
+ size_t non_printing = 0;
+ switch (*fmt++)
+ {
+ case 'm':
+ if (deferred_start != NULL)
+ {
+ ADD_NSTRING (deferred_start, deferred_len);
+ non_printing += deferred_len;
+ }
+
+ ADD_STRING (mne);
+
+ if (deferred_start != NULL)
+ {
+ ADD_STRING (color_off);
+ non_printing += strlen (color_off);
+ }
+
+ string_end_idx = bufcnt;
+ break;
+
+ case 'o':
+ if (op[prec - 1] != NULL)
+ {
+ if (deferred_start != NULL)
+ {
+ ADD_NSTRING (deferred_start, deferred_len);
+ non_printing += deferred_len;
+ }
+
+ ADD_STRING (op[prec - 1]);
+
+ if (deferred_start != NULL)
+ {
+ ADD_STRING (color_off);
+ non_printing += strlen (color_off);
+ }
+
+ string_end_idx = bufcnt;
+ }
+ else
+ bufcnt = string_end_idx;
+ break;
+
+ case 'e':
+ string_end_idx = bufcnt;
+ break;
+
+ case 'a':
+ /* Pad to requested column. */
+ while (bufcnt - non_printing < (size_t) width)
+ ADD_CHAR (' ');
+ width = 0;
+ break;
+
+ case 'l':
+ // TODO
+ break;
+
+ default:
+ abort();
+ }
+
+ /* Pad according to the specified width. */
+ while (bufcnt - non_printing < start_idx + width)
+ ADD_CHAR (' ');
+ }
+
+ strp = buf;
+ len = bufcnt;
+ }
+
+ addr += length;
+ *startp = data + length;
+ retval = outcb (strp, len, outcbarg);
+ if (retval != 0)
+ break;
+ }
+
+ do_ret:
+ if (buf != initbuf)
+ free (buf);
+
+ return retval;
+}
diff --git a/libdw/ChangeLog b/libdw/ChangeLog
index bf1f4857..59f33f9e 100644
--- a/libdw/ChangeLog
+++ b/libdw/ChangeLog
@@ -1,3 +1,63 @@
+2019-10-28 Aaron Merey <amerey@redhat.com>
+
+ * Makefile.am (libdw_so_LDLIBS): Add -ldl for libdebuginfod.so dlopen.
+
+2019-11-10 Mark Wielaard <mark@klomp.org>
+
+ * libdwP.h (libdw_unalloc): New define.
+ (libdw_typed_unalloc): Likewise.
+ (__libdw_thread_tail): New function declaration.
+ * libdw_alloc.c (__libdw_thread_tail): New function.
+ * dwarf_getabbrev.c (__libdw_getabbrev): Call libdw_typed_unalloc
+ when reading invalid data or when hash collission detected.
+
+2019-10-28 Jonathon Anderson <jma14@rice.edu>
+
+ * libdw_alloc.c: Added __libdw_alloc_tail.
+ (__libdw_allocate): Switch to use the mem_tails array.
+ * libdwP.h (Dwarf): Likewise.
+ * dwarf_begin_elf.c (dwarf_begin_elf): Support for above.
+ * dwarf_end.c (dwarf_end): Likewise.
+ * atomics.h: Add support for thread_local.
+
+2019-10-28 Mark Wielaard <mark@klomp.org>
+
+ * dwarf_sig8_hash.h: Include libdw.h. Remove COMPARE. Include
+ dynamicsizehash_concurrent.h.
+ * dwarf_sig8_hash.c: Include dynamicsizehash_concurrent.c.
+ * dwarf_formref_die.c (dwarf_formref_die): Drop NULL argument to
+ Dwarf_Sig8_Hash_find.
+
+2019-08-26 Srđan Milaković <sm108@rice.edu@rice.edu>
+
+ * dwarf_abbrev_hash.{c,h}: Use the *_concurrent hash table.
+
+2019-11-01 Jonathon Anderson <jma14@rice.edu>
+
+ * dwarf_begin_elf.c (valid_p): Switch calloc for malloc for fake CUs.
+ Add explicit initialization of some fields.
+ * dwarf_end.c (cu_free): Add clause to limit freeing of CU internals.
+
+2019-08-26 Jonathon Anderson <jma14@rice.edu>
+
+ * libdw_alloc.c (__libdw_allocate): Added thread-safe stack allocator.
+ * libdwP.h (Dwarf): Likewise.
+ * dwarf_begin_elf.c (dwarf_begin_elf): Support for above.
+ * dwarf_end.c (dwarf_end): Likewise.
+ * Makefile.am: Use -pthread to provide rwlocks.
+
+2019-07-05 Omar Sandoval <osandov@fb.com>
+
+ * Makefile.am (libdw_so_LIBS): Replace libebl.a with libebl_pic.a.
+ Move libebl_pic.a to the beginning so that libdw symbols are resolved.
+ (libdw_so_LDLIBS): Remove -ldl.
+ (libdw.so): Remove -rpath.
+ (libdw_a_LIBADD): Add libebl, libebl_backends, and libcpu objects.
+
+2019-08-25 Jonathon Anderson <jma14@rice.edu>
+
+ * dwarf_getcfi.c (dwarf_getcfi): Set default_same_value to false.
+
2019-08-12 Mark Wielaard <mark@klomp.org>
* libdw.map (ELFUTILS_0.177): Add new version of dwelf_elf_begin.
diff --git a/libdw/Makefile.am b/libdw/Makefile.am
index 166e37cf..ef566399 100644
--- a/libdw/Makefile.am
+++ b/libdw/Makefile.am
@@ -31,17 +31,17 @@ include $(top_srcdir)/config/eu.am
if BUILD_STATIC
AM_CFLAGS += $(fpic_CFLAGS)
endif
-AM_CPPFLAGS += -I$(srcdir)/../libelf -I$(srcdir)/../libdwelf
+AM_CPPFLAGS += -I$(srcdir)/../libelf -I$(srcdir)/../libdwelf -pthread
VERSION = 1
lib_LIBRARIES = libdw.a
-noinst_LIBRARIES = libdw_pic.a libdw_static_pic.a
-noinst_PROGRAMS = libdw.so
+noinst_LIBRARIES = libdw_pic.a
+noinst_PROGRAMS = $(noinst_LIBRARIES:_pic.a=.so)
include_HEADERS = dwarf.h
pkginclude_HEADERS = libdw.h known-dwarf.h
-libdw_a_CFLAGS = -fPIC -fvisibility=hidden $(AM_CFLAGS)
+libdw_a_CFLAGS = -fPIC $(AM_CFLAGS)
libdw_a_SOURCES = dwarf_begin.c dwarf_begin_elf.c dwarf_end.c dwarf_getelf.c \
dwarf_getpubnames.c dwarf_getabbrev.c dwarf_tag.c \
dwarf_error.c dwarf_nextcu.c dwarf_diename.c dwarf_offdie.c \
@@ -95,25 +95,6 @@ libdw_a_SOURCES = dwarf_begin.c dwarf_begin_elf.c dwarf_end.c dwarf_getelf.c \
libdw_find_split_unit.c dwarf_cu_info.c \
dwarf_next_lines.c
-# Minimal library with symbols needed by those libebl backends that we
-# ship statically. This is so that e.g. strip doesn't end up bringing
-# in the whole of libdw, and depending on libbz2, liblzma, etc.
-libdw_static_pic_a_SOURCES = libdw_form.c dwarf_child.c dwarf_attr.c \
- dwarf_attr_integrate.c dwarf_formref_die.c dwarf_error.c \
- dwarf_tag.c dwarf_formref.c \
- dwarf_abbrev_hash.c dwarf_sig8_hash.c \
- dwarf_formudata.c libdw_findcu.c dwarf_offdie.c \
- dwarf_getabbrev.c dwarf_nextcu.c libdw_alloc.c \
- dwarf_hasattr_integrate.c dwarf_hasattr.c \
- dwarf_aggregate_size.c dwarf_siblingof.c dwarf_formsdata.c \
- dwarf_srclang.c dwarf_formflag.c dwarf_diecu.c \
- dwarf_bytesize.c dwarf_bitsize.c dwarf_peel_type.c \
- dwarf_default_lower_bound.c libdw_find_split_unit.c \
- dwarf_getalt.c dwarf_haschildren.c \
- dwarf_begin.c dwarf_begin_elf.c dwarf_end.c frame-cache.c \
- dwarf_get_units.c dwarf_formstring.c \
- ../libdwelf/dwelf_dwarf_gnu_debugaltlink.c
-
if MAINTAINER_MODE
BUILT_SOURCES = $(srcdir)/known-dwarf.h
MAINTAINERCLEANFILES = $(srcdir)/known-dwarf.h
@@ -124,21 +105,16 @@ endif
libdw_pic_a_SOURCES =
am_libdw_pic_a_OBJECTS = $(libdw_a_SOURCES:.c=.os)
-am_libdw_static_pic_a_OBJECTS = $(libdw_static_pic_a_SOURCES:.c=.os)
-libdw_so_LIBS = libdw_pic.a ../libdwelf/libdwelf_pic.a \
- ../libdwfl/libdwfl_pic.a ../libebl/libebl.a \
- ../backends/libebl_static_pic.a \
- ../libcpu/libcpu_static_pic.a
+libdw_so_LIBS = ../libebl/libebl_pic.a ../backends/libebl_backends_pic.a \
+ ../libcpu/libcpu_pic.a libdw_pic.a ../libdwelf/libdwelf_pic.a \
+ ../libdwfl/libdwfl_pic.a
libdw_so_DEPS = ../lib/libeu.a ../libelf/libelf.so
-libdw_so_LDLIBS = $(libdw_so_DEPS) -ldl -lz $(argp_LDADD) $(zip_LIBS)
+libdw_so_LDLIBS = $(libdw_so_DEPS) -ldl -lz $(argp_LDADD) $(zip_LIBS) -pthread
libdw_so_SOURCES =
libdw.so$(EXEEXT): $(srcdir)/libdw.map $(libdw_so_LIBS) $(libdw_so_DEPS)
-# The rpath is necessary for libebl because its $ORIGIN use will
-# not fly in a setuid executable that links in libdw.
$(AM_V_CCLD)$(LINK) $(dso_LDFLAGS) -o $@ \
- -Wl,--soname,$@.$(VERSION) \
- -Wl,--enable-new-dtags,-rpath,$(pkglibdir) \
+ -Wl,--soname,$@.$(VERSION),--enable-new-dtags \
-Wl,--version-script,$<,--no-undefined \
-Wl,--whole-archive $(libdw_so_LIBS) -Wl,--no-whole-archive \
$(libdw_so_LDLIBS)
@@ -163,6 +139,15 @@ libdw_a_LIBADD = $(addprefix ../libdwfl/,$(libdwfl_objects))
libdwelf_objects = $(shell $(AR) t ../libdwelf/libdwelf.a)
libdw_a_LIBADD += $(addprefix ../libdwelf/,$(libdwelf_objects))
+libebl_objects = $(shell $(AR) t ../libebl/libebl.a)
+libdw_a_LIBADD += $(addprefix ../libebl/,$(libebl_objects))
+
+backends_objects = $(shell $(AR) t ../backends/libebl_backends.a)
+libdw_a_LIBADD += $(addprefix ../backends/,$(backends_objects))
+
+libcpu_objects = $(shell $(AR) t ../libcpu/libcpu.a)
+libdw_a_LIBADD += $(addprefix ../libcpu/,$(libcpu_objects))
+
noinst_HEADERS = libdwP.h memory-access.h dwarf_abbrev_hash.h \
dwarf_sig8_hash.h cfi.h encoded-value.h
diff --git a/libdw/dwarf_abbrev_hash.c b/libdw/dwarf_abbrev_hash.c
index f52f5ad5..c2548140 100644
--- a/libdw/dwarf_abbrev_hash.c
+++ b/libdw/dwarf_abbrev_hash.c
@@ -38,7 +38,7 @@
#define next_prime __libdwarf_next_prime
extern size_t next_prime (size_t) attribute_hidden;
-#include <dynamicsizehash.c>
+#include <dynamicsizehash_concurrent.c>
#undef next_prime
#define next_prime attribute_hidden __libdwarf_next_prime
diff --git a/libdw/dwarf_abbrev_hash.h b/libdw/dwarf_abbrev_hash.h
index d2f02ccc..a368c598 100644
--- a/libdw/dwarf_abbrev_hash.h
+++ b/libdw/dwarf_abbrev_hash.h
@@ -32,8 +32,7 @@
#define NAME Dwarf_Abbrev_Hash
#define TYPE Dwarf_Abbrev *
-#define COMPARE(a, b) (0)
-#include <dynamicsizehash.h>
+#include <dynamicsizehash_concurrent.h>
#endif /* dwarf_abbrev_hash.h */
diff --git a/libdw/dwarf_begin_elf.c b/libdw/dwarf_begin_elf.c
index 38c8f5c6..85343088 100644
--- a/libdw/dwarf_begin_elf.c
+++ b/libdw/dwarf_begin_elf.c
@@ -223,7 +223,7 @@ valid_p (Dwarf *result)
inside the .debug_loc or .debug_loclists section. */
if (result != NULL && result->sectiondata[IDX_debug_loc] != NULL)
{
- result->fake_loc_cu = (Dwarf_CU *) calloc (1, sizeof (Dwarf_CU));
+ result->fake_loc_cu = (Dwarf_CU *) malloc (sizeof (Dwarf_CU));
if (unlikely (result->fake_loc_cu == NULL))
{
Dwarf_Sig8_Hash_free (&result->sig8_hash);
@@ -240,12 +240,16 @@ valid_p (Dwarf *result)
result->fake_loc_cu->endp
= (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->split = NULL;
}
}
if (result != NULL && result->sectiondata[IDX_debug_loclists] != NULL)
{
- result->fake_loclists_cu = (Dwarf_CU *) calloc (1, sizeof (Dwarf_CU));
+ result->fake_loclists_cu = (Dwarf_CU *) malloc (sizeof (Dwarf_CU));
if (unlikely (result->fake_loclists_cu == NULL))
{
Dwarf_Sig8_Hash_free (&result->sig8_hash);
@@ -263,6 +267,10 @@ valid_p (Dwarf *result)
result->fake_loclists_cu->endp
= (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->split = NULL;
}
}
@@ -272,7 +280,7 @@ valid_p (Dwarf *result)
inside the .debug_addr section, if it exists. */
if (result != NULL && result->sectiondata[IDX_debug_addr] != NULL)
{
- result->fake_addr_cu = (Dwarf_CU *) calloc (1, sizeof (Dwarf_CU));
+ result->fake_addr_cu = (Dwarf_CU *) malloc (sizeof (Dwarf_CU));
if (unlikely (result->fake_addr_cu == NULL))
{
Dwarf_Sig8_Hash_free (&result->sig8_hash);
@@ -291,6 +299,10 @@ valid_p (Dwarf *result)
result->fake_addr_cu->endp
= (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->split = NULL;
}
}
@@ -397,7 +409,7 @@ dwarf_begin_elf (Elf *elf, Dwarf_Cmd cmd, Elf_Scn *scngrp)
assert (sizeof (struct Dwarf) < mem_default_size);
/* Allocate the data structure. */
- Dwarf *result = (Dwarf *) calloc (1, sizeof (Dwarf) + mem_default_size);
+ Dwarf *result = (Dwarf *) calloc (1, sizeof (Dwarf));
if (unlikely (result == NULL)
|| unlikely (Dwarf_Sig8_Hash_init (&result->sig8_hash, 11) < 0))
{
@@ -414,14 +426,18 @@ dwarf_begin_elf (Elf *elf, Dwarf_Cmd cmd, Elf_Scn *scngrp)
result->elf = elf;
result->alt_fd = -1;
- /* Initialize the memory handling. */
+ /* Initialize the memory handling. Initial blocks are allocated on first
+ actual allocation. */
result->mem_default_size = mem_default_size;
result->oom_handler = __libdw_oom;
- result->mem_tail = (struct libdw_memblock *) (result + 1);
- result->mem_tail->size = (result->mem_default_size
- - offsetof (struct libdw_memblock, mem));
- result->mem_tail->remaining = result->mem_tail->size;
- result->mem_tail->prev = NULL;
+ if (pthread_rwlock_init(&result->mem_rwl, NULL) != 0)
+ {
+ free (result);
+ __libdw_seterrno (DWARF_E_NOMEM); /* no memory. */
+ return NULL;
+ }
+ result->mem_stacks = 0;
+ result->mem_tails = NULL;
if (cmd == DWARF_C_READ || cmd == DWARF_C_RDWR)
{
diff --git a/libdw/dwarf_end.c b/libdw/dwarf_end.c
index 29795c10..77f537a7 100644
--- a/libdw/dwarf_end.c
+++ b/libdw/dwarf_end.c
@@ -52,18 +52,23 @@ cu_free (void *arg)
{
struct Dwarf_CU *p = (struct Dwarf_CU *) arg;
- Dwarf_Abbrev_Hash_free (&p->abbrev_hash);
-
tdestroy (p->locs, noop_free);
- /* Free split dwarf one way (from skeleton to split). */
- if (p->unit_type == DW_UT_skeleton
- && p->split != NULL && p->split != (void *)-1)
+ /* Only free the CU internals if its not a fake CU. */
+ if(p != p->dbg->fake_loc_cu && p != p->dbg->fake_loclists_cu
+ && p != p->dbg->fake_addr_cu)
{
- /* The fake_addr_cu might be shared, only release one. */
- if (p->dbg->fake_addr_cu == p->split->dbg->fake_addr_cu)
- p->split->dbg->fake_addr_cu = NULL;
- INTUSE(dwarf_end) (p->split->dbg);
+ Dwarf_Abbrev_Hash_free (&p->abbrev_hash);
+
+ /* Free split dwarf one way (from skeleton to split). */
+ if (p->unit_type == DW_UT_skeleton
+ && p->split != NULL && p->split != (void *)-1)
+ {
+ /* The fake_addr_cu might be shared, only release one. */
+ if (p->dbg->fake_addr_cu == p->split->dbg->fake_addr_cu)
+ p->split->dbg->fake_addr_cu = NULL;
+ INTUSE(dwarf_end) (p->split->dbg);
+ }
}
}
@@ -94,14 +99,20 @@ dwarf_end (Dwarf *dwarf)
/* And the split Dwarf. */
tdestroy (dwarf->split_tree, noop_free);
- struct libdw_memblock *memp = dwarf->mem_tail;
- /* The first block is allocated together with the Dwarf object. */
- while (memp->prev != NULL)
- {
- struct libdw_memblock *prevp = memp->prev;
- free (memp);
- memp = prevp;
- }
+ /* Free the internally allocated memory. */
+ for (size_t i = 0; i < dwarf->mem_stacks; i++)
+ {
+ struct libdw_memblock *memp = dwarf->mem_tails[i];
+ while (memp != NULL)
+ {
+ struct libdw_memblock *prevp = memp->prev;
+ free (memp);
+ memp = prevp;
+ }
+ }
+ if (dwarf->mem_tails != NULL)
+ free (dwarf->mem_tails);
+ pthread_rwlock_destroy (&dwarf->mem_rwl);
/* Free the pubnames helper structure. */
free (dwarf->pubnames_sets);
diff --git a/libdw/dwarf_formref_die.c b/libdw/dwarf_formref_die.c
index f196331a..48ba8194 100644
--- a/libdw/dwarf_formref_die.c
+++ b/libdw/dwarf_formref_die.c
@@ -83,7 +83,7 @@ dwarf_formref_die (Dwarf_Attribute *attr, Dwarf_Die *result)
have to match in the type unit headers. */
uint64_t sig = read_8ubyte_unaligned (cu->dbg, attr->valp);
- cu = Dwarf_Sig8_Hash_find (&cu->dbg->sig8_hash, sig, NULL);
+ cu = Dwarf_Sig8_Hash_find (&cu->dbg->sig8_hash, sig);
if (cu == NULL)
{
/* Not seen before. We have to scan through the type units.
diff --git a/libdw/dwarf_getabbrev.c b/libdw/dwarf_getabbrev.c
index 6a7e981b..13bee493 100644
--- a/libdw/dwarf_getabbrev.c
+++ b/libdw/dwarf_getabbrev.c
@@ -83,7 +83,7 @@ __libdw_getabbrev (Dwarf *dbg, struct Dwarf_CU *cu, Dwarf_Off offset,
bool foundit = false;
Dwarf_Abbrev *abb = NULL;
if (cu == NULL
- || (abb = Dwarf_Abbrev_Hash_find (&cu->abbrev_hash, code, NULL)) == NULL)
+ || (abb = Dwarf_Abbrev_Hash_find (&cu->abbrev_hash, code)) == NULL)
{
if (result == NULL)
abb = libdw_typed_alloc (dbg, Dwarf_Abbrev);
@@ -99,6 +99,8 @@ __libdw_getabbrev (Dwarf *dbg, struct Dwarf_CU *cu, Dwarf_Off offset,
/* A duplicate abbrev code at a different offset,
that should never happen. */
invalid:
+ if (! foundit)
+ libdw_typed_unalloc (dbg, Dwarf_Abbrev);
__libdw_seterrno (DWARF_E_INVALID_DWARF);
return NULL;
}
@@ -148,7 +150,13 @@ __libdw_getabbrev (Dwarf *dbg, struct Dwarf_CU *cu, Dwarf_Off offset,
/* Add the entry to the hash table. */
if (cu != NULL && ! foundit)
- (void) Dwarf_Abbrev_Hash_insert (&cu->abbrev_hash, abb->code, abb);
+ if (Dwarf_Abbrev_Hash_insert (&cu->abbrev_hash, abb->code, abb) == -1)
+ {
+ /* The entry was already in the table, remove the one we just
+ created and get the one already inserted. */
+ libdw_typed_unalloc (dbg, Dwarf_Abbrev);
+ abb = Dwarf_Abbrev_Hash_find (&cu->abbrev_hash, code);
+ }
out:
return abb;
diff --git a/libdw/dwarf_getcfi.c b/libdw/dwarf_getcfi.c
index 9aed403e..51932cd9 100644
--- a/libdw/dwarf_getcfi.c
+++ b/libdw/dwarf_getcfi.c
@@ -58,6 +58,7 @@ dwarf_getcfi (Dwarf *dbg)
cfi->e_ident = (unsigned char *) elf_getident (dbg->elf, NULL);
cfi->other_byte_order = dbg->other_byte_order;
+ cfi->default_same_value = false;
cfi->next_offset = 0;
cfi->cie_tree = cfi->fde_tree = cfi->expr_tree = NULL;
diff --git a/libdw/dwarf_sig8_hash.c b/libdw/dwarf_sig8_hash.c
index 043cac78..777f9ebc 100644
--- a/libdw/dwarf_sig8_hash.c
+++ b/libdw/dwarf_sig8_hash.c
@@ -38,4 +38,4 @@
#define next_prime __libdwarf_next_prime
extern size_t next_prime (size_t) attribute_hidden;
-#include <dynamicsizehash.c>
+#include <dynamicsizehash_concurrent.c>
diff --git a/libdw/dwarf_sig8_hash.h b/libdw/dwarf_sig8_hash.h
index 705ffbcd..c399919a 100644
--- a/libdw/dwarf_sig8_hash.h
+++ b/libdw/dwarf_sig8_hash.h
@@ -29,10 +29,15 @@
#ifndef _DWARF_SIG8_HASH_H
#define _DWARF_SIG8_HASH_H 1
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include "libdw.h"
+
#define NAME Dwarf_Sig8_Hash
#define TYPE struct Dwarf_CU *
-#define COMPARE(a, b) (0)
-#include <dynamicsizehash.h>
+#include <dynamicsizehash_concurrent.h>
#endif /* dwarf_sig8_hash.h */
diff --git a/libdw/dwarf_tag.c b/libdw/dwarf_tag.c
index 331eaa0d..d784970c 100644
--- a/libdw/dwarf_tag.c
+++ b/libdw/dwarf_tag.c
@@ -45,7 +45,7 @@ __libdw_findabbrev (struct Dwarf_CU *cu, unsigned int code)
return DWARF_END_ABBREV;
/* See whether the entry is already in the hash table. */
- abb = Dwarf_Abbrev_Hash_find (&cu->abbrev_hash, code, NULL);
+ abb = Dwarf_Abbrev_Hash_find (&cu->abbrev_hash, code);
if (abb == NULL)
while (cu->last_abbrev_offset != (size_t) -1l)
{
diff --git a/libdw/libdwP.h b/libdw/libdwP.h
index eebb7d12..36c2acd9 100644
--- a/libdw/libdwP.h
+++ b/libdw/libdwP.h
@@ -31,9 +31,11 @@
#include <libintl.h>
#include <stdbool.h>
+#include <pthread.h>
#include <libdw.h>
#include <dwarf.h>
+#include "atomics.h"
/* gettext helper macros. */
@@ -218,16 +220,22 @@ struct Dwarf
/* Similar for addrx/constx, which will come from .debug_addr section. */
struct Dwarf_CU *fake_addr_cu;
- /* Internal memory handling. This is basically a simplified
+ /* 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. */
+ pthread_rwlock_t mem_rwl;
+
+ /* Internal memory handling. This is basically a simplified thread-local
reimplementation of obstacks. Unfortunately the standard obstack
implementation is not usable in libraries. */
+ size_t mem_stacks;
struct libdw_memblock
{
size_t size;
size_t remaining;
struct libdw_memblock *prev;
char mem[0];
- } *mem_tail;
+ } **mem_tails;
/* Default size of allocated memory blocks. */
size_t mem_default_size;
@@ -570,9 +578,9 @@ libdw_valid_user_form (int form)
extern void __libdw_seterrno (int value) internal_function;
-/* Memory handling, the easy parts. This macro does not do any locking. */
+/* Memory handling, the easy parts. */
#define libdw_alloc(dbg, type, tsize, cnt) \
- ({ struct libdw_memblock *_tail = (dbg)->mem_tail; \
+ ({ struct libdw_memblock *_tail = __libdw_alloc_tail(dbg); \
size_t _required = (tsize) * (cnt); \
type *_result = (type *) (_tail->mem + (_tail->size - _tail->remaining));\
size_t _padding = ((__alignof (type) \
@@ -591,6 +599,23 @@ extern void __libdw_seterrno (int value) internal_function;
#define libdw_typed_alloc(dbg, type) \
libdw_alloc (dbg, type, sizeof (type), 1)
+/* Can only be used to undo the last libdw_alloc. */
+#define libdw_unalloc(dbg, type, tsize, cnt) \
+ ({ struct libdw_memblock *_tail = __libdw_thread_tail (dbg); \
+ size_t _required = (tsize) * (cnt); \
+ /* We cannot know the padding, it is lost. */ \
+ _tail->remaining += _required; }) \
+
+#define libdw_typed_unalloc(dbg, type) \
+ libdw_unalloc (dbg, type, sizeof (type), 1)
+
+/* Callback to choose a thread-local memory allocation stack. */
+extern struct libdw_memblock *__libdw_alloc_tail (Dwarf* dbg)
+ __nonnull_attribute__ (1);
+
+extern struct libdw_memblock *__libdw_thread_tail (Dwarf* dbg)
+ __nonnull_attribute__ (1);
+
/* Callback to allocate more. */
extern void *__libdw_allocate (Dwarf *dbg, size_t minsize, size_t align)
__attribute__ ((__malloc__)) __nonnull_attribute__ (1);
diff --git a/libdw/libdw_alloc.c b/libdw/libdw_alloc.c
index f1e08714..e0281a3d 100644
--- a/libdw/libdw_alloc.c
+++ b/libdw/libdw_alloc.c
@@ -35,7 +35,79 @@
#include <stdlib.h>
#include "libdwP.h"
#include "system.h"
+#include "atomics.h"
+#if USE_VG_ANNOTATIONS == 1
+#include <helgrind.h>
+#else
+#define ANNOTATE_HAPPENS_BEFORE(X)
+#define ANNOTATE_HAPPENS_AFTER(X)
+#endif
+
+#define THREAD_ID_UNSET ((size_t) -1)
+static __thread size_t thread_id = THREAD_ID_UNSET;
+static atomic_size_t next_id = ATOMIC_VAR_INIT(0);
+struct libdw_memblock *
+__libdw_alloc_tail (Dwarf *dbg)
+{
+ if (thread_id == THREAD_ID_UNSET)
+ thread_id = atomic_fetch_add (&next_id, 1);
+
+ pthread_rwlock_rdlock (&dbg->mem_rwl);
+ if (thread_id >= dbg->mem_stacks)
+ {
+ pthread_rwlock_unlock (&dbg->mem_rwl);
+ pthread_rwlock_wrlock (&dbg->mem_rwl);
+
+ /* Another thread may have already reallocated. In theory using an
+ atomic would be faster, but given that this only happens once per
+ thread per Dwarf, some minor slowdown should be fine. */
+ if (thread_id >= dbg->mem_stacks)
+ {
+ dbg->mem_tails = realloc (dbg->mem_tails, (thread_id+1)
+ * sizeof (struct libdw_memblock *));
+ if (dbg->mem_tails == NULL)
+ {
+ pthread_rwlock_unlock (&dbg->mem_rwl);
+ dbg->oom_handler();
+ }
+ for (size_t i = dbg->mem_stacks; i <= thread_id; i++)
+ dbg->mem_tails[i] = NULL;
+ dbg->mem_stacks = thread_id + 1;
+ ANNOTATE_HAPPENS_BEFORE (&dbg->mem_tails);
+ }
+
+ pthread_rwlock_unlock (&dbg->mem_rwl);
+ pthread_rwlock_rdlock (&dbg->mem_rwl);
+ }
+
+ /* At this point, we have an entry in the tail array. */
+ ANNOTATE_HAPPENS_AFTER (&dbg->mem_tails);
+ struct libdw_memblock *result = dbg->mem_tails[thread_id];
+ if (result == NULL)
+ {
+ result = malloc (dbg->mem_default_size);
+ result->size = dbg->mem_default_size
+ - offsetof (struct libdw_memblock, mem);
+ result->remaining = result->size;
+ result->prev = NULL;
+ dbg->mem_tails[thread_id] = result;
+ }
+ pthread_rwlock_unlock (&dbg->mem_rwl);
+ return result;
+}
+
+/* Can only be called after a allocation for this thread has already
+ been done, to possibly undo it. */
+struct libdw_memblock *
+__libdw_thread_tail (Dwarf *dbg)
+{
+ struct libdw_memblock *result;
+ pthread_rwlock_rdlock (&dbg->mem_rwl);
+ result = dbg->mem_tails[thread_id];
+ pthread_rwlock_unlock (&dbg->mem_rwl);
+ return result;
+}
void *
__libdw_allocate (Dwarf *dbg, size_t minsize, size_t align)
@@ -52,8 +124,10 @@ __libdw_allocate (Dwarf *dbg, size_t minsize, size_t align)
newp->size = size - offsetof (struct libdw_memblock, mem);
newp->remaining = (uintptr_t) newp + size - (result + minsize);
- newp->prev = dbg->mem_tail;
- dbg->mem_tail = newp;
+ pthread_rwlock_rdlock (&dbg->mem_rwl);
+ newp->prev = dbg->mem_tails[thread_id];
+ dbg->mem_tails[thread_id] = newp;
+ pthread_rwlock_unlock (&dbg->mem_rwl);
return (void *) result;
}
diff --git a/libdwelf/Makefile.am b/libdwelf/Makefile.am
index dd7adf07..4932b8dd 100644
--- a/libdwelf/Makefile.am
+++ b/libdwelf/Makefile.am
@@ -39,7 +39,7 @@ noinst_LIBRARIES = libdwelf.a libdwelf_pic.a
pkginclude_HEADERS = libdwelf.h
noinst_HEADERS = libdwelfP.h
-libdwelf_a_CFLAGS = -fPIC -fvisibility=hidden $(AM_CFLAGS)
+libdwelf_a_CFLAGS = -fPIC $(AM_CFLAGS)
libdwelf_a_SOURCES = dwelf_elf_gnu_debuglink.c dwelf_dwarf_gnu_debugaltlink.c \
dwelf_elf_gnu_build_id.c dwelf_scn_gnu_compressed_size.c \
dwelf_strtab.c dwelf_elf_begin.c \
diff --git a/libdwfl/ChangeLog b/libdwfl/ChangeLog
index 04a39637..b8222189 100644
--- a/libdwfl/ChangeLog
+++ b/libdwfl/ChangeLog
@@ -1,3 +1,20 @@
+2019-10-28 Aaron Merey <amerey@redhat.com>
+
+ * dwfl_build_id_find_elf.c (dwfl_build_id_find_elf): Call debuginfod
+ client functions via dlopen to look for elf/dwarf files as fallback.
+ * find-debuginfo.c (dwfl_standard_find_debuginfo): Ditto.
+
+2019-10-07 Omar Sandoval <osandov@fb.com>
+
+ * dwfl_frame.c (dwfl_getthreads): Get rid of unnecessary
+ thread_free_all_states calls.
+ (getthread): Ditto.
+ (state_free): Remove function.
+ (thread_free_all_states): Remove function.
+ (free_states): Add function.
+ (dwfl_thread_getframes): Don't update thread->unwound while unwinding.
+ * libdwflP.h (struct Dwfl_Thread): Update comment for unwound member.
+
2019-08-12 Mark Wielaard <mark@klomp.org>
* gzip.c (open_stream): Return DWFL_E_ERRNO on bad file operation.
diff --git a/libdwfl/Makefile.am b/libdwfl/Makefile.am
index d9d13b28..af77bb0c 100644
--- a/libdwfl/Makefile.am
+++ b/libdwfl/Makefile.am
@@ -31,7 +31,7 @@
##
include $(top_srcdir)/config/eu.am
AM_CPPFLAGS += -I$(srcdir) -I$(srcdir)/../libelf -I$(srcdir)/../libebl \
- -I$(srcdir)/../libdw -I$(srcdir)/../libdwelf
+ -I$(srcdir)/../libdw -I$(srcdir)/../libdwelf -I$(srcdir)/../debuginfod
VERSION = 1
noinst_LIBRARIES = libdwfl.a
@@ -39,7 +39,7 @@ noinst_LIBRARIES += libdwfl_pic.a
pkginclude_HEADERS = libdwfl.h
-libdwfl_a_CFLAGS = -fPIC -fvisibility=hidden $(AM_CFLAGS)
+libdwfl_a_CFLAGS = -fPIC $(AM_CFLAGS)
libdwfl_a_SOURCES = dwfl_begin.c dwfl_end.c dwfl_error.c dwfl_version.c \
dwfl_module.c dwfl_report_elf.c relocate.c \
dwfl_module_build_id.c dwfl_module_report_build_id.c \
@@ -70,7 +70,7 @@ libdwfl_a_SOURCES = dwfl_begin.c dwfl_end.c dwfl_error.c dwfl_version.c \
link_map.c core-file.c open.c image-header.c \
dwfl_frame.c frame_unwind.c dwfl_frame_pc.c \
linux-pid-attach.c linux-core-attach.c dwfl_frame_regs.c \
- gzip.c
+ gzip.c debuginfod-client.c
if BZLIB
libdwfl_a_SOURCES += bzip2.c
diff --git a/libdwfl/debuginfod-client.c b/libdwfl/debuginfod-client.c
new file mode 100644
index 00000000..ee604ad9
--- /dev/null
+++ b/libdwfl/debuginfod-client.c
@@ -0,0 +1,131 @@
+/* Try to get an ELF or debug file through the debuginfod.
+ Copyright (C) 2019 Red Hat, Inc.
+ This file is part of elfutils.
+
+ This file is free software; you can redistribute it and/or modify
+ it under the terms of either
+
+ * the GNU Lesser General Public License as published by the Free
+ Software Foundation; either version 3 of the License, or (at
+ your option) any later version
+
+ or
+
+ * the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at
+ your option) any later version
+
+ or both in parallel, as here.
+
+ elfutils is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received copies of the GNU General Public License and
+ the GNU Lesser General Public License along with this program. If
+ not, see <http://www.gnu.org/licenses/>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include "libdwflP.h"
+#include <dlfcn.h>
+
+static __typeof__ (debuginfod_begin) *fp_debuginfod_begin;
+static __typeof__ (debuginfod_find_executable) *fp_debuginfod_find_executable;
+static __typeof__ (debuginfod_find_debuginfo) *fp_debuginfod_find_debuginfo;
+static __typeof__ (debuginfod_end) *fp_debuginfod_end;
+
+/* NB: this is slightly thread-unsafe */
+
+static debuginfod_client *
+get_client (Dwfl *dwfl)
+{
+ if (dwfl->debuginfod != NULL)
+ return dwfl->debuginfod;
+
+ if (fp_debuginfod_begin != NULL)
+ {
+ dwfl->debuginfod = (*fp_debuginfod_begin) ();
+ return dwfl->debuginfod;
+ }
+
+ return NULL;
+}
+
+int
+__libdwfl_debuginfod_find_executable (Dwfl *dwfl,
+ const unsigned char *build_id_bits,
+ size_t build_id_len)
+{
+ int fd = -1;
+ if (build_id_len > 0)
+ {
+ debuginfod_client *c = get_client (dwfl);
+ if (c != NULL)
+ fd = (*fp_debuginfod_find_executable) (c, build_id_bits,
+ build_id_len, NULL);
+ }
+
+ return fd;
+}
+
+int
+__libdwfl_debuginfod_find_debuginfo (Dwfl *dwfl,
+ const unsigned char *build_id_bits,
+ size_t build_id_len)
+{
+ int fd = -1;
+ if (build_id_len > 0)
+ {
+ debuginfod_client *c = get_client (dwfl);
+ if (c != NULL)
+ fd = (*fp_debuginfod_find_debuginfo) (c, build_id_bits,
+ build_id_len, NULL);
+ }
+
+ return fd;
+}
+
+void
+__libdwfl_debuginfod_end (debuginfod_client *c)
+{
+ if (c != NULL)
+ (*fp_debuginfod_end) (c);
+}
+
+/* Try to get the libdebuginfod library functions to make sure
+ everything is initialized early. */
+void __attribute__ ((constructor))
+__libdwfl_debuginfod_init (void)
+{
+ void *debuginfod_so = dlopen("libdebuginfod-" VERSION ".so", RTLD_LAZY);
+
+ if (debuginfod_so == NULL)
+ debuginfod_so = dlopen("libdebuginfod.so", RTLD_LAZY);
+
+ if (debuginfod_so != NULL)
+ {
+ fp_debuginfod_begin = dlsym (debuginfod_so, "debuginfod_begin");
+ fp_debuginfod_find_executable = dlsym (debuginfod_so,
+ "debuginfod_find_executable");
+ fp_debuginfod_find_debuginfo = dlsym (debuginfod_so,
+ "debuginfod_find_debuginfo");
+ fp_debuginfod_end = dlsym (debuginfod_so, "debuginfod_end");
+
+ /* We either get them all, or we get none. */
+ if (fp_debuginfod_begin == NULL
+ || fp_debuginfod_find_executable == NULL
+ || fp_debuginfod_find_debuginfo == NULL
+ || fp_debuginfod_end == NULL)
+ {
+ fp_debuginfod_begin = NULL;
+ fp_debuginfod_find_executable = NULL;
+ fp_debuginfod_find_debuginfo = NULL;
+ fp_debuginfod_end = NULL;
+ dlclose (debuginfod_so);
+ }
+ }
+}
diff --git a/libdwfl/dwfl_build_id_find_elf.c b/libdwfl/dwfl_build_id_find_elf.c
index cc6c3f62..4e56143f 100644
--- a/libdwfl/dwfl_build_id_find_elf.c
+++ b/libdwfl/dwfl_build_id_find_elf.c
@@ -1,5 +1,5 @@
/* Find an ELF file for a module from its build ID.
- Copyright (C) 2007-2010, 2014, 2015 Red Hat, Inc.
+ Copyright (C) 2007-2010, 2014, 2015, 2019 Red Hat, Inc.
This file is part of elfutils.
This file is free software; you can redistribute it and/or modify
@@ -187,7 +187,17 @@ dwfl_build_id_find_elf (Dwfl_Module *mod,
free (*file_name);
*file_name = NULL;
}
- else if (errno == 0 && mod->build_id_len > 0)
+ else
+ {
+ /* If all else fails and a build-id is available, query the
+ debuginfo-server if enabled. */
+ if (fd < 0 && mod->build_id_len > 0)
+ fd = __libdwfl_debuginfod_find_executable (mod->dwfl,
+ mod->build_id_bits,
+ mod->build_id_len);
+ }
+
+ if (fd < 0 && errno == 0 && mod->build_id_len > 0)
/* Setting this with no file yet loaded is a marker that
the build ID is authoritative even if we also know a
putative *FILE_NAME. */
diff --git a/libdwfl/dwfl_end.c b/libdwfl/dwfl_end.c
index 74ee9e07..4f6c722a 100644
--- a/libdwfl/dwfl_end.c
+++ b/libdwfl/dwfl_end.c
@@ -39,6 +39,8 @@ dwfl_end (Dwfl *dwfl)
if (dwfl == NULL)
return;
+ __libdwfl_debuginfod_end (dwfl->debuginfod);
+
if (dwfl->process)
__libdwfl_process_free (dwfl->process);
diff --git a/libdwfl/dwfl_frame.c b/libdwfl/dwfl_frame.c
index 881f735a..5bbf850e 100644
--- a/libdwfl/dwfl_frame.c
+++ b/libdwfl/dwfl_frame.c
@@ -71,19 +71,14 @@ state_fetch_pc (Dwfl_Frame *state)
/* Do not call it on your own, to be used by thread_* functions only. */
static void
-state_free (Dwfl_Frame *state)
+free_states (Dwfl_Frame *state)
{
- Dwfl_Thread *thread = state->thread;
- assert (thread->unwound == state);
- thread->unwound = state->unwound;
- free (state);
-}
-
-static void
-thread_free_all_states (Dwfl_Thread *thread)
-{
- while (thread->unwound)
- state_free (thread->unwound);
+ while (state)
+ {
+ Dwfl_Frame *next = state->unwound;
+ free(state);
+ state = next;
+ }
}
static Dwfl_Frame *
@@ -279,24 +274,15 @@ dwfl_getthreads (Dwfl *dwfl, int (*callback) (Dwfl_Thread *thread, void *arg),
process->callbacks_arg,
&thread.callbacks_arg);
if (thread.tid < 0)
- {
- Dwfl_Error saved_errno = dwfl_errno ();
- thread_free_all_states (&thread);
- __libdwfl_seterrno (saved_errno);
- return -1;
- }
+ return -1;
if (thread.tid == 0)
{
- thread_free_all_states (&thread);
__libdwfl_seterrno (DWFL_E_NOERROR);
return 0;
}
int err = callback (&thread, arg);
if (err != DWARF_CB_OK)
- {
- thread_free_all_states (&thread);
- return err;
- }
+ return err;
assert (thread.unwound == NULL);
}
/* NOTREACHED */
@@ -356,11 +342,8 @@ getthread (Dwfl *dwfl, pid_t tid,
if (process->callbacks->get_thread (dwfl, tid, process->callbacks_arg,
&thread.callbacks_arg))
{
- int err;
thread.tid = tid;
- err = callback (&thread, arg);
- thread_free_all_states (&thread);
- return err;
+ return callback (&thread, arg);
}
return -1;
@@ -411,12 +394,6 @@ dwfl_thread_getframes (Dwfl_Thread *thread,
int (*callback) (Dwfl_Frame *state, void *arg),
void *arg)
{
- if (thread->unwound != NULL)
- {
- /* We had to be called from inside CALLBACK. */
- __libdwfl_seterrno (DWFL_E_ATTACH_STATE_CONFLICT);
- return -1;
- }
Ebl *ebl = thread->process->ebl;
if (ebl_frame_nregs (ebl) == 0)
{
@@ -432,33 +409,34 @@ dwfl_thread_getframes (Dwfl_Thread *thread,
if (! process->callbacks->set_initial_registers (thread,
thread->callbacks_arg))
{
- thread_free_all_states (thread);
+ free_states (thread->unwound);
+ thread->unwound = NULL;
return -1;
}
- if (! state_fetch_pc (thread->unwound))
+ Dwfl_Frame *state = thread->unwound;
+ thread->unwound = NULL;
+ if (! state_fetch_pc (state))
{
if (process->callbacks->thread_detach)
process->callbacks->thread_detach (thread, thread->callbacks_arg);
- thread_free_all_states (thread);
+ free_states (state);
return -1;
}
-
- Dwfl_Frame *state;
do
{
- state = thread->unwound;
int err = callback (state, arg);
if (err != DWARF_CB_OK)
{
if (process->callbacks->thread_detach)
process->callbacks->thread_detach (thread, thread->callbacks_arg);
- thread_free_all_states (thread);
+ free_states (state);
return err;
}
__libdwfl_frame_unwind (state);
+ Dwfl_Frame *next = state->unwound;
/* The old frame is no longer needed. */
- state_free (thread->unwound);
- state = thread->unwound;
+ free (state);
+ state = next;
}
while (state && state->pc_state == DWFL_FRAME_STATE_PC_SET);
@@ -467,12 +445,12 @@ dwfl_thread_getframes (Dwfl_Thread *thread,
process->callbacks->thread_detach (thread, thread->callbacks_arg);
if (state == NULL || state->pc_state == DWFL_FRAME_STATE_ERROR)
{
- thread_free_all_states (thread);
+ free_states (state);
__libdwfl_seterrno (err);
return -1;
}
assert (state->pc_state == DWFL_FRAME_STATE_PC_UNDEFINED);
- thread_free_all_states (thread);
+ free_states (state);
return 0;
}
INTDEF(dwfl_thread_getframes)
diff --git a/libdwfl/find-debuginfo.c b/libdwfl/find-debuginfo.c
index 9267788d..40857645 100644
--- a/libdwfl/find-debuginfo.c
+++ b/libdwfl/find-debuginfo.c
@@ -1,5 +1,5 @@
/* Standard find_debuginfo callback for libdwfl.
- Copyright (C) 2005-2010, 2014, 2015 Red Hat, Inc.
+ Copyright (C) 2005-2010, 2014, 2015, 2019 Red Hat, Inc.
This file is part of elfutils.
This file is free software; you can redistribute it and/or modify
@@ -359,7 +359,8 @@ dwfl_standard_find_debuginfo (Dwfl_Module *mod,
other than just by finding nothing, that's all we do. */
const unsigned char *bits;
GElf_Addr vaddr;
- if (INTUSE(dwfl_module_build_id) (mod, &bits, &vaddr) > 0)
+ int bits_len;
+ if ((bits_len = INTUSE(dwfl_module_build_id) (mod, &bits, &vaddr)) > 0)
{
/* Dropping most arguments means we cannot rely on them in
dwfl_build_id_find_debuginfo. But leave it that way since
@@ -397,6 +398,9 @@ dwfl_standard_find_debuginfo (Dwfl_Module *mod,
free (canon);
}
+ if (fd < 0 && bits_len > 0)
+ fd = __libdwfl_debuginfod_find_debuginfo (mod->dwfl, bits, bits_len);
+
return fd;
}
INTDEF (dwfl_standard_find_debuginfo)
diff --git a/libdwfl/libdwflP.h b/libdwfl/libdwflP.h
index 941a8b66..f631f946 100644
--- a/libdwfl/libdwflP.h
+++ b/libdwfl/libdwflP.h
@@ -40,6 +40,7 @@
#include "../libdw/libdwP.h" /* We need its INTDECLs. */
#include "../libdwelf/libdwelfP.h"
+#include "../debuginfod/debuginfod.h"
typedef struct Dwfl_Process Dwfl_Process;
@@ -114,6 +115,7 @@ struct Dwfl_User_Core
struct Dwfl
{
const Dwfl_Callbacks *callbacks;
+ debuginfod_client *debuginfod;
Dwfl_Module *modulelist; /* List in order used by full traversals. */
@@ -242,8 +244,7 @@ struct Dwfl_Thread
{
Dwfl_Process *process;
pid_t tid;
- /* The current frame being unwound. Initially it is the bottom frame.
- Later the processed frames get freed and this pointer is updated. */
+ /* Bottom (innermost) frame while we're initializing, NULL afterwards. */
Dwfl_Frame *unwound;
void *callbacks_arg;
};
@@ -635,6 +636,19 @@ extern Dwfl_Error __libdw_open_elf (int fd, Elf **elfp) internal_function;
extern bool __libdwfl_dynamic_vaddr_get (Elf *elf, GElf_Addr *vaddrp)
internal_function;
+/* Internal interface to libdebuginfod (if installed). */
+int
+__libdwfl_debuginfod_find_executable (Dwfl *dwfl,
+ const unsigned char *build_id_bits,
+ size_t build_id_len);
+int
+__libdwfl_debuginfod_find_debuginfo (Dwfl *dwfl,
+ const unsigned char *build_id_bits,
+ size_t build_id_len);
+void
+__libdwfl_debuginfod_end (debuginfod_client *c);
+
+
/* These are working nicely for --core, but are not ready to be
exported interfaces quite yet. */
diff --git a/libebl/ChangeLog b/libebl/ChangeLog
index bb91c152..4da7eeeb 100644
--- a/libebl/ChangeLog
+++ b/libebl/ChangeLog
@@ -1,3 +1,20 @@
+2019-08-29 Mark Wielaard <mark@klomp.org>
+
+ * Makefile.am (noinst_LIBRARIES): Add libebl.a.
+ (noinst_HEADERS): Add libebl.h.
+
+2019-07-05 Omar Sandoval <osandov@fb.com>
+
+ * Makefile.am: Make libebl.a non-PIC by default.
+ Add libebl_pic.a.
+ Remove LIBEBL_SUBDIR definition.
+ (gen_SOURCES): Remove.
+ * eblopenbackend.c (machines): Replace dsoname with init callback.
+ (try_dlopen): Remove.
+ (openbackend): Use machine callback instead of try_dlopen().
+ Don't assign result->dlhandle.
+ * eblclosebackend.c (ebl_closebackend): Remove dlclose() call.
+
2019-04-29 Mao Han <han_mao@c-sky.com>
* eblopenbackend.c: Add C-SKY.
diff --git a/libebl/Makefile.am b/libebl/Makefile.am
index ecebdd06..e488dd36 100644
--- a/libebl/Makefile.am
+++ b/libebl/Makefile.am
@@ -28,37 +28,39 @@
## not, see <http://www.gnu.org/licenses/>.
##
include $(top_srcdir)/config/eu.am
+if BUILD_STATIC
AM_CFLAGS += $(fpic_CFLAGS)
+endif
AM_CPPFLAGS += -I$(srcdir)/../libelf -I$(srcdir)/../libdw -I$(srcdir)/../libasm
VERSION = 1
-LIBEBL_SUBDIR = @LIBEBL_SUBDIR@
-lib_LIBRARIES = libebl.a
+noinst_LIBRARIES = libebl.a libebl_pic.a
-pkginclude_HEADERS = libebl.h
+libebl_a_SOURCES = eblopenbackend.c eblclosebackend.c eblreloctypename.c \
+ eblsegmenttypename.c eblsectiontypename.c \
+ eblmachineflagname.c eblsymboltypename.c \
+ ebldynamictagname.c eblsectionname.c \
+ eblsymbolbindingname.c eblbackendname.c eblosabiname.c \
+ eblmachineflagcheck.c eblmachinesectionflagcheck.c \
+ eblreloctypecheck.c eblrelocvaliduse.c \
+ eblrelocsimpletype.c ebldynamictagcheck.c \
+ eblcorenotetypename.c eblobjnotetypename.c eblcorenote.c \
+ eblobjnote.c ebldebugscnp.c eblgotpcreloccheck.c \
+ eblcopyrelocp.c eblsectionstripp.c eblelfclass.c \
+ eblelfdata.c eblelfmachine.c ebl_check_special_symbol.c \
+ eblbsspltp.c eblretval.c eblreginfo.c eblnonerelocp.c \
+ eblrelativerelocp.c eblsysvhashentrysize.c eblauxvinfo.c \
+ eblcheckobjattr.c ebl_check_special_section.c \
+ ebl_syscall_abi.c eblabicfi.c eblstother.c eblinitreg.c \
+ ebldwarftoregno.c eblnormalizepc.c eblunwind.c \
+ eblresolvesym.c eblcheckreloctargettype.c \
+ ebl_data_marker_symbol.c
-gen_SOURCES = eblopenbackend.c eblclosebackend.c \
- eblreloctypename.c eblsegmenttypename.c \
- eblsectiontypename.c eblmachineflagname.c \
- eblsymboltypename.c ebldynamictagname.c eblsectionname.c \
- eblsymbolbindingname.c eblbackendname.c eblosabiname.c \
- eblmachineflagcheck.c eblmachinesectionflagcheck.c \
- eblreloctypecheck.c eblrelocvaliduse.c eblrelocsimpletype.c \
- ebldynamictagcheck.c eblcorenotetypename.c eblobjnotetypename.c \
- eblcorenote.c eblobjnote.c ebldebugscnp.c \
- eblgotpcreloccheck.c eblcopyrelocp.c eblsectionstripp.c \
- eblelfclass.c eblelfdata.c eblelfmachine.c \
- ebl_check_special_symbol.c eblbsspltp.c eblretval.c \
- eblreginfo.c eblnonerelocp.c eblrelativerelocp.c \
- eblsysvhashentrysize.c eblauxvinfo.c eblcheckobjattr.c \
- ebl_check_special_section.c ebl_syscall_abi.c eblabicfi.c \
- eblstother.c eblinitreg.c ebldwarftoregno.c eblnormalizepc.c \
- eblunwind.c eblresolvesym.c eblcheckreloctargettype.c \
- ebl_data_marker_symbol.c
+libebl_pic_a_SOURCES =
+am_libebl_pic_a_OBJECTS = $(libebl_a_SOURCES:.c=.os)
-libebl_a_CFLAGS = -fvisibility=hidden $(AM_CFLAGS)
-libebl_a_SOURCES = $(gen_SOURCES)
+libebl_a_CFLAGS = -fPIC $(AM_CFLAGS)
-noinst_HEADERS = libeblP.h ebl-hooks.h
+noinst_HEADERS = libebl.h libeblP.h ebl-hooks.h
-CLEANFILES += $(am_libebl_pic_a_OBJECTS)
+MOSTLYCLEANFILES = $(am_libebl_pic_a_OBJECTS)
diff --git a/libebl/eblopenbackend.c b/libebl/eblopenbackend.c
index 9431897b..db000632 100644
--- a/libebl/eblopenbackend.c
+++ b/libebl/eblopenbackend.c
@@ -41,14 +41,14 @@
#include <system.h>
#include <libeblP.h>
-const char *i386_init (Elf *elf, GElf_Half machine, Ebl *eh, size_t ehlen);
-const char *x86_64_init (Elf *elf, GElf_Half machine, Ebl *eh, size_t ehlen);
-const char *ppc_init (Elf *elf, GElf_Half machine, Ebl *eh, size_t ehlen);
-const char *ppc64_init (Elf *elf, GElf_Half machine, Ebl *eh, size_t ehlen);
-const char *ia64_init (Elf *elf, GElf_Half machine, Ebl *eh, size_t ehlen);
-const char *s390_init (Elf *elf, GElf_Half machine, Ebl *eh, size_t ehlen);
-const char *aarch64_init (Elf *elf, GElf_Half machine, Ebl *eh, size_t ehlen);
-const char *bpf_init (Elf *elf, GElf_Half machine, Ebl *eh, size_t ehlen);
+const char *i386_init (Elf *, GElf_Half, Ebl *eh, size_t ehlen);
+const char *x86_64_init (Elf *, GElf_Half, Ebl *eh, size_t ehlen);
+const char *ppc_init (Elf *, GElf_Half, Ebl *eh, size_t ehlen);
+const char *ppc64_init (Elf *, GElf_Half, Ebl *eh, size_t ehlen);
+const char *ia64_init (Elf *, GElf_Half, Ebl *eh, size_t ehlen);
+const char *s390_init (Elf *, GElf_Half, Ebl *eh, size_t ehlen);
+const char *aarch64_init (Elf *, GElf_Half, Ebl *eh, size_t ehlen);
+const char *bpf_init (Elf *, GElf_Half, Ebl *eh, size_t ehlen);
/* This table should contain the complete list of architectures as far
as the ELF specification is concerned. */
@@ -56,7 +56,7 @@ const char *bpf_init (Elf *elf, GElf_Half machine, Ebl *eh, size_t ehlen);
arrays to avoid relocations. */
static const struct
{
- ebl_bhinit_t initptr;
+ ebl_bhinit_t init;
const char *emulation;
const char *prefix;
int prefix_len;
@@ -321,43 +321,17 @@ openbackend (Elf *elf, const char *emulation, GElf_Half machine)
result->data = elf->state.elf32.ehdr->e_ident[EI_DATA];
}
-#ifndef LIBEBL_SUBDIR
-# define LIBEBL_SUBDIR PACKAGE
-#endif
-
-/* This works if libebl has been staticly linked into a binary.
- It might also work for shared libraries when installed in
- ${prefix}/lib/ or ${prefix}/lib64/, but not for multiarch
- library installs like ${prefix}/lib/i386-linux-gnu/ */
-#define BINORIGINDIR "$ORIGIN/../$LIB/" LIBEBL_SUBDIR "/"
-
-/* This works if libebl has been linked into a shared library,
- just look in the subdir. */
-#define LIBORIGINDIR "$ORIGIN/" LIBEBL_SUBDIR "/"
-
- ebl_bhinit_t initp = machines[cnt].initptr;
- if (1)
- {
- static const char version[] = MODVERSION;
- const char *modversion;
- if (initp != NULL
- && (modversion = initp (elf, machine, result, sizeof (Ebl)))
- && strcmp (version, modversion) == 0)
- {
- /* We found a module to handle our file. */
- result->dlhandle = NULL;
- result->elf = elf;
-
- /* A few entries are mandatory. */
- assert (result->destr != NULL);
-
- return result;
- }
- }
+ if (machines[cnt].init &&
+ machines[cnt].init (elf, machine, result, sizeof(Ebl)))
+ {
+ result->elf = elf;
+ /* A few entries are mandatory. */
+ assert (result->destr != NULL);
+ return result;
+ }
- /* We cannot find a DSO but the emulation/machine ID matches.
+ /* We don't have a backend but the emulation/machine ID matches.
Return that information. */
- result->dlhandle = NULL;
result->elf = elf;
fill_defaults (result);
@@ -365,7 +339,6 @@ openbackend (Elf *elf, const char *emulation, GElf_Half machine)
}
/* Nothing matched. We use only the default callbacks. */
- result->dlhandle = NULL;
result->elf = elf;
result->emulation = "<unknown>";
fill_defaults (result);
diff --git a/libebl/libebl.h b/libebl/libebl.h
index 24922eb8..06a14c45 100644
--- a/libebl/libebl.h
+++ b/libebl/libebl.h
@@ -30,13 +30,7 @@
/* This is the interface for the Elfutils Backend Library.
It is a completely UNSUPPORTED interface. Don't use any libebl
function directly. These are only for internal elfutils backends
- and tools. There is NO source or binary compatible guarantee.
-
- The ABI of the backend modules is not guaranteed. Really, no guarantee
- whatsoever. We are enforcing this in the code. The modules and their
- users must match. No third-party EBL module are supported or allowed.
- The only reason there are separate modules is to not have the code for
- all architectures in all the binaries. */
+ and tools. There is NO source or binary compatible guarantee. */
#ifndef _LIBEBL_H
diff --git a/libebl/libeblP.h b/libebl/libeblP.h
index a5869685..fd0fcc98 100644
--- a/libebl/libeblP.h
+++ b/libebl/libeblP.h
@@ -77,9 +77,6 @@ struct ebl
ebl_resolve_sym_value if available for this arch. */
GElf_Addr fd_addr;
Elf_Data *fd_data;
-
- /* Internal data. */
- void *dlhandle;
};
diff --git a/libelf/Makefile.am b/libelf/Makefile.am
index 0d8679f2..51e86dc8 100644
--- a/libelf/Makefile.am
+++ b/libelf/Makefile.am
@@ -51,7 +51,7 @@ endif
pkginclude_HEADERS = elf-knowledge.h
-libelf_a_CFLAGS = -fPIC -fvisibility=hidden $(AM_CFLAGS)
+libelf_a_CFLAGS = -fPIC $(AM_CFLAGS)
libelf_a_SOURCES = elf_version.c elf_hash.c elf_error.c elf_fill.c \
elf_begin.c elf_next.c elf_rand.c elf_end.c elf_kind.c \
gelf_getclass.c elf_getbase.c elf_getident.c \
diff --git a/m4/ChangeLog b/m4/ChangeLog
index 9ee06d75..8ab0ff39 100644
--- a/m4/ChangeLog
+++ b/m4/ChangeLog
@@ -1,3 +1,7 @@
+2019-10-28 Aaron Merey <amerey@redhat.com>
+
+ * ax_check_compile_flag.m4, ax_cxx_compile_stdcxx.m4: New files.
+
2015-05-01 Mark Wielaard <mjw@redhat.com>
* zip.m4: Explicitly set with_ to no, if not yes.
diff --git a/m4/Makefile.am b/m4/Makefile.am
index 3b0e1145..ae7a5657 100644
--- a/m4/Makefile.am
+++ b/m4/Makefile.am
@@ -18,4 +18,4 @@
##
##m4-files-begin
-EXTRA_DIST = codeset.m4 gettext.m4 iconv.m4 lcmessage.m4 progtest.m4 zip.m4
+EXTRA_DIST = codeset.m4 gettext.m4 iconv.m4 lcmessage.m4 progtest.m4 zip.m4 ax_check_compile_flag.m4 ax_cxx_compile_stdcxx.m4
diff --git a/m4/ax_check_compile_flag.m4 b/m4/ax_check_compile_flag.m4
new file mode 100644
index 00000000..ca363971
--- /dev/null
+++ b/m4/ax_check_compile_flag.m4
@@ -0,0 +1,74 @@
+# ===========================================================================
+# http://www.gnu.org/software/autoconf-archive/ax_check_compile_flag.html
+# ===========================================================================
+#
+# SYNOPSIS
+#
+# AX_CHECK_COMPILE_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS], [INPUT])
+#
+# DESCRIPTION
+#
+# Check whether the given FLAG works with the current language's compiler
+# or gives an error. (Warnings, however, are ignored)
+#
+# ACTION-SUCCESS/ACTION-FAILURE are shell commands to execute on
+# success/failure.
+#
+# If EXTRA-FLAGS is defined, it is added to the current language's default
+# flags (e.g. CFLAGS) when the check is done. The check is thus made with
+# the flags: "CFLAGS EXTRA-FLAGS FLAG". This can for example be used to
+# force the compiler to issue an error when a bad flag is given.
+#
+# INPUT gives an alternative input source to AC_COMPILE_IFELSE.
+#
+# NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this
+# macro in sync with AX_CHECK_{PREPROC,LINK}_FLAG.
+#
+# LICENSE
+#
+# Copyright (c) 2008 Guido U. Draheim <guidod@gmx.de>
+# Copyright (c) 2011 Maarten Bosmans <mkbosmans@gmail.com>
+#
+# This program 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.
+#
+# This program 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/>.
+#
+# As a special exception, the respective Autoconf Macro's copyright owner
+# gives unlimited permission to copy, distribute and modify the configure
+# scripts that are the output of Autoconf when processing the Macro. You
+# need not follow the terms of the GNU General Public License when using
+# or distributing such scripts, even though portions of the text of the
+# Macro appear in them. The GNU General Public License (GPL) does govern
+# all other use of the material that constitutes the Autoconf Macro.
+#
+# This special exception to the GPL applies to versions of the Autoconf
+# Macro released by the Autoconf Archive. When you make and distribute a
+# modified version of the Autoconf Macro, you may extend this special
+# exception to the GPL to apply to your modified version as well.
+
+#serial 4
+
+AC_DEFUN([AX_CHECK_COMPILE_FLAG],
+[AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_IF
+AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_[]_AC_LANG_ABBREV[]flags_$4_$1])dnl
+AC_CACHE_CHECK([whether _AC_LANG compiler accepts $1], CACHEVAR, [
+ ax_check_save_flags=$[]_AC_LANG_PREFIX[]FLAGS
+ _AC_LANG_PREFIX[]FLAGS="$[]_AC_LANG_PREFIX[]FLAGS $4 $1"
+ AC_COMPILE_IFELSE([m4_default([$5],[AC_LANG_PROGRAM()])],
+ [AS_VAR_SET(CACHEVAR,[yes])],
+ [AS_VAR_SET(CACHEVAR,[no])])
+ _AC_LANG_PREFIX[]FLAGS=$ax_check_save_flags])
+AS_VAR_IF(CACHEVAR,yes,
+ [m4_default([$2], :)],
+ [m4_default([$3], :)])
+AS_VAR_POPDEF([CACHEVAR])dnl
+])dnl AX_CHECK_COMPILE_FLAGS
diff --git a/m4/ax_cxx_compile_stdcxx.m4 b/m4/ax_cxx_compile_stdcxx.m4
new file mode 100644
index 00000000..8adc7656
--- /dev/null
+++ b/m4/ax_cxx_compile_stdcxx.m4
@@ -0,0 +1,556 @@
+# ===========================================================================
+# http://www.gnu.org/software/autoconf-archive/ax_cxx_compile_stdcxx.html
+# ===========================================================================
+#
+# SYNOPSIS
+#
+# AX_CXX_COMPILE_STDCXX(VERSION, [ext|noext], [mandatory|optional])
+#
+# DESCRIPTION
+#
+# Check for baseline language coverage in the compiler for the specified
+# version of the C++ standard. If necessary, add switches to CXX to
+# enable support. VERSION may be '11' (for the C++11 standard) or '14'
+# (for the C++14 standard).
+#
+# The second argument, if specified, indicates whether you insist on an
+# extended mode (e.g. -std=gnu++11) or a strict conformance mode (e.g.
+# -std=c++11). If neither is specified, you get whatever works, with
+# preference for an extended mode.
+#
+# The third argument, if specified 'mandatory' or if left unspecified,
+# indicates that baseline support for the specified C++ standard is
+# required and that the macro should error out if no mode with that
+# support is found. If specified 'optional', then configuration proceeds
+# regardless, after defining HAVE_CXX${VERSION} if and only if a
+# supporting mode is found.
+#
+# LICENSE
+#
+# Copyright (c) 2008 Benjamin Kosnik <bkoz@redhat.com>
+# Copyright (c) 2012 Zack Weinberg <zackw@panix.com>
+# Copyright (c) 2013 Roy Stogner <roystgnr@ices.utexas.edu>
+# Copyright (c) 2014, 2015 Google Inc.; contributed by Alexey Sokolov <sokolov@google.com>
+# Copyright (c) 2015 Paul Norman <penorman@mac.com>
+# Copyright (c) 2015 Moritz Klammler <moritz@klammler.eu>
+#
+# Copying and distribution of this file, with or without modification, are
+# permitted in any medium without royalty provided the copyright notice
+# and this notice are preserved. This file is offered as-is, without any
+# warranty.
+
+#serial 3
+
+dnl This macro is based on the code from the AX_CXX_COMPILE_STDCXX_11 macro
+dnl (serial version number 13).
+
+AC_DEFUN([AX_CXX_COMPILE_STDCXX], [dnl
+ m4_if([$1], [11], [],
+ [$1], [14], [],
+ [$1], [17], [m4_fatal([support for C++17 not yet implemented in AX_CXX_COMPILE_STDCXX])],
+ [m4_fatal([invalid first argument `$1' to AX_CXX_COMPILE_STDCXX])])dnl
+ m4_if([$2], [], [],
+ [$2], [ext], [],
+ [$2], [noext], [],
+ [m4_fatal([invalid second argument `$2' to AX_CXX_COMPILE_STDCXX])])dnl
+ m4_if([$3], [], [ax_cxx_compile_cxx$1_required=true],
+ [$3], [mandatory], [ax_cxx_compile_cxx$1_required=true],
+ [$3], [optional], [ax_cxx_compile_cxx$1_required=false],
+ [m4_fatal([invalid third argument `$3' to AX_CXX_COMPILE_STDCXX])])
+ AC_LANG_PUSH([C++])dnl
+ ac_success=no
+ AC_CACHE_CHECK(whether $CXX supports C++$1 features by default,
+ ax_cv_cxx_compile_cxx$1,
+ [AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])],
+ [ax_cv_cxx_compile_cxx$1=yes],
+ [ax_cv_cxx_compile_cxx$1=no])])
+ if test x$ax_cv_cxx_compile_cxx$1 = xyes; then
+ ac_success=yes
+ fi
+
+ m4_if([$2], [noext], [], [dnl
+ if test x$ac_success = xno; then
+ for switch in -std=gnu++$1 -std=gnu++0x; do
+ cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx$1_$switch])
+ AC_CACHE_CHECK(whether $CXX supports C++$1 features with $switch,
+ $cachevar,
+ [ac_save_CXX="$CXX"
+ CXX="$CXX $switch"
+ AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])],
+ [eval $cachevar=yes],
+ [eval $cachevar=no])
+ CXX="$ac_save_CXX"])
+ if eval test x\$$cachevar = xyes; then
+ CXX="$CXX $switch"
+ ac_success=yes
+ break
+ fi
+ done
+ fi])
+
+ m4_if([$2], [ext], [], [dnl
+ if test x$ac_success = xno; then
+ dnl HP's aCC needs +std=c++11 according to:
+ dnl http://h21007.www2.hp.com/portal/download/files/unprot/aCxx/PDF_Release_Notes/769149-001.pdf
+ dnl Cray's crayCC needs "-h std=c++11"
+ for switch in -std=c++$1 -std=c++0x +std=c++$1 "-h std=c++$1"; do
+ cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx$1_$switch])
+ AC_CACHE_CHECK(whether $CXX supports C++$1 features with $switch,
+ $cachevar,
+ [ac_save_CXX="$CXX"
+ CXX="$CXX $switch"
+ AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])],
+ [eval $cachevar=yes],
+ [eval $cachevar=no])
+ CXX="$ac_save_CXX"])
+ if eval test x\$$cachevar = xyes; then
+ CXX="$CXX $switch"
+ ac_success=yes
+ break
+ fi
+ done
+ fi])
+ AC_LANG_POP([C++])
+ if test x$ax_cxx_compile_cxx$1_required = xtrue; then
+ if test x$ac_success = xno; then
+ AC_MSG_ERROR([*** A compiler with support for C++$1 language features is required.])
+ fi
+ fi
+ if test x$ac_success = xno; then
+ HAVE_CXX$1=0
+ AC_MSG_NOTICE([No compiler with C++$1 support was found])
+ else
+ HAVE_CXX$1=1
+ AC_DEFINE(HAVE_CXX$1,1,
+ [define if the compiler supports basic C++$1 syntax])
+ fi
+ AC_SUBST(HAVE_CXX$1)
+])
+
+
+dnl Test body for checking C++11 support
+
+m4_define([_AX_CXX_COMPILE_STDCXX_testbody_11],
+ _AX_CXX_COMPILE_STDCXX_testbody_new_in_11
+)
+
+
+dnl Test body for checking C++14 support
+
+m4_define([_AX_CXX_COMPILE_STDCXX_testbody_14],
+ _AX_CXX_COMPILE_STDCXX_testbody_new_in_11
+ _AX_CXX_COMPILE_STDCXX_testbody_new_in_14
+)
+
+
+dnl Tests for new features in C++11
+
+m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_11], [[
+
+// If the compiler admits that it is not ready for C++11, why torture it?
+// Hopefully, this will speed up the test.
+
+#ifndef __cplusplus
+
+#error "This is not a C++ compiler"
+
+#elif __cplusplus < 201103L
+
+#error "This is not a C++11 compiler"
+
+#else
+
+namespace cxx11
+{
+
+ namespace test_static_assert
+ {
+
+ template <typename T>
+ struct check
+ {
+ static_assert(sizeof(int) <= sizeof(T), "not big enough");
+ };
+
+ }
+
+ namespace test_final_override
+ {
+
+ struct Base
+ {
+ virtual void f() {}
+ };
+
+ struct Derived : public Base
+ {
+ virtual void f() override {}
+ };
+
+ }
+
+ namespace test_double_right_angle_brackets
+ {
+
+ template < typename T >
+ struct check {};
+
+ typedef check<void> single_type;
+ typedef check<check<void>> double_type;
+ typedef check<check<check<void>>> triple_type;
+ typedef check<check<check<check<void>>>> quadruple_type;
+
+ }
+
+ namespace test_decltype
+ {
+
+ int
+ f()
+ {
+ int a = 1;
+ decltype(a) b = 2;
+ return a + b;
+ }
+
+ }
+
+ namespace test_type_deduction
+ {
+
+ template < typename T1, typename T2 >
+ struct is_same
+ {
+ static const bool value = false;
+ };
+
+ template < typename T >
+ struct is_same<T, T>
+ {
+ static const bool value = true;
+ };
+
+ template < typename T1, typename T2 >
+ auto
+ add(T1 a1, T2 a2) -> decltype(a1 + a2)
+ {
+ return a1 + a2;
+ }
+
+ int
+ test(const int c, volatile int v)
+ {
+ static_assert(is_same<int, decltype(0)>::value == true, "");
+ static_assert(is_same<int, decltype(c)>::value == false, "");
+ static_assert(is_same<int, decltype(v)>::value == false, "");
+ auto ac = c;
+ auto av = v;
+ auto sumi = ac + av + 'x';
+ auto sumf = ac + av + 1.0;
+ static_assert(is_same<int, decltype(ac)>::value == true, "");
+ static_assert(is_same<int, decltype(av)>::value == true, "");
+ static_assert(is_same<int, decltype(sumi)>::value == true, "");
+ static_assert(is_same<int, decltype(sumf)>::value == false, "");
+ static_assert(is_same<int, decltype(add(c, v))>::value == true, "");
+ return (sumf > 0.0) ? sumi : add(c, v);
+ }
+
+ }
+
+ namespace test_noexcept
+ {
+
+ int f() { return 0; }
+ int g() noexcept { return 0; }
+
+ static_assert(noexcept(f()) == false, "");
+ static_assert(noexcept(g()) == true, "");
+
+ }
+
+ namespace test_constexpr
+ {
+
+ template < typename CharT >
+ unsigned long constexpr
+ strlen_c_r(const CharT *const s, const unsigned long acc) noexcept
+ {
+ return *s ? strlen_c_r(s + 1, acc + 1) : acc;
+ }
+
+ template < typename CharT >
+ unsigned long constexpr
+ strlen_c(const CharT *const s) noexcept
+ {
+ return strlen_c_r(s, 0UL);
+ }
+
+ static_assert(strlen_c("") == 0UL, "");
+ static_assert(strlen_c("1") == 1UL, "");
+ static_assert(strlen_c("example") == 7UL, "");
+ static_assert(strlen_c("another\0example") == 7UL, "");
+
+ }
+
+ namespace test_rvalue_references
+ {
+
+ template < int N >
+ struct answer
+ {
+ static constexpr int value = N;
+ };
+
+ answer<1> f(int&) { return answer<1>(); }
+ answer<2> f(const int&) { return answer<2>(); }
+ answer<3> f(int&&) { return answer<3>(); }
+
+ void
+ test()
+ {
+ int i = 0;
+ const int c = 0;
+ static_assert(decltype(f(i))::value == 1, "");
+ static_assert(decltype(f(c))::value == 2, "");
+ static_assert(decltype(f(0))::value == 3, "");
+ }
+
+ }
+
+ namespace test_uniform_initialization
+ {
+
+ struct test
+ {
+ static const int zero {};
+ static const int one {1};
+ };
+
+ static_assert(test::zero == 0, "");
+ static_assert(test::one == 1, "");
+
+ }
+
+ namespace test_lambdas
+ {
+
+ void
+ test1()
+ {
+ auto lambda1 = [](){};
+ auto lambda2 = lambda1;
+ lambda1();
+ lambda2();
+ }
+
+ int
+ test2()
+ {
+ auto a = [](int i, int j){ return i + j; }(1, 2);
+ auto b = []() -> int { return '0'; }();
+ auto c = [=](){ return a + b; }();
+ auto d = [&](){ return c; }();
+ auto e = [a, &b](int x) mutable {
+ const auto identity = [](int y){ return y; };
+ for (auto i = 0; i < a; ++i)
+ a += b--;
+ return x + identity(a + b);
+ }(0);
+ return a + b + c + d + e;
+ }
+
+ int
+ test3()
+ {
+ const auto nullary = [](){ return 0; };
+ const auto unary = [](int x){ return x; };
+ using nullary_t = decltype(nullary);
+ using unary_t = decltype(unary);
+ const auto higher1st = [](nullary_t f){ return f(); };
+ const auto higher2nd = [unary](nullary_t f1){
+ return [unary, f1](unary_t f2){ return f2(unary(f1())); };
+ };
+ return higher1st(nullary) + higher2nd(nullary)(unary);
+ }
+
+ }
+
+ namespace test_variadic_templates
+ {
+
+ template <int...>
+ struct sum;
+
+ template <int N0, int... N1toN>
+ struct sum<N0, N1toN...>
+ {
+ static constexpr auto value = N0 + sum<N1toN...>::value;
+ };
+
+ template <>
+ struct sum<>
+ {
+ static constexpr auto value = 0;
+ };
+
+ static_assert(sum<>::value == 0, "");
+ static_assert(sum<1>::value == 1, "");
+ static_assert(sum<23>::value == 23, "");
+ static_assert(sum<1, 2>::value == 3, "");
+ static_assert(sum<5, 5, 11>::value == 21, "");
+ static_assert(sum<2, 3, 5, 7, 11, 13>::value == 41, "");
+
+ }
+
+ // http://stackoverflow.com/questions/13728184/template-aliases-and-sfinae
+ // Clang 3.1 fails with headers of libstd++ 4.8.3 when using std::function
+ // because of this.
+ namespace test_template_alias_sfinae
+ {
+
+ struct foo {};
+
+ template<typename T>
+ using member = typename T::member_type;
+
+ template<typename T>
+ void func(...) {}
+
+ template<typename T>
+ void func(member<T>*) {}
+
+ void test();
+
+ void test() { func<foo>(0); }
+
+ }
+
+} // namespace cxx11
+
+#endif // __cplusplus >= 201103L
+
+]])
+
+
+dnl Tests for new features in C++14
+
+m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_14], [[
+
+// If the compiler admits that it is not ready for C++14, why torture it?
+// Hopefully, this will speed up the test.
+
+#ifndef __cplusplus
+
+#error "This is not a C++ compiler"
+
+#elif __cplusplus < 201402L
+
+#error "This is not a C++14 compiler"
+
+#else
+
+namespace cxx14
+{
+
+ namespace test_polymorphic_lambdas
+ {
+
+ int
+ test()
+ {
+ const auto lambda = [](auto&&... args){
+ const auto istiny = [](auto x){
+ return (sizeof(x) == 1UL) ? 1 : 0;
+ };
+ const int aretiny[] = { istiny(args)... };
+ return aretiny[0];
+ };
+ return lambda(1, 1L, 1.0f, '1');
+ }
+
+ }
+
+ namespace test_binary_literals
+ {
+
+ constexpr auto ivii = 0b0000000000101010;
+ static_assert(ivii == 42, "wrong value");
+
+ }
+
+ namespace test_generalized_constexpr
+ {
+
+ template < typename CharT >
+ constexpr unsigned long
+ strlen_c(const CharT *const s) noexcept
+ {
+ auto length = 0UL;
+ for (auto p = s; *p; ++p)
+ ++length;
+ return length;
+ }
+
+ static_assert(strlen_c("") == 0UL, "");
+ static_assert(strlen_c("x") == 1UL, "");
+ static_assert(strlen_c("test") == 4UL, "");
+ static_assert(strlen_c("another\0test") == 7UL, "");
+
+ }
+
+ namespace test_lambda_init_capture
+ {
+
+ int
+ test()
+ {
+ auto x = 0;
+ const auto lambda1 = [a = x](int b){ return a + b; };
+ const auto lambda2 = [a = lambda1(x)](){ return a; };
+ return lambda2();
+ }
+
+ }
+
+ namespace test_digit_seperators
+ {
+
+ constexpr auto ten_million = 100'000'000;
+ static_assert(ten_million == 100000000, "");
+
+ }
+
+ namespace test_return_type_deduction
+ {
+
+ auto f(int& x) { return x; }
+ decltype(auto) g(int& x) { return x; }
+
+ template < typename T1, typename T2 >
+ struct is_same
+ {
+ static constexpr auto value = false;
+ };
+
+ template < typename T >
+ struct is_same<T, T>
+ {
+ static constexpr auto value = true;
+ };
+
+ int
+ test()
+ {
+ auto x = 0;
+ static_assert(is_same<int, decltype(f(x))>::value, "");
+ static_assert(is_same<int&, decltype(g(x))>::value, "");
+ return x;
+ }
+
+ }
+
+} // namespace cxx14
+
+#endif // __cplusplus >= 201402L
+
+]])
diff --git a/po/ChangeLog b/po/ChangeLog
index 1d202391..884b1666 100644
--- a/po/ChangeLog
+++ b/po/ChangeLog
@@ -1,3 +1,7 @@
+2019-11-26 Mark Wielaard <mark@klomp.org>
+
+ * *.po: Update for 0.178.
+
2019-08-13 Mark Wielaard <mark@klomp.org>
* *.po: Update for 0.177.
diff --git a/po/de.po b/po/de.po
index da01de95..a9b6897a 100644
--- a/po/de.po
+++ b/po/de.po
@@ -11,7 +11,7 @@ msgid ""
msgstr ""
"Project-Id-Version: elfutils VERSION\n"
"Report-Msgid-Bugs-To: https://sourceware.org/bugzilla/\n"
-"POT-Creation-Date: 2019-08-13 23:38+0200\n"
+"POT-Creation-Date: 2019-11-26 09:48+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"
@@ -27,7 +27,7 @@ msgid ""
"colorize the output. WHEN defaults to 'always' or can be 'auto' or 'never'"
msgstr ""
-#: lib/color.c:127
+#: lib/color.c:129
#, c-format
msgid ""
"%s: invalid argument '%s' for '--color'\n"
@@ -37,7 +37,7 @@ msgid ""
" - 'auto', 'tty', 'if-tty'\n"
msgstr ""
-#: lib/color.c:190 src/objdump.c:726
+#: lib/color.c:194 src/objdump.c:728
#, fuzzy, c-format
msgid "cannot allocate memory"
msgstr "konnte Verzeichnis nicht erstellen: %s"
@@ -54,18 +54,18 @@ msgstr ""
"GARANTIE,\n"
"auch nicht für Marktgängigkeit oder Eignung für einen Bestimmten Zweck.\n"
-#: lib/xmalloc.c:52 lib/xmalloc.c:65 lib/xmalloc.c:77 src/readelf.c:3433
-#: src/readelf.c:11382 src/unstrip.c:2350 src/unstrip.c:2556
+#: lib/xmalloc.c:52 lib/xmalloc.c:65 lib/xmalloc.c:77 src/readelf.c:3449
+#: src/readelf.c:11398 src/unstrip.c:2393 src/unstrip.c:2599
#, c-format
msgid "memory exhausted"
msgstr "Kein Speicher mehr verfügbar"
-#: libasm/asm_error.c:65 libdw/dwarf_error.c:57 libdwfl/libdwflP.h:50
+#: libasm/asm_error.c:65 libdw/dwarf_error.c:57 libdwfl/libdwflP.h:51
#: libelf/elf_error.c:60
msgid "no error"
msgstr "kein Fehler"
-#: libasm/asm_error.c:66 libdw/dwarf_error.c:67 libdwfl/libdwflP.h:52
+#: libasm/asm_error.c:66 libdw/dwarf_error.c:67 libdwfl/libdwflP.h:53
#: libelf/elf_error.c:91
msgid "out of memory"
msgstr "nicht genügend Speicher"
@@ -102,7 +102,7 @@ msgstr "Fehler bei Datenausgabe"
msgid "no backend support available"
msgstr "keine Backend-Unterstützung verfügbar"
-#: libasm/asm_error.c:83 libdw/dwarf_error.c:58 libdwfl/libdwflP.h:51
+#: libasm/asm_error.c:83 libdw/dwarf_error.c:58 libdwfl/libdwflP.h:52
#: libelf/elf_error.c:63
msgid "unknown error"
msgstr "unbekannter Fehler"
@@ -218,7 +218,7 @@ msgstr "Ungültige DWARF Version"
msgid "invalid directory index"
msgstr "ungültiger Verzeichnisindex"
-#: libdw/dwarf_error.c:87 libdwfl/libdwflP.h:71
+#: libdw/dwarf_error.c:87 libdwfl/libdwflP.h:72
msgid "address out of range"
msgstr "Außerhalb des Adressbereiches"
@@ -249,7 +249,7 @@ msgstr "Ungültiger Zeilenindex"
msgid "invalid address range index"
msgstr "Ungültiger Adressbereichs Index"
-#: libdw/dwarf_error.c:94 libdwfl/libdwflP.h:72
+#: libdw/dwarf_error.c:94 libdwfl/libdwflP.h:73
msgid "no matching address range"
msgstr "Kein passender Adressbereich"
@@ -298,7 +298,7 @@ msgstr "unbekannter Typ"
msgid ".debug_addr section missing"
msgstr ".debug_line Sektion fehlt"
-#: libdwfl/argp-std.c:50 src/stack.c:638 src/unstrip.c:2497
+#: libdwfl/argp-std.c:50 src/stack.c:638 src/unstrip.c:2540
msgid "Input selection options:"
msgstr "Eingabeauswahloptionen:"
@@ -363,165 +363,165 @@ msgstr "nicht genügend Speicher"
msgid "No modules recognized in core file"
msgstr "Keine Module in der Kerndatei gefunden"
-#: libdwfl/libdwflP.h:53
+#: libdwfl/libdwflP.h:54
msgid "See errno"
msgstr ""
-#: libdwfl/libdwflP.h:54
+#: libdwfl/libdwflP.h:55
msgid "See elf_errno"
msgstr ""
-#: libdwfl/libdwflP.h:55
+#: libdwfl/libdwflP.h:56
msgid "See dwarf_errno"
msgstr ""
-#: libdwfl/libdwflP.h:56
+#: libdwfl/libdwflP.h:57
msgid "See ebl_errno (XXX missing)"
msgstr ""
-#: libdwfl/libdwflP.h:57
+#: libdwfl/libdwflP.h:58
msgid "gzip decompression failed"
msgstr ""
-#: libdwfl/libdwflP.h:58
+#: libdwfl/libdwflP.h:59
msgid "bzip2 decompression failed"
msgstr ""
-#: libdwfl/libdwflP.h:59
+#: libdwfl/libdwflP.h:60
msgid "LZMA decompression failed"
msgstr ""
-#: libdwfl/libdwflP.h:60
+#: libdwfl/libdwflP.h:61
msgid "no support library found for machine"
msgstr ""
-#: libdwfl/libdwflP.h:61
+#: libdwfl/libdwflP.h:62
msgid "Callbacks missing for ET_REL file"
msgstr ""
-#: libdwfl/libdwflP.h:62
+#: libdwfl/libdwflP.h:63
msgid "Unsupported relocation type"
msgstr ""
-#: libdwfl/libdwflP.h:63
+#: libdwfl/libdwflP.h:64
msgid "r_offset is bogus"
msgstr ""
-#: libdwfl/libdwflP.h:64 libelf/elf_error.c:115 libelf/elf_error.c:175
+#: libdwfl/libdwflP.h:65 libelf/elf_error.c:115 libelf/elf_error.c:175
msgid "offset out of range"
msgstr "Offset ausserhalb des Bereichs"
-#: libdwfl/libdwflP.h:65
+#: libdwfl/libdwflP.h:66
#, fuzzy
msgid "relocation refers to undefined symbol"
msgstr "Zeige Grösse der definierten Symbole"
-#: libdwfl/libdwflP.h:66
+#: libdwfl/libdwflP.h:67
msgid "Callback returned failure"
msgstr ""
-#: libdwfl/libdwflP.h:67
+#: libdwfl/libdwflP.h:68
#, fuzzy
msgid "No DWARF information found"
msgstr "keine DWARF Information"
-#: libdwfl/libdwflP.h:68
+#: libdwfl/libdwflP.h:69
msgid "No symbol table found"
msgstr ""
-#: libdwfl/libdwflP.h:69
+#: libdwfl/libdwflP.h:70
#, fuzzy
msgid "No ELF program headers"
msgstr "Programm-Köpfe anzeigen"
-#: libdwfl/libdwflP.h:70
+#: libdwfl/libdwflP.h:71
msgid "address range overlaps an existing module"
msgstr ""
-#: libdwfl/libdwflP.h:73
+#: libdwfl/libdwflP.h:74
msgid "image truncated"
msgstr ""
-#: libdwfl/libdwflP.h:74
+#: libdwfl/libdwflP.h:75
#, fuzzy
msgid "ELF file opened"
msgstr "keine ELF Datei"
-#: libdwfl/libdwflP.h:75
+#: libdwfl/libdwflP.h:76
#, fuzzy
msgid "not a valid ELF file"
msgstr "Ungültige ELF Datei"
-#: libdwfl/libdwflP.h:76
+#: libdwfl/libdwflP.h:77
#, fuzzy
msgid "cannot handle DWARF type description"
msgstr "konnte Elf-Deskriptor nicht erzeugen: %s"
-#: libdwfl/libdwflP.h:77
+#: libdwfl/libdwflP.h:78
msgid "ELF file does not match build ID"
msgstr ""
-#: libdwfl/libdwflP.h:78
+#: libdwfl/libdwflP.h:79
#, fuzzy
msgid "corrupt .gnu.prelink_undo section data"
msgstr "konnte Abschnittsdaten nicht holen: %s"
-#: libdwfl/libdwflP.h:79
+#: libdwfl/libdwflP.h:80
msgid "Internal error due to ebl"
msgstr ""
-#: libdwfl/libdwflP.h:80
+#: libdwfl/libdwflP.h:81
msgid "Missing data in core file"
msgstr ""
-#: libdwfl/libdwflP.h:81
+#: libdwfl/libdwflP.h:82
#, fuzzy
msgid "Invalid register"
msgstr "ungültiger Parameter"
-#: libdwfl/libdwflP.h:82
+#: libdwfl/libdwflP.h:83
msgid "Error reading process memory"
msgstr ""
-#: libdwfl/libdwflP.h:83
+#: libdwfl/libdwflP.h:84
msgid "Couldn't find architecture of any ELF"
msgstr ""
-#: libdwfl/libdwflP.h:84
+#: libdwfl/libdwflP.h:85
msgid "Error parsing /proc filesystem"
msgstr ""
-#: libdwfl/libdwflP.h:85
+#: libdwfl/libdwflP.h:86
#, fuzzy
msgid "Invalid DWARF"
msgstr "DWARF ungültig"
-#: libdwfl/libdwflP.h:86
+#: libdwfl/libdwflP.h:87
msgid "Unsupported DWARF"
msgstr ""
-#: libdwfl/libdwflP.h:87
+#: libdwfl/libdwflP.h:88
msgid "Unable to find more threads"
msgstr ""
-#: libdwfl/libdwflP.h:88
+#: libdwfl/libdwflP.h:89
msgid "Dwfl already has attached state"
msgstr ""
-#: libdwfl/libdwflP.h:89
+#: libdwfl/libdwflP.h:90
msgid "Dwfl has no attached state"
msgstr ""
-#: libdwfl/libdwflP.h:90
+#: libdwfl/libdwflP.h:91
msgid "Unwinding not supported for this architecture"
msgstr ""
-#: libdwfl/libdwflP.h:91
+#: libdwfl/libdwflP.h:92
#, fuzzy
msgid "Invalid argument"
msgstr "ungültiger Parameter"
-#: libdwfl/libdwflP.h:92
+#: libdwfl/libdwflP.h:93
#, fuzzy
msgid "Not an ET_CORE ELF file"
msgstr "Ungültige ELF Datei"
@@ -627,7 +627,7 @@ msgstr "ungültige Grösse des Quell-Operanden"
msgid "invalid size of destination operand"
msgstr "ungültige Grösse des Ziel-Operanden"
-#: libelf/elf_error.c:87 src/readelf.c:6150
+#: libelf/elf_error.c:87 src/readelf.c:6166
#, c-format
msgid "invalid encoding"
msgstr "ungültige Kodierung"
@@ -715,8 +715,8 @@ msgstr "data/scn Unterschied"
msgid "invalid section header"
msgstr "ungültiger Abschnitts-Header"
-#: libelf/elf_error.c:191 src/readelf.c:9898 src/readelf.c:10498
-#: src/readelf.c:10599 src/readelf.c:10781
+#: libelf/elf_error.c:191 src/readelf.c:9914 src/readelf.c:10514
+#: src/readelf.c:10615 src/readelf.c:10797
#, c-format
msgid "invalid data"
msgstr "Ungültige Daten"
@@ -1375,7 +1375,7 @@ 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:984 src/strip.c:1021
-#: src/unstrip.c:2146 src/unstrip.c:2175
+#: src/unstrip.c:2189 src/unstrip.c:2218
#, c-format
msgid "cannot open '%s'"
msgstr "'%s' kann nicht geöffnet werden"
@@ -1468,7 +1468,7 @@ 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:153
+#: src/elfcompress.c:1336 src/elflint.c:77 src/readelf.c:158
msgid "FILE..."
msgstr "DATEI..."
@@ -1499,14 +1499,14 @@ msgstr ""
msgid "Pedantic checking of ELF files compliance with gABI/psABI spec."
msgstr ""
-#: src/elflint.c:154 src/readelf.c:357
-#, c-format
-msgid "cannot open input file"
+#: src/elflint.c:154 src/readelf.c:368
+#, fuzzy, c-format
+msgid "cannot open input file '%s'"
msgstr "Kann Eingabedatei nicht öffnen"
#: src/elflint.c:161
-#, c-format
-msgid "cannot generate Elf descriptor: %s\n"
+#, fuzzy, c-format
+msgid "cannot generate Elf descriptor for '%s': %s\n"
msgstr "kann Elf-Deskriptor nicht erzeugen: %s\n"
#: src/elflint.c:180
@@ -1518,7 +1518,7 @@ msgstr "Fehler beim Schliessen des Elf-Desktriptor: %s\n"
msgid "No errors"
msgstr "Keine Fehler"
-#: src/elflint.c:219 src/readelf.c:559
+#: src/elflint.c:219 src/readelf.c:575
msgid "Missing file name.\n"
msgstr "Dateiname fehlt.\n"
@@ -3474,12 +3474,12 @@ msgstr "%s%s%s: Dateiformat nicht erkannt"
msgid "cannot create search tree"
msgstr "Kann Suchbaum nicht erstellen"
-#: src/nm.c:746 src/nm.c:1205 src/objdump.c:777 src/readelf.c:619
-#: src/readelf.c:1431 src/readelf.c:1582 src/readelf.c:1783 src/readelf.c:1989
-#: src/readelf.c:2179 src/readelf.c:2357 src/readelf.c:2433 src/readelf.c:2691
-#: src/readelf.c:2767 src/readelf.c:2854 src/readelf.c:3452 src/readelf.c:3502
-#: src/readelf.c:3565 src/readelf.c:11214 src/readelf.c:12399
-#: src/readelf.c:12603 src/readelf.c:12671 src/size.c:398 src/size.c:470
+#: src/nm.c:746 src/nm.c:1205 src/objdump.c:779 src/readelf.c:635
+#: src/readelf.c:1447 src/readelf.c:1598 src/readelf.c:1799 src/readelf.c:2005
+#: src/readelf.c:2195 src/readelf.c:2373 src/readelf.c:2449 src/readelf.c:2707
+#: src/readelf.c:2783 src/readelf.c:2870 src/readelf.c:3468 src/readelf.c:3518
+#: src/readelf.c:3581 src/readelf.c:11230 src/readelf.c:12415
+#: src/readelf.c:12626 src/readelf.c:12695 src/size.c:398 src/size.c:470
#: src/strip.c:1038
#, c-format
msgid "cannot get section header string table index"
@@ -3523,12 +3523,12 @@ 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:1526
+#: src/nm.c:1527
#, c-format
msgid "%s%s%s%s: Invalid operation"
msgstr "%s%s%s%s: Ungültige Operation"
-#: src/nm.c:1583
+#: src/nm.c:1584
#, c-format
msgid "%s%s%s: no symbols"
msgstr "%s%s%s: keine Symbole"
@@ -3563,7 +3563,7 @@ msgstr ""
msgid "Show information from FILEs (a.out by default)."
msgstr ""
-#: src/objdump.c:218 src/readelf.c:564
+#: src/objdump.c:218 src/readelf.c:580
msgid "No operation specified.\n"
msgstr "Keine Operation angegeben.\n"
@@ -3572,11 +3572,11 @@ msgstr "Keine Operation angegeben.\n"
msgid "while close `%s'"
msgstr ""
-#: src/objdump.c:363 src/readelf.c:2084 src/readelf.c:2276
+#: src/objdump.c:363 src/readelf.c:2100 src/readelf.c:2292
msgid "INVALID SYMBOL"
msgstr ""
-#: src/objdump.c:378 src/readelf.c:2118 src/readelf.c:2312
+#: src/objdump.c:378 src/readelf.c:2134 src/readelf.c:2328
msgid "INVALID SECTION"
msgstr ""
@@ -3627,508 +3627,513 @@ msgstr "'%s' ist kein Archiv"
msgid "error while freeing sub-ELF descriptor: %s"
msgstr ""
-#: src/readelf.c:94
+#: src/readelf.c:97
#, fuzzy
msgid "ELF input selection:"
msgstr "Eingabeauswahloptionen:"
-#: src/readelf.c:96
+#: src/readelf.c:99
msgid ""
"Use the named SECTION (default .gnu_debugdata) as (compressed) ELF input data"
msgstr ""
-#: src/readelf.c:99
+#: src/readelf.c:102
msgid ""
"Used with -w to find the skeleton Compile Units in FILE associated with the "
"Split Compile units in a .dwo input file"
msgstr ""
-#: src/readelf.c:101
+#: src/readelf.c:104
#, fuzzy
msgid "ELF output selection:"
msgstr "Eingabeauswahloptionen:"
-#: src/readelf.c:103
+#: src/readelf.c:106
msgid "All these plus -p .strtab -p .dynstr -p .comment"
msgstr ""
-#: src/readelf.c:104
+#: src/readelf.c:107
msgid "Display the dynamic segment"
msgstr ""
-#: src/readelf.c:105
+#: src/readelf.c:108
msgid "Display the ELF file header"
msgstr ""
-#: src/readelf.c:107
+#: src/readelf.c:110
msgid "Display histogram of bucket list lengths"
msgstr ""
-#: src/readelf.c:108
+#: src/readelf.c:111
msgid "Display the program headers"
msgstr "Programm-Köpfe anzeigen"
-#: src/readelf.c:110
+#: src/readelf.c:113
msgid "Display relocations"
msgstr "Relocations anzeigen"
-#: src/readelf.c:111
+#: src/readelf.c:114
#, fuzzy
msgid "Display the section groups"
msgstr "Programm-Köpfe anzeigen"
-#: src/readelf.c:112
+#: src/readelf.c:115
#, fuzzy
msgid "Display the sections' headers"
msgstr "Programm-Köpfe anzeigen"
-#: src/readelf.c:115
+#: src/readelf.c:118
#, fuzzy
msgid "Display the symbol table sections"
msgstr "Symboltabelle anzeigen"
-#: src/readelf.c:116
+#: src/readelf.c:120
+#, fuzzy
+msgid "Display (only) the dynamic symbol table"
+msgstr "Zeige nur externe Symbole"
+
+#: src/readelf.c:121
msgid "Display versioning information"
msgstr "Versionierungsinformationen anzeigen"
-#: src/readelf.c:117
+#: src/readelf.c:122
#, fuzzy
msgid "Display the ELF notes"
msgstr "Kernnotizen anzeigen"
-#: src/readelf.c:119
+#: src/readelf.c:124
#, fuzzy
msgid "Display architecture specific information, if any"
msgstr "Architekturspezifische Informationen anzeigen (falls vorhanden)"
-#: src/readelf.c:121
+#: src/readelf.c:126
msgid "Display sections for exception handling"
msgstr "Abschnitte für Ausnahmebehandlung anzeigen"
-#: src/readelf.c:123
+#: src/readelf.c:128
msgid "Additional output selection:"
msgstr ""
-#: src/readelf.c:125
+#: src/readelf.c:130
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 ""
-#: src/readelf.c:129
+#: src/readelf.c:134
msgid "Dump the uninterpreted contents of SECTION, by number or name"
msgstr ""
-#: src/readelf.c:131
+#: src/readelf.c:136
msgid "Print string contents of sections"
msgstr ""
-#: src/readelf.c:134
+#: src/readelf.c:139
msgid "Display the symbol index of an archive"
msgstr "Symbolindex des Archivs anzeigen"
-#: src/readelf.c:136
+#: src/readelf.c:141
msgid "Output control:"
msgstr "Ausgabekontrolle:"
-#: src/readelf.c:138
+#: src/readelf.c:143
msgid "Do not find symbol names for addresses in DWARF data"
msgstr "Keine symbolischen Namen für Adressen in DWARF-Daten suchen"
-#: src/readelf.c:140
+#: src/readelf.c:145
#, fuzzy
msgid ""
"Display just offsets instead of resolving values to addresses in DWARF data"
msgstr "Keine symbolischen Namen für Adressen in DWARF-Daten suchen"
-#: src/readelf.c:142
+#: src/readelf.c:147
msgid "Ignored for compatibility (lines always wide)"
msgstr ""
-#: src/readelf.c:144
+#: src/readelf.c:149
msgid ""
"Show compression information for compressed sections (when used with -S); "
"decompress section before dumping data (when used with -p or -x)"
msgstr ""
#. Short description of program.
-#: src/readelf.c:149
+#: src/readelf.c:154
msgid "Print information from ELF file in human-readable form."
msgstr "Informationen aus der ELF-Datei in menschenlesbarer Form ausgeben."
#. Look up once.
-#: src/readelf.c:339
+#: src/readelf.c:350
msgid "yes"
msgstr "ja"
-#: src/readelf.c:340
+#: src/readelf.c:351
msgid "no"
msgstr "nein"
-#: src/readelf.c:532
+#: src/readelf.c:548
#, c-format
msgid "Unknown DWARF debug section `%s'.\n"
msgstr ""
-#: src/readelf.c:603 src/readelf.c:714
+#: src/readelf.c:619 src/readelf.c:730
#, c-format
msgid "cannot generate Elf descriptor: %s"
msgstr "konnte Elf-Deskriptor nicht erzeugen: %s"
-#: src/readelf.c:610 src/readelf.c:937 src/strip.c:1133
+#: src/readelf.c:626 src/readelf.c:953 src/strip.c:1133
#, c-format
msgid "cannot determine number of sections: %s"
msgstr ""
-#: src/readelf.c:628 src/readelf.c:1247 src/readelf.c:1455
+#: src/readelf.c:644 src/readelf.c:1263 src/readelf.c:1471
#, c-format
msgid "cannot get section: %s"
msgstr ""
-#: src/readelf.c:637 src/readelf.c:1254 src/readelf.c:1463 src/readelf.c:12623
-#: src/unstrip.c:395 src/unstrip.c:426 src/unstrip.c:481 src/unstrip.c:600
-#: src/unstrip.c:621 src/unstrip.c:661 src/unstrip.c:873 src/unstrip.c:1204
-#: src/unstrip.c:1331 src/unstrip.c:1355 src/unstrip.c:1398 src/unstrip.c:1462
-#: src/unstrip.c:1636 src/unstrip.c:1770 src/unstrip.c:1913 src/unstrip.c:2008
+#: src/readelf.c:653 src/readelf.c:1270 src/readelf.c:1479 src/readelf.c:12646
+#: src/unstrip.c:395 src/unstrip.c:426 src/unstrip.c:485 src/unstrip.c:604
+#: src/unstrip.c:625 src/unstrip.c:665 src/unstrip.c:881 src/unstrip.c:1212
+#: src/unstrip.c:1339 src/unstrip.c:1363 src/unstrip.c:1419 src/unstrip.c:1483
+#: src/unstrip.c:1658 src/unstrip.c:1809 src/unstrip.c:1952 src/unstrip.c:2051
#, c-format
msgid "cannot get section header: %s"
msgstr ""
-#: src/readelf.c:645
+#: src/readelf.c:661
#, fuzzy, c-format
msgid "cannot get section name"
msgstr "konnte Abschnittsdaten nicht holen: %s"
-#: src/readelf.c:654 src/readelf.c:6560 src/readelf.c:10486 src/readelf.c:10588
-#: src/readelf.c:10766
+#: src/readelf.c:670 src/readelf.c:6576 src/readelf.c:10502 src/readelf.c:10604
+#: src/readelf.c:10782
#, c-format
msgid "cannot get %s content: %s"
msgstr ""
-#: src/readelf.c:670
+#: src/readelf.c:686
#, fuzzy, c-format
msgid "cannot create temp file '%s'"
msgstr "neue Datei konnte nicht angelegt werden"
-#: src/readelf.c:679
+#: src/readelf.c:695
#, fuzzy, c-format
msgid "cannot write section data"
msgstr "konnte Abschnittsdaten nicht holen: %s"
-#: src/readelf.c:685 src/readelf.c:702 src/readelf.c:731
+#: src/readelf.c:701 src/readelf.c:718 src/readelf.c:747
#, c-format
msgid "error while closing Elf descriptor: %s"
msgstr ""
-#: src/readelf.c:692
+#: src/readelf.c:708
#, fuzzy, c-format
msgid "error while rewinding file descriptor"
msgstr "Fehler beim Schliessen des Elf-Desktriptor: %s\n"
-#: src/readelf.c:726
+#: src/readelf.c:742
#, c-format
msgid "'%s' is not an archive, cannot print archive index"
msgstr ""
-#: src/readelf.c:830
+#: src/readelf.c:846
#, c-format
msgid "cannot stat input file"
msgstr ""
-#: src/readelf.c:832
+#: src/readelf.c:848
#, c-format
msgid "input file is empty"
msgstr ""
-#: src/readelf.c:834
+#: src/readelf.c:850
#, c-format
msgid "failed reading '%s': %s"
msgstr "Konnte '%s' nicht lesen: %s"
-#: src/readelf.c:863
+#: src/readelf.c:879
#, fuzzy, c-format
msgid "No such section '%s' in '%s'"
msgstr "konnte Abschnittsdaten nicht holen: %s"
-#: src/readelf.c:922
+#: src/readelf.c:938
#, c-format
msgid "cannot read ELF header: %s"
msgstr ""
-#: src/readelf.c:930
+#: src/readelf.c:946
#, c-format
msgid "cannot create EBL handle"
msgstr ""
-#: src/readelf.c:943
+#: src/readelf.c:959
#, fuzzy, c-format
msgid "cannot determine number of program headers: %s"
msgstr "konnte Programm-Kopf nicht erstellen: %s"
-#: src/readelf.c:975
+#: src/readelf.c:991
#, fuzzy, c-format
msgid "cannot read ELF: %s"
msgstr "Konnte %s: %s nicht lesen"
-#: src/readelf.c:1036
+#: src/readelf.c:1052
msgid "NONE (None)"
msgstr ""
-#: src/readelf.c:1037
+#: src/readelf.c:1053
msgid "REL (Relocatable file)"
msgstr ""
-#: src/readelf.c:1038
+#: src/readelf.c:1054
msgid "EXEC (Executable file)"
msgstr ""
-#: src/readelf.c:1039
+#: src/readelf.c:1055
msgid "DYN (Shared object file)"
msgstr ""
-#: src/readelf.c:1040
+#: src/readelf.c:1056
msgid "CORE (Core file)"
msgstr ""
-#: src/readelf.c:1045
+#: src/readelf.c:1061
#, c-format
msgid "OS Specific: (%x)\n"
msgstr ""
#. && e_type <= ET_HIPROC always true
-#: src/readelf.c:1047
+#: src/readelf.c:1063
#, c-format
msgid "Processor Specific: (%x)\n"
msgstr ""
-#: src/readelf.c:1057
+#: src/readelf.c:1073
msgid ""
"ELF Header:\n"
" Magic: "
msgstr ""
-#: src/readelf.c:1061
+#: src/readelf.c:1077
#, c-format
msgid ""
"\n"
" Class: %s\n"
msgstr ""
-#: src/readelf.c:1066
+#: src/readelf.c:1082
#, fuzzy, c-format
msgid " Data: %s\n"
msgstr " Daten: %s\n"
-#: src/readelf.c:1072
+#: src/readelf.c:1088
#, c-format
msgid " Ident Version: %hhd %s\n"
msgstr ""
-#: src/readelf.c:1074 src/readelf.c:1096
+#: src/readelf.c:1090 src/readelf.c:1112
msgid "(current)"
msgstr "(aktuell)"
-#: src/readelf.c:1078
+#: src/readelf.c:1094
#, c-format
msgid " OS/ABI: %s\n"
msgstr ""
-#: src/readelf.c:1081
+#: src/readelf.c:1097
#, c-format
msgid " ABI Version: %hhd\n"
msgstr ""
-#: src/readelf.c:1084
+#: src/readelf.c:1100
msgid " Type: "
msgstr " Typ: "
-#: src/readelf.c:1089
+#: src/readelf.c:1105
#, c-format
msgid " Machine: %s\n"
msgstr ""
-#: src/readelf.c:1091
+#: src/readelf.c:1107
#, fuzzy, c-format
msgid " Machine: <unknown>: 0x%x\n"
msgstr " Daten: %s\n"
-#: src/readelf.c:1094
+#: src/readelf.c:1110
#, c-format
msgid " Version: %d %s\n"
msgstr ""
-#: src/readelf.c:1098
+#: src/readelf.c:1114
#, c-format
msgid " Entry point address: %#<PRIx64>\n"
msgstr ""
-#: src/readelf.c:1101
+#: src/readelf.c:1117
#, c-format
msgid " Start of program headers: %<PRId64> %s\n"
msgstr ""
-#: src/readelf.c:1102 src/readelf.c:1105
+#: src/readelf.c:1118 src/readelf.c:1121
msgid "(bytes into file)"
msgstr ""
-#: src/readelf.c:1104
+#: src/readelf.c:1120
#, c-format
msgid " Start of section headers: %<PRId64> %s\n"
msgstr ""
-#: src/readelf.c:1107
+#: src/readelf.c:1123
#, c-format
msgid " Flags: %s\n"
msgstr ""
-#: src/readelf.c:1110
+#: src/readelf.c:1126
#, c-format
msgid " Size of this header: %<PRId16> %s\n"
msgstr ""
-#: src/readelf.c:1111 src/readelf.c:1114 src/readelf.c:1131
+#: src/readelf.c:1127 src/readelf.c:1130 src/readelf.c:1147
msgid "(bytes)"
msgstr "(Bytes)"
-#: src/readelf.c:1113
+#: src/readelf.c:1129
#, c-format
msgid " Size of program header entries: %<PRId16> %s\n"
msgstr ""
-#: src/readelf.c:1116
+#: src/readelf.c:1132
#, c-format
msgid " Number of program headers entries: %<PRId16>"
msgstr ""
-#: src/readelf.c:1123
+#: src/readelf.c:1139
#, c-format
msgid " (%<PRIu32> in [0].sh_info)"
msgstr ""
-#: src/readelf.c:1126 src/readelf.c:1143 src/readelf.c:1157
+#: src/readelf.c:1142 src/readelf.c:1159 src/readelf.c:1173
msgid " ([0] not available)"
msgstr ""
-#: src/readelf.c:1130
+#: src/readelf.c:1146
#, c-format
msgid " Size of section header entries: %<PRId16> %s\n"
msgstr ""
-#: src/readelf.c:1133
+#: src/readelf.c:1149
#, c-format
msgid " Number of section headers entries: %<PRId16>"
msgstr ""
-#: src/readelf.c:1140
+#: src/readelf.c:1156
#, c-format
msgid " (%<PRIu32> in [0].sh_size)"
msgstr ""
#. We managed to get the zeroth section.
-#: src/readelf.c:1153
+#: src/readelf.c:1169
#, c-format
msgid " (%<PRIu32> in [0].sh_link)"
msgstr ""
-#: src/readelf.c:1161
+#: src/readelf.c:1177
#, c-format
msgid ""
" Section header string table index: XINDEX%s\n"
"\n"
msgstr ""
-#: src/readelf.c:1165
+#: src/readelf.c:1181
#, c-format
msgid ""
" Section header string table index: %<PRId16>\n"
"\n"
msgstr ""
-#: src/readelf.c:1212 src/readelf.c:1420
+#: src/readelf.c:1228 src/readelf.c:1436
#, fuzzy, c-format
msgid "cannot get number of sections: %s"
msgstr "konnte Programm-Kopf nicht erstellen: %s"
-#: src/readelf.c:1215
+#: src/readelf.c:1231
#, fuzzy, c-format
msgid ""
"There are %zd section headers, starting at offset %#<PRIx64>:\n"
"\n"
msgstr " %s: %<PRId64>\n"
-#: src/readelf.c:1224
+#: src/readelf.c:1240
#, fuzzy, c-format
msgid "cannot get section header string table index: %s"
msgstr "konnte Abschnittsdaten nicht holen: %s"
-#: src/readelf.c:1227
+#: src/readelf.c:1243
msgid "Section Headers:"
msgstr ""
-#: src/readelf.c:1230
+#: src/readelf.c:1246
msgid ""
"[Nr] Name Type Addr Off Size ES Flags Lk "
"Inf Al"
msgstr ""
-#: src/readelf.c:1232
+#: src/readelf.c:1248
msgid ""
"[Nr] Name Type Addr Off Size ES "
"Flags Lk Inf Al"
msgstr ""
-#: src/readelf.c:1237
+#: src/readelf.c:1253
msgid " [Compression Size Al]"
msgstr ""
-#: src/readelf.c:1239
+#: src/readelf.c:1255
msgid " [Compression Size Al]"
msgstr ""
-#: src/readelf.c:1315
+#: src/readelf.c:1331
#, c-format
msgid "bad compression header for section %zd: %s"
msgstr ""
-#: src/readelf.c:1326
+#: src/readelf.c:1342
#, c-format
msgid "bad gnu compressed size for section %zd: %s"
msgstr ""
-#: src/readelf.c:1344
+#: src/readelf.c:1360
msgid "Program Headers:"
msgstr "Programm-Köpfe:"
-#: src/readelf.c:1346
+#: src/readelf.c:1362
msgid ""
" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align"
msgstr ""
-#: src/readelf.c:1349
+#: src/readelf.c:1365
msgid ""
" Type Offset VirtAddr PhysAddr FileSiz "
"MemSiz Flg Align"
msgstr ""
-#: src/readelf.c:1406
+#: src/readelf.c:1422
#, c-format
msgid "\t[Requesting program interpreter: %s]\n"
msgstr ""
-#: src/readelf.c:1433
+#: src/readelf.c:1449
msgid ""
"\n"
" Section to Segment mapping:\n"
" Segment Sections..."
msgstr ""
-#: src/readelf.c:1444 src/unstrip.c:2067 src/unstrip.c:2109 src/unstrip.c:2116
+#: src/readelf.c:1460 src/unstrip.c:2110 src/unstrip.c:2152 src/unstrip.c:2159
#, c-format
msgid "cannot get program header: %s"
msgstr ""
-#: src/readelf.c:1590
+#: src/readelf.c:1606
#, c-format
msgid ""
"\n"
@@ -4139,7 +4144,7 @@ msgid_plural ""
msgstr[0] ""
msgstr[1] ""
-#: src/readelf.c:1595
+#: src/readelf.c:1611
#, c-format
msgid ""
"\n"
@@ -4150,31 +4155,31 @@ msgid_plural ""
msgstr[0] ""
msgstr[1] ""
-#: src/readelf.c:1603
+#: src/readelf.c:1619
msgid "<INVALID SYMBOL>"
msgstr ""
-#: src/readelf.c:1617
+#: src/readelf.c:1633
msgid "<INVALID SECTION>"
msgstr ""
-#: src/readelf.c:1640 src/readelf.c:2367 src/readelf.c:3468 src/readelf.c:12494
-#: src/readelf.c:12501 src/readelf.c:12545 src/readelf.c:12552
+#: src/readelf.c:1656 src/readelf.c:2383 src/readelf.c:3484 src/readelf.c:12517
+#: src/readelf.c:12524 src/readelf.c:12568 src/readelf.c:12575
msgid "Couldn't uncompress section"
msgstr ""
-#: src/readelf.c:1645 src/readelf.c:2372 src/readelf.c:3473
+#: src/readelf.c:1661 src/readelf.c:2388 src/readelf.c:3489
#, fuzzy, c-format
msgid "cannot get section [%zd] header: %s"
msgstr "konnte Abschnittsdaten nicht holen: %s"
-#: src/readelf.c:1789 src/readelf.c:2439 src/readelf.c:2697 src/readelf.c:2773
-#: src/readelf.c:3077 src/readelf.c:3151 src/readelf.c:5348
+#: src/readelf.c:1805 src/readelf.c:2455 src/readelf.c:2713 src/readelf.c:2789
+#: src/readelf.c:3093 src/readelf.c:3167 src/readelf.c:5364
#, fuzzy, c-format
msgid "invalid sh_link value in section %zu"
msgstr "ungültige .debug_line Sektion"
-#: src/readelf.c:1792
+#: src/readelf.c:1808
#, c-format
msgid ""
"\n"
@@ -4187,43 +4192,43 @@ msgid_plural ""
msgstr[0] ""
msgstr[1] ""
-#: src/readelf.c:1802
+#: src/readelf.c:1818
msgid " Type Value\n"
msgstr ""
-#: src/readelf.c:1826
+#: src/readelf.c:1842
#, c-format
msgid "Shared library: [%s]\n"
msgstr ""
-#: src/readelf.c:1831
+#: src/readelf.c:1847
#, c-format
msgid "Library soname: [%s]\n"
msgstr ""
-#: src/readelf.c:1836
+#: src/readelf.c:1852
#, c-format
msgid "Library rpath: [%s]\n"
msgstr ""
-#: src/readelf.c:1841
+#: src/readelf.c:1857
#, c-format
msgid "Library runpath: [%s]\n"
msgstr ""
-#: src/readelf.c:1861
+#: src/readelf.c:1877
#, c-format
msgid "%<PRId64> (bytes)\n"
msgstr ""
-#: src/readelf.c:1974 src/readelf.c:2164
+#: src/readelf.c:1990 src/readelf.c:2180
#, c-format
msgid ""
"\n"
"Invalid symbol table at offset %#0<PRIx64>\n"
msgstr ""
-#: src/readelf.c:1992 src/readelf.c:2182
+#: src/readelf.c:2008 src/readelf.c:2198
#, c-format
msgid ""
"\n"
@@ -4242,7 +4247,7 @@ msgstr[1] ""
#. The .rela.dyn section does not refer to a specific section but
#. instead of section index zero. Do not try to print a section
#. name.
-#: src/readelf.c:2007 src/readelf.c:2197
+#: src/readelf.c:2023 src/readelf.c:2213
#, c-format
msgid ""
"\n"
@@ -4253,29 +4258,29 @@ msgid_plural ""
msgstr[0] ""
msgstr[1] ""
-#: src/readelf.c:2017
+#: src/readelf.c:2033
msgid " Offset Type Value Name\n"
msgstr ""
-#: src/readelf.c:2019
+#: src/readelf.c:2035
msgid " Offset Type Value Name\n"
msgstr ""
-#: src/readelf.c:2072 src/readelf.c:2083 src/readelf.c:2096 src/readelf.c:2117
-#: src/readelf.c:2129 src/readelf.c:2263 src/readelf.c:2275 src/readelf.c:2289
-#: src/readelf.c:2311 src/readelf.c:2324
+#: src/readelf.c:2088 src/readelf.c:2099 src/readelf.c:2112 src/readelf.c:2133
+#: src/readelf.c:2145 src/readelf.c:2279 src/readelf.c:2291 src/readelf.c:2305
+#: src/readelf.c:2327 src/readelf.c:2340
msgid "<INVALID RELOC>"
msgstr ""
-#: src/readelf.c:2207
+#: src/readelf.c:2223
msgid " Offset Type Value Addend Name\n"
msgstr ""
-#: src/readelf.c:2209
+#: src/readelf.c:2225
msgid " Offset Type Value Addend Name\n"
msgstr ""
-#: src/readelf.c:2447
+#: src/readelf.c:2463
#, c-format
msgid ""
"\n"
@@ -4286,40 +4291,40 @@ msgid_plural ""
msgstr[0] ""
msgstr[1] ""
-#: src/readelf.c:2452
+#: src/readelf.c:2468
#, c-format
msgid " %lu local symbol String table: [%2u] '%s'\n"
msgid_plural " %lu local symbols String table: [%2u] '%s'\n"
msgstr[0] ""
msgstr[1] ""
-#: src/readelf.c:2460
+#: src/readelf.c:2476
msgid " Num: Value Size Type Bind Vis Ndx Name\n"
msgstr ""
-#: src/readelf.c:2462
+#: src/readelf.c:2478
msgid " Num: Value Size Type Bind Vis Ndx Name\n"
msgstr ""
-#: src/readelf.c:2482
+#: src/readelf.c:2498
#, c-format
msgid "%5u: %0*<PRIx64> %6<PRId64> %-7s %-6s %-9s %6s %s"
msgstr ""
-#: src/readelf.c:2570
+#: src/readelf.c:2586
#, c-format
msgid "bad dynamic symbol"
msgstr ""
-#: src/readelf.c:2652
+#: src/readelf.c:2668
msgid "none"
msgstr "keine"
-#: src/readelf.c:2669
+#: src/readelf.c:2685
msgid "| <unknown>"
msgstr "| <unbekannt>"
-#: src/readelf.c:2700
+#: src/readelf.c:2716
#, c-format
msgid ""
"\n"
@@ -4332,17 +4337,17 @@ msgid_plural ""
msgstr[0] ""
msgstr[1] ""
-#: src/readelf.c:2721
+#: src/readelf.c:2737
#, fuzzy, c-format
msgid " %#06x: Version: %hu File: %s Cnt: %hu\n"
msgstr " %#06x: Version: %hu Datei: %s Cnt: %hu\n"
-#: src/readelf.c:2734
+#: src/readelf.c:2750
#, c-format
msgid " %#06x: Name: %s Flags: %s Version: %hu\n"
msgstr " %#06x: Name: %s Flags: %s Version: %hu\n"
-#: src/readelf.c:2777
+#: src/readelf.c:2793
#, c-format
msgid ""
"\n"
@@ -4355,18 +4360,18 @@ msgid_plural ""
msgstr[0] ""
msgstr[1] ""
-#: src/readelf.c:2805
+#: src/readelf.c:2821
#, c-format
msgid " %#06x: Version: %hd Flags: %s Index: %hd Cnt: %hd Name: %s\n"
msgstr ""
-#: src/readelf.c:2820
+#: src/readelf.c:2836
#, c-format
msgid " %#06x: Parent %d: %s\n"
msgstr ""
#. Print the header.
-#: src/readelf.c:3081
+#: src/readelf.c:3097
#, c-format
msgid ""
"\n"
@@ -4379,15 +4384,15 @@ msgid_plural ""
msgstr[0] ""
msgstr[1] ""
-#: src/readelf.c:3109
+#: src/readelf.c:3125
msgid " 0 *local* "
msgstr " 0 *lokal* "
-#: src/readelf.c:3114
+#: src/readelf.c:3130
msgid " 1 *global* "
msgstr " 1 *global* "
-#: src/readelf.c:3156
+#: src/readelf.c:3172
#, c-format
msgid ""
"\n"
@@ -4402,66 +4407,66 @@ msgid_plural ""
msgstr[0] ""
msgstr[1] ""
-#: src/readelf.c:3178
+#: src/readelf.c:3194
#, no-c-format
msgid " Length Number % of total Coverage\n"
msgstr ""
-#: src/readelf.c:3180
+#: src/readelf.c:3196
#, c-format
msgid " 0 %6<PRIu32> %5.1f%%\n"
msgstr " 0 %6<PRIu32> %5.1f%%\n"
-#: src/readelf.c:3187
+#: src/readelf.c:3203
#, c-format
msgid "%7d %6<PRIu32> %5.1f%% %5.1f%%\n"
msgstr "%7d %6<PRIu32> %5.1f%% %5.1f%%\n"
-#: src/readelf.c:3200
+#: src/readelf.c:3216
#, c-format
msgid ""
" Average number of tests: successful lookup: %f\n"
"\t\t\t unsuccessful lookup: %f\n"
msgstr ""
-#: src/readelf.c:3218 src/readelf.c:3282 src/readelf.c:3348
+#: src/readelf.c:3234 src/readelf.c:3298 src/readelf.c:3364
#, c-format
msgid "cannot get data for section %d: %s"
msgstr ""
-#: src/readelf.c:3226
+#: src/readelf.c:3242
#, fuzzy, c-format
msgid "invalid data in sysv.hash section %d"
msgstr "ungültige .debug_line Sektion"
-#: src/readelf.c:3255
+#: src/readelf.c:3271
#, fuzzy, c-format
msgid "invalid chain in sysv.hash section %d"
msgstr "ungültige .debug_line Sektion"
-#: src/readelf.c:3290
+#: src/readelf.c:3306
#, fuzzy, c-format
msgid "invalid data in sysv.hash64 section %d"
msgstr "ungültige .debug_line Sektion"
-#: src/readelf.c:3321
+#: src/readelf.c:3337
#, fuzzy, c-format
msgid "invalid chain in sysv.hash64 section %d"
msgstr "ungültige .debug_line Sektion"
-#: src/readelf.c:3357
+#: src/readelf.c:3373
#, fuzzy, c-format
msgid "invalid data in gnu.hash section %d"
msgstr "ungültige .debug_line Sektion"
-#: src/readelf.c:3424
+#: src/readelf.c:3440
#, c-format
msgid ""
" Symbol Bias: %u\n"
" Bitmask Size: %zu bytes %<PRIuFAST32>%% bits set 2nd hash shift: %u\n"
msgstr ""
-#: src/readelf.c:3513
+#: src/readelf.c:3529
#, c-format
msgid ""
"\n"
@@ -4472,13 +4477,13 @@ msgid_plural ""
msgstr[0] ""
msgstr[1] ""
-#: src/readelf.c:3527
+#: src/readelf.c:3543
msgid ""
" Library Time Stamp Checksum Version "
"Flags"
msgstr ""
-#: src/readelf.c:3579
+#: src/readelf.c:3595
#, c-format
msgid ""
"\n"
@@ -4486,102 +4491,102 @@ msgid ""
"%#0<PRIx64>:\n"
msgstr ""
-#: src/readelf.c:3596
+#: src/readelf.c:3612
msgid " Owner Size\n"
msgstr ""
-#: src/readelf.c:3625
+#: src/readelf.c:3641
#, c-format
msgid " %-13s %4<PRIu32>\n"
msgstr " %-13s %4<PRIu32>\n"
#. Unknown subsection, print and skip.
-#: src/readelf.c:3664
+#: src/readelf.c:3680
#, c-format
msgid " %-4u %12<PRIu32>\n"
msgstr " %-4u %12<PRIu32>\n"
#. Tag_File
-#: src/readelf.c:3669
+#: src/readelf.c:3685
#, c-format
msgid " File: %11<PRIu32>\n"
msgstr " File: %11<PRIu32>\n"
-#: src/readelf.c:3718
+#: src/readelf.c:3734
#, c-format
msgid " %s: %<PRId64>, %s\n"
msgstr " %s: %<PRId64>, %s\n"
-#: src/readelf.c:3721
+#: src/readelf.c:3737
#, c-format
msgid " %s: %<PRId64>\n"
msgstr " %s: %<PRId64>\n"
-#: src/readelf.c:3724
+#: src/readelf.c:3740
#, c-format
msgid " %s: %s\n"
msgstr " %s: %s\n"
-#: src/readelf.c:3734
+#: src/readelf.c:3750
#, c-format
msgid " %u: %<PRId64>\n"
msgstr " %u: %<PRId64>\n"
-#: src/readelf.c:3737
+#: src/readelf.c:3753
#, c-format
msgid " %u: %s\n"
msgstr " %u: %s\n"
-#: src/readelf.c:3807
+#: src/readelf.c:3823
#, fuzzy, c-format
msgid "sprintf failure"
msgstr "mprotect fehlgeschlagen"
-#: src/readelf.c:4289
+#: src/readelf.c:4305
msgid "empty block"
msgstr ""
-#: src/readelf.c:4292
+#: src/readelf.c:4308
#, c-format
msgid "%zu byte block:"
msgstr ""
-#: src/readelf.c:4770
+#: src/readelf.c:4786
#, c-format
msgid "%*s[%2<PRIuMAX>] %s <TRUNCATED>\n"
msgstr ""
-#: src/readelf.c:4834
+#: src/readelf.c:4850
#, c-format
msgid "%s %#<PRIx64> used with different address sizes"
msgstr ""
-#: src/readelf.c:4841
+#: src/readelf.c:4857
#, c-format
msgid "%s %#<PRIx64> used with different offset sizes"
msgstr ""
-#: src/readelf.c:4848
+#: src/readelf.c:4864
#, c-format
msgid "%s %#<PRIx64> used with different base addresses"
msgstr ""
-#: src/readelf.c:4855
+#: src/readelf.c:4871
#, c-format
msgid "%s %#<PRIx64> used with different attribute %s and %s"
msgstr ""
-#: src/readelf.c:4952
+#: src/readelf.c:4968
#, c-format
msgid " [%6tx] <UNUSED GARBAGE IN REST OF SECTION>\n"
msgstr ""
-#: src/readelf.c:4960
+#: src/readelf.c:4976
#, c-format
msgid " [%6tx] <UNUSED GARBAGE> ... %<PRIu64> bytes ...\n"
msgstr ""
-#: src/readelf.c:5038
+#: src/readelf.c:5054
#, c-format
msgid ""
"\n"
@@ -4589,79 +4594,79 @@ msgid ""
" [ Code]\n"
msgstr ""
-#: src/readelf.c:5046
+#: src/readelf.c:5062
#, c-format
msgid ""
"\n"
"Abbreviation section at offset %<PRIu64>:\n"
msgstr ""
-#: src/readelf.c:5059
+#: src/readelf.c:5075
#, c-format
msgid " *** error while reading abbreviation: %s\n"
msgstr ""
-#: src/readelf.c:5075
+#: src/readelf.c:5091
#, c-format
msgid " [%5u] offset: %<PRId64>, children: %s, tag: %s\n"
msgstr ""
-#: src/readelf.c:5108 src/readelf.c:5417 src/readelf.c:5584 src/readelf.c:5969
-#: src/readelf.c:6570 src/readelf.c:8307 src/readelf.c:8993 src/readelf.c:9429
-#: src/readelf.c:9674 src/readelf.c:9840 src/readelf.c:10227
-#: src/readelf.c:10287
+#: src/readelf.c:5124 src/readelf.c:5433 src/readelf.c:5600 src/readelf.c:5985
+#: src/readelf.c:6586 src/readelf.c:8323 src/readelf.c:9009 src/readelf.c:9445
+#: src/readelf.c:9690 src/readelf.c:9856 src/readelf.c:10243
+#: src/readelf.c:10303
#, c-format
msgid ""
"\n"
"DWARF section [%2zu] '%s' at offset %#<PRIx64>:\n"
msgstr ""
-#: src/readelf.c:5121
+#: src/readelf.c:5137
#, fuzzy, c-format
msgid "cannot get .debug_addr section data: %s"
msgstr "konnte Abschnittsdaten nicht holen: %s"
-#: src/readelf.c:5221 src/readelf.c:5245 src/readelf.c:5629 src/readelf.c:9038
+#: src/readelf.c:5237 src/readelf.c:5261 src/readelf.c:5645 src/readelf.c:9054
#, fuzzy, c-format
msgid " Length: %8<PRIu64>\n"
msgstr " %s: %<PRId64>\n"
-#: src/readelf.c:5223 src/readelf.c:5260 src/readelf.c:5642 src/readelf.c:9051
+#: src/readelf.c:5239 src/readelf.c:5276 src/readelf.c:5658 src/readelf.c:9067
#, fuzzy, c-format
msgid " DWARF version: %8<PRIu16>\n"
msgstr " %s: %<PRId64>\n"
-#: src/readelf.c:5224 src/readelf.c:5269 src/readelf.c:5651 src/readelf.c:9060
+#: src/readelf.c:5240 src/readelf.c:5285 src/readelf.c:5667 src/readelf.c:9076
#, fuzzy, c-format
msgid " Address size: %8<PRIu64>\n"
msgstr " %s: %<PRId64>\n"
-#: src/readelf.c:5226 src/readelf.c:5279 src/readelf.c:5661 src/readelf.c:9070
+#: src/readelf.c:5242 src/readelf.c:5295 src/readelf.c:5677 src/readelf.c:9086
#, fuzzy, c-format
msgid " Segment size: %8<PRIu64>\n"
msgstr " %s: %<PRId64>\n"
-#: src/readelf.c:5264 src/readelf.c:5646 src/readelf.c:9055 src/readelf.c:10419
+#: src/readelf.c:5280 src/readelf.c:5662 src/readelf.c:9071 src/readelf.c:10435
#, fuzzy, c-format
msgid "Unknown version"
msgstr "unbekannte Version"
-#: src/readelf.c:5274 src/readelf.c:5487 src/readelf.c:5656 src/readelf.c:9065
+#: src/readelf.c:5290 src/readelf.c:5503 src/readelf.c:5672 src/readelf.c:9081
#, fuzzy, c-format
msgid "unsupported address size"
msgstr "Kein Adress-Wert"
-#: src/readelf.c:5285 src/readelf.c:5498 src/readelf.c:5666 src/readelf.c:9075
+#: src/readelf.c:5301 src/readelf.c:5514 src/readelf.c:5682 src/readelf.c:9091
#, c-format
msgid "unsupported segment size"
msgstr ""
-#: src/readelf.c:5338 src/readelf.c:5412
+#: src/readelf.c:5354 src/readelf.c:5428
#, c-format
msgid "cannot get .debug_aranges content: %s"
msgstr ""
-#: src/readelf.c:5353
+#: src/readelf.c:5369
#, c-format
msgid ""
"\n"
@@ -4672,241 +4677,241 @@ msgid_plural ""
msgstr[0] ""
msgstr[1] ""
-#: src/readelf.c:5384
+#: src/readelf.c:5400
#, c-format
msgid " [%*zu] ???\n"
msgstr " [%*zu] ???\n"
-#: src/readelf.c:5386
+#: src/readelf.c:5402
#, c-format
msgid ""
" [%*zu] start: %0#*<PRIx64>, length: %5<PRIu64>, CU DIE offset: %6<PRId64>\n"
msgstr ""
-#: src/readelf.c:5430 src/readelf.c:8334
+#: src/readelf.c:5446 src/readelf.c:8350
#, c-format
msgid ""
"\n"
"Table at offset %zu:\n"
msgstr ""
-#: src/readelf.c:5434 src/readelf.c:5610 src/readelf.c:6594 src/readelf.c:8345
-#: src/readelf.c:9019
+#: src/readelf.c:5450 src/readelf.c:5626 src/readelf.c:6610 src/readelf.c:8361
+#: src/readelf.c:9035
#, c-format
msgid "invalid data in section [%zu] '%s'"
msgstr ""
-#: src/readelf.c:5450
+#: src/readelf.c:5466
#, fuzzy, c-format
msgid ""
"\n"
" Length: %6<PRIu64>\n"
msgstr " %s: %<PRId64>\n"
-#: src/readelf.c:5462
+#: src/readelf.c:5478
#, fuzzy, c-format
msgid " DWARF version: %6<PRIuFAST16>\n"
msgstr " %s: %<PRId64>\n"
-#: src/readelf.c:5466
+#: src/readelf.c:5482
#, c-format
msgid "unsupported aranges version"
msgstr ""
-#: src/readelf.c:5477
+#: src/readelf.c:5493
#, fuzzy, c-format
msgid " CU offset: %6<PRIx64>\n"
msgstr " %s: %<PRId64>\n"
-#: src/readelf.c:5483
+#: src/readelf.c:5499
#, c-format
msgid " Address size: %6<PRIu64>\n"
msgstr ""
-#: src/readelf.c:5494
+#: src/readelf.c:5510
#, c-format
msgid ""
" Segment size: %6<PRIu64>\n"
"\n"
msgstr ""
-#: src/readelf.c:5549
+#: src/readelf.c:5565
#, c-format
msgid " %zu padding bytes\n"
msgstr ""
-#: src/readelf.c:5593
+#: src/readelf.c:5609
#, fuzzy, c-format
msgid "cannot get .debug_rnglists content: %s"
msgstr "konnte Programm-Kopf nicht erstellen: %s"
-#: src/readelf.c:5616 src/readelf.c:9025
+#: src/readelf.c:5632 src/readelf.c:9041
#, fuzzy, c-format
msgid ""
"Table at Offset 0x%<PRIx64>:\n"
"\n"
msgstr " %s: %<PRId64>\n"
-#: src/readelf.c:5671 src/readelf.c:9080
+#: src/readelf.c:5687 src/readelf.c:9096
#, fuzzy, c-format
msgid " Offset entries: %8<PRIu64>\n"
msgstr " %s: %<PRId64>\n"
-#: src/readelf.c:5687 src/readelf.c:9096
+#: src/readelf.c:5703 src/readelf.c:9112
#, c-format
msgid " Unknown CU base: "
msgstr ""
-#: src/readelf.c:5689 src/readelf.c:9098
+#: src/readelf.c:5705 src/readelf.c:9114
#, c-format
msgid " CU [%6<PRIx64>] base: "
msgstr ""
-#: src/readelf.c:5695 src/readelf.c:9104
+#: src/readelf.c:5711 src/readelf.c:9120
#, c-format
msgid " Not associated with a CU.\n"
msgstr ""
-#: src/readelf.c:5706 src/readelf.c:9115
+#: src/readelf.c:5722 src/readelf.c:9131
#, c-format
msgid "too many offset entries for unit length"
msgstr ""
-#: src/readelf.c:5710 src/readelf.c:9119
+#: src/readelf.c:5726 src/readelf.c:9135
#, fuzzy, c-format
msgid " Offsets starting at 0x%<PRIx64>:\n"
msgstr " %s: %<PRId64>\n"
-#: src/readelf.c:5762
+#: src/readelf.c:5778
#, fuzzy, c-format
msgid "invalid range list data"
msgstr "Ungültige Daten"
-#: src/readelf.c:5947 src/readelf.c:9407
+#: src/readelf.c:5963 src/readelf.c:9423
#, c-format
msgid ""
" %zu padding bytes\n"
"\n"
msgstr ""
-#: src/readelf.c:5964
+#: src/readelf.c:5980
#, c-format
msgid "cannot get .debug_ranges content: %s"
msgstr ""
-#: src/readelf.c:6000 src/readelf.c:9462
+#: src/readelf.c:6016 src/readelf.c:9478
#, c-format
msgid ""
"\n"
" Unknown CU base: "
msgstr ""
-#: src/readelf.c:6002 src/readelf.c:9464
+#: src/readelf.c:6018 src/readelf.c:9480
#, c-format
msgid ""
"\n"
" CU [%6<PRIx64>] base: "
msgstr ""
-#: src/readelf.c:6011 src/readelf.c:9490 src/readelf.c:9516
+#: src/readelf.c:6027 src/readelf.c:9506 src/readelf.c:9532
#, c-format
msgid " [%6tx] <INVALID DATA>\n"
msgstr ""
-#: src/readelf.c:6032 src/readelf.c:9596
+#: src/readelf.c:6048 src/readelf.c:9612
#, c-format
msgid ""
" [%6tx] base address\n"
" "
msgstr ""
-#: src/readelf.c:6040 src/readelf.c:9604
+#: src/readelf.c:6056 src/readelf.c:9620
#, fuzzy, c-format
msgid " [%6tx] empty list\n"
msgstr " [%6tx] %s..%s\n"
-#: src/readelf.c:6295
+#: src/readelf.c:6311
msgid " <INVALID DATA>\n"
msgstr ""
-#: src/readelf.c:6548
+#: src/readelf.c:6564
#, fuzzy, c-format
msgid "cannot get ELF: %s"
msgstr "ELF Kopf konnte nicht ausgelesen werden"
-#: src/readelf.c:6566
+#: src/readelf.c:6582
#, c-format
msgid ""
"\n"
"Call frame information section [%2zu] '%s' at offset %#<PRIx64>:\n"
msgstr ""
-#: src/readelf.c:6616
+#: src/readelf.c:6632
#, c-format
msgid ""
"\n"
" [%6tx] Zero terminator\n"
msgstr ""
-#: src/readelf.c:6717 src/readelf.c:6871
+#: src/readelf.c:6733 src/readelf.c:6887
#, fuzzy, c-format
msgid "invalid augmentation length"
msgstr "ungültige Abschnittsausrichtung"
-#: src/readelf.c:6732
+#: src/readelf.c:6748
msgid "FDE address encoding: "
msgstr ""
-#: src/readelf.c:6738
+#: src/readelf.c:6754
msgid "LSDA pointer encoding: "
msgstr ""
-#: src/readelf.c:6848
+#: src/readelf.c:6864
#, c-format
msgid " (offset: %#<PRIx64>)"
msgstr ""
-#: src/readelf.c:6855
+#: src/readelf.c:6871
#, c-format
msgid " (end offset: %#<PRIx64>)"
msgstr ""
-#: src/readelf.c:6892
+#: src/readelf.c:6908
#, c-format
msgid " %-26sLSDA pointer: %#<PRIx64>\n"
msgstr ""
-#: src/readelf.c:6977
+#: src/readelf.c:6993
#, c-format
msgid "DIE [%<PRIx64>] cannot get attribute code: %s"
msgstr ""
-#: src/readelf.c:6987
+#: src/readelf.c:7003
#, c-format
msgid "DIE [%<PRIx64>] cannot get attribute form: %s"
msgstr ""
-#: src/readelf.c:7009
+#: src/readelf.c:7025
#, c-format
msgid "DIE [%<PRIx64>] cannot get attribute '%s' (%s) value: %s"
msgstr ""
-#: src/readelf.c:7339
+#: src/readelf.c:7355
#, fuzzy, c-format
msgid "invalid file (%<PRId64>): %s"
msgstr "Ungültige Datei"
-#: src/readelf.c:7343
+#: src/readelf.c:7359
#, fuzzy, c-format
msgid "no srcfiles for CU [%<PRIx64>]"
msgstr "unbekannte Form %<PRIx64>"
-#: src/readelf.c:7347
+#: src/readelf.c:7363
#, fuzzy, c-format
msgid "couldn't get DWARF CU: %s"
msgstr "ELF Kopf konnte nicht ausgelesen werden"
-#: src/readelf.c:7660
+#: src/readelf.c:7676
#, c-format
msgid ""
"\n"
@@ -4914,12 +4919,12 @@ msgid ""
" [Offset]\n"
msgstr ""
-#: src/readelf.c:7710
+#: src/readelf.c:7726
#, fuzzy, c-format
msgid "cannot get next unit: %s"
msgstr "konnte Abschnittsdaten nicht holen: %s"
-#: src/readelf.c:7729
+#: src/readelf.c:7745
#, c-format
msgid ""
" Type unit at offset %<PRIu64>:\n"
@@ -4928,7 +4933,7 @@ msgid ""
" Type signature: %#<PRIx64>, Type offset: %#<PRIx64> [%<PRIx64>]\n"
msgstr ""
-#: src/readelf.c:7741
+#: src/readelf.c:7757
#, c-format
msgid ""
" Compilation unit at offset %<PRIu64>:\n"
@@ -4936,37 +4941,37 @@ msgid ""
"%<PRIu8>, Offset size: %<PRIu8>\n"
msgstr ""
-#: src/readelf.c:7751 src/readelf.c:7914
+#: src/readelf.c:7767 src/readelf.c:7930
#, c-format
msgid " Unit type: %s (%<PRIu8>)"
msgstr ""
-#: src/readelf.c:7778
+#: src/readelf.c:7794
#, c-format
msgid "unknown version (%d) or unit type (%d)"
msgstr ""
-#: src/readelf.c:7807
+#: src/readelf.c:7823
#, c-format
msgid "cannot get DIE offset: %s"
msgstr ""
-#: src/readelf.c:7816
+#: src/readelf.c:7832
#, 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:7854
+#: src/readelf.c:7870
#, c-format
msgid "cannot get next DIE: %s\n"
msgstr ""
-#: src/readelf.c:7862
+#: src/readelf.c:7878
#, c-format
msgid "cannot get next DIE: %s"
msgstr ""
-#: src/readelf.c:7906
+#: src/readelf.c:7922
#, c-format
msgid ""
" Split compilation unit at offset %<PRIu64>:\n"
@@ -4974,7 +4979,7 @@ msgid ""
"%<PRIu8>, Offset size: %<PRIu8>\n"
msgstr ""
-#: src/readelf.c:7958
+#: src/readelf.c:7974
#, c-format
msgid ""
"\n"
@@ -4982,18 +4987,18 @@ msgid ""
"\n"
msgstr ""
-#: src/readelf.c:8290
+#: src/readelf.c:8306
#, fuzzy, c-format
msgid "unknown form: %s"
msgstr "unbekannte Form %<PRIx64>"
-#: src/readelf.c:8321
+#: src/readelf.c:8337
#, c-format
msgid "cannot get line data section data: %s"
msgstr ""
#. Print what we got so far.
-#: src/readelf.c:8423
+#: src/readelf.c:8439
#, c-format
msgid ""
"\n"
@@ -5012,171 +5017,171 @@ msgid ""
"Opcodes:\n"
msgstr ""
-#: src/readelf.c:8445
+#: src/readelf.c:8461
#, fuzzy, c-format
msgid "cannot handle .debug_line version: %u\n"
msgstr "ungültige .debug_line Sektion"
-#: src/readelf.c:8453
+#: src/readelf.c:8469
#, fuzzy, c-format
msgid "cannot handle address size: %u\n"
msgstr "Kein Adress-Wert"
-#: src/readelf.c:8461
+#: src/readelf.c:8477
#, c-format
msgid "cannot handle segment selector size: %u\n"
msgstr ""
-#: src/readelf.c:8471
+#: src/readelf.c:8487
#, c-format
msgid "invalid data at offset %tu in section [%zu] '%s'"
msgstr ""
-#: src/readelf.c:8486
+#: src/readelf.c:8502
#, c-format
msgid " [%*<PRIuFAST8>] %hhu argument\n"
msgid_plural " [%*<PRIuFAST8>] %hhu arguments\n"
msgstr[0] ""
msgstr[1] ""
-#: src/readelf.c:8497
+#: src/readelf.c:8513
msgid ""
"\n"
"Directory table:"
msgstr ""
-#: src/readelf.c:8503 src/readelf.c:8580
+#: src/readelf.c:8519 src/readelf.c:8596
#, fuzzy, c-format
msgid " ["
msgstr " %s: %s\n"
-#: src/readelf.c:8574
+#: src/readelf.c:8590
msgid ""
"\n"
"File name table:"
msgstr ""
-#: src/readelf.c:8635
+#: src/readelf.c:8651
msgid " Entry Dir Time Size Name"
msgstr ""
-#: src/readelf.c:8672
+#: src/readelf.c:8688
msgid ""
"\n"
"Line number statements:"
msgstr ""
-#: src/readelf.c:8695
+#: src/readelf.c:8711
#, c-format
msgid "invalid maximum operations per instruction is zero"
msgstr ""
-#: src/readelf.c:8729
+#: src/readelf.c:8745
#, c-format
msgid " special opcode %u: address+%u = "
msgstr ""
-#: src/readelf.c:8733
+#: src/readelf.c:8749
#, c-format
msgid ", op_index = %u, line%+d = %zu\n"
msgstr ""
-#: src/readelf.c:8736
+#: src/readelf.c:8752
#, c-format
msgid ", line%+d = %zu\n"
msgstr ""
-#: src/readelf.c:8754
+#: src/readelf.c:8770
#, c-format
msgid " extended opcode %u: "
msgstr ""
-#: src/readelf.c:8759
+#: src/readelf.c:8775
msgid " end of sequence"
msgstr ""
-#: src/readelf.c:8777
+#: src/readelf.c:8793
#, fuzzy, c-format
msgid " set address to "
msgstr "Außerhalb des Adressbereiches"
-#: src/readelf.c:8805
+#: src/readelf.c:8821
#, c-format
msgid " define new file: dir=%u, mtime=%<PRIu64>, length=%<PRIu64>, name=%s\n"
msgstr ""
-#: src/readelf.c:8819
+#: src/readelf.c:8835
#, c-format
msgid " set discriminator to %u\n"
msgstr ""
#. Unknown, ignore it.
-#: src/readelf.c:8824
+#: src/readelf.c:8840
#, fuzzy
msgid " unknown opcode"
msgstr "unbekannter Typ"
#. Takes no argument.
-#: src/readelf.c:8836
+#: src/readelf.c:8852
msgid " copy"
msgstr ""
-#: src/readelf.c:8847
+#: src/readelf.c:8863
#, c-format
msgid " advance address by %u to "
msgstr ""
-#: src/readelf.c:8851 src/readelf.c:8912
+#: src/readelf.c:8867 src/readelf.c:8928
#, c-format
msgid ", op_index to %u"
msgstr ""
-#: src/readelf.c:8863
+#: src/readelf.c:8879
#, c-format
msgid " advance line by constant %d to %<PRId64>\n"
msgstr ""
-#: src/readelf.c:8873
+#: src/readelf.c:8889
#, c-format
msgid " set file to %<PRIu64>\n"
msgstr ""
-#: src/readelf.c:8884
+#: src/readelf.c:8900
#, c-format
msgid " set column to %<PRIu64>\n"
msgstr ""
-#: src/readelf.c:8891
+#: src/readelf.c:8907
#, c-format
msgid " set '%s' to %<PRIuFAST8>\n"
msgstr ""
#. Takes no argument.
-#: src/readelf.c:8897
+#: src/readelf.c:8913
msgid " set basic block flag"
msgstr ""
-#: src/readelf.c:8908
+#: src/readelf.c:8924
#, c-format
msgid " advance address by constant %u to "
msgstr ""
-#: src/readelf.c:8928
+#: src/readelf.c:8944
#, c-format
msgid " advance address by fixed value %u to \n"
msgstr ""
#. Takes no argument.
-#: src/readelf.c:8938
+#: src/readelf.c:8954
msgid " set prologue end flag"
msgstr ""
#. Takes no argument.
-#: src/readelf.c:8943
+#: src/readelf.c:8959
msgid " set epilogue begin flag"
msgstr ""
-#: src/readelf.c:8953
+#: src/readelf.c:8969
#, c-format
msgid " set isa to %u\n"
msgstr ""
@@ -5184,103 +5189,103 @@ msgstr ""
#. 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:8962
+#: src/readelf.c:8978
#, c-format
msgid " unknown opcode with %<PRIu8> parameter:"
msgid_plural " unknown opcode with %<PRIu8> parameters:"
msgstr[0] ""
msgstr[1] ""
-#: src/readelf.c:9002
+#: src/readelf.c:9018
#, fuzzy, c-format
msgid "cannot get .debug_loclists content: %s"
msgstr "konnte Eintrag aus der Symboltabelle nicht holen: %s"
-#: src/readelf.c:9171
+#: src/readelf.c:9187
#, fuzzy, c-format
msgid "invalid loclists data"
msgstr "Ungültige Daten"
-#: src/readelf.c:9424
+#: src/readelf.c:9440
#, c-format
msgid "cannot get .debug_loc content: %s"
msgstr ""
-#: src/readelf.c:9631 src/readelf.c:10675
+#: src/readelf.c:9647 src/readelf.c:10691
msgid " <INVALID DATA>\n"
msgstr ""
-#: src/readelf.c:9686 src/readelf.c:9849
+#: src/readelf.c:9702 src/readelf.c:9865
#, c-format
msgid "cannot get macro information section data: %s"
msgstr ""
-#: src/readelf.c:9766
+#: src/readelf.c:9782
#, c-format
msgid "%*s*** non-terminated string at end of section"
msgstr ""
-#: src/readelf.c:9789
+#: src/readelf.c:9805
#, c-format
msgid "%*s*** missing DW_MACINFO_start_file argument at end of section"
msgstr ""
-#: src/readelf.c:9890
+#: src/readelf.c:9906
#, fuzzy, c-format
msgid " Offset: 0x%<PRIx64>\n"
msgstr " %s: %<PRId64>\n"
-#: src/readelf.c:9902
+#: src/readelf.c:9918
#, fuzzy, c-format
msgid " Version: %<PRIu16>\n"
msgstr " %s: %<PRId64>\n"
-#: src/readelf.c:9908 src/readelf.c:10795
+#: src/readelf.c:9924 src/readelf.c:10811
#, c-format
msgid " unknown version, cannot parse section\n"
msgstr ""
-#: src/readelf.c:9915
+#: src/readelf.c:9931
#, fuzzy, c-format
msgid " Flag: 0x%<PRIx8>"
msgstr " %s: %<PRId64>\n"
-#: src/readelf.c:9944
+#: src/readelf.c:9960
#, c-format
msgid " Offset length: %<PRIu8>\n"
msgstr ""
-#: src/readelf.c:9952
+#: src/readelf.c:9968
#, c-format
msgid " .debug_line offset: 0x%<PRIx64>\n"
msgstr ""
-#: src/readelf.c:9977
+#: src/readelf.c:9993
#, c-format
msgid " extension opcode table, %<PRIu8> items:\n"
msgstr ""
-#: src/readelf.c:9984
+#: src/readelf.c:10000
#, c-format
msgid " [%<PRIx8>]"
msgstr ""
-#: src/readelf.c:9996
+#: src/readelf.c:10012
#, c-format
msgid " %<PRIu8> arguments:"
msgstr ""
-#: src/readelf.c:10011
+#: src/readelf.c:10027
#, c-format
msgid " no arguments."
msgstr ""
-#: src/readelf.c:10212
+#: src/readelf.c:10228
#, c-format
msgid " [%5d] DIE offset: %6<PRId64>, CU DIE offset: %6<PRId64>, name: %s\n"
msgstr ""
-#: src/readelf.c:10256
+#: src/readelf.c:10272
#, c-format
msgid ""
"\n"
@@ -5288,72 +5293,72 @@ msgid ""
" %*s String\n"
msgstr ""
-#: src/readelf.c:10271
+#: src/readelf.c:10287
#, c-format
msgid " *** error, missing string terminator\n"
msgstr ""
-#: src/readelf.c:10300
+#: src/readelf.c:10316
#, fuzzy, c-format
msgid "cannot get .debug_str_offsets section data: %s"
msgstr "konnte Abschnittsdaten nicht holen: %s"
-#: src/readelf.c:10399
+#: src/readelf.c:10415
#, fuzzy, c-format
msgid " Length: %8<PRIu64>\n"
msgstr " %s: %<PRId64>\n"
-#: src/readelf.c:10401
+#: src/readelf.c:10417
#, fuzzy, c-format
msgid " Offset size: %8<PRIu8>\n"
msgstr " %s: %<PRId64>\n"
-#: src/readelf.c:10415
+#: src/readelf.c:10431
#, fuzzy, c-format
msgid " DWARF version: %8<PRIu16>\n"
msgstr " %s: %<PRId64>\n"
-#: src/readelf.c:10424
+#: src/readelf.c:10440
#, fuzzy, c-format
msgid " Padding: %8<PRIx16>\n"
msgstr " %s: %<PRId64>\n"
-#: src/readelf.c:10478
+#: src/readelf.c:10494
#, c-format
msgid ""
"\n"
"Call frame search table section [%2zu] '.eh_frame_hdr':\n"
msgstr ""
-#: src/readelf.c:10580
+#: src/readelf.c:10596
#, c-format
msgid ""
"\n"
"Exception handling table section [%2zu] '.gcc_except_table':\n"
msgstr ""
-#: src/readelf.c:10603
+#: src/readelf.c:10619
#, c-format
msgid " LPStart encoding: %#x "
msgstr ""
-#: src/readelf.c:10615
+#: src/readelf.c:10631
#, c-format
msgid " TType encoding: %#x "
msgstr ""
-#: src/readelf.c:10630
+#: src/readelf.c:10646
#, c-format
msgid " Call site encoding: %#x "
msgstr ""
-#: src/readelf.c:10643
+#: src/readelf.c:10659
msgid ""
"\n"
" Call site table:"
msgstr ""
-#: src/readelf.c:10657
+#: src/readelf.c:10673
#, c-format
msgid ""
" [%4u] Call site start: %#<PRIx64>\n"
@@ -5362,142 +5367,142 @@ msgid ""
" Action: %u\n"
msgstr ""
-#: src/readelf.c:10730
+#: src/readelf.c:10746
#, c-format
msgid "invalid TType encoding"
msgstr ""
-#: src/readelf.c:10757
+#: src/readelf.c:10773
#, c-format
msgid ""
"\n"
"GDB section [%2zu] '%s' at offset %#<PRIx64> contains %<PRId64> bytes :\n"
msgstr ""
-#: src/readelf.c:10786
+#: src/readelf.c:10802
#, fuzzy, c-format
msgid " Version: %<PRId32>\n"
msgstr " %s: %<PRId64>\n"
-#: src/readelf.c:10804
+#: src/readelf.c:10820
#, c-format
msgid " CU offset: %#<PRIx32>\n"
msgstr ""
-#: src/readelf.c:10811
+#: src/readelf.c:10827
#, c-format
msgid " TU offset: %#<PRIx32>\n"
msgstr ""
-#: src/readelf.c:10818
+#: src/readelf.c:10834
#, c-format
msgid " address offset: %#<PRIx32>\n"
msgstr ""
-#: src/readelf.c:10825
+#: src/readelf.c:10841
#, c-format
msgid " symbol offset: %#<PRIx32>\n"
msgstr ""
-#: src/readelf.c:10832
+#: src/readelf.c:10848
#, c-format
msgid " constant offset: %#<PRIx32>\n"
msgstr ""
-#: src/readelf.c:10846
+#: src/readelf.c:10862
#, c-format
msgid ""
"\n"
" CU list at offset %#<PRIx32> contains %zu entries:\n"
msgstr ""
-#: src/readelf.c:10871
+#: src/readelf.c:10887
#, c-format
msgid ""
"\n"
" TU list at offset %#<PRIx32> contains %zu entries:\n"
msgstr ""
-#: src/readelf.c:10900
+#: src/readelf.c:10916
#, c-format
msgid ""
"\n"
" Address list at offset %#<PRIx32> contains %zu entries:\n"
msgstr ""
-#: src/readelf.c:10932
+#: src/readelf.c:10948
#, c-format
msgid ""
"\n"
" Symbol table at offset %#<PRIx32> contains %zu slots:\n"
msgstr ""
-#: src/readelf.c:11070
+#: src/readelf.c:11086
#, c-format
msgid "cannot get debug context descriptor: %s"
msgstr ""
-#: src/readelf.c:11433 src/readelf.c:12055 src/readelf.c:12166
-#: src/readelf.c:12224
+#: src/readelf.c:11449 src/readelf.c:12071 src/readelf.c:12182
+#: src/readelf.c:12240
#, c-format
msgid "cannot convert core note data: %s"
msgstr ""
-#: src/readelf.c:11796
+#: src/readelf.c:11812
#, c-format
msgid ""
"\n"
"%*s... <repeats %u more times> ..."
msgstr ""
-#: src/readelf.c:12303
+#: src/readelf.c:12319
msgid " Owner Data size Type\n"
msgstr ""
-#: src/readelf.c:12332
+#: src/readelf.c:12348
#, c-format
msgid " %-13.*s %9<PRId32> %s\n"
msgstr ""
-#: src/readelf.c:12384
+#: src/readelf.c:12400
#, fuzzy, c-format
msgid "cannot get content of note: %s"
msgstr "Konnte Inhalt von %s: %s nicht lesen"
-#: src/readelf.c:12411
+#: src/readelf.c:12434
#, c-format
msgid ""
"\n"
"Note section [%2zu] '%s' of %<PRIu64> bytes at offset %#0<PRIx64>:\n"
msgstr ""
-#: src/readelf.c:12434
+#: src/readelf.c:12457
#, c-format
msgid ""
"\n"
"Note segment of %<PRIu64> bytes at offset %#0<PRIx64>:\n"
msgstr ""
-#: src/readelf.c:12481
+#: src/readelf.c:12504
#, fuzzy, c-format
msgid ""
"\n"
"Section [%zu] '%s' has no data to dump.\n"
msgstr "konnte Abschnittsdaten nicht holen: %s"
-#: src/readelf.c:12508 src/readelf.c:12559
+#: src/readelf.c:12531 src/readelf.c:12582
#, fuzzy, c-format
msgid "cannot get data for section [%zu] '%s': %s"
msgstr "konnte Abschnittsdaten nicht holen: %s"
-#: src/readelf.c:12513
+#: src/readelf.c:12536
#, c-format
msgid ""
"\n"
"Hex dump of section [%zu] '%s', %<PRIu64> bytes at offset %#0<PRIx64>:\n"
msgstr ""
-#: src/readelf.c:12518
+#: src/readelf.c:12541
#, c-format
msgid ""
"\n"
@@ -5505,21 +5510,21 @@ msgid ""
"%#0<PRIx64>:\n"
msgstr ""
-#: src/readelf.c:12532
+#: src/readelf.c:12555
#, fuzzy, c-format
msgid ""
"\n"
"Section [%zu] '%s' has no strings to dump.\n"
msgstr "konnte Abschnittsdaten nicht holen: %s"
-#: src/readelf.c:12564
+#: src/readelf.c:12587
#, c-format
msgid ""
"\n"
"String section [%zu] '%s' contains %<PRIu64> bytes at offset %#0<PRIx64>:\n"
msgstr ""
-#: src/readelf.c:12569
+#: src/readelf.c:12592
#, c-format
msgid ""
"\n"
@@ -5527,45 +5532,45 @@ msgid ""
"offset %#0<PRIx64>:\n"
msgstr ""
-#: src/readelf.c:12618
+#: src/readelf.c:12641
#, c-format
msgid ""
"\n"
"section [%lu] does not exist"
msgstr ""
-#: src/readelf.c:12647
+#: src/readelf.c:12671
#, c-format
msgid ""
"\n"
"section '%s' does not exist"
msgstr ""
-#: src/readelf.c:12704
+#: src/readelf.c:12728
#, c-format
msgid "cannot get symbol index of archive '%s': %s"
msgstr ""
-#: src/readelf.c:12707
+#: src/readelf.c:12731
#, c-format
msgid ""
"\n"
"Archive '%s' has no symbol index\n"
msgstr ""
-#: src/readelf.c:12711
+#: src/readelf.c:12735
#, c-format
msgid ""
"\n"
"Index of archive '%s' has %zu entries:\n"
msgstr ""
-#: src/readelf.c:12729
+#: src/readelf.c:12753
#, fuzzy, c-format
msgid "cannot extract member at offset %zu in '%s': %s"
msgstr "konnte Programm-Kopf nicht erstellen: %s"
-#: src/readelf.c:12734
+#: src/readelf.c:12758
#, c-format
msgid "Archive member '%s' contains:\n"
msgstr ""
@@ -6153,7 +6158,7 @@ msgstr ""
msgid "cannot get shdrstrndx:%s"
msgstr "konnte Abschnittsdaten nicht holen: %s"
-#: src/unstrip.c:248 src/unstrip.c:2038
+#: src/unstrip.c:248 src/unstrip.c:2081
#, c-format
msgid "cannot get ELF header: %s"
msgstr ""
@@ -6173,12 +6178,12 @@ msgstr "konnte Versionierungsabschnitt nicht erstellen: %s"
msgid "cannot copy ELF header: %s"
msgstr ""
-#: src/unstrip.c:269 src/unstrip.c:2056 src/unstrip.c:2099
+#: src/unstrip.c:269 src/unstrip.c:2099 src/unstrip.c:2142
#, fuzzy, c-format
msgid "cannot get number of program headers: %s"
msgstr "konnte Programm-Kopf nicht erstellen: %s"
-#: src/unstrip.c:274 src/unstrip.c:2060
+#: src/unstrip.c:274 src/unstrip.c:2103
#, c-format
msgid "cannot create program headers: %s"
msgstr "konnte Programm-Kopf nicht erstellen: %s"
@@ -6193,12 +6198,12 @@ msgstr "konnte Programm-Kopf nicht kopieren: %s"
msgid "cannot copy section header: %s"
msgstr ""
-#: src/unstrip.c:293 src/unstrip.c:1669
+#: src/unstrip.c:293 src/unstrip.c:1703
#, c-format
msgid "cannot get section data: %s"
msgstr "konnte Abschnittsdaten nicht holen: %s"
-#: src/unstrip.c:295 src/unstrip.c:1671
+#: src/unstrip.c:295 src/unstrip.c:1705
#, c-format
msgid "cannot copy section data: %s"
msgstr "konnte Abschnittsdaten nicht kopieren: %s"
@@ -6208,14 +6213,14 @@ msgstr "konnte Abschnittsdaten nicht kopieren: %s"
msgid "cannot create directory '%s'"
msgstr "konnte Verzeichnis nicht erstellen: %s"
-#: src/unstrip.c:391 src/unstrip.c:647 src/unstrip.c:681 src/unstrip.c:847
-#: src/unstrip.c:1706
+#: src/unstrip.c:391 src/unstrip.c:651 src/unstrip.c:685 src/unstrip.c:853
+#: src/unstrip.c:1745
#, c-format
msgid "cannot get symbol table entry: %s"
msgstr "konnte Eintrag aus der Symboltabelle nicht holen: %s"
-#: src/unstrip.c:407 src/unstrip.c:650 src/unstrip.c:671 src/unstrip.c:684
-#: src/unstrip.c:1727 src/unstrip.c:1922 src/unstrip.c:1946
+#: src/unstrip.c:407 src/unstrip.c:654 src/unstrip.c:675 src/unstrip.c:688
+#: src/unstrip.c:1766 src/unstrip.c:1961 src/unstrip.c:1985
#, c-format
msgid "cannot update symbol table: %s"
msgstr "konnte Symboltabelle nicht aktualisieren: %s"
@@ -6225,228 +6230,243 @@ msgstr "konnte Symboltabelle nicht aktualisieren: %s"
msgid "cannot update section header: %s"
msgstr ""
-#: src/unstrip.c:459 src/unstrip.c:473
+#: src/unstrip.c:463 src/unstrip.c:477
#, c-format
msgid "cannot update relocation: %s"
msgstr ""
-#: src/unstrip.c:570
+#: src/unstrip.c:574
#, c-format
msgid "cannot get symbol version: %s"
msgstr ""
-#: src/unstrip.c:583
+#: src/unstrip.c:587
#, c-format
msgid "unexpected section type in [%zu] with sh_link to symtab"
msgstr ""
-#: src/unstrip.c:853
+#: src/unstrip.c:842
+#, fuzzy, c-format
+msgid "cannot get symbol section data: %s"
+msgstr "konnte Abschnittsdaten nicht holen: %s"
+
+#: src/unstrip.c:844
+#, fuzzy, c-format
+msgid "cannot get string section data: %s"
+msgstr "konnte Abschnittsdaten nicht holen: %s"
+
+#: src/unstrip.c:861
#, fuzzy, c-format
msgid "invalid string offset in symbol [%zu]"
msgstr "ungültiger Offset %zu für Symbol %s"
-#: src/unstrip.c:1011 src/unstrip.c:1402
+#: src/unstrip.c:1019 src/unstrip.c:1423
#, fuzzy, c-format
msgid "cannot read section [%zu] name: %s"
msgstr "konnte Abschnittsdaten nicht holen: %s"
-#: src/unstrip.c:1026
+#: src/unstrip.c:1034
#, fuzzy, c-format
msgid "bad sh_link for group section: %s"
msgstr "ungültige .debug_line Sektion"
-#: src/unstrip.c:1032
+#: src/unstrip.c:1040
#, fuzzy, c-format
msgid "couldn't get shdr for group section: %s"
msgstr "konnte Versionierungsabschnitt nicht erstellen: %s"
-#: src/unstrip.c:1037
+#: src/unstrip.c:1045
#, fuzzy, c-format
msgid "bad data for group symbol section: %s"
msgstr "ungültige .debug_line Sektion"
-#: src/unstrip.c:1043
+#: src/unstrip.c:1051
#, fuzzy, c-format
msgid "couldn't get symbol for group section: %s"
msgstr "konnte Programm-Kopf nicht erstellen: %s"
-#: src/unstrip.c:1048
+#: src/unstrip.c:1056
#, fuzzy, c-format
msgid "bad symbol name for group section: %s"
msgstr "konnte Programm-Kopf nicht erstellen: %s"
-#: src/unstrip.c:1090 src/unstrip.c:1109 src/unstrip.c:1147
+#: src/unstrip.c:1098 src/unstrip.c:1117 src/unstrip.c:1155
#, c-format
msgid "cannot read '.gnu.prelink_undo' section: %s"
msgstr ""
-#: src/unstrip.c:1127
+#: src/unstrip.c:1135
#, c-format
msgid "overflow with shnum = %zu in '%s' section"
msgstr ""
-#: src/unstrip.c:1138
+#: src/unstrip.c:1146
#, c-format
msgid "invalid contents in '%s' section"
msgstr ""
-#: src/unstrip.c:1194 src/unstrip.c:1528
+#: src/unstrip.c:1202 src/unstrip.c:1549
#, fuzzy, c-format
msgid "cannot find matching section for [%zu] '%s'"
msgstr "konnte Abschnittsdaten nicht holen: %s"
-#: src/unstrip.c:1319 src/unstrip.c:1335 src/unstrip.c:1607 src/unstrip.c:1881
+#: src/unstrip.c:1327 src/unstrip.c:1343 src/unstrip.c:1629 src/unstrip.c:1920
#, c-format
msgid "cannot add section name to string table: %s"
msgstr ""
-#: src/unstrip.c:1344
+#: src/unstrip.c:1352
#, c-format
msgid "cannot update section header string table data: %s"
msgstr ""
-#: src/unstrip.c:1373 src/unstrip.c:1377
+#: src/unstrip.c:1381 src/unstrip.c:1385
#, c-format
msgid "cannot get section header string table section index: %s"
msgstr ""
-#: src/unstrip.c:1381 src/unstrip.c:1385 src/unstrip.c:1622
+#: src/unstrip.c:1389 src/unstrip.c:1393 src/unstrip.c:1644
#, c-format
msgid "cannot get section count: %s"
msgstr ""
-#: src/unstrip.c:1388
+#: src/unstrip.c:1396
#, c-format
msgid "more sections in stripped file than debug file -- arguments reversed?"
msgstr ""
-#: src/unstrip.c:1450 src/unstrip.c:1543
+#: src/unstrip.c:1400
+#, c-format
+msgid "no sections in stripped file"
+msgstr ""
+
+#: src/unstrip.c:1471 src/unstrip.c:1564
#, c-format
msgid "cannot read section header string table: %s"
msgstr ""
-#: src/unstrip.c:1601
+#: src/unstrip.c:1623
#, c-format
msgid "cannot add new section: %s"
msgstr ""
-#: src/unstrip.c:1714
+#: src/unstrip.c:1753
#, fuzzy, c-format
msgid "symbol [%zu] has invalid section index"
msgstr "ungültiger Abschnittsindex"
-#: src/unstrip.c:1746
+#: src/unstrip.c:1785
#, fuzzy, c-format
msgid "group has invalid section index [%zd]"
msgstr "ungültiger Abschnittsindex"
-#: src/unstrip.c:2017
+#: src/unstrip.c:2060
#, fuzzy, c-format
msgid "cannot read section data: %s"
msgstr "konnte Abschnittsdaten nicht holen: %s"
-#: src/unstrip.c:2046
+#: src/unstrip.c:2089
#, c-format
msgid "cannot update ELF header: %s"
msgstr ""
-#: src/unstrip.c:2070
+#: src/unstrip.c:2113
#, c-format
msgid "cannot update program header: %s"
msgstr "konnte Programm-Kopf nicht aktualisieren: %s"
-#: src/unstrip.c:2075 src/unstrip.c:2157
+#: src/unstrip.c:2118 src/unstrip.c:2200
#, c-format
msgid "cannot write output file: %s"
msgstr ""
-#: src/unstrip.c:2126
+#: src/unstrip.c:2169
#, c-format
msgid "DWARF data not adjusted for prelinking bias; consider prelink -u"
msgstr ""
-#: src/unstrip.c:2129
+#: src/unstrip.c:2172
#, c-format
msgid ""
"DWARF data in '%s' not adjusted for prelinking bias; consider prelink -u"
msgstr ""
-#: src/unstrip.c:2148 src/unstrip.c:2199 src/unstrip.c:2211 src/unstrip.c:2297
+#: src/unstrip.c:2191 src/unstrip.c:2242 src/unstrip.c:2254 src/unstrip.c:2340
#, c-format
msgid "cannot create ELF descriptor: %s"
msgstr ""
-#: src/unstrip.c:2190
+#: src/unstrip.c:2233
msgid "WARNING: "
msgstr ""
-#: src/unstrip.c:2192
+#: src/unstrip.c:2235
msgid ", use --force"
msgstr ""
-#: src/unstrip.c:2215
+#: src/unstrip.c:2258
msgid "ELF header identification (e_ident) different"
msgstr ""
-#: src/unstrip.c:2218
+#: src/unstrip.c:2261
msgid "ELF header type (e_type) different"
msgstr ""
-#: src/unstrip.c:2221
+#: src/unstrip.c:2264
msgid "ELF header machine type (e_machine) different"
msgstr ""
-#: src/unstrip.c:2224
+#: src/unstrip.c:2267
msgid "stripped program header (e_phnum) smaller than unstripped"
msgstr ""
-#: src/unstrip.c:2254
+#: src/unstrip.c:2297
#, c-format
msgid "cannot find stripped file for module '%s': %s"
msgstr ""
-#: src/unstrip.c:2258
+#: src/unstrip.c:2301
#, c-format
msgid "cannot open stripped file '%s' for module '%s': %s"
msgstr ""
-#: src/unstrip.c:2273
+#: src/unstrip.c:2316
#, c-format
msgid "cannot find debug file for module '%s': %s"
msgstr ""
-#: src/unstrip.c:2277
+#: src/unstrip.c:2320
#, c-format
msgid "cannot open debug file '%s' for module '%s': %s"
msgstr ""
-#: src/unstrip.c:2290
+#: src/unstrip.c:2333
#, c-format
msgid "module '%s' file '%s' is not stripped"
msgstr ""
-#: src/unstrip.c:2321
+#: src/unstrip.c:2364
#, c-format
msgid "cannot cache section addresses for module '%s': %s"
msgstr ""
-#: src/unstrip.c:2454
+#: src/unstrip.c:2497
#, c-format
msgid "no matching modules found"
msgstr "kein passendes Modul gefunden"
-#: src/unstrip.c:2463
+#: src/unstrip.c:2506
#, c-format
msgid "matched more than one module"
msgstr "mehr als ein passendes Modul"
-#: src/unstrip.c:2507
+#: src/unstrip.c:2550
msgid ""
"STRIPPED-FILE DEBUG-FILE\n"
"[MODULE...]"
msgstr ""
-#: src/unstrip.c:2508
+#: src/unstrip.c:2551
msgid ""
"Combine stripped files with separate symbols and debug information.\n"
"\n"
diff --git a/po/es.po b/po/es.po
index 06b17ef6..0d32a5de 100644
--- a/po/es.po
+++ b/po/es.po
@@ -10,7 +10,7 @@ msgid ""
msgstr ""
"Project-Id-Version: elfutils.master.es\n"
"Report-Msgid-Bugs-To: https://sourceware.org/bugzilla/\n"
-"POT-Creation-Date: 2019-08-13 23:38+0200\n"
+"POT-Creation-Date: 2019-11-26 09:48+0100\n"
"PO-Revision-Date: 2011-01-10 15:17-0300\n"
"Last-Translator: Claudio Rodrigo Pereyra Diaz <claudiorodrigo@pereyradiaz."
"com.ar>\n"
@@ -29,7 +29,7 @@ msgid ""
"colorize the output. WHEN defaults to 'always' or can be 'auto' or 'never'"
msgstr ""
-#: lib/color.c:127
+#: lib/color.c:129
#, c-format
msgid ""
"%s: invalid argument '%s' for '--color'\n"
@@ -39,7 +39,7 @@ msgid ""
" - 'auto', 'tty', 'if-tty'\n"
msgstr ""
-#: lib/color.c:190 src/objdump.c:726
+#: lib/color.c:194 src/objdump.c:728
#, fuzzy, c-format
msgid "cannot allocate memory"
msgstr "No se puede asignar sección PLT: %s"
@@ -57,18 +57,18 @@ msgstr ""
"garantía, ni siquiera para SU COMERCIALIZACIÓN o PARA SER USADO CON UN FIN "
"DETERMINADO.\n"
-#: lib/xmalloc.c:52 lib/xmalloc.c:65 lib/xmalloc.c:77 src/readelf.c:3433
-#: src/readelf.c:11382 src/unstrip.c:2350 src/unstrip.c:2556
+#: lib/xmalloc.c:52 lib/xmalloc.c:65 lib/xmalloc.c:77 src/readelf.c:3449
+#: src/readelf.c:11398 src/unstrip.c:2393 src/unstrip.c:2599
#, c-format
msgid "memory exhausted"
msgstr "memoria agotada"
-#: libasm/asm_error.c:65 libdw/dwarf_error.c:57 libdwfl/libdwflP.h:50
+#: libasm/asm_error.c:65 libdw/dwarf_error.c:57 libdwfl/libdwflP.h:51
#: libelf/elf_error.c:60
msgid "no error"
msgstr "ningún error"
-#: libasm/asm_error.c:66 libdw/dwarf_error.c:67 libdwfl/libdwflP.h:52
+#: libasm/asm_error.c:66 libdw/dwarf_error.c:67 libdwfl/libdwflP.h:53
#: libelf/elf_error.c:91
msgid "out of memory"
msgstr "memoria agotada"
@@ -105,7 +105,7 @@ msgstr "error durante salida de datos"
msgid "no backend support available"
msgstr "No hay soporte de segundo plano"
-#: libasm/asm_error.c:83 libdw/dwarf_error.c:58 libdwfl/libdwflP.h:51
+#: libasm/asm_error.c:83 libdw/dwarf_error.c:58 libdwfl/libdwflP.h:52
#: libelf/elf_error.c:63
msgid "unknown error"
msgstr "error desconocido"
@@ -221,7 +221,7 @@ msgstr "versión DWARF inválida"
msgid "invalid directory index"
msgstr "Ãndice de directorio inválido"
-#: libdw/dwarf_error.c:87 libdwfl/libdwflP.h:71
+#: libdw/dwarf_error.c:87 libdwfl/libdwflP.h:72
msgid "address out of range"
msgstr "dirección fuera de rango"
@@ -252,7 +252,7 @@ msgstr "Ãndice de línea inválido"
msgid "invalid address range index"
msgstr "Ãndice de dirección de rango inválido"
-#: libdw/dwarf_error.c:94 libdwfl/libdwflP.h:72
+#: libdw/dwarf_error.c:94 libdwfl/libdwflP.h:73
msgid "no matching address range"
msgstr "dirección de rango no coincidente"
@@ -300,7 +300,7 @@ msgstr "código operativo desconocido "
msgid ".debug_addr section missing"
msgstr ".debug_ranges section faltante"
-#: libdwfl/argp-std.c:50 src/stack.c:638 src/unstrip.c:2497
+#: libdwfl/argp-std.c:50 src/stack.c:638 src/unstrip.c:2540
msgid "Input selection options:"
msgstr "Opciones de selección de entrada:"
@@ -367,159 +367,159 @@ msgstr "memoria agotada"
msgid "No modules recognized in core file"
msgstr "No hay módulos reconocidos en el archivo core"
-#: libdwfl/libdwflP.h:53
+#: libdwfl/libdwflP.h:54
msgid "See errno"
msgstr "Ve errno"
-#: libdwfl/libdwflP.h:54
+#: libdwfl/libdwflP.h:55
msgid "See elf_errno"
msgstr "Ver elf_errno"
-#: libdwfl/libdwflP.h:55
+#: libdwfl/libdwflP.h:56
msgid "See dwarf_errno"
msgstr "Ver dwarf_errno"
-#: libdwfl/libdwflP.h:56
+#: libdwfl/libdwflP.h:57
msgid "See ebl_errno (XXX missing)"
msgstr "Ver ebl_errno (no se encuentra XXX)"
-#: libdwfl/libdwflP.h:57
+#: libdwfl/libdwflP.h:58
msgid "gzip decompression failed"
msgstr "falló la descompresión gzip"
-#: libdwfl/libdwflP.h:58
+#: libdwfl/libdwflP.h:59
msgid "bzip2 decompression failed"
msgstr "falló la descompresión bzip2"
-#: libdwfl/libdwflP.h:59
+#: libdwfl/libdwflP.h:60
msgid "LZMA decompression failed"
msgstr "falló la descompresión LZMA"
-#: libdwfl/libdwflP.h:60
+#: libdwfl/libdwflP.h:61
msgid "no support library found for machine"
msgstr "no se ha encontrado una biblioteca de soporte para la máquina"
-#: libdwfl/libdwflP.h:61
+#: libdwfl/libdwflP.h:62
msgid "Callbacks missing for ET_REL file"
msgstr "No se encuentran rellamadas para el archivo ET_REL"
-#: libdwfl/libdwflP.h:62
+#: libdwfl/libdwflP.h:63
msgid "Unsupported relocation type"
msgstr "Tipo de reubicación no soportada"
-#: libdwfl/libdwflP.h:63
+#: libdwfl/libdwflP.h:64
msgid "r_offset is bogus"
msgstr "r_offset se encuentra inutilizable"
-#: libdwfl/libdwflP.h:64 libelf/elf_error.c:115 libelf/elf_error.c:175
+#: libdwfl/libdwflP.h:65 libelf/elf_error.c:115 libelf/elf_error.c:175
msgid "offset out of range"
msgstr "desplazamiento fuera de rango"
-#: libdwfl/libdwflP.h:65
+#: libdwfl/libdwflP.h:66
msgid "relocation refers to undefined symbol"
msgstr "la reubicación hace referencia a un símbolo no definido"
-#: libdwfl/libdwflP.h:66
+#: libdwfl/libdwflP.h:67
msgid "Callback returned failure"
msgstr "La rellamada devolvió un fallo"
-#: libdwfl/libdwflP.h:67
+#: libdwfl/libdwflP.h:68
msgid "No DWARF information found"
msgstr "No se ha encontrado una información DWARF"
-#: libdwfl/libdwflP.h:68
+#: libdwfl/libdwflP.h:69
msgid "No symbol table found"
msgstr "No se ha encontrado una tabla simbólica"
-#: libdwfl/libdwflP.h:69
+#: libdwfl/libdwflP.h:70
msgid "No ELF program headers"
msgstr "No existen encabezados de programa ELF"
-#: libdwfl/libdwflP.h:70
+#: libdwfl/libdwflP.h:71
msgid "address range overlaps an existing module"
msgstr "el rango de dirección se superpone con un módulo existente"
-#: libdwfl/libdwflP.h:73
+#: libdwfl/libdwflP.h:74
msgid "image truncated"
msgstr "imagen truncada"
-#: libdwfl/libdwflP.h:74
+#: libdwfl/libdwflP.h:75
msgid "ELF file opened"
msgstr "Archivo ELF abierto"
-#: libdwfl/libdwflP.h:75
+#: libdwfl/libdwflP.h:76
msgid "not a valid ELF file"
msgstr "no es un archivo ELF válido"
-#: libdwfl/libdwflP.h:76
+#: libdwfl/libdwflP.h:77
msgid "cannot handle DWARF type description"
msgstr "no es posible manipular tipo de descripción DWARF"
-#: libdwfl/libdwflP.h:77
+#: libdwfl/libdwflP.h:78
msgid "ELF file does not match build ID"
msgstr "El archivo ELF no coincide con el ID construido"
-#: libdwfl/libdwflP.h:78
+#: libdwfl/libdwflP.h:79
#, fuzzy
msgid "corrupt .gnu.prelink_undo section data"
msgstr "no se puede leer sección '.gnu.prelink_undo': %s"
-#: libdwfl/libdwflP.h:79
+#: libdwfl/libdwflP.h:80
msgid "Internal error due to ebl"
msgstr ""
-#: libdwfl/libdwflP.h:80
+#: libdwfl/libdwflP.h:81
msgid "Missing data in core file"
msgstr ""
-#: libdwfl/libdwflP.h:81
+#: libdwfl/libdwflP.h:82
#, fuzzy
msgid "Invalid register"
msgstr "Parámetro inválido"
-#: libdwfl/libdwflP.h:82
+#: libdwfl/libdwflP.h:83
msgid "Error reading process memory"
msgstr ""
-#: libdwfl/libdwflP.h:83
+#: libdwfl/libdwflP.h:84
msgid "Couldn't find architecture of any ELF"
msgstr ""
-#: libdwfl/libdwflP.h:84
+#: libdwfl/libdwflP.h:85
msgid "Error parsing /proc filesystem"
msgstr ""
-#: libdwfl/libdwflP.h:85
+#: libdwfl/libdwflP.h:86
#, fuzzy
msgid "Invalid DWARF"
msgstr "DWARF inválido"
-#: libdwfl/libdwflP.h:86
+#: libdwfl/libdwflP.h:87
msgid "Unsupported DWARF"
msgstr ""
-#: libdwfl/libdwflP.h:87
+#: libdwfl/libdwflP.h:88
msgid "Unable to find more threads"
msgstr ""
-#: libdwfl/libdwflP.h:88
+#: libdwfl/libdwflP.h:89
msgid "Dwfl already has attached state"
msgstr ""
-#: libdwfl/libdwflP.h:89
+#: libdwfl/libdwflP.h:90
msgid "Dwfl has no attached state"
msgstr ""
-#: libdwfl/libdwflP.h:90
+#: libdwfl/libdwflP.h:91
msgid "Unwinding not supported for this architecture"
msgstr ""
-#: libdwfl/libdwflP.h:91
+#: libdwfl/libdwflP.h:92
#, fuzzy
msgid "Invalid argument"
msgstr "Parámetro inválido"
-#: libdwfl/libdwflP.h:92
+#: libdwfl/libdwflP.h:93
#, fuzzy
msgid "Not an ET_CORE ELF file"
msgstr "no es un archivo ELF válido"
@@ -625,7 +625,7 @@ msgstr "tamaño inválido del operando fuente"
msgid "invalid size of destination operand"
msgstr "tamaño inválido del operando destino"
-#: libelf/elf_error.c:87 src/readelf.c:6150
+#: libelf/elf_error.c:87 src/readelf.c:6166
#, c-format
msgid "invalid encoding"
msgstr "codificación inválida"
@@ -711,8 +711,8 @@ msgstr "no coinciden los datos/scn"
msgid "invalid section header"
msgstr "encabezamiento de sección inválida"
-#: libelf/elf_error.c:191 src/readelf.c:9898 src/readelf.c:10498
-#: src/readelf.c:10599 src/readelf.c:10781
+#: libelf/elf_error.c:191 src/readelf.c:9914 src/readelf.c:10514
+#: src/readelf.c:10615 src/readelf.c:10797
#, c-format
msgid "invalid data"
msgstr "datos inválidos"
@@ -1382,7 +1382,7 @@ 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:984 src/strip.c:1021
-#: src/unstrip.c:2146 src/unstrip.c:2175
+#: src/unstrip.c:2189 src/unstrip.c:2218
#, c-format
msgid "cannot open '%s'"
msgstr "Imposible abrir '%s'"
@@ -1477,7 +1477,7 @@ 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:153
+#: src/elfcompress.c:1336 src/elflint.c:77 src/readelf.c:158
msgid "FILE..."
msgstr "FICHERO..."
@@ -1510,14 +1510,14 @@ msgstr ""
msgid "Pedantic checking of ELF files compliance with gABI/psABI spec."
msgstr "Chequeo minucioso de ficheros ELF de acuerdo con gABI/psABI "
-#: src/elflint.c:154 src/readelf.c:357
-#, c-format
-msgid "cannot open input file"
+#: src/elflint.c:154 src/readelf.c:368
+#, fuzzy, c-format
+msgid "cannot open input file '%s'"
msgstr "no se puede abrir el fichero de entrada"
#: src/elflint.c:161
-#, c-format
-msgid "cannot generate Elf descriptor: %s\n"
+#, fuzzy, c-format
+msgid "cannot generate Elf descriptor for '%s': %s\n"
msgstr "no se puede crear descriptor ELF: %s\n"
#: src/elflint.c:180
@@ -1529,7 +1529,7 @@ msgstr "error al cerrar el descriptor ELF: %s\n"
msgid "No errors"
msgstr "No hay errores"
-#: src/elflint.c:219 src/readelf.c:559
+#: src/elflint.c:219 src/readelf.c:575
msgid "Missing file name.\n"
msgstr "Falta el nombre de archivo.\n"
@@ -3774,12 +3774,12 @@ msgstr "%s%s%s: no se reconoció el formato de fichero"
msgid "cannot create search tree"
msgstr "No se puede crear el árbol de búsqueda"
-#: src/nm.c:746 src/nm.c:1205 src/objdump.c:777 src/readelf.c:619
-#: src/readelf.c:1431 src/readelf.c:1582 src/readelf.c:1783 src/readelf.c:1989
-#: src/readelf.c:2179 src/readelf.c:2357 src/readelf.c:2433 src/readelf.c:2691
-#: src/readelf.c:2767 src/readelf.c:2854 src/readelf.c:3452 src/readelf.c:3502
-#: src/readelf.c:3565 src/readelf.c:11214 src/readelf.c:12399
-#: src/readelf.c:12603 src/readelf.c:12671 src/size.c:398 src/size.c:470
+#: src/nm.c:746 src/nm.c:1205 src/objdump.c:779 src/readelf.c:635
+#: src/readelf.c:1447 src/readelf.c:1598 src/readelf.c:1799 src/readelf.c:2005
+#: src/readelf.c:2195 src/readelf.c:2373 src/readelf.c:2449 src/readelf.c:2707
+#: src/readelf.c:2783 src/readelf.c:2870 src/readelf.c:3468 src/readelf.c:3518
+#: src/readelf.c:3581 src/readelf.c:11230 src/readelf.c:12415
+#: src/readelf.c:12626 src/readelf.c:12695 src/size.c:398 src/size.c:470
#: src/strip.c:1038
#, c-format
msgid "cannot get section header string table index"
@@ -3827,12 +3827,12 @@ 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:1526
+#: src/nm.c:1527
#, c-format
msgid "%s%s%s%s: Invalid operation"
msgstr "%s%s%s%s: Operación inválida"
-#: src/nm.c:1583
+#: src/nm.c:1584
#, c-format
msgid "%s%s%s: no symbols"
msgstr "%s%s%s: No hay símbolos"
@@ -3867,7 +3867,7 @@ msgstr "Sólo muestra información para NOMBRE de sección."
msgid "Show information from FILEs (a.out by default)."
msgstr "Muestra información de FICHEROS (a.out por defecto)."
-#: src/objdump.c:218 src/readelf.c:564
+#: src/objdump.c:218 src/readelf.c:580
msgid "No operation specified.\n"
msgstr "No se especificó una operación.\n"
@@ -3876,11 +3876,11 @@ msgstr "No se especificó una operación.\n"
msgid "while close `%s'"
msgstr "mientras cierra `%s'"
-#: src/objdump.c:363 src/readelf.c:2084 src/readelf.c:2276
+#: src/objdump.c:363 src/readelf.c:2100 src/readelf.c:2292
msgid "INVALID SYMBOL"
msgstr "SÃMBOLO INVÃLIDO"
-#: src/objdump.c:378 src/readelf.c:2118 src/readelf.c:2312
+#: src/objdump.c:378 src/readelf.c:2134 src/readelf.c:2328
msgid "INVALID SECTION"
msgstr "SECCIÓN INVÃLIDA"
@@ -3934,85 +3934,90 @@ msgstr "%s: no es un archivo"
msgid "error while freeing sub-ELF descriptor: %s"
msgstr "error al liberar descriptor sub-ELF: %s"
-#: src/readelf.c:94
+#: src/readelf.c:97
#, fuzzy
msgid "ELF input selection:"
msgstr "Selección de salida de ELF:"
-#: src/readelf.c:96
+#: src/readelf.c:99
msgid ""
"Use the named SECTION (default .gnu_debugdata) as (compressed) ELF input data"
msgstr ""
-#: src/readelf.c:99
+#: src/readelf.c:102
msgid ""
"Used with -w to find the skeleton Compile Units in FILE associated with the "
"Split Compile units in a .dwo input file"
msgstr ""
-#: src/readelf.c:101
+#: src/readelf.c:104
msgid "ELF output selection:"
msgstr "Selección de salida de ELF:"
-#: src/readelf.c:103
+#: src/readelf.c:106
msgid "All these plus -p .strtab -p .dynstr -p .comment"
msgstr "Todo esto mas -p .strtab -p .dynstr -p .comment"
-#: src/readelf.c:104
+#: src/readelf.c:107
msgid "Display the dynamic segment"
msgstr "Mostrar el segmento dinámico"
-#: src/readelf.c:105
+#: src/readelf.c:108
msgid "Display the ELF file header"
msgstr "Mostrar el encabezamiento del fichero ELF"
-#: src/readelf.c:107
+#: src/readelf.c:110
msgid "Display histogram of bucket list lengths"
msgstr "Mostrar histograma de las longitudes de las listas de cubetas"
-#: src/readelf.c:108
+#: src/readelf.c:111
msgid "Display the program headers"
msgstr "Mostrar encabezamientos de programa"
-#: src/readelf.c:110
+#: src/readelf.c:113
msgid "Display relocations"
msgstr "Mostrar reubicaciones"
-#: src/readelf.c:111
+#: src/readelf.c:114
#, fuzzy
msgid "Display the section groups"
msgstr "Mostrar los encabezados de las secciones"
-#: src/readelf.c:112
+#: src/readelf.c:115
msgid "Display the sections' headers"
msgstr "Mostrar los encabezados de las secciones"
-#: src/readelf.c:115
+#: src/readelf.c:118
#, fuzzy
msgid "Display the symbol table sections"
msgstr "Mostrar la tabla de símbolos"
-#: src/readelf.c:116
+#: src/readelf.c:120
+#, fuzzy
+msgid "Display (only) the dynamic symbol table"
+msgstr "Mostrar sólo símbolos externos"
+
+#: src/readelf.c:121
msgid "Display versioning information"
msgstr "Mostrar información de versión"
-#: src/readelf.c:117
+#: src/readelf.c:122
msgid "Display the ELF notes"
msgstr "Mostrar las notas ELF"
-#: src/readelf.c:119
+#: src/readelf.c:124
msgid "Display architecture specific information, if any"
msgstr "Mostrar información específica de la arquitectura (si es que la hay)"
-#: src/readelf.c:121
+#: src/readelf.c:126
msgid "Display sections for exception handling"
msgstr "Muestra secciones para manejo de excepciones"
-#: src/readelf.c:123
+#: src/readelf.c:128
msgid "Additional output selection:"
msgstr "Selección de salida adicional:"
-#: src/readelf.c:125
+#: src/readelf.c:130
#, fuzzy
msgid ""
"Display DWARF section content. SECTION can be one of abbrev, addr, aranges, "
@@ -4023,197 +4028,197 @@ msgstr ""
"siguiente: abbrev, aranges, frame, info, loc, line, ranges, pubnames, str, "
"macinfo, o exception"
-#: src/readelf.c:129
+#: src/readelf.c:134
msgid "Dump the uninterpreted contents of SECTION, by number or name"
msgstr "Vuelca los contenidos no interpretados de SECCIÓN, por número o nombre"
-#: src/readelf.c:131
+#: src/readelf.c:136
msgid "Print string contents of sections"
msgstr "Imprime contenido de cadena de secciones"
-#: src/readelf.c:134
+#: src/readelf.c:139
msgid "Display the symbol index of an archive"
msgstr "Muestra el índice de símbolos de un archivo"
-#: src/readelf.c:136
+#: src/readelf.c:141
msgid "Output control:"
msgstr "Control de salida:"
-#: src/readelf.c:138
+#: src/readelf.c:143
msgid "Do not find symbol names for addresses in DWARF data"
msgstr ""
"No se encuentran los nombres de símbolos para direcciones en datos DWARF"
-#: src/readelf.c:140
+#: src/readelf.c:145
#, fuzzy
msgid ""
"Display just offsets instead of resolving values to addresses in DWARF data"
msgstr ""
"No se encuentran los nombres de símbolos para direcciones en datos DWARF"
-#: src/readelf.c:142
+#: src/readelf.c:147
msgid "Ignored for compatibility (lines always wide)"
msgstr ""
-#: src/readelf.c:144
+#: src/readelf.c:149
msgid ""
"Show compression information for compressed sections (when used with -S); "
"decompress section before dumping data (when used with -p or -x)"
msgstr ""
#. Short description of program.
-#: src/readelf.c:149
+#: src/readelf.c:154
msgid "Print information from ELF file in human-readable form."
msgstr ""
"Imprimir información del fichero ELF en una forma comprensible para los "
"seres humanos."
#. Look up once.
-#: src/readelf.c:339
+#: src/readelf.c:350
msgid "yes"
msgstr "sí"
-#: src/readelf.c:340
+#: src/readelf.c:351
msgid "no"
msgstr "no"
-#: src/readelf.c:532
+#: src/readelf.c:548
#, c-format
msgid "Unknown DWARF debug section `%s'.\n"
msgstr "Sección de depuración DWARF desconocida `%s'.\n"
-#: src/readelf.c:603 src/readelf.c:714
+#: src/readelf.c:619 src/readelf.c:730
#, c-format
msgid "cannot generate Elf descriptor: %s"
msgstr "no se puede crear descriptor ELF: %s"
-#: src/readelf.c:610 src/readelf.c:937 src/strip.c:1133
+#: src/readelf.c:626 src/readelf.c:953 src/strip.c:1133
#, c-format
msgid "cannot determine number of sections: %s"
msgstr "no se pudieron determinar el número de secciones: %s"
-#: src/readelf.c:628 src/readelf.c:1247 src/readelf.c:1455
+#: src/readelf.c:644 src/readelf.c:1263 src/readelf.c:1471
#, c-format
msgid "cannot get section: %s"
msgstr "No se puede encontrar la sección: %s"
-#: src/readelf.c:637 src/readelf.c:1254 src/readelf.c:1463 src/readelf.c:12623
-#: src/unstrip.c:395 src/unstrip.c:426 src/unstrip.c:481 src/unstrip.c:600
-#: src/unstrip.c:621 src/unstrip.c:661 src/unstrip.c:873 src/unstrip.c:1204
-#: src/unstrip.c:1331 src/unstrip.c:1355 src/unstrip.c:1398 src/unstrip.c:1462
-#: src/unstrip.c:1636 src/unstrip.c:1770 src/unstrip.c:1913 src/unstrip.c:2008
+#: src/readelf.c:653 src/readelf.c:1270 src/readelf.c:1479 src/readelf.c:12646
+#: src/unstrip.c:395 src/unstrip.c:426 src/unstrip.c:485 src/unstrip.c:604
+#: src/unstrip.c:625 src/unstrip.c:665 src/unstrip.c:881 src/unstrip.c:1212
+#: src/unstrip.c:1339 src/unstrip.c:1363 src/unstrip.c:1419 src/unstrip.c:1483
+#: src/unstrip.c:1658 src/unstrip.c:1809 src/unstrip.c:1952 src/unstrip.c:2051
#, c-format
msgid "cannot get section header: %s"
msgstr "No se puede obtener encabezamiento de sección: %s"
-#: src/readelf.c:645
+#: src/readelf.c:661
#, fuzzy, c-format
msgid "cannot get section name"
msgstr "no se puede obtener encabezamiento de sección\n"
-#: src/readelf.c:654 src/readelf.c:6560 src/readelf.c:10486 src/readelf.c:10588
-#: src/readelf.c:10766
+#: src/readelf.c:670 src/readelf.c:6576 src/readelf.c:10502 src/readelf.c:10604
+#: src/readelf.c:10782
#, c-format
msgid "cannot get %s content: %s"
msgstr "No se puede obtener el contenido %s: %s"
-#: src/readelf.c:670
+#: src/readelf.c:686
#, fuzzy, c-format
msgid "cannot create temp file '%s'"
msgstr "no se puede crear fichero nuevo '%s': %s"
-#: src/readelf.c:679
+#: src/readelf.c:695
#, fuzzy, c-format
msgid "cannot write section data"
msgstr "no se puede leer la sección de datos: %s"
-#: src/readelf.c:685 src/readelf.c:702 src/readelf.c:731
+#: src/readelf.c:701 src/readelf.c:718 src/readelf.c:747
#, c-format
msgid "error while closing Elf descriptor: %s"
msgstr "error al cerrar el descriptor ELF: %s"
-#: src/readelf.c:692
+#: src/readelf.c:708
#, fuzzy, c-format
msgid "error while rewinding file descriptor"
msgstr "error al cerrar el descriptor ELF: %s"
-#: src/readelf.c:726
+#: src/readelf.c:742
#, c-format
msgid "'%s' is not an archive, cannot print archive index"
msgstr "'%s' no es un archivo, no se puede imprimir índice de archivo"
-#: src/readelf.c:830
+#: src/readelf.c:846
#, c-format
msgid "cannot stat input file"
msgstr "no sepudo stat archivo de entrada"
-#: src/readelf.c:832
+#: src/readelf.c:848
#, c-format
msgid "input file is empty"
msgstr "archivo de entrada vacío"
-#: src/readelf.c:834
+#: src/readelf.c:850
#, c-format
msgid "failed reading '%s': %s"
msgstr "Falló lectura de '%s': %s"
-#: src/readelf.c:863
+#: src/readelf.c:879
#, fuzzy, c-format
msgid "No such section '%s' in '%s'"
msgstr "No se puede obtener contenido de sección %zu en '%s': %s"
-#: src/readelf.c:922
+#: src/readelf.c:938
#, c-format
msgid "cannot read ELF header: %s"
msgstr "no se pudo leer encabezamiento ELF: %s"
-#: src/readelf.c:930
+#: src/readelf.c:946
#, c-format
msgid "cannot create EBL handle"
msgstr "no se puede crear EBL"
-#: src/readelf.c:943
+#: src/readelf.c:959
#, c-format
msgid "cannot determine number of program headers: %s"
msgstr "no se pudo determinar la cantidad de encabezados de programa: %s"
-#: src/readelf.c:975
+#: src/readelf.c:991
#, fuzzy, c-format
msgid "cannot read ELF: %s"
msgstr "no sepuede leer %s: %s"
-#: src/readelf.c:1036
+#: src/readelf.c:1052
msgid "NONE (None)"
msgstr "NONE (Ninguno)"
-#: src/readelf.c:1037
+#: src/readelf.c:1053
msgid "REL (Relocatable file)"
msgstr "REL (Fichero reubicable)"
-#: src/readelf.c:1038
+#: src/readelf.c:1054
msgid "EXEC (Executable file)"
msgstr "EXEC (Fichero ejecutable)"
-#: src/readelf.c:1039
+#: src/readelf.c:1055
msgid "DYN (Shared object file)"
msgstr "DYN (Fichero objeto compartido)"
-#: src/readelf.c:1040
+#: src/readelf.c:1056
msgid "CORE (Core file)"
msgstr "CORE (Fichero núcleo)"
-#: src/readelf.c:1045
+#: src/readelf.c:1061
#, c-format
msgid "OS Specific: (%x)\n"
msgstr "OS Specific: (%x)\n"
#. && e_type <= ET_HIPROC always true
-#: src/readelf.c:1047
+#: src/readelf.c:1063
#, c-format
msgid "Processor Specific: (%x)\n"
msgstr "Específico del procesador: (%x)\n"
-#: src/readelf.c:1057
+#: src/readelf.c:1073
msgid ""
"ELF Header:\n"
" Magic: "
@@ -4221,7 +4226,7 @@ msgstr ""
"Encabezamiento ELF:\n"
" Mágico: "
-#: src/readelf.c:1061
+#: src/readelf.c:1077
#, c-format
msgid ""
"\n"
@@ -4230,125 +4235,125 @@ msgstr ""
"\n"
" Clase: %s\n"
-#: src/readelf.c:1066
+#: src/readelf.c:1082
#, c-format
msgid " Data: %s\n"
msgstr " Datos: %s\n"
-#: src/readelf.c:1072
+#: src/readelf.c:1088
#, c-format
msgid " Ident Version: %hhd %s\n"
msgstr " Versión ident: %hhd %s\n"
-#: src/readelf.c:1074 src/readelf.c:1096
+#: src/readelf.c:1090 src/readelf.c:1112
msgid "(current)"
msgstr "(actual)"
-#: src/readelf.c:1078
+#: src/readelf.c:1094
#, c-format
msgid " OS/ABI: %s\n"
msgstr " OS/ABI: %s\n"
-#: src/readelf.c:1081
+#: src/readelf.c:1097
#, c-format
msgid " ABI Version: %hhd\n"
msgstr " Versión ABI: %hhd\n"
-#: src/readelf.c:1084
+#: src/readelf.c:1100
msgid " Type: "
msgstr " Tipo: "
-#: src/readelf.c:1089
+#: src/readelf.c:1105
#, c-format
msgid " Machine: %s\n"
msgstr " Máquina: %s\n"
-#: src/readelf.c:1091
+#: src/readelf.c:1107
#, fuzzy, c-format
msgid " Machine: <unknown>: 0x%x\n"
msgstr " Máquina: %s\n"
-#: src/readelf.c:1094
+#: src/readelf.c:1110
#, c-format
msgid " Version: %d %s\n"
msgstr " Versión: %d %s\n"
-#: src/readelf.c:1098
+#: src/readelf.c:1114
#, c-format
msgid " Entry point address: %#<PRIx64>\n"
msgstr " Dirección de punto de entrada: %#<PRIx64>\n"
-#: src/readelf.c:1101
+#: src/readelf.c:1117
#, c-format
msgid " Start of program headers: %<PRId64> %s\n"
msgstr " Inicio de encabezamientos de programa: %<PRId64> %s\n"
-#: src/readelf.c:1102 src/readelf.c:1105
+#: src/readelf.c:1118 src/readelf.c:1121
msgid "(bytes into file)"
msgstr " (bytes en el archivo)"
-#: src/readelf.c:1104
+#: src/readelf.c:1120
#, c-format
msgid " Start of section headers: %<PRId64> %s\n"
msgstr " Inicio de encabezamientos de sección: %<PRId64> %s\n"
-#: src/readelf.c:1107
+#: src/readelf.c:1123
#, c-format
msgid " Flags: %s\n"
msgstr " Indicadores: %s\n"
-#: src/readelf.c:1110
+#: src/readelf.c:1126
#, c-format
msgid " Size of this header: %<PRId16> %s\n"
msgstr " Tamaño de este encabezamiento: %<PRId16> %s\n"
-#: src/readelf.c:1111 src/readelf.c:1114 src/readelf.c:1131
+#: src/readelf.c:1127 src/readelf.c:1130 src/readelf.c:1147
msgid "(bytes)"
msgstr "(bytes)"
-#: src/readelf.c:1113
+#: src/readelf.c:1129
#, c-format
msgid " Size of program header entries: %<PRId16> %s\n"
msgstr ""
" Tamaño de las entradas en encabezamiento del programa: %<PRId16> %s\n"
-#: src/readelf.c:1116
+#: src/readelf.c:1132
#, c-format
msgid " Number of program headers entries: %<PRId16>"
msgstr " Cantidad de entradas de encabezados de programa: %<PRId16>"
-#: src/readelf.c:1123
+#: src/readelf.c:1139
#, c-format
msgid " (%<PRIu32> in [0].sh_info)"
msgstr " (%<PRIu32> in [0].sh_info)"
-#: src/readelf.c:1126 src/readelf.c:1143 src/readelf.c:1157
+#: src/readelf.c:1142 src/readelf.c:1159 src/readelf.c:1173
msgid " ([0] not available)"
msgstr " ([0] no disponible)"
-#: src/readelf.c:1130
+#: src/readelf.c:1146
#, c-format
msgid " Size of section header entries: %<PRId16> %s\n"
msgstr ""
" Tamaño de las entradas en el encabezamiento de sección: %<PRId16> %s\n"
-#: src/readelf.c:1133
+#: src/readelf.c:1149
#, c-format
msgid " Number of section headers entries: %<PRId16>"
msgstr " Cantidad de entradas en los encabezamientos de sección: %<PRId16>"
-#: src/readelf.c:1140
+#: src/readelf.c:1156
#, c-format
msgid " (%<PRIu32> in [0].sh_size)"
msgstr " (%<PRIu32> en [0].sh_size)"
#. We managed to get the zeroth section.
-#: src/readelf.c:1153
+#: src/readelf.c:1169
#, c-format
msgid " (%<PRIu32> in [0].sh_link)"
msgstr " (%<PRIu32> en [0].sh_link)"
-#: src/readelf.c:1161
+#: src/readelf.c:1177
#, c-format
msgid ""
" Section header string table index: XINDEX%s\n"
@@ -4357,19 +4362,19 @@ msgstr ""
" Ãndice de tabla de cadenas de sección de encabezamiento de : XINDEX%s\n"
"\n"
-#: src/readelf.c:1165
+#: src/readelf.c:1181
#, c-format
msgid ""
" Section header string table index: %<PRId16>\n"
"\n"
msgstr " Ãndice de tabla de cadenas de sección de encabezamiento: %<PRId16>\n"
-#: src/readelf.c:1212 src/readelf.c:1420
+#: src/readelf.c:1228 src/readelf.c:1436
#, fuzzy, c-format
msgid "cannot get number of sections: %s"
msgstr "no se pudieron determinar el número de secciones: %s"
-#: src/readelf.c:1215
+#: src/readelf.c:1231
#, fuzzy, c-format
msgid ""
"There are %zd section headers, starting at offset %#<PRIx64>:\n"
@@ -4378,16 +4383,16 @@ msgstr ""
"Hay %d encabezamientos de sección, comenzando en compensación %#<PRIx64>:\n"
"\n"
-#: src/readelf.c:1224
+#: src/readelf.c:1240
#, fuzzy, c-format
msgid "cannot get section header string table index: %s"
msgstr "no se puede obtener índice de cadena de encabezamiento de sección"
-#: src/readelf.c:1227
+#: src/readelf.c:1243
msgid "Section Headers:"
msgstr "encabezamientos de sección:"
-#: src/readelf.c:1230
+#: src/readelf.c:1246
msgid ""
"[Nr] Name Type Addr Off Size ES Flags Lk "
"Inf Al"
@@ -4395,7 +4400,7 @@ msgstr ""
"[Nr] Nombre Tipo Dirección Off Tamaño Inf Al "
"Enlace banderas ES"
-#: src/readelf.c:1232
+#: src/readelf.c:1248
msgid ""
"[Nr] Name Type Addr Off Size ES "
"Flags Lk Inf Al"
@@ -4403,36 +4408,36 @@ msgstr ""
"[Nr] Name Type Addr Off Size ES "
"Flags Lk Inf Al"
-#: src/readelf.c:1237
+#: src/readelf.c:1253
msgid " [Compression Size Al]"
msgstr ""
-#: src/readelf.c:1239
+#: src/readelf.c:1255
msgid " [Compression Size Al]"
msgstr ""
-#: src/readelf.c:1315
+#: src/readelf.c:1331
#, fuzzy, c-format
msgid "bad compression header for section %zd: %s"
msgstr "No se puede obtener el encabezamiento de sección %zu: %s"
-#: src/readelf.c:1326
+#: src/readelf.c:1342
#, fuzzy, c-format
msgid "bad gnu compressed size for section %zd: %s"
msgstr "No se pueden obtener datos para la sección %d: %s"
-#: src/readelf.c:1344
+#: src/readelf.c:1360
msgid "Program Headers:"
msgstr "encabezamientos de programa:"
-#: src/readelf.c:1346
+#: src/readelf.c:1362
msgid ""
" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align"
msgstr ""
" Tipo Compensación Dirección Virtual Dirección "
"Física Tamaño de Fichero Tamaño de Memoria Alineación de bandera"
-#: src/readelf.c:1349
+#: src/readelf.c:1365
msgid ""
" Type Offset VirtAddr PhysAddr FileSiz "
"MemSiz Flg Align"
@@ -4440,12 +4445,12 @@ msgstr ""
" Tipo Compensación Dirección Virtual Dirección "
"Física Tamaño de Fichero Tamaño de Memoria Alineación de bandera"
-#: src/readelf.c:1406
+#: src/readelf.c:1422
#, c-format
msgid "\t[Requesting program interpreter: %s]\n"
msgstr "\t[Solicitando intérprete de programa: %s]\n"
-#: src/readelf.c:1433
+#: src/readelf.c:1449
msgid ""
"\n"
" Section to Segment mapping:\n"
@@ -4455,12 +4460,12 @@ msgstr ""
" Sección para asignación de segmento:\n"
" Secciones de segmento..."
-#: src/readelf.c:1444 src/unstrip.c:2067 src/unstrip.c:2109 src/unstrip.c:2116
+#: src/readelf.c:1460 src/unstrip.c:2110 src/unstrip.c:2152 src/unstrip.c:2159
#, c-format
msgid "cannot get program header: %s"
msgstr "no se puede obtener memoria para encabezamiento del programa: %s"
-#: src/readelf.c:1590
+#: src/readelf.c:1606
#, c-format
msgid ""
"\n"
@@ -4475,7 +4480,7 @@ msgstr[1] ""
"\n"
"Grupo de sección COMDAT [%2zu] '%s' con firma '%s' contiene entradas %zu:\n"
-#: src/readelf.c:1595
+#: src/readelf.c:1611
#, c-format
msgid ""
"\n"
@@ -4490,31 +4495,31 @@ msgstr[1] ""
"\n"
"Grupo de sección [%2zu] '%s' con firma '%s' contiene entradas %zu:\n"
-#: src/readelf.c:1603
+#: src/readelf.c:1619
msgid "<INVALID SYMBOL>"
msgstr "<SÃMBOLO INVÃLIDO>"
-#: src/readelf.c:1617
+#: src/readelf.c:1633
msgid "<INVALID SECTION>"
msgstr "<SECCIÓN INVÃLIDA>"
-#: src/readelf.c:1640 src/readelf.c:2367 src/readelf.c:3468 src/readelf.c:12494
-#: src/readelf.c:12501 src/readelf.c:12545 src/readelf.c:12552
+#: src/readelf.c:1656 src/readelf.c:2383 src/readelf.c:3484 src/readelf.c:12517
+#: src/readelf.c:12524 src/readelf.c:12568 src/readelf.c:12575
msgid "Couldn't uncompress section"
msgstr ""
-#: src/readelf.c:1645 src/readelf.c:2372 src/readelf.c:3473
+#: src/readelf.c:1661 src/readelf.c:2388 src/readelf.c:3489
#, fuzzy, c-format
msgid "cannot get section [%zd] header: %s"
msgstr "No se puede obtener encabezamiento de sección: %s"
-#: src/readelf.c:1789 src/readelf.c:2439 src/readelf.c:2697 src/readelf.c:2773
-#: src/readelf.c:3077 src/readelf.c:3151 src/readelf.c:5348
+#: src/readelf.c:1805 src/readelf.c:2455 src/readelf.c:2713 src/readelf.c:2789
+#: src/readelf.c:3093 src/readelf.c:3167 src/readelf.c:5364
#, fuzzy, c-format
msgid "invalid sh_link value in section %zu"
msgstr ".debug_line section inválida"
-#: src/readelf.c:1792
+#: src/readelf.c:1808
#, c-format
msgid ""
"\n"
@@ -4535,36 +4540,36 @@ msgstr[1] ""
" Dirección: %#0*<PRIx64> Compensación: %#08<PRIx64> Enlace a sección: "
"[%2u] '%s'\n"
-#: src/readelf.c:1802
+#: src/readelf.c:1818
msgid " Type Value\n"
msgstr " Tipo Valor\n"
-#: src/readelf.c:1826
+#: src/readelf.c:1842
#, c-format
msgid "Shared library: [%s]\n"
msgstr "Biblioteca compartida: [%s]\n"
-#: src/readelf.c:1831
+#: src/readelf.c:1847
#, c-format
msgid "Library soname: [%s]\n"
msgstr "Nombre-so de la biblioteca: [%s]\n"
-#: src/readelf.c:1836
+#: src/readelf.c:1852
#, c-format
msgid "Library rpath: [%s]\n"
msgstr "Rpath de la biblioteca: [%s]\n"
-#: src/readelf.c:1841
+#: src/readelf.c:1857
#, c-format
msgid "Library runpath: [%s]\n"
msgstr "Ruta de ejecución de la biblioteca: [%s]\n"
-#: src/readelf.c:1861
+#: src/readelf.c:1877
#, c-format
msgid "%<PRId64> (bytes)\n"
msgstr "%<PRId64> (bytes)\n"
-#: src/readelf.c:1974 src/readelf.c:2164
+#: src/readelf.c:1990 src/readelf.c:2180
#, c-format
msgid ""
"\n"
@@ -4573,7 +4578,7 @@ msgstr ""
"\n"
"Tabla de símbolos inválida en compensación %#0<PRIx64>\n"
-#: src/readelf.c:1992 src/readelf.c:2182
+#: src/readelf.c:2008 src/readelf.c:2198
#, c-format
msgid ""
"\n"
@@ -4598,7 +4603,7 @@ msgstr[1] ""
#. The .rela.dyn section does not refer to a specific section but
#. instead of section index zero. Do not try to print a section
#. name.
-#: src/readelf.c:2007 src/readelf.c:2197
+#: src/readelf.c:2023 src/readelf.c:2213
#, c-format
msgid ""
"\n"
@@ -4615,29 +4620,29 @@ msgstr[1] ""
"Sección de reubicación [%2u] '%s' en compensación %#0<PRIx64> contiene "
"entradas %d:\n"
-#: src/readelf.c:2017
+#: src/readelf.c:2033
msgid " Offset Type Value Name\n"
msgstr " Compensación Tipo Valor Nombre\n"
-#: src/readelf.c:2019
+#: src/readelf.c:2035
msgid " Offset Type Value Name\n"
msgstr " Compensación Tipo Valor Nombre\n"
-#: src/readelf.c:2072 src/readelf.c:2083 src/readelf.c:2096 src/readelf.c:2117
-#: src/readelf.c:2129 src/readelf.c:2263 src/readelf.c:2275 src/readelf.c:2289
-#: src/readelf.c:2311 src/readelf.c:2324
+#: src/readelf.c:2088 src/readelf.c:2099 src/readelf.c:2112 src/readelf.c:2133
+#: src/readelf.c:2145 src/readelf.c:2279 src/readelf.c:2291 src/readelf.c:2305
+#: src/readelf.c:2327 src/readelf.c:2340
msgid "<INVALID RELOC>"
msgstr "<REUBIC INVÃLIDA>"
-#: src/readelf.c:2207
+#: src/readelf.c:2223
msgid " Offset Type Value Addend Name\n"
msgstr " Compensación Tipo Valor Nombre Adend\n"
-#: src/readelf.c:2209
+#: src/readelf.c:2225
msgid " Offset Type Value Addend Name\n"
msgstr " Compensación Tipo Valor Nombre Adend\n"
-#: src/readelf.c:2447
+#: src/readelf.c:2463
#, c-format
msgid ""
"\n"
@@ -4652,40 +4657,40 @@ msgstr[1] ""
"\n"
"La tabla de símbolos [%2u] '%s' contiene entradas %u:\n"
-#: src/readelf.c:2452
+#: src/readelf.c:2468
#, c-format
msgid " %lu local symbol String table: [%2u] '%s'\n"
msgid_plural " %lu local symbols String table: [%2u] '%s'\n"
msgstr[0] "símbolos locales %lu Tabla de cadena: [%2u] '%s'\n"
msgstr[1] " Símbolos locales %lu Tabla de cadenas: [%2u] '%s'\n"
-#: src/readelf.c:2460
+#: src/readelf.c:2476
msgid " Num: Value Size Type Bind Vis Ndx Name\n"
msgstr " Núm: Valor Tamaño Tipo Unión Vis Nombre Ndx\n"
-#: src/readelf.c:2462
+#: src/readelf.c:2478
msgid " Num: Value Size Type Bind Vis Ndx Name\n"
msgstr " Num: Valor Tamaño Tipo Unión Vis Nombre Ndx\n"
-#: src/readelf.c:2482
+#: src/readelf.c:2498
#, c-format
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:2570
+#: src/readelf.c:2586
#, c-format
msgid "bad dynamic symbol"
msgstr "símbolo dinámico erróneo"
-#: src/readelf.c:2652
+#: src/readelf.c:2668
msgid "none"
msgstr "nada"
-#: src/readelf.c:2669
+#: src/readelf.c:2685
msgid "| <unknown>"
msgstr "| <desconocido>"
-#: src/readelf.c:2700
+#: src/readelf.c:2716
#, c-format
msgid ""
"\n"
@@ -4706,17 +4711,17 @@ msgstr[1] ""
" Dirección: %#0*<PRIx64> Compensación: %#08<PRIx64> Enlace a sección: "
"[%2u] '%s'\n"
-#: src/readelf.c:2721
+#: src/readelf.c:2737
#, c-format
msgid " %#06x: Version: %hu File: %s Cnt: %hu\n"
msgstr " %#06x: Versión: %hu Fichero: %s Conteo: %hu\n"
-#: src/readelf.c:2734
+#: src/readelf.c:2750
#, c-format
msgid " %#06x: Name: %s Flags: %s Version: %hu\n"
msgstr " %#06x: Nombre: %s Banderas: %s Versión: %hu\n"
-#: src/readelf.c:2777
+#: src/readelf.c:2793
#, c-format
msgid ""
"\n"
@@ -4737,19 +4742,19 @@ msgstr[1] ""
" Dirección: %#0*<PRIx64> Compensación: %#08<PRIx64> Enlace a sección: "
"[%2u] '%s'\n"
-#: src/readelf.c:2805
+#: src/readelf.c:2821
#, 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:2820
+#: src/readelf.c:2836
#, c-format
msgid " %#06x: Parent %d: %s\n"
msgstr " %#06x: Principal %d: %s\n"
#. Print the header.
-#: src/readelf.c:3081
+#: src/readelf.c:3097
#, c-format
msgid ""
"\n"
@@ -4770,15 +4775,15 @@ msgstr[1] ""
" Dirección: %#0*<PRIx64> Compensación: %#08<PRIx64> Enlace a sección: "
"[%2u] '%s'"
-#: src/readelf.c:3109
+#: src/readelf.c:3125
msgid " 0 *local* "
msgstr " 0 *local* "
-#: src/readelf.c:3114
+#: src/readelf.c:3130
msgid " 1 *global* "
msgstr " 1 *global* "
-#: src/readelf.c:3156
+#: src/readelf.c:3172
#, c-format
msgid ""
"\n"
@@ -4803,22 +4808,22 @@ msgstr[1] ""
" Dirección: %#0*<PRIx64> Compensación: %#08<PRIx64> Enlace a sección: "
"[%2u] '%s'\n"
-#: src/readelf.c:3178
+#: src/readelf.c:3194
#, no-c-format
msgid " Length Number % of total Coverage\n"
msgstr " Longitud Número % of total Cobertura\n"
-#: src/readelf.c:3180
+#: src/readelf.c:3196
#, c-format
msgid " 0 %6<PRIu32> %5.1f%%\n"
msgstr " 0 %6<PRIu32> %5.1f%%\n"
-#: src/readelf.c:3187
+#: src/readelf.c:3203
#, c-format
msgid "%7d %6<PRIu32> %5.1f%% %5.1f%%\n"
msgstr "%7d %6<PRIu32> %5.1f%% %5.1f%%\n"
-#: src/readelf.c:3200
+#: src/readelf.c:3216
#, c-format
msgid ""
" Average number of tests: successful lookup: %f\n"
@@ -4827,37 +4832,37 @@ msgstr ""
" Número promedio de pruebas: búsqueda exitosa: %f\n"
" búsqueda sin éxito: %f\n"
-#: src/readelf.c:3218 src/readelf.c:3282 src/readelf.c:3348
+#: src/readelf.c:3234 src/readelf.c:3298 src/readelf.c:3364
#, 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:3226
+#: src/readelf.c:3242
#, fuzzy, c-format
msgid "invalid data in sysv.hash section %d"
msgstr "Datos inválidos en sección [%zu] '%s'"
-#: src/readelf.c:3255
+#: src/readelf.c:3271
#, fuzzy, c-format
msgid "invalid chain in sysv.hash section %d"
msgstr "Datos inválidos en sección [%zu] '%s'"
-#: src/readelf.c:3290
+#: src/readelf.c:3306
#, fuzzy, c-format
msgid "invalid data in sysv.hash64 section %d"
msgstr "Datos inválidos en sección [%zu] '%s'"
-#: src/readelf.c:3321
+#: src/readelf.c:3337
#, fuzzy, c-format
msgid "invalid chain in sysv.hash64 section %d"
msgstr "Datos inválidos en sección [%zu] '%s'"
-#: src/readelf.c:3357
+#: src/readelf.c:3373
#, fuzzy, c-format
msgid "invalid data in gnu.hash section %d"
msgstr "Datos inválidos en sección [%zu] '%s'"
-#: src/readelf.c:3424
+#: src/readelf.c:3440
#, c-format
msgid ""
" Symbol Bias: %u\n"
@@ -4867,7 +4872,7 @@ msgstr ""
" Tamaño de Bitmask: %zu bytes %<PRIuFAST32>%% bits establecen segundo "
"cambio de dispersión: %u\n"
-#: src/readelf.c:3513
+#: src/readelf.c:3529
#, c-format
msgid ""
"\n"
@@ -4884,7 +4889,7 @@ msgstr[1] ""
"Sección de lista de biblioteca [%2zu] '%s' en compensación %#0<PRIx64> "
"contiene entradas %d:\n"
-#: src/readelf.c:3527
+#: src/readelf.c:3543
msgid ""
" Library Time Stamp Checksum Version "
"Flags"
@@ -4892,7 +4897,7 @@ msgstr ""
" Biblioteca Marca de tiempo Indicadores "
"de versión de suma de verificación"
-#: src/readelf.c:3579
+#: src/readelf.c:3595
#, c-format
msgid ""
"\n"
@@ -4903,102 +4908,102 @@ msgstr ""
"Sección de atributos de objeto [%2zu] '%s' de %<PRIu64> bytes con "
"desplazamiento %#0<PRIx64>:\n"
-#: src/readelf.c:3596
+#: src/readelf.c:3612
msgid " Owner Size\n"
msgstr " Propietario Tamaño\n"
-#: src/readelf.c:3625
+#: src/readelf.c:3641
#, c-format
msgid " %-13s %4<PRIu32>\n"
msgstr " %-13s %4<PRIu32>\n"
#. Unknown subsection, print and skip.
-#: src/readelf.c:3664
+#: src/readelf.c:3680
#, c-format
msgid " %-4u %12<PRIu32>\n"
msgstr " %-4u %12<PRIu32>\n"
#. Tag_File
-#: src/readelf.c:3669
+#: src/readelf.c:3685
#, c-format
msgid " File: %11<PRIu32>\n"
msgstr " File: %11<PRIu32>\n"
-#: src/readelf.c:3718
+#: src/readelf.c:3734
#, c-format
msgid " %s: %<PRId64>, %s\n"
msgstr " %s: %<PRId64>, %s\n"
-#: src/readelf.c:3721
+#: src/readelf.c:3737
#, c-format
msgid " %s: %<PRId64>\n"
msgstr " %s: %<PRId64>\n"
-#: src/readelf.c:3724
+#: src/readelf.c:3740
#, c-format
msgid " %s: %s\n"
msgstr " %s: %s\n"
-#: src/readelf.c:3734
+#: src/readelf.c:3750
#, c-format
msgid " %u: %<PRId64>\n"
msgstr " %u: %<PRId64>\n"
-#: src/readelf.c:3737
+#: src/readelf.c:3753
#, c-format
msgid " %u: %s\n"
msgstr " %u: %s\n"
-#: src/readelf.c:3807
+#: src/readelf.c:3823
#, fuzzy, c-format
msgid "sprintf failure"
msgstr "mprotect falló"
-#: src/readelf.c:4289
+#: src/readelf.c:4305
msgid "empty block"
msgstr "bloque vacío"
-#: src/readelf.c:4292
+#: src/readelf.c:4308
#, c-format
msgid "%zu byte block:"
msgstr "bloque de byte %zu:"
-#: src/readelf.c:4770
+#: src/readelf.c:4786
#, fuzzy, c-format
msgid "%*s[%2<PRIuMAX>] %s <TRUNCATED>\n"
msgstr "%*s[%4<PRIuMAX>] %s <TRUNCATED>\n"
-#: src/readelf.c:4834
+#: src/readelf.c:4850
#, c-format
msgid "%s %#<PRIx64> used with different address sizes"
msgstr "%s %#<PRIx64> utilizado con direcciones de diferente tamaño"
-#: src/readelf.c:4841
+#: src/readelf.c:4857
#, c-format
msgid "%s %#<PRIx64> used with different offset sizes"
msgstr "%s %#<PRIx64> utilizado con offsetr de diferente tamaño"
-#: src/readelf.c:4848
+#: src/readelf.c:4864
#, fuzzy, c-format
msgid "%s %#<PRIx64> used with different base addresses"
msgstr "%s %#<PRIx64> utilizado con direcciones de diferente tamaño"
-#: src/readelf.c:4855
+#: src/readelf.c:4871
#, 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:4952
+#: src/readelf.c:4968
#, 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:4960
+#: src/readelf.c:4976
#, c-format
msgid " [%6tx] <UNUSED GARBAGE> ... %<PRIu64> bytes ...\n"
msgstr " [%6tx] <MATERIAL INUTIL NO UTILIZADO> ... %<PRIu64> bytes ...\n"
-#: src/readelf.c:5038
+#: src/readelf.c:5054
#, c-format
msgid ""
"\n"
@@ -5009,7 +5014,7 @@ msgstr ""
"Sección DWARF [%2zu] '%s' en compensación %#<PRIx64>:\n"
" [ Código]\n"
-#: src/readelf.c:5046
+#: src/readelf.c:5062
#, c-format
msgid ""
"\n"
@@ -5018,20 +5023,20 @@ msgstr ""
"\n"
"Sección de abreviatura en compensación %<PRIu64>:\n"
-#: src/readelf.c:5059
+#: src/readelf.c:5075
#, c-format
msgid " *** error while reading abbreviation: %s\n"
msgstr " *** error en lectura de abreviatura: %s\n"
-#: src/readelf.c:5075
+#: src/readelf.c:5091
#, c-format
msgid " [%5u] offset: %<PRId64>, children: %s, tag: %s\n"
msgstr " [%5u] compensación: %<PRId64>, hijos: %s, etiqueta: %s\n"
-#: src/readelf.c:5108 src/readelf.c:5417 src/readelf.c:5584 src/readelf.c:5969
-#: src/readelf.c:6570 src/readelf.c:8307 src/readelf.c:8993 src/readelf.c:9429
-#: src/readelf.c:9674 src/readelf.c:9840 src/readelf.c:10227
-#: src/readelf.c:10287
+#: src/readelf.c:5124 src/readelf.c:5433 src/readelf.c:5600 src/readelf.c:5985
+#: src/readelf.c:6586 src/readelf.c:8323 src/readelf.c:9009 src/readelf.c:9445
+#: src/readelf.c:9690 src/readelf.c:9856 src/readelf.c:10243
+#: src/readelf.c:10303
#, c-format
msgid ""
"\n"
@@ -5040,52 +5045,52 @@ msgstr ""
"\n"
"Sección DWARF [%2zu] '%s' en compensación %#<PRIx64>:\n"
-#: src/readelf.c:5121
+#: src/readelf.c:5137
#, fuzzy, c-format
msgid "cannot get .debug_addr section data: %s"
msgstr "no se pueden obtener datos de sección: %s"
-#: src/readelf.c:5221 src/readelf.c:5245 src/readelf.c:5629 src/readelf.c:9038
+#: src/readelf.c:5237 src/readelf.c:5261 src/readelf.c:5645 src/readelf.c:9054
#, fuzzy, c-format
msgid " Length: %8<PRIu64>\n"
msgstr " (compensación: %#<PRIx64>)"
-#: src/readelf.c:5223 src/readelf.c:5260 src/readelf.c:5642 src/readelf.c:9051
+#: src/readelf.c:5239 src/readelf.c:5276 src/readelf.c:5658 src/readelf.c:9067
#, fuzzy, c-format
msgid " DWARF version: %8<PRIu16>\n"
msgstr " %s: %<PRId64>\n"
-#: src/readelf.c:5224 src/readelf.c:5269 src/readelf.c:5651 src/readelf.c:9060
+#: src/readelf.c:5240 src/readelf.c:5285 src/readelf.c:5667 src/readelf.c:9076
#, fuzzy, c-format
msgid " Address size: %8<PRIu64>\n"
msgstr " (fin de compensación: %#<PRIx64>)"
-#: src/readelf.c:5226 src/readelf.c:5279 src/readelf.c:5661 src/readelf.c:9070
+#: src/readelf.c:5242 src/readelf.c:5295 src/readelf.c:5677 src/readelf.c:9086
#, fuzzy, c-format
msgid " Segment size: %8<PRIu64>\n"
msgstr " establecer archivo a %<PRIu64>\n"
-#: src/readelf.c:5264 src/readelf.c:5646 src/readelf.c:9055 src/readelf.c:10419
+#: src/readelf.c:5280 src/readelf.c:5662 src/readelf.c:9071 src/readelf.c:10435
#, fuzzy, c-format
msgid "Unknown version"
msgstr "versión desconocida"
-#: src/readelf.c:5274 src/readelf.c:5487 src/readelf.c:5656 src/readelf.c:9065
+#: src/readelf.c:5290 src/readelf.c:5503 src/readelf.c:5672 src/readelf.c:9081
#, fuzzy, c-format
msgid "unsupported address size"
msgstr "no hay valor de dirección"
-#: src/readelf.c:5285 src/readelf.c:5498 src/readelf.c:5666 src/readelf.c:9075
+#: src/readelf.c:5301 src/readelf.c:5514 src/readelf.c:5682 src/readelf.c:9091
#, c-format
msgid "unsupported segment size"
msgstr ""
-#: src/readelf.c:5338 src/readelf.c:5412
+#: src/readelf.c:5354 src/readelf.c:5428
#, c-format
msgid "cannot get .debug_aranges content: %s"
msgstr "no se ha podido obtener contenido de .debug_aranges: %s"
-#: src/readelf.c:5353
+#: src/readelf.c:5369
#, c-format
msgid ""
"\n"
@@ -5100,12 +5105,12 @@ msgstr[1] ""
"\n"
"Sección DWARF [%2zu] '%s' en compensación %#<PRIx64> contiene entradas %zu:\n"
-#: src/readelf.c:5384
+#: src/readelf.c:5400
#, c-format
msgid " [%*zu] ???\n"
msgstr " [%*zu] ???\n"
-#: src/readelf.c:5386
+#: src/readelf.c:5402
#, c-format
msgid ""
" [%*zu] start: %0#*<PRIx64>, length: %5<PRIu64>, CU DIE offset: %6<PRId64>\n"
@@ -5113,7 +5118,7 @@ msgstr ""
" Inicio [%*zu]: %0#*<PRIx64>, longitud: %5<PRIu64>, compensación CU DIE: "
"%6<PRId64>\n"
-#: src/readelf.c:5430 src/readelf.c:8334
+#: src/readelf.c:5446 src/readelf.c:8350
#, fuzzy, c-format
msgid ""
"\n"
@@ -5122,152 +5127,152 @@ msgstr ""
"\n"
"Tabla en compensación %Zu:\n"
-#: src/readelf.c:5434 src/readelf.c:5610 src/readelf.c:6594 src/readelf.c:8345
-#: src/readelf.c:9019
+#: src/readelf.c:5450 src/readelf.c:5626 src/readelf.c:6610 src/readelf.c:8361
+#: src/readelf.c:9035
#, c-format
msgid "invalid data in section [%zu] '%s'"
msgstr "Datos inválidos en sección [%zu] '%s'"
-#: src/readelf.c:5450
+#: src/readelf.c:5466
#, fuzzy, c-format
msgid ""
"\n"
" Length: %6<PRIu64>\n"
msgstr " (compensación: %#<PRIx64>)"
-#: src/readelf.c:5462
+#: src/readelf.c:5478
#, fuzzy, c-format
msgid " DWARF version: %6<PRIuFAST16>\n"
msgstr " %s: %<PRId64>\n"
-#: src/readelf.c:5466
+#: src/readelf.c:5482
#, c-format
msgid "unsupported aranges version"
msgstr ""
-#: src/readelf.c:5477
+#: src/readelf.c:5493
#, fuzzy, c-format
msgid " CU offset: %6<PRIx64>\n"
msgstr " (compensación: %#<PRIx64>)"
-#: src/readelf.c:5483
+#: src/readelf.c:5499
#, fuzzy, c-format
msgid " Address size: %6<PRIu64>\n"
msgstr " (fin de compensación: %#<PRIx64>)"
-#: src/readelf.c:5494
+#: src/readelf.c:5510
#, fuzzy, c-format
msgid ""
" Segment size: %6<PRIu64>\n"
"\n"
msgstr " establecer archivo a %<PRIu64>\n"
-#: src/readelf.c:5549
+#: src/readelf.c:5565
#, c-format
msgid " %zu padding bytes\n"
msgstr ""
-#: src/readelf.c:5593
+#: src/readelf.c:5609
#, fuzzy, c-format
msgid "cannot get .debug_rnglists content: %s"
msgstr "no se ha podido obtener contenido de .debug_ranges: %s"
-#: src/readelf.c:5616 src/readelf.c:9025
+#: src/readelf.c:5632 src/readelf.c:9041
#, fuzzy, c-format
msgid ""
"Table at Offset 0x%<PRIx64>:\n"
"\n"
msgstr " (fin de compensación: %#<PRIx64>)"
-#: src/readelf.c:5671 src/readelf.c:9080
+#: src/readelf.c:5687 src/readelf.c:9096
#, fuzzy, c-format
msgid " Offset entries: %8<PRIu64>\n"
msgstr " (compensación: %#<PRIx64>)"
-#: src/readelf.c:5687 src/readelf.c:9096
+#: src/readelf.c:5703 src/readelf.c:9112
#, c-format
msgid " Unknown CU base: "
msgstr ""
-#: src/readelf.c:5689 src/readelf.c:9098
+#: src/readelf.c:5705 src/readelf.c:9114
#, c-format
msgid " CU [%6<PRIx64>] base: "
msgstr ""
-#: src/readelf.c:5695 src/readelf.c:9104
+#: src/readelf.c:5711 src/readelf.c:9120
#, c-format
msgid " Not associated with a CU.\n"
msgstr ""
-#: src/readelf.c:5706 src/readelf.c:9115
+#: src/readelf.c:5722 src/readelf.c:9131
#, c-format
msgid "too many offset entries for unit length"
msgstr ""
-#: src/readelf.c:5710 src/readelf.c:9119
+#: src/readelf.c:5726 src/readelf.c:9135
#, fuzzy, c-format
msgid " Offsets starting at 0x%<PRIx64>:\n"
msgstr " Propietario Tamaño\n"
-#: src/readelf.c:5762
+#: src/readelf.c:5778
#, fuzzy, c-format
msgid "invalid range list data"
msgstr "datos inválidos"
-#: src/readelf.c:5947 src/readelf.c:9407
+#: src/readelf.c:5963 src/readelf.c:9423
#, c-format
msgid ""
" %zu padding bytes\n"
"\n"
msgstr ""
-#: src/readelf.c:5964
+#: src/readelf.c:5980
#, c-format
msgid "cannot get .debug_ranges content: %s"
msgstr "no se ha podido obtener contenido de .debug_ranges: %s"
-#: src/readelf.c:6000 src/readelf.c:9462
+#: src/readelf.c:6016 src/readelf.c:9478
#, c-format
msgid ""
"\n"
" Unknown CU base: "
msgstr ""
-#: src/readelf.c:6002 src/readelf.c:9464
+#: src/readelf.c:6018 src/readelf.c:9480
#, c-format
msgid ""
"\n"
" CU [%6<PRIx64>] base: "
msgstr ""
-#: src/readelf.c:6011 src/readelf.c:9490 src/readelf.c:9516
+#: src/readelf.c:6027 src/readelf.c:9506 src/readelf.c:9532
#, c-format
msgid " [%6tx] <INVALID DATA>\n"
msgstr " [%6tx] <DATOS INVÃLIDOS>\n"
-#: src/readelf.c:6032 src/readelf.c:9596
+#: src/readelf.c:6048 src/readelf.c:9612
#, fuzzy, c-format
msgid ""
" [%6tx] base address\n"
" "
msgstr " [%6tx] (dirección base) %s\n"
-#: src/readelf.c:6040 src/readelf.c:9604
+#: src/readelf.c:6056 src/readelf.c:9620
#, fuzzy, c-format
msgid " [%6tx] empty list\n"
msgstr " [%6tx] lista vacía\n"
-#: src/readelf.c:6295
+#: src/readelf.c:6311
#, fuzzy
msgid " <INVALID DATA>\n"
msgstr " <DATOS INVÃLIDOS>\n"
-#: src/readelf.c:6548
+#: src/readelf.c:6564
#, fuzzy, c-format
msgid "cannot get ELF: %s"
msgstr "no se puede leer encabezamiento ELF: %s"
-#: src/readelf.c:6566
+#: src/readelf.c:6582
#, c-format
msgid ""
"\n"
@@ -5277,7 +5282,7 @@ msgstr ""
"Sección de información de marco de llamada [%2zu] '%s' en compensación "
"%#<PRIx64>:\n"
-#: src/readelf.c:6616
+#: src/readelf.c:6632
#, c-format
msgid ""
"\n"
@@ -5286,65 +5291,65 @@ msgstr ""
"\n"
" [%6tx] Terminator cero\n"
-#: src/readelf.c:6717 src/readelf.c:6871
+#: src/readelf.c:6733 src/readelf.c:6887
#, c-format
msgid "invalid augmentation length"
msgstr "longitud de aumento inválida"
-#: src/readelf.c:6732
+#: src/readelf.c:6748
msgid "FDE address encoding: "
msgstr "Codificación de dirección FDE:"
-#: src/readelf.c:6738
+#: src/readelf.c:6754
msgid "LSDA pointer encoding: "
msgstr "Codificación de puntero LSDA:"
-#: src/readelf.c:6848
+#: src/readelf.c:6864
#, c-format
msgid " (offset: %#<PRIx64>)"
msgstr " (compensación: %#<PRIx64>)"
-#: src/readelf.c:6855
+#: src/readelf.c:6871
#, c-format
msgid " (end offset: %#<PRIx64>)"
msgstr " (fin de compensación: %#<PRIx64>)"
-#: src/readelf.c:6892
+#: src/readelf.c:6908
#, c-format
msgid " %-26sLSDA pointer: %#<PRIx64>\n"
msgstr "Puntero %-26sLSDA: %#<PRIx64>\n"
-#: src/readelf.c:6977
+#: src/readelf.c:6993
#, fuzzy, c-format
msgid "DIE [%<PRIx64>] cannot get attribute code: %s"
msgstr "No se puede obtener código de atributo: %s"
-#: src/readelf.c:6987
+#: src/readelf.c:7003
#, fuzzy, c-format
msgid "DIE [%<PRIx64>] cannot get attribute form: %s"
msgstr "No se puede obtener forma de atributo: %s"
-#: src/readelf.c:7009
+#: src/readelf.c:7025
#, fuzzy, c-format
msgid "DIE [%<PRIx64>] cannot get attribute '%s' (%s) value: %s"
msgstr "No se puede obtener valor: %s"
-#: src/readelf.c:7339
+#: src/readelf.c:7355
#, fuzzy, c-format
msgid "invalid file (%<PRId64>): %s"
msgstr "Archivo inválido"
-#: src/readelf.c:7343
+#: src/readelf.c:7359
#, fuzzy, c-format
msgid "no srcfiles for CU [%<PRIx64>]"
msgstr " establecer archivo a %<PRIu64>\n"
-#: src/readelf.c:7347
+#: src/readelf.c:7363
#, fuzzy, c-format
msgid "couldn't get DWARF CU: %s"
msgstr "no se puede leer encabezamiento ELF: %s"
-#: src/readelf.c:7660
+#: src/readelf.c:7676
#, c-format
msgid ""
"\n"
@@ -5355,12 +5360,12 @@ msgstr ""
"Sección DWARF [%2zu] '%s' en compensación %#<PRIx64>:\n"
" [Offset]\n"
-#: src/readelf.c:7710
+#: src/readelf.c:7726
#, fuzzy, c-format
msgid "cannot get next unit: %s"
msgstr "No se puede obtener próximo DIE: %s"
-#: src/readelf.c:7729
+#: src/readelf.c:7745
#, fuzzy, c-format
msgid ""
" Type unit at offset %<PRIu64>:\n"
@@ -5373,7 +5378,7 @@ msgstr ""
"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:7741
+#: src/readelf.c:7757
#, c-format
msgid ""
" Compilation unit at offset %<PRIu64>:\n"
@@ -5384,39 +5389,39 @@ msgstr ""
" 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:7751 src/readelf.c:7914
+#: src/readelf.c:7767 src/readelf.c:7930
#, c-format
msgid " Unit type: %s (%<PRIu8>)"
msgstr ""
-#: src/readelf.c:7778
+#: src/readelf.c:7794
#, c-format
msgid "unknown version (%d) or unit type (%d)"
msgstr ""
-#: src/readelf.c:7807
+#: src/readelf.c:7823
#, c-format
msgid "cannot get DIE offset: %s"
msgstr "no se puede obtener DIE en compensación: %s"
-#: src/readelf.c:7816
+#: src/readelf.c:7832
#, 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:7854
+#: src/readelf.c:7870
#, c-format
msgid "cannot get next DIE: %s\n"
msgstr "No se puede obtener próximo DIE: %s\n"
-#: src/readelf.c:7862
+#: src/readelf.c:7878
#, c-format
msgid "cannot get next DIE: %s"
msgstr "No se puede obtener próximo DIE: %s"
-#: src/readelf.c:7906
+#: src/readelf.c:7922
#, fuzzy, c-format
msgid ""
" Split compilation unit at offset %<PRIu64>:\n"
@@ -5427,7 +5432,7 @@ msgstr ""
" 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:7958
+#: src/readelf.c:7974
#, fuzzy, c-format
msgid ""
"\n"
@@ -5437,18 +5442,18 @@ msgstr ""
"\n"
"Sección DWARF [%2zu] '%s' en compensación %#<PRIx64>:\n"
-#: src/readelf.c:8290
+#: src/readelf.c:8306
#, fuzzy, c-format
msgid "unknown form: %s"
msgstr "Forma %<PRIx64> desconocida"
-#: src/readelf.c:8321
+#: src/readelf.c:8337
#, 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:8423
+#: src/readelf.c:8439
#, fuzzy, c-format
msgid ""
"\n"
@@ -5479,34 +5484,34 @@ msgstr ""
"\n"
"Códigos operativos:\n"
-#: src/readelf.c:8445
+#: src/readelf.c:8461
#, 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:8453
+#: src/readelf.c:8469
#, fuzzy, c-format
msgid "cannot handle address size: %u\n"
msgstr "no hay valor de dirección"
-#: src/readelf.c:8461
+#: src/readelf.c:8477
#, fuzzy, c-format
msgid "cannot handle segment selector size: %u\n"
msgstr "No se puede encontrar la sección: %s"
-#: src/readelf.c:8471
+#: src/readelf.c:8487
#, 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:8486
+#: src/readelf.c:8502
#, 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:8497
+#: src/readelf.c:8513
msgid ""
"\n"
"Directory table:"
@@ -5514,12 +5519,12 @@ msgstr ""
"\n"
"Tabla de Directorio:"
-#: src/readelf.c:8503 src/readelf.c:8580
+#: src/readelf.c:8519 src/readelf.c:8596
#, fuzzy, c-format
msgid " ["
msgstr " %s: %s\n"
-#: src/readelf.c:8574
+#: src/readelf.c:8590
#, fuzzy
msgid ""
"\n"
@@ -5528,7 +5533,7 @@ msgstr ""
"\n"
" Tabla de sitio de llamada:"
-#: src/readelf.c:8635
+#: src/readelf.c:8651
#, fuzzy
msgid " Entry Dir Time Size Name"
msgstr ""
@@ -5536,7 +5541,7 @@ msgstr ""
"Tabla de nombre de archivo:\n"
" Directorio de entrada Tiempo Tamaño Nombre"
-#: src/readelf.c:8672
+#: src/readelf.c:8688
msgid ""
"\n"
"Line number statements:"
@@ -5544,121 +5549,121 @@ msgstr ""
"\n"
" Declaraciones de número de Línea:"
-#: src/readelf.c:8695
+#: src/readelf.c:8711
#, 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:8729
+#: src/readelf.c:8745
#, 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:8733
+#: src/readelf.c:8749
#, 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:8736
+#: src/readelf.c:8752
#, c-format
msgid ", line%+d = %zu\n"
msgstr ""
-#: src/readelf.c:8754
+#: src/readelf.c:8770
#, c-format
msgid " extended opcode %u: "
msgstr " Código operativo extendido %u: "
-#: src/readelf.c:8759
+#: src/readelf.c:8775
#, fuzzy
msgid " end of sequence"
msgstr "Fin de secuencia"
-#: src/readelf.c:8777
+#: src/readelf.c:8793
#, fuzzy, c-format
msgid " set address to "
msgstr "Establecer dirección a %s\n"
-#: src/readelf.c:8805
+#: src/readelf.c:8821
#, 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:8819
+#: src/readelf.c:8835
#, c-format
msgid " set discriminator to %u\n"
msgstr " establecer discriminador a %u\n"
#. Unknown, ignore it.
-#: src/readelf.c:8824
+#: src/readelf.c:8840
#, fuzzy
msgid " unknown opcode"
msgstr "código operativo desconocido "
#. Takes no argument.
-#: src/readelf.c:8836
+#: src/readelf.c:8852
msgid " copy"
msgstr "Copiar"
-#: src/readelf.c:8847
+#: src/readelf.c:8863
#, fuzzy, c-format
msgid " advance address by %u to "
msgstr "Dirección de avance por %u a %s\n"
-#: src/readelf.c:8851 src/readelf.c:8912
+#: src/readelf.c:8867 src/readelf.c:8928
#, c-format
msgid ", op_index to %u"
msgstr ""
-#: src/readelf.c:8863
+#: src/readelf.c:8879
#, 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:8873
+#: src/readelf.c:8889
#, c-format
msgid " set file to %<PRIu64>\n"
msgstr " establecer archivo a %<PRIu64>\n"
-#: src/readelf.c:8884
+#: src/readelf.c:8900
#, c-format
msgid " set column to %<PRIu64>\n"
msgstr " Establecer columna a %<PRIu64>\n"
-#: src/readelf.c:8891
+#: src/readelf.c:8907
#, c-format
msgid " set '%s' to %<PRIuFAST8>\n"
msgstr "Establecer '%s' a %<PRIuFAST8>\n"
#. Takes no argument.
-#: src/readelf.c:8897
+#: src/readelf.c:8913
msgid " set basic block flag"
msgstr "Establecer bandera de bloque básico"
-#: src/readelf.c:8908
+#: src/readelf.c:8924
#, fuzzy, c-format
msgid " advance address by constant %u to "
msgstr "Dirección de avance por constante %u a %s\n"
-#: src/readelf.c:8928
+#: src/readelf.c:8944
#, 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:8938
+#: src/readelf.c:8954
msgid " set prologue end flag"
msgstr " Establecer bandera prologue_end"
#. Takes no argument.
-#: src/readelf.c:8943
+#: src/readelf.c:8959
msgid " set epilogue begin flag"
msgstr " Establecer bandera epilogue_begin"
-#: src/readelf.c:8953
+#: src/readelf.c:8969
#, c-format
msgid " set isa to %u\n"
msgstr " establecer isa para %u\n"
@@ -5666,105 +5671,105 @@ msgstr " establecer isa para %u\n"
#. 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:8962
+#: src/readelf.c:8978
#, 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:9002
+#: src/readelf.c:9018
#, fuzzy, c-format
msgid "cannot get .debug_loclists content: %s"
msgstr "no es posible obtener contenido de .debug_loc: %s"
-#: src/readelf.c:9171
+#: src/readelf.c:9187
#, fuzzy, c-format
msgid "invalid loclists data"
msgstr "datos inválidos"
-#: src/readelf.c:9424
+#: src/readelf.c:9440
#, c-format
msgid "cannot get .debug_loc content: %s"
msgstr "no es posible obtener contenido de .debug_loc: %s"
-#: src/readelf.c:9631 src/readelf.c:10675
+#: src/readelf.c:9647 src/readelf.c:10691
msgid " <INVALID DATA>\n"
msgstr " <DATOS INVÃLIDOS>\n"
-#: src/readelf.c:9686 src/readelf.c:9849
+#: src/readelf.c:9702 src/readelf.c:9865
#, 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:9766
+#: src/readelf.c:9782
#, 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:9789
+#: src/readelf.c:9805
#, 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:9890
+#: src/readelf.c:9906
#, fuzzy, c-format
msgid " Offset: 0x%<PRIx64>\n"
msgstr " Propietario Tamaño\n"
-#: src/readelf.c:9902
+#: src/readelf.c:9918
#, fuzzy, c-format
msgid " Version: %<PRIu16>\n"
msgstr " %s: %<PRId64>\n"
-#: src/readelf.c:9908 src/readelf.c:10795
+#: src/readelf.c:9924 src/readelf.c:10811
#, c-format
msgid " unknown version, cannot parse section\n"
msgstr ""
-#: src/readelf.c:9915
+#: src/readelf.c:9931
#, fuzzy, c-format
msgid " Flag: 0x%<PRIx8>"
msgstr " Dirección de punto de entrada: %#<PRIx64>\n"
-#: src/readelf.c:9944
+#: src/readelf.c:9960
#, fuzzy, c-format
msgid " Offset length: %<PRIu8>\n"
msgstr " (compensación: %#<PRIx64>)"
-#: src/readelf.c:9952
+#: src/readelf.c:9968
#, fuzzy, c-format
msgid " .debug_line offset: 0x%<PRIx64>\n"
msgstr " (fin de compensación: %#<PRIx64>)"
-#: src/readelf.c:9977
+#: src/readelf.c:9993
#, fuzzy, c-format
msgid " extension opcode table, %<PRIu8> items:\n"
msgstr " opcódigo con parámetro %<PRIu8> desconocido:"
-#: src/readelf.c:9984
+#: src/readelf.c:10000
#, c-format
msgid " [%<PRIx8>]"
msgstr ""
-#: src/readelf.c:9996
+#: src/readelf.c:10012
#, fuzzy, c-format
msgid " %<PRIu8> arguments:"
msgstr " [%*<PRIuFAST8>] argumento %hhu \n"
-#: src/readelf.c:10011
+#: src/readelf.c:10027
#, c-format
msgid " no arguments."
msgstr ""
-#: src/readelf.c:10212
+#: src/readelf.c:10228
#, 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:10256
+#: src/readelf.c:10272
#, c-format
msgid ""
"\n"
@@ -5775,37 +5780,37 @@ msgstr ""
"Sección DWARF [%2zu] '%s' en compensación %#<PRIx64>:\n"
" %*s String\n"
-#: src/readelf.c:10271
+#: src/readelf.c:10287
#, fuzzy, c-format
msgid " *** error, missing string terminator\n"
msgstr " *** error en lectura de cadenas: %s\n"
-#: src/readelf.c:10300
+#: src/readelf.c:10316
#, 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:10399
+#: src/readelf.c:10415
#, fuzzy, c-format
msgid " Length: %8<PRIu64>\n"
msgstr " (compensación: %#<PRIx64>)"
-#: src/readelf.c:10401
+#: src/readelf.c:10417
#, fuzzy, c-format
msgid " Offset size: %8<PRIu8>\n"
msgstr " (compensación: %#<PRIx64>)"
-#: src/readelf.c:10415
+#: src/readelf.c:10431
#, fuzzy, c-format
msgid " DWARF version: %8<PRIu16>\n"
msgstr " %s: %<PRId64>\n"
-#: src/readelf.c:10424
+#: src/readelf.c:10440
#, fuzzy, c-format
msgid " Padding: %8<PRIx16>\n"
msgstr " (compensación: %#<PRIx64>)"
-#: src/readelf.c:10478
+#: src/readelf.c:10494
#, c-format
msgid ""
"\n"
@@ -5814,7 +5819,7 @@ msgstr ""
"\n"
"Sección de tabla de búsqueda de marco de llamada [%2zu] '.eh_frame_hdr':\n"
-#: src/readelf.c:10580
+#: src/readelf.c:10596
#, c-format
msgid ""
"\n"
@@ -5823,22 +5828,22 @@ msgstr ""
"\n"
"Excepción en el manejo de la sección de tabla [%2zu] '.gcc_except_table':\n"
-#: src/readelf.c:10603
+#: src/readelf.c:10619
#, c-format
msgid " LPStart encoding: %#x "
msgstr "Codificación LPStart: %#x "
-#: src/readelf.c:10615
+#: src/readelf.c:10631
#, c-format
msgid " TType encoding: %#x "
msgstr "Codificación TType: %#x "
-#: src/readelf.c:10630
+#: src/readelf.c:10646
#, c-format
msgid " Call site encoding: %#x "
msgstr "Codificación de sitio de llamada: %#x "
-#: src/readelf.c:10643
+#: src/readelf.c:10659
msgid ""
"\n"
" Call site table:"
@@ -5846,7 +5851,7 @@ msgstr ""
"\n"
" Tabla de sitio de llamada:"
-#: src/readelf.c:10657
+#: src/readelf.c:10673
#, c-format
msgid ""
" [%4u] Call site start: %#<PRIx64>\n"
@@ -5859,12 +5864,12 @@ msgstr ""
" Landing pad: %#<PRIx64>\n"
" Action: %u\n"
-#: src/readelf.c:10730
+#: src/readelf.c:10746
#, c-format
msgid "invalid TType encoding"
msgstr "Codificación TType inválida"
-#: src/readelf.c:10757
+#: src/readelf.c:10773
#, fuzzy, c-format
msgid ""
"\n"
@@ -5873,37 +5878,37 @@ msgstr ""
"\n"
"Sección DWARF [%2zu] '%s' en compensación %#<PRIx64> contiene entrada %zu:\n"
-#: src/readelf.c:10786
+#: src/readelf.c:10802
#, fuzzy, c-format
msgid " Version: %<PRId32>\n"
msgstr " %s: %<PRId64>\n"
-#: src/readelf.c:10804
+#: src/readelf.c:10820
#, fuzzy, c-format
msgid " CU offset: %#<PRIx32>\n"
msgstr " (compensación: %#<PRIx64>)"
-#: src/readelf.c:10811
+#: src/readelf.c:10827
#, fuzzy, c-format
msgid " TU offset: %#<PRIx32>\n"
msgstr " (compensación: %#<PRIx64>)"
-#: src/readelf.c:10818
+#: src/readelf.c:10834
#, fuzzy, c-format
msgid " address offset: %#<PRIx32>\n"
msgstr " (fin de compensación: %#<PRIx64>)"
-#: src/readelf.c:10825
+#: src/readelf.c:10841
#, fuzzy, c-format
msgid " symbol offset: %#<PRIx32>\n"
msgstr " (compensación: %#<PRIx64>)"
-#: src/readelf.c:10832
+#: src/readelf.c:10848
#, fuzzy, c-format
msgid " constant offset: %#<PRIx32>\n"
msgstr " (fin de compensación: %#<PRIx64>)"
-#: src/readelf.c:10846
+#: src/readelf.c:10862
#, fuzzy, c-format
msgid ""
"\n"
@@ -5912,7 +5917,7 @@ msgstr ""
"\n"
"Sección DWARF [%2zu] '%s' en compensación %#<PRIx64> contiene entrada %zu:\n"
-#: src/readelf.c:10871
+#: src/readelf.c:10887
#, fuzzy, c-format
msgid ""
"\n"
@@ -5921,7 +5926,7 @@ msgstr ""
"\n"
"Sección DWARF [%2zu] '%s' en compensación %#<PRIx64> contiene entrada %zu:\n"
-#: src/readelf.c:10900
+#: src/readelf.c:10916
#, fuzzy, c-format
msgid ""
"\n"
@@ -5930,7 +5935,7 @@ msgstr ""
"\n"
"Sección DWARF [%2zu] '%s' en compensación %#<PRIx64> contiene entrada %zu:\n"
-#: src/readelf.c:10932
+#: src/readelf.c:10948
#, fuzzy, c-format
msgid ""
"\n"
@@ -5939,18 +5944,18 @@ msgstr ""
"\n"
"Tabla de símbolos inválida en compensación %#0<PRIx64>\n"
-#: src/readelf.c:11070
+#: src/readelf.c:11086
#, c-format
msgid "cannot get debug context descriptor: %s"
msgstr "no se puede depurar descriptor de contexto: %s"
-#: src/readelf.c:11433 src/readelf.c:12055 src/readelf.c:12166
-#: src/readelf.c:12224
+#: src/readelf.c:11449 src/readelf.c:12071 src/readelf.c:12182
+#: src/readelf.c:12240
#, c-format
msgid "cannot convert core note data: %s"
msgstr "no es posible convertir datos de la nota principal: %s"
-#: src/readelf.c:11796
+#: src/readelf.c:11812
#, c-format
msgid ""
"\n"
@@ -5959,21 +5964,21 @@ msgstr ""
"\n"
"%*s... <repeats %u more times> ..."
-#: src/readelf.c:12303
+#: src/readelf.c:12319
msgid " Owner Data size Type\n"
msgstr " Owner Data size Type\n"
-#: src/readelf.c:12332
+#: src/readelf.c:12348
#, c-format
msgid " %-13.*s %9<PRId32> %s\n"
msgstr " %-13.*s %9<PRId32> %s\n"
-#: src/readelf.c:12384
+#: src/readelf.c:12400
#, 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:12411
+#: src/readelf.c:12434
#, c-format
msgid ""
"\n"
@@ -5982,7 +5987,7 @@ msgstr ""
"\n"
"Sección de nota [%2zu] '%s' de %<PRIu64> bytes en compensación %#0<PRIx64>:\n"
-#: src/readelf.c:12434
+#: src/readelf.c:12457
#, c-format
msgid ""
"\n"
@@ -5991,7 +5996,7 @@ msgstr ""
"\n"
"Segmento de nota de %<PRIu64> bytes en compensación %#0<PRIx64>:\n"
-#: src/readelf.c:12481
+#: src/readelf.c:12504
#, fuzzy, c-format
msgid ""
"\n"
@@ -6000,12 +6005,12 @@ msgstr ""
"\n"
"Sección [%Zu] '%s' no tiene datos para volcar.\n"
-#: src/readelf.c:12508 src/readelf.c:12559
+#: src/readelf.c:12531 src/readelf.c:12582
#, 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:12513
+#: src/readelf.c:12536
#, fuzzy, c-format
msgid ""
"\n"
@@ -6015,7 +6020,7 @@ msgstr ""
"Volcado Hex de sección [%Zu] '%s', %<PRIu64> bytes en compensación "
"%#0<PRIx64>:\n"
-#: src/readelf.c:12518
+#: src/readelf.c:12541
#, fuzzy, c-format
msgid ""
"\n"
@@ -6026,7 +6031,7 @@ msgstr ""
"Volcado Hex de sección [%Zu] '%s', %<PRIu64> bytes en compensación "
"%#0<PRIx64>:\n"
-#: src/readelf.c:12532
+#: src/readelf.c:12555
#, fuzzy, c-format
msgid ""
"\n"
@@ -6035,7 +6040,7 @@ msgstr ""
"\n"
"Sección [%Zu] '%s' no tiene datos para volcar.\n"
-#: src/readelf.c:12564
+#: src/readelf.c:12587
#, fuzzy, c-format
msgid ""
"\n"
@@ -6045,7 +6050,7 @@ msgstr ""
"Sección de cadena [%Zu] '%s' contiene %<PRIu64> bytes en compensación "
"%#0<PRIx64>:\n"
-#: src/readelf.c:12569
+#: src/readelf.c:12592
#, fuzzy, c-format
msgid ""
"\n"
@@ -6056,7 +6061,7 @@ msgstr ""
"Sección de cadena [%Zu] '%s' contiene %<PRIu64> bytes en compensación "
"%#0<PRIx64>:\n"
-#: src/readelf.c:12618
+#: src/readelf.c:12641
#, c-format
msgid ""
"\n"
@@ -6065,7 +6070,7 @@ msgstr ""
"\n"
"sección [%lu] no existe"
-#: src/readelf.c:12647
+#: src/readelf.c:12671
#, c-format
msgid ""
"\n"
@@ -6074,12 +6079,12 @@ msgstr ""
"\n"
"sección '%s' no existe"
-#: src/readelf.c:12704
+#: src/readelf.c:12728
#, 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:12707
+#: src/readelf.c:12731
#, c-format
msgid ""
"\n"
@@ -6088,7 +6093,7 @@ msgstr ""
"\n"
"Archivo '%s' no tiene índice de símbolo\n"
-#: src/readelf.c:12711
+#: src/readelf.c:12735
#, fuzzy, c-format
msgid ""
"\n"
@@ -6097,12 +6102,12 @@ msgstr ""
"\n"
"Ãndice de archivo '%s' tiene %Zu entradas:\n"
-#: src/readelf.c:12729
+#: src/readelf.c:12753
#, 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:12734
+#: src/readelf.c:12758
#, c-format
msgid "Archive member '%s' contains:\n"
msgstr "Miembro de archivo contiene '%s':\n"
@@ -6699,7 +6704,7 @@ msgstr "no se puede crear el encabezamiento ELF: %s"
msgid "cannot get shdrstrndx:%s"
msgstr "No se puede encontrar la sección: %s"
-#: src/unstrip.c:248 src/unstrip.c:2038
+#: src/unstrip.c:248 src/unstrip.c:2081
#, c-format
msgid "cannot get ELF header: %s"
msgstr "no se puede leer encabezamiento ELF: %s"
@@ -6719,12 +6724,12 @@ msgstr "no se puede actualizar reubicación: %s"
msgid "cannot copy ELF header: %s"
msgstr "no se puede copiar encabezamiento ELF: %s"
-#: src/unstrip.c:269 src/unstrip.c:2056 src/unstrip.c:2099
+#: src/unstrip.c:269 src/unstrip.c:2099 src/unstrip.c:2142
#, 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:274 src/unstrip.c:2060
+#: src/unstrip.c:274 src/unstrip.c:2103
#, c-format
msgid "cannot create program headers: %s"
msgstr "No pueden crear encabezamientos de programa: %s"
@@ -6739,12 +6744,12 @@ msgstr "no puede copiar encabezamiento de programa: %s"
msgid "cannot copy section header: %s"
msgstr "no se puede copiar encabezamiento de sección: %s"
-#: src/unstrip.c:293 src/unstrip.c:1669
+#: src/unstrip.c:293 src/unstrip.c:1703
#, c-format
msgid "cannot get section data: %s"
msgstr "no se pueden obtener datos de sección: %s"
-#: src/unstrip.c:295 src/unstrip.c:1671
+#: src/unstrip.c:295 src/unstrip.c:1705
#, c-format
msgid "cannot copy section data: %s"
msgstr "no pueden copiar datos de sección: %s"
@@ -6754,14 +6759,14 @@ msgstr "no pueden copiar datos de sección: %s"
msgid "cannot create directory '%s'"
msgstr "no se puede crear el directorio '%s'"
-#: src/unstrip.c:391 src/unstrip.c:647 src/unstrip.c:681 src/unstrip.c:847
-#: src/unstrip.c:1706
+#: src/unstrip.c:391 src/unstrip.c:651 src/unstrip.c:685 src/unstrip.c:853
+#: src/unstrip.c:1745
#, c-format
msgid "cannot get symbol table entry: %s"
msgstr "no se puede obtener entrada de tabla de símbolos: %s"
-#: src/unstrip.c:407 src/unstrip.c:650 src/unstrip.c:671 src/unstrip.c:684
-#: src/unstrip.c:1727 src/unstrip.c:1922 src/unstrip.c:1946
+#: src/unstrip.c:407 src/unstrip.c:654 src/unstrip.c:675 src/unstrip.c:688
+#: src/unstrip.c:1766 src/unstrip.c:1961 src/unstrip.c:1985
#, c-format
msgid "cannot update symbol table: %s"
msgstr "no se puede actualizar tabla de símbolos: %s"
@@ -6771,155 +6776,170 @@ msgstr "no se puede actualizar tabla de símbolos: %s"
msgid "cannot update section header: %s"
msgstr "no se puede actualizar encabezamiento de sección: %s"
-#: src/unstrip.c:459 src/unstrip.c:473
+#: src/unstrip.c:463 src/unstrip.c:477
#, c-format
msgid "cannot update relocation: %s"
msgstr "no se puede actualizar reubicación: %s"
-#: src/unstrip.c:570
+#: src/unstrip.c:574
#, c-format
msgid "cannot get symbol version: %s"
msgstr "no se puede obtener versión de símbolo: %s"
-#: src/unstrip.c:583
+#: src/unstrip.c:587
#, 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:853
+#: src/unstrip.c:842
+#, fuzzy, c-format
+msgid "cannot get symbol section data: %s"
+msgstr "no se pueden obtener datos de sección: %s"
+
+#: src/unstrip.c:844
+#, fuzzy, c-format
+msgid "cannot get string section data: %s"
+msgstr "no se pueden obtener datos de sección: %s"
+
+#: src/unstrip.c:861
#, fuzzy, c-format
msgid "invalid string offset in symbol [%zu]"
msgstr "compensación de cadena inválida en símbolo [%Zu]"
-#: src/unstrip.c:1011 src/unstrip.c:1402
+#: src/unstrip.c:1019 src/unstrip.c:1423
#, fuzzy, c-format
msgid "cannot read section [%zu] name: %s"
msgstr "no se puede leer nombre [%Zu]: %s"
-#: src/unstrip.c:1026
+#: src/unstrip.c:1034
#, fuzzy, c-format
msgid "bad sh_link for group section: %s"
msgstr ".debug_line section inválida"
-#: src/unstrip.c:1032
+#: src/unstrip.c:1040
#, 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:1037
+#: src/unstrip.c:1045
#, 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:1043
+#: src/unstrip.c:1051
#, 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:1048
+#: src/unstrip.c:1056
#, 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:1090 src/unstrip.c:1109 src/unstrip.c:1147
+#: src/unstrip.c:1098 src/unstrip.c:1117 src/unstrip.c:1155
#, c-format
msgid "cannot read '.gnu.prelink_undo' section: %s"
msgstr "no se puede leer sección '.gnu.prelink_undo': %s"
-#: src/unstrip.c:1127
+#: src/unstrip.c:1135
#, c-format
msgid "overflow with shnum = %zu in '%s' section"
msgstr ""
-#: src/unstrip.c:1138
+#: src/unstrip.c:1146
#, c-format
msgid "invalid contents in '%s' section"
msgstr "contenido inválido en sección '%s'"
-#: src/unstrip.c:1194 src/unstrip.c:1528
+#: src/unstrip.c:1202 src/unstrip.c:1549
#, 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:1319 src/unstrip.c:1335 src/unstrip.c:1607 src/unstrip.c:1881
+#: src/unstrip.c:1327 src/unstrip.c:1343 src/unstrip.c:1629 src/unstrip.c:1920
#, 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:1344
+#: src/unstrip.c:1352
#, 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:1373 src/unstrip.c:1377
+#: src/unstrip.c:1381 src/unstrip.c:1385
#, 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:1381 src/unstrip.c:1385 src/unstrip.c:1622
+#: src/unstrip.c:1389 src/unstrip.c:1393 src/unstrip.c:1644
#, c-format
msgid "cannot get section count: %s"
msgstr "No se puede obtener cuenta de sección: %s"
-#: src/unstrip.c:1388
+#: src/unstrip.c:1396
#, 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:1450 src/unstrip.c:1543
+#: src/unstrip.c:1400
+#, c-format
+msgid "no sections in stripped file"
+msgstr ""
+
+#: src/unstrip.c:1471 src/unstrip.c:1564
#, 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:1601
+#: src/unstrip.c:1623
#, c-format
msgid "cannot add new section: %s"
msgstr "No se puede añadir nueva sección: %s"
-#: src/unstrip.c:1714
+#: src/unstrip.c:1753
#, fuzzy, c-format
msgid "symbol [%zu] has invalid section index"
msgstr "símbolo [%Zu] tiene índice de sección inválido"
-#: src/unstrip.c:1746
+#: src/unstrip.c:1785
#, fuzzy, c-format
msgid "group has invalid section index [%zd]"
msgstr "símbolo [%Zu] tiene índice de sección inválido"
-#: src/unstrip.c:2017
+#: src/unstrip.c:2060
#, c-format
msgid "cannot read section data: %s"
msgstr "no se puede leer la sección de datos: %s"
-#: src/unstrip.c:2046
+#: src/unstrip.c:2089
#, c-format
msgid "cannot update ELF header: %s"
msgstr "No se puede actualizar encabezamiento ELF: %s"
-#: src/unstrip.c:2070
+#: src/unstrip.c:2113
#, c-format
msgid "cannot update program header: %s"
msgstr "no se puede actualizar encabezamiento de programa: %s"
-#: src/unstrip.c:2075 src/unstrip.c:2157
+#: src/unstrip.c:2118 src/unstrip.c:2200
#, c-format
msgid "cannot write output file: %s"
msgstr "no se puede escribir al archivo de salida: %s"
-#: src/unstrip.c:2126
+#: src/unstrip.c:2169
#, 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:2129
+#: src/unstrip.c:2172
#, c-format
msgid ""
"DWARF data in '%s' not adjusted for prelinking bias; consider prelink -u"
@@ -6927,77 +6947,77 @@ msgstr ""
"Datos DWARF en '%s' no se ajustan a polarización de pre-enlace; considere "
"prelink -u"
-#: src/unstrip.c:2148 src/unstrip.c:2199 src/unstrip.c:2211 src/unstrip.c:2297
+#: src/unstrip.c:2191 src/unstrip.c:2242 src/unstrip.c:2254 src/unstrip.c:2340
#, c-format
msgid "cannot create ELF descriptor: %s"
msgstr "no se puede crear un descriptor ELF: %s"
-#: src/unstrip.c:2190
+#: src/unstrip.c:2233
msgid "WARNING: "
msgstr ""
-#: src/unstrip.c:2192
+#: src/unstrip.c:2235
msgid ", use --force"
msgstr ""
-#: src/unstrip.c:2215
+#: src/unstrip.c:2258
msgid "ELF header identification (e_ident) different"
msgstr ""
-#: src/unstrip.c:2218
+#: src/unstrip.c:2261
msgid "ELF header type (e_type) different"
msgstr ""
-#: src/unstrip.c:2221
+#: src/unstrip.c:2264
msgid "ELF header machine type (e_machine) different"
msgstr ""
-#: src/unstrip.c:2224
+#: src/unstrip.c:2267
msgid "stripped program header (e_phnum) smaller than unstripped"
msgstr ""
-#: src/unstrip.c:2254
+#: src/unstrip.c:2297
#, 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:2258
+#: src/unstrip.c:2301
#, 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:2273
+#: src/unstrip.c:2316
#, 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:2277
+#: src/unstrip.c:2320
#, 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:2290
+#: src/unstrip.c:2333
#, c-format
msgid "module '%s' file '%s' is not stripped"
msgstr "No se obtuvo el archivo '%s' de módulo '%s' "
-#: src/unstrip.c:2321
+#: src/unstrip.c:2364
#, 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:2454
+#: src/unstrip.c:2497
#, c-format
msgid "no matching modules found"
msgstr "No se encontraron módulos coincidentes"
-#: src/unstrip.c:2463
+#: src/unstrip.c:2506
#, c-format
msgid "matched more than one module"
msgstr "coincidió con más de un módulo"
-#: src/unstrip.c:2507
+#: src/unstrip.c:2550
msgid ""
"STRIPPED-FILE DEBUG-FILE\n"
"[MODULE...]"
@@ -7005,7 +7025,7 @@ msgstr ""
"STRIPPED-FILE DEBUG-FILE\n"
"[MODULE...]"
-#: src/unstrip.c:2508
+#: src/unstrip.c:2551
#, fuzzy
msgid ""
"Combine stripped files with separate symbols and debug information.\n"
diff --git a/po/ja.po b/po/ja.po
index c1d81c29..cd53f220 100644
--- a/po/ja.po
+++ b/po/ja.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: ja\n"
"Report-Msgid-Bugs-To: https://sourceware.org/bugzilla/\n"
-"POT-Creation-Date: 2019-08-13 23:38+0200\n"
+"POT-Creation-Date: 2019-11-26 09:48+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"
@@ -24,7 +24,7 @@ msgid ""
"colorize the output. WHEN defaults to 'always' or can be 'auto' or 'never'"
msgstr ""
-#: lib/color.c:127
+#: lib/color.c:129
#, c-format
msgid ""
"%s: invalid argument '%s' for '--color'\n"
@@ -34,7 +34,7 @@ msgid ""
" - 'auto', 'tty', 'if-tty'\n"
msgstr ""
-#: lib/color.c:190 src/objdump.c:726
+#: lib/color.c:194 src/objdump.c:728
#, fuzzy, c-format
msgid "cannot allocate memory"
msgstr "PLT セクションを割り当ã¦ã‚‰ã‚Œã¾ã›ã‚“: %s"
@@ -50,18 +50,18 @@ msgstr ""
"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:52 lib/xmalloc.c:65 lib/xmalloc.c:77 src/readelf.c:3433
-#: src/readelf.c:11382 src/unstrip.c:2350 src/unstrip.c:2556
+#: lib/xmalloc.c:52 lib/xmalloc.c:65 lib/xmalloc.c:77 src/readelf.c:3449
+#: src/readelf.c:11398 src/unstrip.c:2393 src/unstrip.c:2599
#, c-format
msgid "memory exhausted"
msgstr "メモリー消費済ã¿"
-#: libasm/asm_error.c:65 libdw/dwarf_error.c:57 libdwfl/libdwflP.h:50
+#: libasm/asm_error.c:65 libdw/dwarf_error.c:57 libdwfl/libdwflP.h:51
#: libelf/elf_error.c:60
msgid "no error"
msgstr "エラー無ã—"
-#: libasm/asm_error.c:66 libdw/dwarf_error.c:67 libdwfl/libdwflP.h:52
+#: libasm/asm_error.c:66 libdw/dwarf_error.c:67 libdwfl/libdwflP.h:53
#: libelf/elf_error.c:91
msgid "out of memory"
msgstr "メモリーä¸è¶³"
@@ -98,7 +98,7 @@ msgstr "データã®å‡ºåŠ›ä¸­ã«ã‚¨ãƒ©ãƒ¼"
msgid "no backend support available"
msgstr "ãƒãƒƒã‚¯ã‚¨ãƒ³ãƒ‰ã‚µãƒãƒ¼ãƒˆãŒåˆ©ç”¨ã§ãã¾ã›ã‚“"
-#: libasm/asm_error.c:83 libdw/dwarf_error.c:58 libdwfl/libdwflP.h:51
+#: libasm/asm_error.c:83 libdw/dwarf_error.c:58 libdwfl/libdwflP.h:52
#: libelf/elf_error.c:63
msgid "unknown error"
msgstr "ä¸æ˜Žãªã‚¨ãƒ©ãƒ¼"
@@ -214,7 +214,7 @@ msgstr "ä¸å½“㪠DWARF ãƒãƒ¼ã‚¸ãƒ§ãƒ³"
msgid "invalid directory index"
msgstr "ä¸å½“ãªãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªãƒ¼ç´¢å¼•"
-#: libdw/dwarf_error.c:87 libdwfl/libdwflP.h:71
+#: libdw/dwarf_error.c:87 libdwfl/libdwflP.h:72
msgid "address out of range"
msgstr "アドレスãŒç¯„囲外ã§ã™"
@@ -245,7 +245,7 @@ msgstr "ä¸å½“ãªè¡Œç´¢å¼•"
msgid "invalid address range index"
msgstr "ä¸å½“ãªã‚¢ãƒ‰ãƒ¬ã‚¹ç¯„囲索引"
-#: libdw/dwarf_error.c:94 libdwfl/libdwflP.h:72
+#: libdw/dwarf_error.c:94 libdwfl/libdwflP.h:73
msgid "no matching address range"
msgstr "アドレス範囲ã«å¯¾å¿œã—ã¾ã›ã‚“"
@@ -293,7 +293,7 @@ msgstr "ä¸æ˜Žãªå‘½ä»¤ã‚³ãƒ¼ãƒ‰"
msgid ".debug_addr section missing"
msgstr ".debug_ranges セクションãŒã‚ã‚Šã¾ã›ã‚“"
-#: libdwfl/argp-std.c:50 src/stack.c:638 src/unstrip.c:2497
+#: libdwfl/argp-std.c:50 src/stack.c:638 src/unstrip.c:2540
msgid "Input selection options:"
msgstr "é¸æŠžã‚ªãƒ—ションを入力ã—ã¦ãã ã•ã„:"
@@ -360,165 +360,165 @@ msgstr "メモリーä¸è¶³"
msgid "No modules recognized in core file"
msgstr "コアファイルã®ä¸­ã«ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ã‚’èªè­˜ã§ãã¾ã›ã‚“"
-#: libdwfl/libdwflP.h:53
+#: libdwfl/libdwflP.h:54
msgid "See errno"
msgstr ""
-#: libdwfl/libdwflP.h:54
+#: libdwfl/libdwflP.h:55
msgid "See elf_errno"
msgstr ""
-#: libdwfl/libdwflP.h:55
+#: libdwfl/libdwflP.h:56
msgid "See dwarf_errno"
msgstr ""
-#: libdwfl/libdwflP.h:56
+#: libdwfl/libdwflP.h:57
msgid "See ebl_errno (XXX missing)"
msgstr ""
-#: libdwfl/libdwflP.h:57
+#: libdwfl/libdwflP.h:58
msgid "gzip decompression failed"
msgstr ""
-#: libdwfl/libdwflP.h:58
+#: libdwfl/libdwflP.h:59
msgid "bzip2 decompression failed"
msgstr ""
-#: libdwfl/libdwflP.h:59
+#: libdwfl/libdwflP.h:60
msgid "LZMA decompression failed"
msgstr ""
-#: libdwfl/libdwflP.h:60
+#: libdwfl/libdwflP.h:61
msgid "no support library found for machine"
msgstr ""
-#: libdwfl/libdwflP.h:61
+#: libdwfl/libdwflP.h:62
msgid "Callbacks missing for ET_REL file"
msgstr ""
-#: libdwfl/libdwflP.h:62
+#: libdwfl/libdwflP.h:63
msgid "Unsupported relocation type"
msgstr ""
-#: libdwfl/libdwflP.h:63
+#: libdwfl/libdwflP.h:64
msgid "r_offset is bogus"
msgstr ""
-#: libdwfl/libdwflP.h:64 libelf/elf_error.c:115 libelf/elf_error.c:175
+#: libdwfl/libdwflP.h:65 libelf/elf_error.c:115 libelf/elf_error.c:175
msgid "offset out of range"
msgstr "オフセットãŒç¯„囲を越ãˆã¦ã„ã‚‹"
-#: libdwfl/libdwflP.h:65
+#: libdwfl/libdwflP.h:66
#, fuzzy
msgid "relocation refers to undefined symbol"
msgstr "定義ã•ã‚ŒãŸã‚·ãƒ³ãƒœãƒ«ã®å°åˆ·ã‚µã‚¤ã‚º"
-#: libdwfl/libdwflP.h:66
+#: libdwfl/libdwflP.h:67
msgid "Callback returned failure"
msgstr ""
-#: libdwfl/libdwflP.h:67
+#: libdwfl/libdwflP.h:68
#, fuzzy
msgid "No DWARF information found"
msgstr "DWARF 情報ãŒã‚ã‚Šã¾ã›ã‚“"
-#: libdwfl/libdwflP.h:68
+#: libdwfl/libdwflP.h:69
msgid "No symbol table found"
msgstr ""
-#: libdwfl/libdwflP.h:69
+#: libdwfl/libdwflP.h:70
#, fuzzy
msgid "No ELF program headers"
msgstr "プログラムヘッダーを得られã¾ã›ã‚“: %s"
-#: libdwfl/libdwflP.h:70
+#: libdwfl/libdwflP.h:71
msgid "address range overlaps an existing module"
msgstr ""
-#: libdwfl/libdwflP.h:73
+#: libdwfl/libdwflP.h:74
msgid "image truncated"
msgstr ""
-#: libdwfl/libdwflP.h:74
+#: libdwfl/libdwflP.h:75
#, fuzzy
msgid "ELF file opened"
msgstr "ファイルã®ã‚ªãƒ¼ãƒ—ンを追跡ã—ã¾ã™ã€‚"
-#: libdwfl/libdwflP.h:75
+#: libdwfl/libdwflP.h:76
#, fuzzy
msgid "not a valid ELF file"
msgstr "ä¸å½“㪠ELF ファイル"
-#: libdwfl/libdwflP.h:76
+#: libdwfl/libdwflP.h:77
#, fuzzy
msgid "cannot handle DWARF type description"
msgstr "Elf 記述å­ã‚’生æˆã§ãã¾ã›ã‚“: %s"
-#: libdwfl/libdwflP.h:77
+#: libdwfl/libdwflP.h:78
msgid "ELF file does not match build ID"
msgstr ""
-#: libdwfl/libdwflP.h:78
+#: libdwfl/libdwflP.h:79
#, fuzzy
msgid "corrupt .gnu.prelink_undo section data"
msgstr "ラインデータセクションデータを得られã¾ã›ã‚“: %s"
-#: libdwfl/libdwflP.h:79
+#: libdwfl/libdwflP.h:80
msgid "Internal error due to ebl"
msgstr ""
-#: libdwfl/libdwflP.h:80
+#: libdwfl/libdwflP.h:81
msgid "Missing data in core file"
msgstr ""
-#: libdwfl/libdwflP.h:81
+#: libdwfl/libdwflP.h:82
#, fuzzy
msgid "Invalid register"
msgstr "ä¸å½“ãªãƒ‘ラメーター"
-#: libdwfl/libdwflP.h:82
+#: libdwfl/libdwflP.h:83
msgid "Error reading process memory"
msgstr ""
-#: libdwfl/libdwflP.h:83
+#: libdwfl/libdwflP.h:84
msgid "Couldn't find architecture of any ELF"
msgstr ""
-#: libdwfl/libdwflP.h:84
+#: libdwfl/libdwflP.h:85
msgid "Error parsing /proc filesystem"
msgstr ""
-#: libdwfl/libdwflP.h:85
+#: libdwfl/libdwflP.h:86
#, fuzzy
msgid "Invalid DWARF"
msgstr "ä¸å½“㪠DWARF"
-#: libdwfl/libdwflP.h:86
+#: libdwfl/libdwflP.h:87
msgid "Unsupported DWARF"
msgstr ""
-#: libdwfl/libdwflP.h:87
+#: libdwfl/libdwflP.h:88
msgid "Unable to find more threads"
msgstr ""
-#: libdwfl/libdwflP.h:88
+#: libdwfl/libdwflP.h:89
msgid "Dwfl already has attached state"
msgstr ""
-#: libdwfl/libdwflP.h:89
+#: libdwfl/libdwflP.h:90
msgid "Dwfl has no attached state"
msgstr ""
-#: libdwfl/libdwflP.h:90
+#: libdwfl/libdwflP.h:91
msgid "Unwinding not supported for this architecture"
msgstr ""
-#: libdwfl/libdwflP.h:91
+#: libdwfl/libdwflP.h:92
#, fuzzy
msgid "Invalid argument"
msgstr "ä¸å½“ãªãƒ‘ラメーター"
-#: libdwfl/libdwflP.h:92
+#: libdwfl/libdwflP.h:93
#, fuzzy
msgid "Not an ET_CORE ELF file"
msgstr "ä¸å½“㪠ELF ファイル"
@@ -624,7 +624,7 @@ msgstr "ソース演算å­ã®å¤§ãã•ãŒç„¡åŠ¹"
msgid "invalid size of destination operand"
msgstr "宛先演算å­ã®å¤§ãã•ãŒç„¡åŠ¹"
-#: libelf/elf_error.c:87 src/readelf.c:6150
+#: libelf/elf_error.c:87 src/readelf.c:6166
#, c-format
msgid "invalid encoding"
msgstr "無効ãªã‚¨ãƒ³ã‚³ãƒ¼ãƒ‰"
@@ -711,8 +711,8 @@ msgstr "データ/scnãŒä¸æ•´åˆã§ã™"
msgid "invalid section header"
msgstr "ä¸å½“ãªã‚»ã‚¯ã‚·ãƒ§ãƒ³ãƒ˜ãƒƒãƒ€ãƒ¼"
-#: libelf/elf_error.c:191 src/readelf.c:9898 src/readelf.c:10498
-#: src/readelf.c:10599 src/readelf.c:10781
+#: libelf/elf_error.c:191 src/readelf.c:9914 src/readelf.c:10514
+#: src/readelf.c:10615 src/readelf.c:10797
#, c-format
msgid "invalid data"
msgstr "ä¸å½“ãªãƒ‡ãƒ¼ã‚¿"
@@ -1374,7 +1374,7 @@ 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:984 src/strip.c:1021
-#: src/unstrip.c:2146 src/unstrip.c:2175
+#: src/unstrip.c:2189 src/unstrip.c:2218
#, c-format
msgid "cannot open '%s'"
msgstr "'%s' ã‚’é–‹ã‘ã¾ã›ã‚“"
@@ -1468,7 +1468,7 @@ msgid "Be silent when a section cannot be compressed"
msgstr "セクション [%2d] '%s': セクションデータを得られã¾ã›ã‚“\n"
#. Strings for arguments in help texts.
-#: src/elfcompress.c:1336 src/elflint.c:77 src/readelf.c:153
+#: src/elfcompress.c:1336 src/elflint.c:77 src/readelf.c:158
msgid "FILE..."
msgstr "ãµãã„ã‚‹..."
@@ -1500,14 +1500,14 @@ msgstr ""
msgid "Pedantic checking of ELF files compliance with gABI/psABI spec."
msgstr "ELF ファイル㌠gABI/psABI 仕様ã¸æº–æ‹ ã—ã¦ã„ã‚‹ã‹ã®åŽ³å¯†ãªãƒã‚§ãƒƒã‚¯ã€‚"
-#: src/elflint.c:154 src/readelf.c:357
-#, c-format
-msgid "cannot open input file"
+#: src/elflint.c:154 src/readelf.c:368
+#, fuzzy, c-format
+msgid "cannot open input file '%s'"
msgstr "入力ファイルを開ã‘ã¾ã›ã‚“"
#: src/elflint.c:161
-#, c-format
-msgid "cannot generate Elf descriptor: %s\n"
+#, fuzzy, c-format
+msgid "cannot generate Elf descriptor for '%s': %s\n"
msgstr "Elf 記述å­ã‚’生æˆã§ãã¾ã›ã‚“: %s\n"
#: src/elflint.c:180
@@ -1519,7 +1519,7 @@ msgstr "Elf 記述å­ã‚’é–‰ã˜ã¦ã„る時ã«ã‚¨ãƒ©ãƒ¼: %s\n"
msgid "No errors"
msgstr "エラーã¯ã‚ã‚Šã¾ã›ã‚“"
-#: src/elflint.c:219 src/readelf.c:559
+#: src/elflint.c:219 src/readelf.c:575
msgid "Missing file name.\n"
msgstr "ファイルåãŒã‚ã‚Šã¾ã›ã‚“。\n"
@@ -3553,12 +3553,12 @@ msgstr "%s%s%s: ファイル形å¼ã‚’èªè­˜ã§ãã¾ã›ã‚“"
msgid "cannot create search tree"
msgstr "検索ツリーを生æˆã§ãã¾ã›ã‚“"
-#: src/nm.c:746 src/nm.c:1205 src/objdump.c:777 src/readelf.c:619
-#: src/readelf.c:1431 src/readelf.c:1582 src/readelf.c:1783 src/readelf.c:1989
-#: src/readelf.c:2179 src/readelf.c:2357 src/readelf.c:2433 src/readelf.c:2691
-#: src/readelf.c:2767 src/readelf.c:2854 src/readelf.c:3452 src/readelf.c:3502
-#: src/readelf.c:3565 src/readelf.c:11214 src/readelf.c:12399
-#: src/readelf.c:12603 src/readelf.c:12671 src/size.c:398 src/size.c:470
+#: src/nm.c:746 src/nm.c:1205 src/objdump.c:779 src/readelf.c:635
+#: src/readelf.c:1447 src/readelf.c:1598 src/readelf.c:1799 src/readelf.c:2005
+#: src/readelf.c:2195 src/readelf.c:2373 src/readelf.c:2449 src/readelf.c:2707
+#: src/readelf.c:2783 src/readelf.c:2870 src/readelf.c:3468 src/readelf.c:3518
+#: src/readelf.c:3581 src/readelf.c:11230 src/readelf.c:12415
+#: src/readelf.c:12626 src/readelf.c:12695 src/size.c:398 src/size.c:470
#: src/strip.c:1038
#, c-format
msgid "cannot get section header string table index"
@@ -3604,12 +3604,12 @@ msgid "%s: entries (%zd) in section %zd `%s' is too large"
msgstr "%s: セクションã®é …ç›®ã®å¤§ãã• `%s' ã¯äºˆæœŸã—ãŸã‚‚ã®ã¨ã¯ç•°ãªã‚Šã¾ã™"
#. XXX Add machine specific object file types.
-#: src/nm.c:1526
+#: src/nm.c:1527
#, c-format
msgid "%s%s%s%s: Invalid operation"
msgstr "%s%s%s%s: ä¸å½“ãªæ“作"
-#: src/nm.c:1583
+#: src/nm.c:1584
#, c-format
msgid "%s%s%s: no symbols"
msgstr "%s%s%s: シンボルãŒã‚ã‚Šã¾ã›ã‚“"
@@ -3644,7 +3644,7 @@ msgstr ""
msgid "Show information from FILEs (a.out by default)."
msgstr ""
-#: src/objdump.c:218 src/readelf.c:564
+#: src/objdump.c:218 src/readelf.c:580
msgid "No operation specified.\n"
msgstr "æ“作ãŒæŒ‡å®šã•ã‚Œã¦ã„ã¾ã›ã‚“。\n"
@@ -3653,11 +3653,11 @@ msgstr "æ“作ãŒæŒ‡å®šã•ã‚Œã¦ã„ã¾ã›ã‚“。\n"
msgid "while close `%s'"
msgstr ""
-#: src/objdump.c:363 src/readelf.c:2084 src/readelf.c:2276
+#: src/objdump.c:363 src/readelf.c:2100 src/readelf.c:2292
msgid "INVALID SYMBOL"
msgstr "ä¸å½“ãªã‚·ãƒ³ãƒœãƒ«"
-#: src/objdump.c:378 src/readelf.c:2118 src/readelf.c:2312
+#: src/objdump.c:378 src/readelf.c:2134 src/readelf.c:2328
msgid "INVALID SECTION"
msgstr "ä¸å½“ãªã‚»ã‚¯ã‚·ãƒ§ãƒ³"
@@ -3708,90 +3708,95 @@ msgstr ""
msgid "error while freeing sub-ELF descriptor: %s"
msgstr ""
-#: src/readelf.c:94
+#: src/readelf.c:97
#, fuzzy
msgid "ELF input selection:"
msgstr "出力é¸æŠž:"
-#: src/readelf.c:96
+#: src/readelf.c:99
msgid ""
"Use the named SECTION (default .gnu_debugdata) as (compressed) ELF input data"
msgstr ""
-#: src/readelf.c:99
+#: src/readelf.c:102
msgid ""
"Used with -w to find the skeleton Compile Units in FILE associated with the "
"Split Compile units in a .dwo input file"
msgstr ""
-#: src/readelf.c:101
+#: src/readelf.c:104
#, fuzzy
msgid "ELF output selection:"
msgstr "出力é¸æŠž:"
-#: src/readelf.c:103
+#: src/readelf.c:106
msgid "All these plus -p .strtab -p .dynstr -p .comment"
msgstr ""
-#: src/readelf.c:104
+#: src/readelf.c:107
msgid "Display the dynamic segment"
msgstr "動的セグメントを表示"
-#: src/readelf.c:105
+#: src/readelf.c:108
msgid "Display the ELF file header"
msgstr "ELF ファイルヘッダーを表示"
-#: src/readelf.c:107
+#: src/readelf.c:110
msgid "Display histogram of bucket list lengths"
msgstr "ãƒã‚±ãƒƒãƒˆãƒªã‚¹ãƒˆé•·ã®æŸ±çŠ¶å›³ã‚’表示"
-#: src/readelf.c:108
+#: src/readelf.c:111
msgid "Display the program headers"
msgstr "プログラムヘッダーを表示"
-#: src/readelf.c:110
+#: src/readelf.c:113
msgid "Display relocations"
msgstr "リロケーションを表示"
-#: src/readelf.c:111
+#: src/readelf.c:114
#, fuzzy
msgid "Display the section groups"
msgstr "セクションã®ãƒ˜ãƒƒãƒ€ãƒ¼ã‚’表示"
-#: src/readelf.c:112
+#: src/readelf.c:115
#, fuzzy
msgid "Display the sections' headers"
msgstr "セクションã®ãƒ˜ãƒƒãƒ€ãƒ¼ã‚’表示"
-#: src/readelf.c:115
+#: src/readelf.c:118
#, fuzzy
msgid "Display the symbol table sections"
msgstr "シンボルテーブルを表示"
-#: src/readelf.c:116
+#: src/readelf.c:120
+#, fuzzy
+msgid "Display (only) the dynamic symbol table"
+msgstr "外部シンボルã®ã¿ã‚’表示"
+
+#: src/readelf.c:121
msgid "Display versioning information"
msgstr "ãƒãƒ¼ã‚¸ãƒ§ãƒ‹ãƒ³ã‚°æƒ…å ±ã®è¡¨ç¤º"
-#: src/readelf.c:117
+#: src/readelf.c:122
#, fuzzy
msgid "Display the ELF notes"
msgstr "コアノートを表示"
-#: src/readelf.c:119
+#: src/readelf.c:124
#, fuzzy
msgid "Display architecture specific information, if any"
msgstr "(ã‚‚ã—ã‚ã‚Œã°)アーキテクãƒãƒ£ãƒ¼å›ºæœ‰ã®æƒ…報を表示"
-#: src/readelf.c:121
+#: src/readelf.c:126
msgid "Display sections for exception handling"
msgstr "例外をå–り扱ã†ãŸã‚ã®ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã‚’表示"
-#: src/readelf.c:123
+#: src/readelf.c:128
#, fuzzy
msgid "Additional output selection:"
msgstr "出力é¸æŠž:"
-#: src/readelf.c:125
+#: src/readelf.c:130
#, fuzzy
msgid ""
"Display DWARF section content. SECTION can be one of abbrev, addr, aranges, "
@@ -3801,193 +3806,193 @@ msgstr ""
"DWARF セクションã®å†…容を表示。SECTION 㯠addrevã‹ã€arangesã€frameã€infoã€"
"locã€rangesã€pubnamesã€strã€macinfoã€exception ã®ã„ãšã‚Œã‹ã§ã™"
-#: src/readelf.c:129
+#: src/readelf.c:134
msgid "Dump the uninterpreted contents of SECTION, by number or name"
msgstr "æ•°å­—ã‹åå‰ã§è§£é‡ˆã§ããªã„セクションã®å†…容をダンプã™ã‚‹"
-#: src/readelf.c:131
+#: src/readelf.c:136
msgid "Print string contents of sections"
msgstr "セクションã®æ–‡å­—列内容をå°åˆ·ã™ã‚‹"
-#: src/readelf.c:134
+#: src/readelf.c:139
msgid "Display the symbol index of an archive"
msgstr "アーカイブã®ã‚·ãƒ³ãƒœãƒ«ç´¢å¼•ã‚’表示"
-#: src/readelf.c:136
+#: src/readelf.c:141
msgid "Output control:"
msgstr "出力制御:"
-#: src/readelf.c:138
+#: src/readelf.c:143
msgid "Do not find symbol names for addresses in DWARF data"
msgstr "DWARFデータ中ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã®ãŸã‚ã®ã‚·ãƒ³ãƒœãƒ«åを探ã•ãªã„"
-#: src/readelf.c:140
+#: src/readelf.c:145
#, fuzzy
msgid ""
"Display just offsets instead of resolving values to addresses in DWARF data"
msgstr "DWARFデータ中ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã®ãŸã‚ã®ã‚·ãƒ³ãƒœãƒ«åを探ã•ãªã„"
-#: src/readelf.c:142
+#: src/readelf.c:147
msgid "Ignored for compatibility (lines always wide)"
msgstr ""
-#: src/readelf.c:144
+#: src/readelf.c:149
msgid ""
"Show compression information for compressed sections (when used with -S); "
"decompress section before dumping data (when used with -p or -x)"
msgstr ""
#. Short description of program.
-#: src/readelf.c:149
+#: src/readelf.c:154
msgid "Print information from ELF file in human-readable form."
msgstr "ELF ファイルã‹ã‚‰äººé–“ãŒèª­ã‚ã‚‹å½¢ã§æƒ…報をå°åˆ·ã™ã‚‹ã€‚"
#. Look up once.
-#: src/readelf.c:339
+#: src/readelf.c:350
msgid "yes"
msgstr "ã¯ã„"
-#: src/readelf.c:340
+#: src/readelf.c:351
msgid "no"
msgstr "ã„ã„ãˆ"
-#: src/readelf.c:532
+#: src/readelf.c:548
#, c-format
msgid "Unknown DWARF debug section `%s'.\n"
msgstr "ä¸æ˜Žãª DWARF デãƒãƒƒã‚°ã‚»ã‚¯ã‚·ãƒ§ãƒ³ `%s'.\n"
-#: src/readelf.c:603 src/readelf.c:714
+#: src/readelf.c:619 src/readelf.c:730
#, c-format
msgid "cannot generate Elf descriptor: %s"
msgstr "Elf 記述å­ã‚’生æˆã§ãã¾ã›ã‚“: %s"
-#: src/readelf.c:610 src/readelf.c:937 src/strip.c:1133
+#: src/readelf.c:626 src/readelf.c:953 src/strip.c:1133
#, c-format
msgid "cannot determine number of sections: %s"
msgstr "セクション数を決定ã§ãã¾ã›ã‚“: %s"
-#: src/readelf.c:628 src/readelf.c:1247 src/readelf.c:1455
+#: src/readelf.c:644 src/readelf.c:1263 src/readelf.c:1471
#, c-format
msgid "cannot get section: %s"
msgstr "セクションを得られã¾ã›ã‚“: %s"
-#: src/readelf.c:637 src/readelf.c:1254 src/readelf.c:1463 src/readelf.c:12623
-#: src/unstrip.c:395 src/unstrip.c:426 src/unstrip.c:481 src/unstrip.c:600
-#: src/unstrip.c:621 src/unstrip.c:661 src/unstrip.c:873 src/unstrip.c:1204
-#: src/unstrip.c:1331 src/unstrip.c:1355 src/unstrip.c:1398 src/unstrip.c:1462
-#: src/unstrip.c:1636 src/unstrip.c:1770 src/unstrip.c:1913 src/unstrip.c:2008
+#: src/readelf.c:653 src/readelf.c:1270 src/readelf.c:1479 src/readelf.c:12646
+#: src/unstrip.c:395 src/unstrip.c:426 src/unstrip.c:485 src/unstrip.c:604
+#: src/unstrip.c:625 src/unstrip.c:665 src/unstrip.c:881 src/unstrip.c:1212
+#: src/unstrip.c:1339 src/unstrip.c:1363 src/unstrip.c:1419 src/unstrip.c:1483
+#: src/unstrip.c:1658 src/unstrip.c:1809 src/unstrip.c:1952 src/unstrip.c:2051
#, c-format
msgid "cannot get section header: %s"
msgstr "セクションヘッダーを得られã¾ã›ã‚“: %s"
-#: src/readelf.c:645
+#: src/readelf.c:661
#, fuzzy, c-format
msgid "cannot get section name"
msgstr "セクションを得られã¾ã›ã‚“: %s"
-#: src/readelf.c:654 src/readelf.c:6560 src/readelf.c:10486 src/readelf.c:10588
-#: src/readelf.c:10766
+#: src/readelf.c:670 src/readelf.c:6576 src/readelf.c:10502 src/readelf.c:10604
+#: src/readelf.c:10782
#, c-format
msgid "cannot get %s content: %s"
msgstr "%s ã®å†…容を得られã¾ã›ã‚“: %s"
-#: src/readelf.c:670
+#: src/readelf.c:686
#, fuzzy, c-format
msgid "cannot create temp file '%s'"
msgstr "æ–°ã—ã„ファイル '%s' を生æˆã§ãã¾ã›ã‚“: %s"
-#: src/readelf.c:679
+#: src/readelf.c:695
#, fuzzy, c-format
msgid "cannot write section data"
msgstr "セクションデータを割り当ã¦ã‚‰ã‚Œã¾ã›ã‚“: %s"
-#: src/readelf.c:685 src/readelf.c:702 src/readelf.c:731
+#: src/readelf.c:701 src/readelf.c:718 src/readelf.c:747
#, c-format
msgid "error while closing Elf descriptor: %s"
msgstr "Elf 記述å­ã‚’é–‰ã˜ã¦ã„る時ã«ã‚¨ãƒ©ãƒ¼: %s"
-#: src/readelf.c:692
+#: src/readelf.c:708
#, fuzzy, c-format
msgid "error while rewinding file descriptor"
msgstr "Elf 記述å­ã‚’é–‰ã˜ã¦ã„る時ã«ã‚¨ãƒ©ãƒ¼: %s"
-#: src/readelf.c:726
+#: src/readelf.c:742
#, c-format
msgid "'%s' is not an archive, cannot print archive index"
msgstr "'%s' ã¯ã‚¢ãƒ¼ã‚«ã‚¤ãƒ–ã§ã¯ãªãã€ã‚¢ãƒ¼ã‚«ã‚¤ãƒ–索引をå°åˆ·ã§ãã¾ã›ã‚“"
-#: src/readelf.c:830
+#: src/readelf.c:846
#, c-format
msgid "cannot stat input file"
msgstr "入力ファイルを stat ã§ãã¾ã›ã‚“"
-#: src/readelf.c:832
+#: src/readelf.c:848
#, c-format
msgid "input file is empty"
msgstr "入力ファイルãŒç©ºã§ã™"
-#: src/readelf.c:834
+#: src/readelf.c:850
#, c-format
msgid "failed reading '%s': %s"
msgstr "'%s' ã®èª­è¾¼ã¿ã«å¤±æ•—: %s"
-#: src/readelf.c:863
+#: src/readelf.c:879
#, fuzzy, c-format
msgid "No such section '%s' in '%s'"
msgstr "セクション [%Zu] '%s' ã‹ã‚‰ãƒ‡ãƒ¼ã‚¿ãŒå¾—られã¾ã›ã‚“: %s"
-#: src/readelf.c:922
+#: src/readelf.c:938
#, c-format
msgid "cannot read ELF header: %s"
msgstr "ELF ヘッダーãŒèª­ã‚ã¾ã›ã‚“: %s"
-#: src/readelf.c:930
+#: src/readelf.c:946
#, c-format
msgid "cannot create EBL handle"
msgstr "EBL ヘッダーを生æˆã§ãã¾ã›ã‚“"
-#: src/readelf.c:943
+#: src/readelf.c:959
#, fuzzy, c-format
msgid "cannot determine number of program headers: %s"
msgstr "セクション数を決定ã§ãã¾ã›ã‚“: %s"
-#: src/readelf.c:975
+#: src/readelf.c:991
#, fuzzy, c-format
msgid "cannot read ELF: %s"
msgstr "%s を読ã¿ã¾ã›ã‚“: %s"
-#: src/readelf.c:1036
+#: src/readelf.c:1052
msgid "NONE (None)"
msgstr "ãªã— (ãªã—)"
-#: src/readelf.c:1037
+#: src/readelf.c:1053
msgid "REL (Relocatable file)"
msgstr "REL (リロケータブルファイル)"
-#: src/readelf.c:1038
+#: src/readelf.c:1054
msgid "EXEC (Executable file)"
msgstr "(EXEC (実行ファイル)"
-#: src/readelf.c:1039
+#: src/readelf.c:1055
msgid "DYN (Shared object file)"
msgstr "DYN (共用オブジェクトファイル)"
-#: src/readelf.c:1040
+#: src/readelf.c:1056
msgid "CORE (Core file)"
msgstr "CORE (コアファイル)"
-#: src/readelf.c:1045
+#: src/readelf.c:1061
#, c-format
msgid "OS Specific: (%x)\n"
msgstr "OS 固有: (%x)\n"
#. && e_type <= ET_HIPROC always true
-#: src/readelf.c:1047
+#: src/readelf.c:1063
#, c-format
msgid "Processor Specific: (%x)\n"
msgstr "プロセッサー固有: (%x)\n"
-#: src/readelf.c:1057
+#: src/readelf.c:1073
msgid ""
"ELF Header:\n"
" Magic: "
@@ -3995,7 +4000,7 @@ msgstr ""
"ELF ヘッダー:\n"
" マジック: "
-#: src/readelf.c:1061
+#: src/readelf.c:1077
#, c-format
msgid ""
"\n"
@@ -4004,123 +4009,123 @@ msgstr ""
"\n"
" クラス: %s\n"
-#: src/readelf.c:1066
+#: src/readelf.c:1082
#, c-format
msgid " Data: %s\n"
msgstr " データ: %s\n"
-#: src/readelf.c:1072
+#: src/readelf.c:1088
#, c-format
msgid " Ident Version: %hhd %s\n"
msgstr " 識別ãƒãƒ¼ã‚¸ãƒ§ãƒ³: %hhd %s\n"
-#: src/readelf.c:1074 src/readelf.c:1096
+#: src/readelf.c:1090 src/readelf.c:1112
msgid "(current)"
msgstr "(ç¾åœ¨)"
-#: src/readelf.c:1078
+#: src/readelf.c:1094
#, c-format
msgid " OS/ABI: %s\n"
msgstr " OS/ABI: %s\n"
-#: src/readelf.c:1081
+#: src/readelf.c:1097
#, c-format
msgid " ABI Version: %hhd\n"
msgstr " ABI ãƒãƒ¼ã‚¸ãƒ§ãƒ³: %hhd\n"
-#: src/readelf.c:1084
+#: src/readelf.c:1100
msgid " Type: "
msgstr " タイプ: "
-#: src/readelf.c:1089
+#: src/readelf.c:1105
#, c-format
msgid " Machine: %s\n"
msgstr " マシン : %s\n"
-#: src/readelf.c:1091
+#: src/readelf.c:1107
#, fuzzy, c-format
msgid " Machine: <unknown>: 0x%x\n"
msgstr " マシン : %s\n"
-#: src/readelf.c:1094
+#: src/readelf.c:1110
#, c-format
msgid " Version: %d %s\n"
msgstr " ãƒãƒ¼ã‚¸ãƒ§ãƒ³: %d %s\n"
-#: src/readelf.c:1098
+#: src/readelf.c:1114
#, c-format
msgid " Entry point address: %#<PRIx64>\n"
msgstr " å…¥å£ç‚¹ã‚¢ãƒ‰ãƒ¬ã‚¹ : %#<PRIx64>\n"
-#: src/readelf.c:1101
+#: src/readelf.c:1117
#, c-format
msgid " Start of program headers: %<PRId64> %s\n"
msgstr " プログラムヘッダーã®é–‹å§‹: %<PRId64> %s\n"
-#: src/readelf.c:1102 src/readelf.c:1105
+#: src/readelf.c:1118 src/readelf.c:1121
msgid "(bytes into file)"
msgstr "(ファイルã¸ã®ãƒã‚¤ãƒˆæ•°)"
-#: src/readelf.c:1104
+#: src/readelf.c:1120
#, c-format
msgid " Start of section headers: %<PRId64> %s\n"
msgstr " セクションヘッダーã®é–‹å§‹: %<PRId64> %s\n"
-#: src/readelf.c:1107
+#: src/readelf.c:1123
#, c-format
msgid " Flags: %s\n"
msgstr " フラグ: %s\n"
-#: src/readelf.c:1110
+#: src/readelf.c:1126
#, c-format
msgid " Size of this header: %<PRId16> %s\n"
msgstr " ã“ã®ãƒ˜ãƒƒãƒ€ãƒ¼ã®å¤§ãã•: %<PRId16> %s\n"
-#: src/readelf.c:1111 src/readelf.c:1114 src/readelf.c:1131
+#: src/readelf.c:1127 src/readelf.c:1130 src/readelf.c:1147
msgid "(bytes)"
msgstr "(ãƒã‚¤ãƒˆ)"
-#: src/readelf.c:1113
+#: src/readelf.c:1129
#, c-format
msgid " Size of program header entries: %<PRId16> %s\n"
msgstr " プログラムヘッダー項目ã®å¤§ãã•:%<PRId16> %s\n"
-#: src/readelf.c:1116
+#: src/readelf.c:1132
#, fuzzy, c-format
msgid " Number of program headers entries: %<PRId16>"
msgstr " プログラムヘッダー項目ã®æ•° : %<PRId16>\n"
-#: src/readelf.c:1123
+#: src/readelf.c:1139
#, fuzzy, c-format
msgid " (%<PRIu32> in [0].sh_info)"
msgstr "([0].sh_link ã® %<PRIu32>)"
-#: src/readelf.c:1126 src/readelf.c:1143 src/readelf.c:1157
+#: src/readelf.c:1142 src/readelf.c:1159 src/readelf.c:1173
msgid " ([0] not available)"
msgstr "([0]ã¯ä½¿ãˆã¾ã›ã‚“)"
-#: src/readelf.c:1130
+#: src/readelf.c:1146
#, c-format
msgid " Size of section header entries: %<PRId16> %s\n"
msgstr " セクションヘッダー項目ã®å¤§ãã•:%<PRId16> %s\n"
-#: src/readelf.c:1133
+#: src/readelf.c:1149
#, c-format
msgid " Number of section headers entries: %<PRId16>"
msgstr " セクションヘッダー項目ã®æ•° : %<PRId16>"
-#: src/readelf.c:1140
+#: src/readelf.c:1156
#, c-format
msgid " (%<PRIu32> in [0].sh_size)"
msgstr " ([0].sh_size ã® %<PRIu32>)"
#. We managed to get the zeroth section.
-#: src/readelf.c:1153
+#: src/readelf.c:1169
#, c-format
msgid " (%<PRIu32> in [0].sh_link)"
msgstr "([0].sh_link ã® %<PRIu32>)"
-#: src/readelf.c:1161
+#: src/readelf.c:1177
#, c-format
msgid ""
" Section header string table index: XINDEX%s\n"
@@ -4129,7 +4134,7 @@ msgstr ""
" セクションヘッダー文字列テーブル索引: XINDEX%s\n"
"\n"
-#: src/readelf.c:1165
+#: src/readelf.c:1181
#, c-format
msgid ""
" Section header string table index: %<PRId16>\n"
@@ -4138,12 +4143,12 @@ msgstr ""
" セクションヘッダー文字列テーブル索引: %<PRId16>\n"
"\n"
-#: src/readelf.c:1212 src/readelf.c:1420
+#: src/readelf.c:1228 src/readelf.c:1436
#, fuzzy, c-format
msgid "cannot get number of sections: %s"
msgstr "セクション数を決定ã§ãã¾ã›ã‚“: %s"
-#: src/readelf.c:1215
+#: src/readelf.c:1231
#, fuzzy, c-format
msgid ""
"There are %zd section headers, starting at offset %#<PRIx64>:\n"
@@ -4152,16 +4157,16 @@ msgstr ""
"オフセット %2$#<PRIx64> ã‹ã‚‰å§‹ã¾ã‚‹ %1$d 個ã®ã‚»ã‚¯ã‚·ãƒ§ãƒ³ãƒ˜ãƒƒãƒ€ãƒ¼ãŒã‚ã‚Šã¾ã™:\n"
"\n"
-#: src/readelf.c:1224
+#: src/readelf.c:1240
#, fuzzy, c-format
msgid "cannot get section header string table index: %s"
msgstr "セクションヘッダー文字列テーブル索引ãŒå¾—られã¾ã›ã‚“"
-#: src/readelf.c:1227
+#: src/readelf.c:1243
msgid "Section Headers:"
msgstr "セクションヘッダー:"
-#: src/readelf.c:1230
+#: src/readelf.c:1246
msgid ""
"[Nr] Name Type Addr Off Size ES Flags Lk "
"Inf Al"
@@ -4169,7 +4174,7 @@ msgstr ""
"[番] åå‰ ã‚¿ã‚¤ãƒ— アドレス オフセ 大ãã• ES フラグLk "
"Inf Al"
-#: src/readelf.c:1232
+#: src/readelf.c:1248
msgid ""
"[Nr] Name Type Addr Off Size ES "
"Flags Lk Inf Al"
@@ -4177,35 +4182,35 @@ msgstr ""
"[番] åå‰ ã‚¿ã‚¤ãƒ— アドレス オフセ 大ãã• ES "
"フラグLk Inf Al"
-#: src/readelf.c:1237
+#: src/readelf.c:1253
msgid " [Compression Size Al]"
msgstr ""
-#: src/readelf.c:1239
+#: src/readelf.c:1255
msgid " [Compression Size Al]"
msgstr ""
-#: src/readelf.c:1315
+#: src/readelf.c:1331
#, fuzzy, c-format
msgid "bad compression header for section %zd: %s"
msgstr "セクションヘッダー文字列セクションを生æˆã§ãã¾ã›ã‚“: %s"
-#: src/readelf.c:1326
+#: src/readelf.c:1342
#, fuzzy, c-format
msgid "bad gnu compressed size for section %zd: %s"
msgstr "セクションã‹ã‚‰ãƒ‡ãƒ¼ã‚¿ã‚’得られã¾ã›ã‚“ %d: %s"
-#: src/readelf.c:1344
+#: src/readelf.c:1360
msgid "Program Headers:"
msgstr "プログラムヘッダー:"
-#: src/readelf.c:1346
+#: src/readelf.c:1362
msgid ""
" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align"
msgstr ""
" タイプ オフセ 仮アドレス 物アドレス ãƒ•ã‚¡ã‚¤é‡ ãƒ¡ãƒ¢é‡ Flg 調整 "
-#: src/readelf.c:1349
+#: src/readelf.c:1365
msgid ""
" Type Offset VirtAddr PhysAddr FileSiz "
"MemSiz Flg Align"
@@ -4213,12 +4218,12 @@ msgstr ""
" タイプ オフセ 仮想アドレス 物ç†ã‚¢ãƒ‰ãƒ¬ã‚¹ ファイルé‡ãƒ¡ãƒ¢"
"é‡ Flg 調整 "
-#: src/readelf.c:1406
+#: src/readelf.c:1422
#, c-format
msgid "\t[Requesting program interpreter: %s]\n"
msgstr "\t[プログラム割込ã¿ã‚’è¦æ±‚: %s]\n"
-#: src/readelf.c:1433
+#: src/readelf.c:1449
msgid ""
"\n"
" Section to Segment mapping:\n"
@@ -4228,12 +4233,12 @@ msgstr ""
" セクションã‹ã‚‰ã‚»ã‚°ãƒ¡ãƒ³ãƒˆã¸ã®ãƒžãƒƒãƒ“ング:\n"
" セグメント セクション..."
-#: src/readelf.c:1444 src/unstrip.c:2067 src/unstrip.c:2109 src/unstrip.c:2116
+#: src/readelf.c:1460 src/unstrip.c:2110 src/unstrip.c:2152 src/unstrip.c:2159
#, c-format
msgid "cannot get program header: %s"
msgstr "プログラムヘッダーを得られã¾ã›ã‚“: %s"
-#: src/readelf.c:1590
+#: src/readelf.c:1606
#, c-format
msgid ""
"\n"
@@ -4246,7 +4251,7 @@ msgstr[0] ""
"ç½²å '%3$s' ã‚’æŒã¤ COMDAT セクショングループ [%1$2zu] '%2$s' ã«ã¯ %4$zu 個ã®"
"é …ç›®ãŒã‚ã‚Šã¾ã™:\n"
-#: src/readelf.c:1595
+#: src/readelf.c:1611
#, c-format
msgid ""
"\n"
@@ -4259,31 +4264,31 @@ msgstr[0] ""
"ç½²å '%3$s' ã‚’æŒã¤ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã‚°ãƒ«ãƒ¼ãƒ— [%1$2zu] '%2$s' ã«ã¯ %4$zu 個ã®é …ç›®ãŒã‚"
"ã‚Šã¾ã™:\n"
-#: src/readelf.c:1603
+#: src/readelf.c:1619
msgid "<INVALID SYMBOL>"
msgstr "<ä¸å½“ãªã‚·ãƒ³ãƒœãƒ«>"
-#: src/readelf.c:1617
+#: src/readelf.c:1633
msgid "<INVALID SECTION>"
msgstr "<ä¸å½“ãªã‚»ã‚¯ã‚·ãƒ§ãƒ³>"
-#: src/readelf.c:1640 src/readelf.c:2367 src/readelf.c:3468 src/readelf.c:12494
-#: src/readelf.c:12501 src/readelf.c:12545 src/readelf.c:12552
+#: src/readelf.c:1656 src/readelf.c:2383 src/readelf.c:3484 src/readelf.c:12517
+#: src/readelf.c:12524 src/readelf.c:12568 src/readelf.c:12575
msgid "Couldn't uncompress section"
msgstr ""
-#: src/readelf.c:1645 src/readelf.c:2372 src/readelf.c:3473
+#: src/readelf.c:1661 src/readelf.c:2388 src/readelf.c:3489
#, fuzzy, c-format
msgid "cannot get section [%zd] header: %s"
msgstr "セクションヘッダーを得られã¾ã›ã‚“: %s"
-#: src/readelf.c:1789 src/readelf.c:2439 src/readelf.c:2697 src/readelf.c:2773
-#: src/readelf.c:3077 src/readelf.c:3151 src/readelf.c:5348
+#: src/readelf.c:1805 src/readelf.c:2455 src/readelf.c:2713 src/readelf.c:2789
+#: src/readelf.c:3093 src/readelf.c:3167 src/readelf.c:5364
#, fuzzy, c-format
msgid "invalid sh_link value in section %zu"
msgstr "ä¸å½“㪠.debug_line セクション"
-#: src/readelf.c:1792
+#: src/readelf.c:1808
#, c-format
msgid ""
"\n"
@@ -4299,36 +4304,36 @@ msgstr[0] ""
" アドレス: %#0*<PRIx64> オフセット: %#08<PRIx64> セクションã¸ã®ãƒªãƒ³ã‚¯: "
"[%2u] '%s'\n"
-#: src/readelf.c:1802
+#: src/readelf.c:1818
msgid " Type Value\n"
msgstr " タイプ 値\n"
-#: src/readelf.c:1826
+#: src/readelf.c:1842
#, c-format
msgid "Shared library: [%s]\n"
msgstr "共用ライブラリー: [%s]\n"
-#: src/readelf.c:1831
+#: src/readelf.c:1847
#, c-format
msgid "Library soname: [%s]\n"
msgstr "ライブラリー so å: [%s]\n"
-#: src/readelf.c:1836
+#: src/readelf.c:1852
#, c-format
msgid "Library rpath: [%s]\n"
msgstr "ライブラリー rパス: [%s]\n"
-#: src/readelf.c:1841
+#: src/readelf.c:1857
#, c-format
msgid "Library runpath: [%s]\n"
msgstr "ライブラリー run パス: [%s]\n"
-#: src/readelf.c:1861
+#: src/readelf.c:1877
#, c-format
msgid "%<PRId64> (bytes)\n"
msgstr "%<PRId64> (ãƒã‚¤ãƒˆ)\n"
-#: src/readelf.c:1974 src/readelf.c:2164
+#: src/readelf.c:1990 src/readelf.c:2180
#, c-format
msgid ""
"\n"
@@ -4337,7 +4342,7 @@ msgstr ""
"\n"
"オフセット %#0<PRIx64> ã«ä¸å½“ãªã‚·ãƒ³ãƒœãƒ«ãƒ†ãƒ¼ãƒ–ル\n"
-#: src/readelf.c:1992 src/readelf.c:2182
+#: src/readelf.c:2008 src/readelf.c:2198
#, c-format
msgid ""
"\n"
@@ -4358,7 +4363,7 @@ msgstr[0] ""
#. The .rela.dyn section does not refer to a specific section but
#. instead of section index zero. Do not try to print a section
#. name.
-#: src/readelf.c:2007 src/readelf.c:2197
+#: src/readelf.c:2023 src/readelf.c:2213
#, c-format
msgid ""
"\n"
@@ -4371,29 +4376,29 @@ msgstr[0] ""
"オフセット %3$#0<PRIx64> ã®ãƒªãƒ­ã‚±ãƒ¼ã‚·ãƒ§ãƒ³ã‚»ã‚¯ã‚·ãƒ§ãƒ³ [%1$2u] '%2$s' ã«ã¯ %4$d "
"個ã®é …ç›®ãŒã‚ã‚Šã¾ã™:\n"
-#: src/readelf.c:2017
+#: src/readelf.c:2033
msgid " Offset Type Value Name\n"
msgstr " オフセット タイプ 値 åå‰\n"
-#: src/readelf.c:2019
+#: src/readelf.c:2035
msgid " Offset Type Value Name\n"
msgstr " オフセット タイプ 値 åå‰\n"
-#: src/readelf.c:2072 src/readelf.c:2083 src/readelf.c:2096 src/readelf.c:2117
-#: src/readelf.c:2129 src/readelf.c:2263 src/readelf.c:2275 src/readelf.c:2289
-#: src/readelf.c:2311 src/readelf.c:2324
+#: src/readelf.c:2088 src/readelf.c:2099 src/readelf.c:2112 src/readelf.c:2133
+#: src/readelf.c:2145 src/readelf.c:2279 src/readelf.c:2291 src/readelf.c:2305
+#: src/readelf.c:2327 src/readelf.c:2340
msgid "<INVALID RELOC>"
msgstr "<ä¸å½“ãªRELOC>"
-#: src/readelf.c:2207
+#: src/readelf.c:2223
msgid " Offset Type Value Addend Name\n"
msgstr " オフセット タイプ 値 付加å\n"
-#: src/readelf.c:2209
+#: src/readelf.c:2225
msgid " Offset Type Value Addend Name\n"
msgstr " オフセット タイプ 値 付加å\n"
-#: src/readelf.c:2447
+#: src/readelf.c:2463
#, c-format
msgid ""
"\n"
@@ -4405,39 +4410,39 @@ msgstr[0] ""
"\n"
"シンボルテーブル [%2u] '%s' ã«ã¯ %u 個ã®é …ç›®ãŒã‚ã‚Šã¾ã™:\n"
-#: src/readelf.c:2452
+#: src/readelf.c:2468
#, c-format
msgid " %lu local symbol String table: [%2u] '%s'\n"
msgid_plural " %lu local symbols String table: [%2u] '%s'\n"
msgstr[0] " %lu ローカルシンボル文字列テーブル: [%2u] '%s'\n"
-#: src/readelf.c:2460
+#: src/readelf.c:2476
msgid " Num: Value Size Type Bind Vis Ndx Name\n"
msgstr " æ•° : 値 大ã タイプ Bind Vis Ndx åå‰\n"
-#: src/readelf.c:2462
+#: src/readelf.c:2478
msgid " Num: Value Size Type Bind Vis Ndx Name\n"
msgstr " æ•° : 値 大ã タイプ Bind Vis Ndx åå‰\n"
-#: src/readelf.c:2482
+#: src/readelf.c:2498
#, c-format
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:2570
+#: src/readelf.c:2586
#, c-format
msgid "bad dynamic symbol"
msgstr "ä¸æ­£ãªå‹•çš„シンボル"
-#: src/readelf.c:2652
+#: src/readelf.c:2668
msgid "none"
msgstr "ãªã—"
-#: src/readelf.c:2669
+#: src/readelf.c:2685
msgid "| <unknown>"
msgstr "| <ä¸æ˜Ž>"
-#: src/readelf.c:2700
+#: src/readelf.c:2716
#, c-format
msgid ""
"\n"
@@ -4453,17 +4458,17 @@ msgstr[0] ""
" アドレス: %#0*<PRIx64> オフセット: %#08<PRIx64> セクションã¸ã®ãƒªãƒ³ã‚¯: "
"[%2u] '%s'\n"
-#: src/readelf.c:2721
+#: src/readelf.c:2737
#, c-format
msgid " %#06x: Version: %hu File: %s Cnt: %hu\n"
msgstr " %#06x: ãƒãƒ¼ã‚¸ãƒ§ãƒ³: %hu ファイル: %s æ•°: %hu\n"
-#: src/readelf.c:2734
+#: src/readelf.c:2750
#, c-format
msgid " %#06x: Name: %s Flags: %s Version: %hu\n"
msgstr " %#06x: åå‰: %s フラグ: %s ãƒãƒ¼ã‚¸ãƒ§ãƒ³: %hu\n"
-#: src/readelf.c:2777
+#: src/readelf.c:2793
#, c-format
msgid ""
"\n"
@@ -4479,18 +4484,18 @@ msgstr[0] ""
" アドレス: %#0*<PRIx64> オフセット: %#08<PRIx64> セクションã¸ã®ãƒªãƒ³ã‚¯: "
"[%2u] '%s'\n"
-#: src/readelf.c:2805
+#: src/readelf.c:2821
#, 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:2820
+#: src/readelf.c:2836
#, c-format
msgid " %#06x: Parent %d: %s\n"
msgstr " %#06x: 親 %d: %s\n"
#. Print the header.
-#: src/readelf.c:3081
+#: src/readelf.c:3097
#, c-format
msgid ""
"\n"
@@ -4506,15 +4511,15 @@ msgstr[0] ""
" アドレス: %#0*<PRIx64> オフセット: %#08<PRIx64> セクションã¸ã®ãƒªãƒ³ã‚¯: "
"[%2u] '%s'"
-#: src/readelf.c:3109
+#: src/readelf.c:3125
msgid " 0 *local* "
msgstr " 0 *ローカル* "
-#: src/readelf.c:3114
+#: src/readelf.c:3130
msgid " 1 *global* "
msgstr " 1 *グローãƒãƒ«* "
-#: src/readelf.c:3156
+#: src/readelf.c:3172
#, c-format
msgid ""
"\n"
@@ -4532,22 +4537,22 @@ msgstr[0] ""
" アドレス: %#0*<PRIx64> オフセット: %#08<PRIx64> セクションã¸ã®ãƒªãƒ³ã‚¯: "
"[%2u] '%s'\n"
-#: src/readelf.c:3178
+#: src/readelf.c:3194
#, fuzzy, no-c-format
msgid " Length Number % of total Coverage\n"
msgstr " é•·ã• æ•° 全体ã®% 範囲 \n"
-#: src/readelf.c:3180
+#: src/readelf.c:3196
#, c-format
msgid " 0 %6<PRIu32> %5.1f%%\n"
msgstr " 0 %6<PRIu32> %5.1f%%\n"
-#: src/readelf.c:3187
+#: src/readelf.c:3203
#, c-format
msgid "%7d %6<PRIu32> %5.1f%% %5.1f%%\n"
msgstr "%7d %6<PRIu32> %5.1f%% %5.1f%%\n"
-#: src/readelf.c:3200
+#: src/readelf.c:3216
#, fuzzy, c-format
msgid ""
" Average number of tests: successful lookup: %f\n"
@@ -4556,37 +4561,37 @@ msgstr ""
" テストã®å¹³å‡æ•°: 検索æˆåŠŸ: %f\n"
" 検索失敗: %f\n"
-#: src/readelf.c:3218 src/readelf.c:3282 src/readelf.c:3348
+#: src/readelf.c:3234 src/readelf.c:3298 src/readelf.c:3364
#, c-format
msgid "cannot get data for section %d: %s"
msgstr "セクションã‹ã‚‰ãƒ‡ãƒ¼ã‚¿ã‚’得られã¾ã›ã‚“ %d: %s"
-#: src/readelf.c:3226
+#: src/readelf.c:3242
#, fuzzy, c-format
msgid "invalid data in sysv.hash section %d"
msgstr "セクション [%zu] '%s' ã®ä¸å½“ãªãƒ‡ãƒ¼ã‚¿"
-#: src/readelf.c:3255
+#: src/readelf.c:3271
#, fuzzy, c-format
msgid "invalid chain in sysv.hash section %d"
msgstr "セクション [%zu] '%s' ã®ä¸å½“ãªãƒ‡ãƒ¼ã‚¿"
-#: src/readelf.c:3290
+#: src/readelf.c:3306
#, fuzzy, c-format
msgid "invalid data in sysv.hash64 section %d"
msgstr "セクション [%zu] '%s' ã®ä¸å½“ãªãƒ‡ãƒ¼ã‚¿"
-#: src/readelf.c:3321
+#: src/readelf.c:3337
#, fuzzy, c-format
msgid "invalid chain in sysv.hash64 section %d"
msgstr "セクション [%zu] '%s' ã®ä¸å½“ãªãƒ‡ãƒ¼ã‚¿"
-#: src/readelf.c:3357
+#: src/readelf.c:3373
#, fuzzy, c-format
msgid "invalid data in gnu.hash section %d"
msgstr "セクション [%zu] '%s' ã®ä¸å½“ãªãƒ‡ãƒ¼ã‚¿"
-#: src/readelf.c:3424
+#: src/readelf.c:3440
#, c-format
msgid ""
" Symbol Bias: %u\n"
@@ -4596,7 +4601,7 @@ msgstr ""
" ビットマスクã®å¤§ãã•: %zu ãƒã‚¤ãƒˆ %<PRIuFAST32>%% ビット設定 第2ãƒãƒƒã‚·ãƒ¥ã‚·ãƒ•"
"ト: %u\n"
-#: src/readelf.c:3513
+#: src/readelf.c:3529
#, c-format
msgid ""
"\n"
@@ -4609,7 +4614,7 @@ msgstr[0] ""
"オフセット %3$#0<PRIx64> ã®ãƒ©ã‚¤ãƒ–ラリー一覧セクション [%1$2zu] '%2$s' ã«ã¯ "
"%4$d 個ã®é …ç›®ãŒã‚ã‚Šã¾ã™:\n"
-#: src/readelf.c:3527
+#: src/readelf.c:3543
msgid ""
" Library Time Stamp Checksum Version "
"Flags"
@@ -4617,7 +4622,7 @@ msgstr ""
" ライブラリー タイムスタンプ ãƒã‚§ãƒƒã‚¯ã‚µãƒ  ãƒãƒ¼"
"ジョン フラグ"
-#: src/readelf.c:3579
+#: src/readelf.c:3595
#, c-format
msgid ""
"\n"
@@ -4628,102 +4633,102 @@ msgstr ""
"オフセット %4$#0<PRIx64> ã® %3$<PRIu64> ãƒã‚¤ãƒˆã®ã‚ªãƒ–ジェクト属性セクション "
"[%1$2zu] '%2$s':\n"
-#: src/readelf.c:3596
+#: src/readelf.c:3612
msgid " Owner Size\n"
msgstr " 所有者 大ãã•\n"
-#: src/readelf.c:3625
+#: src/readelf.c:3641
#, c-format
msgid " %-13s %4<PRIu32>\n"
msgstr " %-13s %4<PRIu32>\n"
#. Unknown subsection, print and skip.
-#: src/readelf.c:3664
+#: src/readelf.c:3680
#, c-format
msgid " %-4u %12<PRIu32>\n"
msgstr " %-4u %12<PRIu32>\n"
#. Tag_File
-#: src/readelf.c:3669
+#: src/readelf.c:3685
#, c-format
msgid " File: %11<PRIu32>\n"
msgstr " ファイル: %11<PRIu32>\n"
-#: src/readelf.c:3718
+#: src/readelf.c:3734
#, c-format
msgid " %s: %<PRId64>, %s\n"
msgstr " %s: %<PRId64>ã€%s\n"
-#: src/readelf.c:3721
+#: src/readelf.c:3737
#, c-format
msgid " %s: %<PRId64>\n"
msgstr " %s: %<PRId64>\n"
-#: src/readelf.c:3724
+#: src/readelf.c:3740
#, c-format
msgid " %s: %s\n"
msgstr " %s: %s\n"
-#: src/readelf.c:3734
+#: src/readelf.c:3750
#, c-format
msgid " %u: %<PRId64>\n"
msgstr " %u: %<PRId64>\n"
-#: src/readelf.c:3737
+#: src/readelf.c:3753
#, c-format
msgid " %u: %s\n"
msgstr " %u: %s\n"
-#: src/readelf.c:3807
+#: src/readelf.c:3823
#, c-format
msgid "sprintf failure"
msgstr ""
-#: src/readelf.c:4289
+#: src/readelf.c:4305
msgid "empty block"
msgstr "空ブロック"
-#: src/readelf.c:4292
+#: src/readelf.c:4308
#, c-format
msgid "%zu byte block:"
msgstr "%zu ãƒã‚¤ãƒˆã®ãƒ–ロック:"
-#: src/readelf.c:4770
+#: src/readelf.c:4786
#, fuzzy, c-format
msgid "%*s[%2<PRIuMAX>] %s <TRUNCATED>\n"
msgstr "%*s[%4<PRIuMAX>] %s <TRUNCATED>\n"
-#: src/readelf.c:4834
+#: src/readelf.c:4850
#, c-format
msgid "%s %#<PRIx64> used with different address sizes"
msgstr ""
-#: src/readelf.c:4841
+#: src/readelf.c:4857
#, c-format
msgid "%s %#<PRIx64> used with different offset sizes"
msgstr ""
-#: src/readelf.c:4848
+#: src/readelf.c:4864
#, c-format
msgid "%s %#<PRIx64> used with different base addresses"
msgstr ""
-#: src/readelf.c:4855
+#: src/readelf.c:4871
#, c-format
msgid "%s %#<PRIx64> used with different attribute %s and %s"
msgstr ""
-#: src/readelf.c:4952
+#: src/readelf.c:4968
#, c-format
msgid " [%6tx] <UNUSED GARBAGE IN REST OF SECTION>\n"
msgstr ""
-#: src/readelf.c:4960
+#: src/readelf.c:4976
#, c-format
msgid " [%6tx] <UNUSED GARBAGE> ... %<PRIu64> bytes ...\n"
msgstr ""
-#: src/readelf.c:5038
+#: src/readelf.c:5054
#, c-format
msgid ""
"\n"
@@ -4734,7 +4739,7 @@ msgstr ""
"オフセット %3$#<PRIx64> 㮠DWARF セクション [%1$2zu] '%2$s':\n"
" [ コード]\n"
-#: src/readelf.c:5046
+#: src/readelf.c:5062
#, c-format
msgid ""
"\n"
@@ -4743,20 +4748,20 @@ msgstr ""
"\n"
"オフセット %<PRIu64> ã®ç•¥èªžã‚»ã‚¯ã‚·ãƒ§ãƒ³:\n"
-#: src/readelf.c:5059
+#: src/readelf.c:5075
#, c-format
msgid " *** error while reading abbreviation: %s\n"
msgstr " *** 略語を読んã§ã„ã‚‹é–“ã«ã‚¨ãƒ©ãƒ¼: %s\n"
-#: src/readelf.c:5075
+#: src/readelf.c:5091
#, c-format
msgid " [%5u] offset: %<PRId64>, children: %s, tag: %s\n"
msgstr " [%5u] オフセット: %<PRId64>ã€å­: %sã€ã‚¿ã‚°: %s\n"
-#: src/readelf.c:5108 src/readelf.c:5417 src/readelf.c:5584 src/readelf.c:5969
-#: src/readelf.c:6570 src/readelf.c:8307 src/readelf.c:8993 src/readelf.c:9429
-#: src/readelf.c:9674 src/readelf.c:9840 src/readelf.c:10227
-#: src/readelf.c:10287
+#: src/readelf.c:5124 src/readelf.c:5433 src/readelf.c:5600 src/readelf.c:5985
+#: src/readelf.c:6586 src/readelf.c:8323 src/readelf.c:9009 src/readelf.c:9445
+#: src/readelf.c:9690 src/readelf.c:9856 src/readelf.c:10243
+#: src/readelf.c:10303
#, c-format
msgid ""
"\n"
@@ -4765,52 +4770,52 @@ msgstr ""
"\n"
"オフセット %3$#<PRIx64> 㮠DWARF セクション [%1$2zu] '%2$s':\n"
-#: src/readelf.c:5121
+#: src/readelf.c:5137
#, fuzzy, c-format
msgid "cannot get .debug_addr section data: %s"
msgstr "セクションデータを割り当ã¦ã‚‰ã‚Œã¾ã›ã‚“: %s"
-#: src/readelf.c:5221 src/readelf.c:5245 src/readelf.c:5629 src/readelf.c:9038
+#: src/readelf.c:5237 src/readelf.c:5261 src/readelf.c:5645 src/readelf.c:9054
#, fuzzy, c-format
msgid " Length: %8<PRIu64>\n"
msgstr " (オフセット: %#<PRIx64>)"
-#: src/readelf.c:5223 src/readelf.c:5260 src/readelf.c:5642 src/readelf.c:9051
+#: src/readelf.c:5239 src/readelf.c:5276 src/readelf.c:5658 src/readelf.c:9067
#, fuzzy, c-format
msgid " DWARF version: %8<PRIu16>\n"
msgstr " %s: %<PRId64>\n"
-#: src/readelf.c:5224 src/readelf.c:5269 src/readelf.c:5651 src/readelf.c:9060
+#: src/readelf.c:5240 src/readelf.c:5285 src/readelf.c:5667 src/readelf.c:9076
#, fuzzy, c-format
msgid " Address size: %8<PRIu64>\n"
msgstr " (終了オフセット: %#<PRIx64>)"
-#: src/readelf.c:5226 src/readelf.c:5279 src/readelf.c:5661 src/readelf.c:9070
+#: src/readelf.c:5242 src/readelf.c:5295 src/readelf.c:5677 src/readelf.c:9086
#, fuzzy, c-format
msgid " Segment size: %8<PRIu64>\n"
msgstr " ファイルを %<PRIu64> ã«è¨­å®šã™ã‚‹\n"
-#: src/readelf.c:5264 src/readelf.c:5646 src/readelf.c:9055 src/readelf.c:10419
+#: src/readelf.c:5280 src/readelf.c:5662 src/readelf.c:9071 src/readelf.c:10435
#, fuzzy, c-format
msgid "Unknown version"
msgstr "ä¸æ˜Žãªãƒãƒ¼ã‚¸ãƒ§ãƒ³"
-#: src/readelf.c:5274 src/readelf.c:5487 src/readelf.c:5656 src/readelf.c:9065
+#: src/readelf.c:5290 src/readelf.c:5503 src/readelf.c:5672 src/readelf.c:9081
#, fuzzy, c-format
msgid "unsupported address size"
msgstr "アドレス値ã§ã¯ã‚ã‚Šã¾ã›ã‚“"
-#: src/readelf.c:5285 src/readelf.c:5498 src/readelf.c:5666 src/readelf.c:9075
+#: src/readelf.c:5301 src/readelf.c:5514 src/readelf.c:5682 src/readelf.c:9091
#, c-format
msgid "unsupported segment size"
msgstr ""
-#: src/readelf.c:5338 src/readelf.c:5412
+#: src/readelf.c:5354 src/readelf.c:5428
#, c-format
msgid "cannot get .debug_aranges content: %s"
msgstr ".debug_aragnes ã®å†…容を得られã¾ã›ã‚“: %s"
-#: src/readelf.c:5353
+#: src/readelf.c:5369
#, c-format
msgid ""
"\n"
@@ -4823,19 +4828,19 @@ msgstr[0] ""
"オフセット %3$#<PRIx64> ã® DWARF セクション [%1$2zu] '%2$s' ã«ã¯ %4$zu 個ã®é …"
"ç›®ãŒã‚ã‚Šã¾ã™:\n"
-#: src/readelf.c:5384
+#: src/readelf.c:5400
#, c-format
msgid " [%*zu] ???\n"
msgstr " [%*zu] ???\n"
-#: src/readelf.c:5386
+#: src/readelf.c:5402
#, 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:5430 src/readelf.c:8334
+#: src/readelf.c:5446 src/readelf.c:8350
#, fuzzy, c-format
msgid ""
"\n"
@@ -4844,154 +4849,154 @@ msgstr ""
"\n"
"オフセット %Zu ã®ãƒ†ãƒ¼ãƒ–ル:\n"
-#: src/readelf.c:5434 src/readelf.c:5610 src/readelf.c:6594 src/readelf.c:8345
-#: src/readelf.c:9019
+#: src/readelf.c:5450 src/readelf.c:5626 src/readelf.c:6610 src/readelf.c:8361
+#: src/readelf.c:9035
#, c-format
msgid "invalid data in section [%zu] '%s'"
msgstr "セクション [%zu] '%s' ã®ä¸å½“ãªãƒ‡ãƒ¼ã‚¿"
-#: src/readelf.c:5450
+#: src/readelf.c:5466
#, fuzzy, c-format
msgid ""
"\n"
" Length: %6<PRIu64>\n"
msgstr " (オフセット: %#<PRIx64>)"
-#: src/readelf.c:5462
+#: src/readelf.c:5478
#, fuzzy, c-format
msgid " DWARF version: %6<PRIuFAST16>\n"
msgstr " %s: %<PRId64>\n"
-#: src/readelf.c:5466
+#: src/readelf.c:5482
#, c-format
msgid "unsupported aranges version"
msgstr ""
-#: src/readelf.c:5477
+#: src/readelf.c:5493
#, fuzzy, c-format
msgid " CU offset: %6<PRIx64>\n"
msgstr " (オフセット: %#<PRIx64>)"
-#: src/readelf.c:5483
+#: src/readelf.c:5499
#, fuzzy, c-format
msgid " Address size: %6<PRIu64>\n"
msgstr " (終了オフセット: %#<PRIx64>)"
-#: src/readelf.c:5494
+#: src/readelf.c:5510
#, fuzzy, c-format
msgid ""
" Segment size: %6<PRIu64>\n"
"\n"
msgstr " ファイルを %<PRIu64> ã«è¨­å®šã™ã‚‹\n"
-#: src/readelf.c:5549
+#: src/readelf.c:5565
#, c-format
msgid " %zu padding bytes\n"
msgstr ""
-#: src/readelf.c:5593
+#: src/readelf.c:5609
#, fuzzy, c-format
msgid "cannot get .debug_rnglists content: %s"
msgstr ".degub_ranges ã®å†…容を得られã¾ã›ã‚“: %s"
-#: src/readelf.c:5616 src/readelf.c:9025
+#: src/readelf.c:5632 src/readelf.c:9041
#, fuzzy, c-format
msgid ""
"Table at Offset 0x%<PRIx64>:\n"
"\n"
msgstr " (終了オフセット: %#<PRIx64>)"
-#: src/readelf.c:5671 src/readelf.c:9080
+#: src/readelf.c:5687 src/readelf.c:9096
#, fuzzy, c-format
msgid " Offset entries: %8<PRIu64>\n"
msgstr " (オフセット: %#<PRIx64>)"
-#: src/readelf.c:5687 src/readelf.c:9096
+#: src/readelf.c:5703 src/readelf.c:9112
#, c-format
msgid " Unknown CU base: "
msgstr ""
-#: src/readelf.c:5689 src/readelf.c:9098
+#: src/readelf.c:5705 src/readelf.c:9114
#, c-format
msgid " CU [%6<PRIx64>] base: "
msgstr ""
-#: src/readelf.c:5695 src/readelf.c:9104
+#: src/readelf.c:5711 src/readelf.c:9120
#, c-format
msgid " Not associated with a CU.\n"
msgstr ""
-#: src/readelf.c:5706 src/readelf.c:9115
+#: src/readelf.c:5722 src/readelf.c:9131
#, c-format
msgid "too many offset entries for unit length"
msgstr ""
-#: src/readelf.c:5710 src/readelf.c:9119
+#: src/readelf.c:5726 src/readelf.c:9135
#, fuzzy, c-format
msgid " Offsets starting at 0x%<PRIx64>:\n"
msgstr " 所有者 大ãã•\n"
-#: src/readelf.c:5762
+#: src/readelf.c:5778
#, fuzzy, c-format
msgid "invalid range list data"
msgstr "ä¸å½“ãªãƒ‡ãƒ¼ã‚¿"
-#: src/readelf.c:5947 src/readelf.c:9407
+#: src/readelf.c:5963 src/readelf.c:9423
#, c-format
msgid ""
" %zu padding bytes\n"
"\n"
msgstr ""
-#: src/readelf.c:5964
+#: src/readelf.c:5980
#, c-format
msgid "cannot get .debug_ranges content: %s"
msgstr ".degub_ranges ã®å†…容を得られã¾ã›ã‚“: %s"
-#: src/readelf.c:6000 src/readelf.c:9462
+#: src/readelf.c:6016 src/readelf.c:9478
#, c-format
msgid ""
"\n"
" Unknown CU base: "
msgstr ""
-#: src/readelf.c:6002 src/readelf.c:9464
+#: src/readelf.c:6018 src/readelf.c:9480
#, c-format
msgid ""
"\n"
" CU [%6<PRIx64>] base: "
msgstr ""
-#: src/readelf.c:6011 src/readelf.c:9490 src/readelf.c:9516
+#: src/readelf.c:6027 src/readelf.c:9506 src/readelf.c:9532
#, c-format
msgid " [%6tx] <INVALID DATA>\n"
msgstr " [%6tx] <ä¸å½“ãªãƒ‡ãƒ¼ã‚¿>\n"
-#: src/readelf.c:6032 src/readelf.c:9596
+#: src/readelf.c:6048 src/readelf.c:9612
#, fuzzy, c-format
msgid ""
" [%6tx] base address\n"
" "
msgstr " [%6tx] ベースアドレス %s\n"
-#: src/readelf.c:6040 src/readelf.c:9604
+#: src/readelf.c:6056 src/readelf.c:9620
#, fuzzy, c-format
msgid " [%6tx] empty list\n"
msgstr ""
"\n"
" [%6tx] ゼロ終端\n"
-#: src/readelf.c:6295
+#: src/readelf.c:6311
#, fuzzy
msgid " <INVALID DATA>\n"
msgstr " [%6tx] <ä¸å½“ãªãƒ‡ãƒ¼ã‚¿>\n"
-#: src/readelf.c:6548
+#: src/readelf.c:6564
#, fuzzy, c-format
msgid "cannot get ELF: %s"
msgstr "次㮠DIE を得られã¾ã›ã‚“: %s"
-#: src/readelf.c:6566
+#: src/readelf.c:6582
#, c-format
msgid ""
"\n"
@@ -5000,7 +5005,7 @@ msgstr ""
"\n"
"オフセット %3$#<PRIx64> 㮠フレーム情報呼出ã—セクション [%1$2zu] '%2$s':\n"
-#: src/readelf.c:6616
+#: src/readelf.c:6632
#, c-format
msgid ""
"\n"
@@ -5009,65 +5014,65 @@ msgstr ""
"\n"
" [%6tx] ゼロ終端\n"
-#: src/readelf.c:6717 src/readelf.c:6871
+#: src/readelf.c:6733 src/readelf.c:6887
#, fuzzy, c-format
msgid "invalid augmentation length"
msgstr "ä¸å½“ãªæ‹¡å¤§ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‰"
-#: src/readelf.c:6732
+#: src/readelf.c:6748
msgid "FDE address encoding: "
msgstr "FDE アドレスエンコード"
-#: src/readelf.c:6738
+#: src/readelf.c:6754
msgid "LSDA pointer encoding: "
msgstr "LSDA ãƒã‚¤ãƒ³ã‚¿ãƒ¼ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‰:"
-#: src/readelf.c:6848
+#: src/readelf.c:6864
#, c-format
msgid " (offset: %#<PRIx64>)"
msgstr " (オフセット: %#<PRIx64>)"
-#: src/readelf.c:6855
+#: src/readelf.c:6871
#, c-format
msgid " (end offset: %#<PRIx64>)"
msgstr " (終了オフセット: %#<PRIx64>)"
-#: src/readelf.c:6892
+#: src/readelf.c:6908
#, c-format
msgid " %-26sLSDA pointer: %#<PRIx64>\n"
msgstr " %-26sLSDA ãƒã‚¤ãƒ³ã‚¿ãƒ¼: %#<PRIx64>\n"
-#: src/readelf.c:6977
+#: src/readelf.c:6993
#, fuzzy, c-format
msgid "DIE [%<PRIx64>] cannot get attribute code: %s"
msgstr "属性コードを得られã¾ã›ã‚“: %s"
-#: src/readelf.c:6987
+#: src/readelf.c:7003
#, fuzzy, c-format
msgid "DIE [%<PRIx64>] cannot get attribute form: %s"
msgstr "属性様å¼ã‚’得られã¾ã›ã‚“: %s"
-#: src/readelf.c:7009
+#: src/readelf.c:7025
#, fuzzy, c-format
msgid "DIE [%<PRIx64>] cannot get attribute '%s' (%s) value: %s"
msgstr "属性値を得られã¾ã›ã‚“: %s"
-#: src/readelf.c:7339
+#: src/readelf.c:7355
#, fuzzy, c-format
msgid "invalid file (%<PRId64>): %s"
msgstr "ä¸å½“ãªãƒ•ã‚¡ã‚¤ãƒ«"
-#: src/readelf.c:7343
+#: src/readelf.c:7359
#, fuzzy, c-format
msgid "no srcfiles for CU [%<PRIx64>]"
msgstr " ファイルを %<PRIu64> ã«è¨­å®šã™ã‚‹\n"
-#: src/readelf.c:7347
+#: src/readelf.c:7363
#, fuzzy, c-format
msgid "couldn't get DWARF CU: %s"
msgstr "次㮠DIE を得られã¾ã›ã‚“: %s"
-#: src/readelf.c:7660
+#: src/readelf.c:7676
#, c-format
msgid ""
"\n"
@@ -5078,12 +5083,12 @@ msgstr ""
"オフセット %3$#<PRIx64> 㮠DWARF セクション [%1$2zu] '%2$s':\n"
" [オフセット]\n"
-#: src/readelf.c:7710
+#: src/readelf.c:7726
#, fuzzy, c-format
msgid "cannot get next unit: %s"
msgstr "次㮠DIE を得られã¾ã›ã‚“: %s"
-#: src/readelf.c:7729
+#: src/readelf.c:7745
#, fuzzy, c-format
msgid ""
" Type unit at offset %<PRIu64>:\n"
@@ -5095,7 +5100,7 @@ msgstr ""
" ãƒãƒ¼ã‚¸ãƒ§ãƒ³: %2$<PRIu16>ã€ç•¥èªžã‚»ã‚¯ã‚·ãƒ§ãƒ³ã‚ªãƒ•ã‚»ãƒƒãƒˆ: %3$<PRIu64>ã€ã‚¢ãƒ‰ãƒ¬ã‚¹ã®å¤§"
"ãã•: %4$<PRIu8>ã€ã‚ªãƒ•ã‚»ãƒƒãƒˆã®å¤§ãã•: %5$<PRIu8>\n"
-#: src/readelf.c:7741
+#: src/readelf.c:7757
#, c-format
msgid ""
" Compilation unit at offset %<PRIu64>:\n"
@@ -5106,39 +5111,39 @@ msgstr ""
" ãƒãƒ¼ã‚¸ãƒ§ãƒ³: %2$<PRIu16>ã€ç•¥èªžã‚»ã‚¯ã‚·ãƒ§ãƒ³ã‚ªãƒ•ã‚»ãƒƒãƒˆ: %3$<PRIu64>ã€ã‚¢ãƒ‰ãƒ¬ã‚¹ã®å¤§"
"ãã•: %4$<PRIu8>ã€ã‚ªãƒ•ã‚»ãƒƒãƒˆã®å¤§ãã•: %5$<PRIu8>\n"
-#: src/readelf.c:7751 src/readelf.c:7914
+#: src/readelf.c:7767 src/readelf.c:7930
#, c-format
msgid " Unit type: %s (%<PRIu8>)"
msgstr ""
-#: src/readelf.c:7778
+#: src/readelf.c:7794
#, c-format
msgid "unknown version (%d) or unit type (%d)"
msgstr ""
-#: src/readelf.c:7807
+#: src/readelf.c:7823
#, c-format
msgid "cannot get DIE offset: %s"
msgstr "DIE オフセットを得られã¾ã›ã‚“: %s"
-#: src/readelf.c:7816
+#: src/readelf.c:7832
#, 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:7854
+#: src/readelf.c:7870
#, c-format
msgid "cannot get next DIE: %s\n"
msgstr "次㮠DIE を得られã¾ã›ã‚“: %s\n"
-#: src/readelf.c:7862
+#: src/readelf.c:7878
#, c-format
msgid "cannot get next DIE: %s"
msgstr "次㮠DIE を得られã¾ã›ã‚“: %s"
-#: src/readelf.c:7906
+#: src/readelf.c:7922
#, fuzzy, c-format
msgid ""
" Split compilation unit at offset %<PRIu64>:\n"
@@ -5149,7 +5154,7 @@ msgstr ""
" ãƒãƒ¼ã‚¸ãƒ§ãƒ³: %2$<PRIu16>ã€ç•¥èªžã‚»ã‚¯ã‚·ãƒ§ãƒ³ã‚ªãƒ•ã‚»ãƒƒãƒˆ: %3$<PRIu64>ã€ã‚¢ãƒ‰ãƒ¬ã‚¹ã®å¤§"
"ãã•: %4$<PRIu8>ã€ã‚ªãƒ•ã‚»ãƒƒãƒˆã®å¤§ãã•: %5$<PRIu8>\n"
-#: src/readelf.c:7958
+#: src/readelf.c:7974
#, fuzzy, c-format
msgid ""
"\n"
@@ -5159,18 +5164,18 @@ msgstr ""
"\n"
"オフセット %3$#<PRIx64> 㮠DWARF セクション [%1$2zu] '%2$s':\n"
-#: src/readelf.c:8290
+#: src/readelf.c:8306
#, fuzzy, c-format
msgid "unknown form: %s"
msgstr "ä¸æ˜Žãªæ§˜å¼ %<PRIx64>"
-#: src/readelf.c:8321
+#: src/readelf.c:8337
#, c-format
msgid "cannot get line data section data: %s"
msgstr "ラインデータセクションデータを得られã¾ã›ã‚“: %s"
#. Print what we got so far.
-#: src/readelf.c:8423
+#: src/readelf.c:8439
#, fuzzy, c-format
msgid ""
"\n"
@@ -5200,33 +5205,33 @@ msgstr ""
"\n"
"命令コード:\n"
-#: src/readelf.c:8445
+#: src/readelf.c:8461
#, fuzzy, c-format
msgid "cannot handle .debug_line version: %u\n"
msgstr ".degub_ranges ã®å†…容を得られã¾ã›ã‚“: %s"
-#: src/readelf.c:8453
+#: src/readelf.c:8469
#, fuzzy, c-format
msgid "cannot handle address size: %u\n"
msgstr "アドレス値ã§ã¯ã‚ã‚Šã¾ã›ã‚“"
-#: src/readelf.c:8461
+#: src/readelf.c:8477
#, fuzzy, c-format
msgid "cannot handle segment selector size: %u\n"
msgstr "セクションを得られã¾ã›ã‚“: %s"
-#: src/readelf.c:8471
+#: src/readelf.c:8487
#, c-format
msgid "invalid data at offset %tu in section [%zu] '%s'"
msgstr "セクション [%2$zu] '%3$s' 中ã®ã‚ªãƒ•ã‚»ãƒƒãƒˆ %1$tu ã«ä¸å½“ãªãƒ‡ãƒ¼ã‚¿"
-#: src/readelf.c:8486
+#: src/readelf.c:8502
#, c-format
msgid " [%*<PRIuFAST8>] %hhu argument\n"
msgid_plural " [%*<PRIuFAST8>] %hhu arguments\n"
msgstr[0] " [%*<PRIuFAST8>] %hhu パラメーター\n"
-#: src/readelf.c:8497
+#: src/readelf.c:8513
msgid ""
"\n"
"Directory table:"
@@ -5234,12 +5239,12 @@ msgstr ""
"\n"
"ディレクトリーテーブル:"
-#: src/readelf.c:8503 src/readelf.c:8580
+#: src/readelf.c:8519 src/readelf.c:8596
#, fuzzy, c-format
msgid " ["
msgstr " %s: %s\n"
-#: src/readelf.c:8574
+#: src/readelf.c:8590
#, fuzzy
msgid ""
"\n"
@@ -5248,7 +5253,7 @@ msgstr ""
"\n"
" 呼出ã—サイトテーブル:"
-#: src/readelf.c:8635
+#: src/readelf.c:8651
#, fuzzy
msgid " Entry Dir Time Size Name"
msgstr ""
@@ -5256,7 +5261,7 @@ msgstr ""
"ファイルåテーブル:\n"
" Entry Dir 時刻 大ãã• åå‰"
-#: src/readelf.c:8672
+#: src/readelf.c:8688
msgid ""
"\n"
"Line number statements:"
@@ -5264,119 +5269,119 @@ msgstr ""
"\n"
"è¡Œ ç•ªå· æ–‡:"
-#: src/readelf.c:8695
+#: src/readelf.c:8711
#, c-format
msgid "invalid maximum operations per instruction is zero"
msgstr ""
-#: src/readelf.c:8729
+#: src/readelf.c:8745
#, fuzzy, c-format
msgid " special opcode %u: address+%u = "
msgstr " 特殊命令コード %u: アドレス+%u = %s, 行%+d = %zu\n"
-#: src/readelf.c:8733
+#: src/readelf.c:8749
#, fuzzy, c-format
msgid ", op_index = %u, line%+d = %zu\n"
msgstr " 特殊命令コード %u: アドレス+%u = %s, 行%+d = %zu\n"
-#: src/readelf.c:8736
+#: src/readelf.c:8752
#, c-format
msgid ", line%+d = %zu\n"
msgstr ""
-#: src/readelf.c:8754
+#: src/readelf.c:8770
#, c-format
msgid " extended opcode %u: "
msgstr " 拡張命令コード %u: "
-#: src/readelf.c:8759
+#: src/readelf.c:8775
#, fuzzy
msgid " end of sequence"
msgstr "列ã®çµ‚ã‚ã‚Š"
-#: src/readelf.c:8777
+#: src/readelf.c:8793
#, fuzzy, c-format
msgid " set address to "
msgstr "アドレスを %s ã«è¨­å®šã™ã‚‹\n"
-#: src/readelf.c:8805
+#: src/readelf.c:8821
#, 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:8819
+#: src/readelf.c:8835
#, fuzzy, c-format
msgid " set discriminator to %u\n"
msgstr "カラムを %<PRIu64> ã«è¨­å®šã™ã‚‹\n"
#. Unknown, ignore it.
-#: src/readelf.c:8824
+#: src/readelf.c:8840
#, fuzzy
msgid " unknown opcode"
msgstr "ä¸æ˜Žãªå‘½ä»¤ã‚³ãƒ¼ãƒ‰"
#. Takes no argument.
-#: src/readelf.c:8836
+#: src/readelf.c:8852
msgid " copy"
msgstr "複写"
-#: src/readelf.c:8847
+#: src/readelf.c:8863
#, fuzzy, c-format
msgid " advance address by %u to "
msgstr "アドレスを %u ã ã‘進ã‚㦠%s ã«ã™ã‚‹\n"
-#: src/readelf.c:8851 src/readelf.c:8912
+#: src/readelf.c:8867 src/readelf.c:8928
#, c-format
msgid ", op_index to %u"
msgstr ""
-#: src/readelf.c:8863
+#: src/readelf.c:8879
#, c-format
msgid " advance line by constant %d to %<PRId64>\n"
msgstr "行を定数 %d ã ã‘進ã‚㦠%<PRId64> ã«ã™ã‚‹\n"
-#: src/readelf.c:8873
+#: src/readelf.c:8889
#, c-format
msgid " set file to %<PRIu64>\n"
msgstr " ファイルを %<PRIu64> ã«è¨­å®šã™ã‚‹\n"
-#: src/readelf.c:8884
+#: src/readelf.c:8900
#, c-format
msgid " set column to %<PRIu64>\n"
msgstr "カラムを %<PRIu64> ã«è¨­å®šã™ã‚‹\n"
-#: src/readelf.c:8891
+#: src/readelf.c:8907
#, c-format
msgid " set '%s' to %<PRIuFAST8>\n"
msgstr " '%s' ã‚’ %<PRIuFAST8> ã«è¨­å®šã™ã‚‹\n"
#. Takes no argument.
-#: src/readelf.c:8897
+#: src/readelf.c:8913
msgid " set basic block flag"
msgstr "基本ブロックフラグを設定ã™ã‚‹"
-#: src/readelf.c:8908
+#: src/readelf.c:8924
#, fuzzy, c-format
msgid " advance address by constant %u to "
msgstr "アドレスを定数 %u ã ã‘済ã‚㦠%s ã«ã™ã‚‹\n"
-#: src/readelf.c:8928
+#: src/readelf.c:8944
#, fuzzy, c-format
msgid " advance address by fixed value %u to \n"
msgstr "アドレスを固定値 %u ã ã‘進ã‚㦠%s ã«ã™ã‚‹\n"
#. Takes no argument.
-#: src/readelf.c:8938
+#: src/readelf.c:8954
msgid " set prologue end flag"
msgstr "プロローグ終了フラグを設定ã™ã‚‹"
#. Takes no argument.
-#: src/readelf.c:8943
+#: src/readelf.c:8959
msgid " set epilogue begin flag"
msgstr "エピローグ開始フラグを設定ã™ã‚‹"
-#: src/readelf.c:8953
+#: src/readelf.c:8969
#, fuzzy, c-format
msgid " set isa to %u\n"
msgstr " ファイルを %<PRIu64> ã«è¨­å®šã™ã‚‹\n"
@@ -5384,98 +5389,98 @@ msgstr " ファイルを %<PRIu64> ã«è¨­å®šã™ã‚‹\n"
#. 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:8962
+#: src/readelf.c:8978
#, c-format
msgid " unknown opcode with %<PRIu8> parameter:"
msgid_plural " unknown opcode with %<PRIu8> parameters:"
msgstr[0] " %<PRIu8> 個ã®ãƒ‘ラメーターã®ã‚ã‚‹ä¸æ˜Žãªå‘½ä»¤ã‚³ãƒ¼ãƒ‰:"
-#: src/readelf.c:9002
+#: src/readelf.c:9018
#, fuzzy, c-format
msgid "cannot get .debug_loclists content: %s"
msgstr ".debug_loc ã®å†…容を得られã¾ã›ã‚“: %s"
-#: src/readelf.c:9171
+#: src/readelf.c:9187
#, fuzzy, c-format
msgid "invalid loclists data"
msgstr "ä¸å½“ãªãƒ‡ãƒ¼ã‚¿"
-#: src/readelf.c:9424
+#: src/readelf.c:9440
#, c-format
msgid "cannot get .debug_loc content: %s"
msgstr ".debug_loc ã®å†…容を得られã¾ã›ã‚“: %s"
-#: src/readelf.c:9631 src/readelf.c:10675
+#: src/readelf.c:9647 src/readelf.c:10691
#, fuzzy
msgid " <INVALID DATA>\n"
msgstr " [%6tx] <ä¸å½“ãªãƒ‡ãƒ¼ã‚¿>\n"
-#: src/readelf.c:9686 src/readelf.c:9849
+#: src/readelf.c:9702 src/readelf.c:9865
#, c-format
msgid "cannot get macro information section data: %s"
msgstr "マクロ情報セクションã®ãƒ‡ãƒ¼ã‚¿ã‚’得られã¾ã›ã‚“: %s"
-#: src/readelf.c:9766
+#: src/readelf.c:9782
#, c-format
msgid "%*s*** non-terminated string at end of section"
msgstr "%*s*** 最後ã®ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã®çµ‚端ã—ã¦ã„ãªã„文字列"
-#: src/readelf.c:9789
+#: src/readelf.c:9805
#, fuzzy, c-format
msgid "%*s*** missing DW_MACINFO_start_file argument at end of section"
msgstr "%*s*** 最後ã®ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã®çµ‚端ã—ã¦ã„ãªã„文字列"
-#: src/readelf.c:9890
+#: src/readelf.c:9906
#, fuzzy, c-format
msgid " Offset: 0x%<PRIx64>\n"
msgstr " 所有者 大ãã•\n"
-#: src/readelf.c:9902
+#: src/readelf.c:9918
#, fuzzy, c-format
msgid " Version: %<PRIu16>\n"
msgstr " %s: %<PRId64>\n"
-#: src/readelf.c:9908 src/readelf.c:10795
+#: src/readelf.c:9924 src/readelf.c:10811
#, c-format
msgid " unknown version, cannot parse section\n"
msgstr ""
-#: src/readelf.c:9915
+#: src/readelf.c:9931
#, fuzzy, c-format
msgid " Flag: 0x%<PRIx8>"
msgstr " å…¥å£ç‚¹ã‚¢ãƒ‰ãƒ¬ã‚¹ : %#<PRIx64>\n"
-#: src/readelf.c:9944
+#: src/readelf.c:9960
#, fuzzy, c-format
msgid " Offset length: %<PRIu8>\n"
msgstr " (オフセット: %#<PRIx64>)"
-#: src/readelf.c:9952
+#: src/readelf.c:9968
#, fuzzy, c-format
msgid " .debug_line offset: 0x%<PRIx64>\n"
msgstr " (終了オフセット: %#<PRIx64>)"
-#: src/readelf.c:9977
+#: src/readelf.c:9993
#, fuzzy, c-format
msgid " extension opcode table, %<PRIu8> items:\n"
msgstr " %<PRIu8> 個ã®ãƒ‘ラメーターã®ã‚ã‚‹ä¸æ˜Žãªå‘½ä»¤ã‚³ãƒ¼ãƒ‰:"
-#: src/readelf.c:9984
+#: src/readelf.c:10000
#, c-format
msgid " [%<PRIx8>]"
msgstr ""
-#: src/readelf.c:9996
+#: src/readelf.c:10012
#, fuzzy, c-format
msgid " %<PRIu8> arguments:"
msgstr " [%*<PRIuFAST8>] %hhu パラメーター\n"
-#: src/readelf.c:10011
+#: src/readelf.c:10027
#, c-format
msgid " no arguments."
msgstr ""
-#: src/readelf.c:10212
+#: src/readelf.c:10228
#, c-format
msgid " [%5d] DIE offset: %6<PRId64>, CU DIE offset: %6<PRId64>, name: %s\n"
msgstr ""
@@ -5483,7 +5488,7 @@ msgstr ""
# # "オフセット %3$#<PRIx64> 㮠DWARF セクション [%1$2zu] '%2$s':\n"
# # " %4$*s 文字列\n" ãŒã‚¨ãƒ©ãƒ¼ã«ãªã‚‹ã®ã¯ä½•æ•…? å–ã‚Šæ•¢ãˆãš fuzzy扱ã„
-#: src/readelf.c:10256
+#: src/readelf.c:10272
#, fuzzy, c-format
msgid ""
"\n"
@@ -5494,37 +5499,37 @@ msgstr ""
"オフセット %3$#<PRIx64> 㮠DWARF セクション [%1$2zu] '%2$s':\n"
" %4$*s 文字列\n"
-#: src/readelf.c:10271
+#: src/readelf.c:10287
#, fuzzy, c-format
msgid " *** error, missing string terminator\n"
msgstr " *** 文字列ã®èª­è¾¼ã¿ä¸­ã«ã‚¨ãƒ©ãƒ¼: %s\n"
-#: src/readelf.c:10300
+#: src/readelf.c:10316
#, fuzzy, c-format
msgid "cannot get .debug_str_offsets section data: %s"
msgstr ".degub_ranges ã®å†…容を得られã¾ã›ã‚“: %s"
-#: src/readelf.c:10399
+#: src/readelf.c:10415
#, fuzzy, c-format
msgid " Length: %8<PRIu64>\n"
msgstr " (オフセット: %#<PRIx64>)"
-#: src/readelf.c:10401
+#: src/readelf.c:10417
#, fuzzy, c-format
msgid " Offset size: %8<PRIu8>\n"
msgstr " (オフセット: %#<PRIx64>)"
-#: src/readelf.c:10415
+#: src/readelf.c:10431
#, fuzzy, c-format
msgid " DWARF version: %8<PRIu16>\n"
msgstr " %s: %<PRId64>\n"
-#: src/readelf.c:10424
+#: src/readelf.c:10440
#, fuzzy, c-format
msgid " Padding: %8<PRIx16>\n"
msgstr " (オフセット: %#<PRIx64>)"
-#: src/readelf.c:10478
+#: src/readelf.c:10494
#, c-format
msgid ""
"\n"
@@ -5533,7 +5538,7 @@ msgstr ""
"\n"
"呼出ã—フレーム検索テーブルセクション [%2zu] '.eh_frame_hdr':\n"
-#: src/readelf.c:10580
+#: src/readelf.c:10596
#, c-format
msgid ""
"\n"
@@ -5542,22 +5547,22 @@ msgstr ""
"\n"
"例外å–扱ã„テーブルセクション [%2zu] '.gcc_except_table':\n"
-#: src/readelf.c:10603
+#: src/readelf.c:10619
#, c-format
msgid " LPStart encoding: %#x "
msgstr " LPStart コード化: %#x "
-#: src/readelf.c:10615
+#: src/readelf.c:10631
#, c-format
msgid " TType encoding: %#x "
msgstr "TType コード化: %#x "
-#: src/readelf.c:10630
+#: src/readelf.c:10646
#, c-format
msgid " Call site encoding: %#x "
msgstr "呼出ã—サイトコード化: %#x "
-#: src/readelf.c:10643
+#: src/readelf.c:10659
msgid ""
"\n"
" Call site table:"
@@ -5565,7 +5570,7 @@ msgstr ""
"\n"
" 呼出ã—サイトテーブル:"
-#: src/readelf.c:10657
+#: src/readelf.c:10673
#, c-format
msgid ""
" [%4u] Call site start: %#<PRIx64>\n"
@@ -5578,12 +5583,12 @@ msgstr ""
" 離ç€é™¸å ´: %#<PRIx64>\n"
" 行動: %u\n"
-#: src/readelf.c:10730
+#: src/readelf.c:10746
#, c-format
msgid "invalid TType encoding"
msgstr "ä¸å½“㪠TType コード化"
-#: src/readelf.c:10757
+#: src/readelf.c:10773
#, fuzzy, c-format
msgid ""
"\n"
@@ -5593,37 +5598,37 @@ msgstr ""
"オフセット %3$#<PRIx64> ã® DWARF セクション [%1$2zu] '%2$s' ã«ã¯ %4$zu 個ã®é …"
"ç›®ãŒã‚ã‚Šã¾ã™:\n"
-#: src/readelf.c:10786
+#: src/readelf.c:10802
#, fuzzy, c-format
msgid " Version: %<PRId32>\n"
msgstr " %s: %<PRId64>\n"
-#: src/readelf.c:10804
+#: src/readelf.c:10820
#, fuzzy, c-format
msgid " CU offset: %#<PRIx32>\n"
msgstr " (オフセット: %#<PRIx64>)"
-#: src/readelf.c:10811
+#: src/readelf.c:10827
#, fuzzy, c-format
msgid " TU offset: %#<PRIx32>\n"
msgstr " (オフセット: %#<PRIx64>)"
-#: src/readelf.c:10818
+#: src/readelf.c:10834
#, fuzzy, c-format
msgid " address offset: %#<PRIx32>\n"
msgstr " (終了オフセット: %#<PRIx64>)"
-#: src/readelf.c:10825
+#: src/readelf.c:10841
#, fuzzy, c-format
msgid " symbol offset: %#<PRIx32>\n"
msgstr " (オフセット: %#<PRIx64>)"
-#: src/readelf.c:10832
+#: src/readelf.c:10848
#, fuzzy, c-format
msgid " constant offset: %#<PRIx32>\n"
msgstr " (終了オフセット: %#<PRIx64>)"
-#: src/readelf.c:10846
+#: src/readelf.c:10862
#, fuzzy, c-format
msgid ""
"\n"
@@ -5633,7 +5638,7 @@ msgstr ""
"オフセット %3$#<PRIx64> ã® DWARF セクション [%1$2zu] '%2$s' ã«ã¯ %4$zu 個ã®é …"
"ç›®ãŒã‚ã‚Šã¾ã™:\n"
-#: src/readelf.c:10871
+#: src/readelf.c:10887
#, fuzzy, c-format
msgid ""
"\n"
@@ -5643,7 +5648,7 @@ msgstr ""
"オフセット %3$#<PRIx64> ã® DWARF セクション [%1$2zu] '%2$s' ã«ã¯ %4$zu 個ã®é …"
"ç›®ãŒã‚ã‚Šã¾ã™:\n"
-#: src/readelf.c:10900
+#: src/readelf.c:10916
#, fuzzy, c-format
msgid ""
"\n"
@@ -5653,7 +5658,7 @@ msgstr ""
"オフセット %3$#<PRIx64> ã® DWARF セクション [%1$2zu] '%2$s' ã«ã¯ %4$zu 個ã®é …"
"ç›®ãŒã‚ã‚Šã¾ã™:\n"
-#: src/readelf.c:10932
+#: src/readelf.c:10948
#, fuzzy, c-format
msgid ""
"\n"
@@ -5662,18 +5667,18 @@ msgstr ""
"\n"
"オフセット %#0<PRIx64> ã«ä¸å½“ãªã‚·ãƒ³ãƒœãƒ«ãƒ†ãƒ¼ãƒ–ル\n"
-#: src/readelf.c:11070
+#: src/readelf.c:11086
#, c-format
msgid "cannot get debug context descriptor: %s"
msgstr "デãƒãƒƒã‚°å†…容記述å­ã‚’得られã¾ã›ã‚“: %s"
-#: src/readelf.c:11433 src/readelf.c:12055 src/readelf.c:12166
-#: src/readelf.c:12224
+#: src/readelf.c:11449 src/readelf.c:12071 src/readelf.c:12182
+#: src/readelf.c:12240
#, c-format
msgid "cannot convert core note data: %s"
msgstr "コアノートデータã®å¤‰æ›ãŒã§ãã¾ã›ã‚“: %s"
-#: src/readelf.c:11796
+#: src/readelf.c:11812
#, c-format
msgid ""
"\n"
@@ -5682,21 +5687,21 @@ msgstr ""
"\n"
"%*s... < %u 回ã®ç¹°è¿”ã—> ..."
-#: src/readelf.c:12303
+#: src/readelf.c:12319
msgid " Owner Data size Type\n"
msgstr " 所有者 データ大ãã•ã‚¿ã‚¤ãƒ—\n"
-#: src/readelf.c:12332
+#: src/readelf.c:12348
#, c-format
msgid " %-13.*s %9<PRId32> %s\n"
msgstr " %-13.*s %9<PRId32> %s\n"
-#: src/readelf.c:12384
+#: src/readelf.c:12400
#, fuzzy, c-format
msgid "cannot get content of note: %s"
msgstr "ノートセクションã®å†…容を得られã¾ã›ã‚“: %s"
-#: src/readelf.c:12411
+#: src/readelf.c:12434
#, c-format
msgid ""
"\n"
@@ -5706,7 +5711,7 @@ msgstr ""
"オフセット %4$#0<PRIx64> ã® %3$<PRIu64> ãƒã‚¤ãƒˆã®ãƒŽãƒ¼ãƒˆã‚»ã‚¯ã‚·ãƒ§ãƒ³ [%1$2zu] "
"'%2$s':\n"
-#: src/readelf.c:12434
+#: src/readelf.c:12457
#, c-format
msgid ""
"\n"
@@ -5715,7 +5720,7 @@ msgstr ""
"\n"
"オフセット %2$#0<PRIx64> ã® %1$<PRIu64> ãƒã‚¤ãƒˆã®ãƒŽãƒ¼ãƒˆã‚»ã‚°ãƒ¡ãƒ³ãƒˆ:\n"
-#: src/readelf.c:12481
+#: src/readelf.c:12504
#, fuzzy, c-format
msgid ""
"\n"
@@ -5724,12 +5729,12 @@ msgstr ""
"\n"
"セクション [%Zu] '%s' ã«ã¯ãƒ€ãƒ³ãƒ—ã™ã¹ãデータãŒã‚ã‚Šã¾ã›ã‚“。\n"
-#: src/readelf.c:12508 src/readelf.c:12559
+#: src/readelf.c:12531 src/readelf.c:12582
#, fuzzy, c-format
msgid "cannot get data for section [%zu] '%s': %s"
msgstr "セクション [%Zu] '%s' ã‹ã‚‰ãƒ‡ãƒ¼ã‚¿ãŒå¾—られã¾ã›ã‚“: %s"
-#: src/readelf.c:12513
+#: src/readelf.c:12536
#, fuzzy, c-format
msgid ""
"\n"
@@ -5739,7 +5744,7 @@ msgstr ""
"オフセット %4$#0<PRIx64> ã®ã‚»ã‚¯ã‚·ãƒ§ãƒ³ [%1$Zu] '%2$s' ã®16進ダン"
"プã€%3$<PRIu64> ãƒã‚¤ãƒˆ:\n"
-#: src/readelf.c:12518
+#: src/readelf.c:12541
#, fuzzy, c-format
msgid ""
"\n"
@@ -5750,7 +5755,7 @@ msgstr ""
"オフセット %4$#0<PRIx64> ã®ã‚»ã‚¯ã‚·ãƒ§ãƒ³ [%1$Zu] '%2$s' ã®16進ダン"
"プã€%3$<PRIu64> ãƒã‚¤ãƒˆ:\n"
-#: src/readelf.c:12532
+#: src/readelf.c:12555
#, fuzzy, c-format
msgid ""
"\n"
@@ -5759,7 +5764,7 @@ msgstr ""
"\n"
"セクション [%Zu] '%s' ã«ã¯ãƒ€ãƒ³ãƒ—ã™ã¹ãデータãŒã‚ã‚Šã¾ã›ã‚“。\n"
-#: src/readelf.c:12564
+#: src/readelf.c:12587
#, fuzzy, c-format
msgid ""
"\n"
@@ -5769,7 +5774,7 @@ msgstr ""
"オフセット %4$#0<PRIx64> 文字列セクション [%1$Zu] '%2$s' ã«ã¯ %3$<PRIu64> ãƒ"
"イトã‚ã‚Šã¾ã™:\n"
-#: src/readelf.c:12569
+#: src/readelf.c:12592
#, fuzzy, c-format
msgid ""
"\n"
@@ -5780,7 +5785,7 @@ msgstr ""
"オフセット %4$#0<PRIx64> 文字列セクション [%1$Zu] '%2$s' ã«ã¯ %3$<PRIu64> ãƒ"
"イトã‚ã‚Šã¾ã™:\n"
-#: src/readelf.c:12618
+#: src/readelf.c:12641
#, c-format
msgid ""
"\n"
@@ -5789,7 +5794,7 @@ msgstr ""
"\n"
"セクション [%lu] ãŒã‚ã‚Šã¾ã›ã‚“"
-#: src/readelf.c:12647
+#: src/readelf.c:12671
#, c-format
msgid ""
"\n"
@@ -5798,12 +5803,12 @@ msgstr ""
"\n"
"セクション '%s' ãŒã‚ã‚Šã¾ã›ã‚“"
-#: src/readelf.c:12704
+#: src/readelf.c:12728
#, c-format
msgid "cannot get symbol index of archive '%s': %s"
msgstr "アーカイブã®ã‚·ãƒ³ãƒœãƒ«ç´¢å¼• '%s' を得られã¾ã›ã‚“: %s"
-#: src/readelf.c:12707
+#: src/readelf.c:12731
#, c-format
msgid ""
"\n"
@@ -5812,7 +5817,7 @@ msgstr ""
"\n"
"アーカイブ '%s' ã«ã¯ã‚·ãƒ³ãƒœãƒ«ç´¢å¼•ãŒã‚ã‚Šã¾ã›ã‚“\n"
-#: src/readelf.c:12711
+#: src/readelf.c:12735
#, fuzzy, c-format
msgid ""
"\n"
@@ -5821,12 +5826,12 @@ msgstr ""
"\n"
"アーカイブ '%s' ã®ç´¢å¼•ã«ã¯ %Zu é …ç›®ã‚ã‚Šã¾ã™:\n"
-#: src/readelf.c:12729
+#: src/readelf.c:12753
#, fuzzy, c-format
msgid "cannot extract member at offset %zu in '%s': %s"
msgstr "'%2$s' 㮠オフセット %1$Zu ã®ãƒ¡ãƒ³ãƒãƒ¼ã‚’抽出ã§ãã¾ã›ã‚“: %3$s"
-#: src/readelf.c:12734
+#: src/readelf.c:12758
#, c-format
msgid "Archive member '%s' contains:\n"
msgstr "アーカイブメンãƒãƒ¼ '%s' ã«ã¯ä»¥ä¸‹ãŒã‚ã‚Šã¾ã™:\n"
@@ -6418,7 +6423,7 @@ msgstr ""
msgid "cannot get shdrstrndx:%s"
msgstr "セクションを得られã¾ã›ã‚“: %s"
-#: src/unstrip.c:248 src/unstrip.c:2038
+#: src/unstrip.c:248 src/unstrip.c:2081
#, c-format
msgid "cannot get ELF header: %s"
msgstr ""
@@ -6438,12 +6443,12 @@ msgstr "セクション数を決定ã§ãã¾ã›ã‚“: %s"
msgid "cannot copy ELF header: %s"
msgstr ""
-#: src/unstrip.c:269 src/unstrip.c:2056 src/unstrip.c:2099
+#: src/unstrip.c:269 src/unstrip.c:2099 src/unstrip.c:2142
#, fuzzy, c-format
msgid "cannot get number of program headers: %s"
msgstr "セクション数を決定ã§ãã¾ã›ã‚“: %s"
-#: src/unstrip.c:274 src/unstrip.c:2060
+#: src/unstrip.c:274 src/unstrip.c:2103
#, c-format
msgid "cannot create program headers: %s"
msgstr ""
@@ -6458,12 +6463,12 @@ msgstr ""
msgid "cannot copy section header: %s"
msgstr ""
-#: src/unstrip.c:293 src/unstrip.c:1669
+#: src/unstrip.c:293 src/unstrip.c:1703
#, c-format
msgid "cannot get section data: %s"
msgstr ""
-#: src/unstrip.c:295 src/unstrip.c:1671
+#: src/unstrip.c:295 src/unstrip.c:1705
#, c-format
msgid "cannot copy section data: %s"
msgstr ""
@@ -6473,14 +6478,14 @@ msgstr ""
msgid "cannot create directory '%s'"
msgstr ""
-#: src/unstrip.c:391 src/unstrip.c:647 src/unstrip.c:681 src/unstrip.c:847
-#: src/unstrip.c:1706
+#: src/unstrip.c:391 src/unstrip.c:651 src/unstrip.c:685 src/unstrip.c:853
+#: src/unstrip.c:1745
#, c-format
msgid "cannot get symbol table entry: %s"
msgstr ""
-#: src/unstrip.c:407 src/unstrip.c:650 src/unstrip.c:671 src/unstrip.c:684
-#: src/unstrip.c:1727 src/unstrip.c:1922 src/unstrip.c:1946
+#: src/unstrip.c:407 src/unstrip.c:654 src/unstrip.c:675 src/unstrip.c:688
+#: src/unstrip.c:1766 src/unstrip.c:1961 src/unstrip.c:1985
#, c-format
msgid "cannot update symbol table: %s"
msgstr ""
@@ -6490,228 +6495,243 @@ msgstr ""
msgid "cannot update section header: %s"
msgstr ""
-#: src/unstrip.c:459 src/unstrip.c:473
+#: src/unstrip.c:463 src/unstrip.c:477
#, c-format
msgid "cannot update relocation: %s"
msgstr ""
-#: src/unstrip.c:570
+#: src/unstrip.c:574
#, c-format
msgid "cannot get symbol version: %s"
msgstr ""
-#: src/unstrip.c:583
+#: src/unstrip.c:587
#, c-format
msgid "unexpected section type in [%zu] with sh_link to symtab"
msgstr ""
-#: src/unstrip.c:853
+#: src/unstrip.c:842
+#, fuzzy, c-format
+msgid "cannot get symbol section data: %s"
+msgstr "ラインデータセクションデータを得られã¾ã›ã‚“: %s"
+
+#: src/unstrip.c:844
+#, fuzzy, c-format
+msgid "cannot get string section data: %s"
+msgstr "ラインデータセクションデータを得られã¾ã›ã‚“: %s"
+
+#: src/unstrip.c:861
#, fuzzy, c-format
msgid "invalid string offset in symbol [%zu]"
msgstr "シンボル %2$sã®ä¸æ­£ãªã‚ªãƒ•ã‚»ãƒƒãƒˆ %1$zu "
-#: src/unstrip.c:1011 src/unstrip.c:1402
+#: src/unstrip.c:1019 src/unstrip.c:1423
#, fuzzy, c-format
msgid "cannot read section [%zu] name: %s"
msgstr "セクションデータを割り当ã¦ã‚‰ã‚Œã¾ã›ã‚“: %s"
-#: src/unstrip.c:1026
+#: src/unstrip.c:1034
#, fuzzy, c-format
msgid "bad sh_link for group section: %s"
msgstr "ä¸å½“㪠.debug_line セクション"
-#: src/unstrip.c:1032
+#: src/unstrip.c:1040
#, fuzzy, c-format
msgid "couldn't get shdr for group section: %s"
msgstr "セクションã‹ã‚‰ãƒ‡ãƒ¼ã‚¿ã‚’得られã¾ã›ã‚“ %d: %s"
-#: src/unstrip.c:1037
+#: src/unstrip.c:1045
#, fuzzy, c-format
msgid "bad data for group symbol section: %s"
msgstr "セクションã‹ã‚‰ãƒ‡ãƒ¼ã‚¿ã‚’得られã¾ã›ã‚“ %d: %s"
-#: src/unstrip.c:1043
+#: src/unstrip.c:1051
#, fuzzy, c-format
msgid "couldn't get symbol for group section: %s"
msgstr "セクション数を決定ã§ãã¾ã›ã‚“: %s"
-#: src/unstrip.c:1048
+#: src/unstrip.c:1056
#, fuzzy, c-format
msgid "bad symbol name for group section: %s"
msgstr "セクションヘッダー文字列セクションを生æˆã§ãã¾ã›ã‚“: %s"
-#: src/unstrip.c:1090 src/unstrip.c:1109 src/unstrip.c:1147
+#: src/unstrip.c:1098 src/unstrip.c:1117 src/unstrip.c:1155
#, c-format
msgid "cannot read '.gnu.prelink_undo' section: %s"
msgstr ""
-#: src/unstrip.c:1127
+#: src/unstrip.c:1135
#, c-format
msgid "overflow with shnum = %zu in '%s' section"
msgstr ""
-#: src/unstrip.c:1138
+#: src/unstrip.c:1146
#, c-format
msgid "invalid contents in '%s' section"
msgstr ""
-#: src/unstrip.c:1194 src/unstrip.c:1528
+#: src/unstrip.c:1202 src/unstrip.c:1549
#, fuzzy, c-format
msgid "cannot find matching section for [%zu] '%s'"
msgstr "セクション [%zu] '%s' ã®ä¸å½“ãªãƒ‡ãƒ¼ã‚¿"
-#: src/unstrip.c:1319 src/unstrip.c:1335 src/unstrip.c:1607 src/unstrip.c:1881
+#: src/unstrip.c:1327 src/unstrip.c:1343 src/unstrip.c:1629 src/unstrip.c:1920
#, c-format
msgid "cannot add section name to string table: %s"
msgstr ""
-#: src/unstrip.c:1344
+#: src/unstrip.c:1352
#, c-format
msgid "cannot update section header string table data: %s"
msgstr ""
-#: src/unstrip.c:1373 src/unstrip.c:1377
+#: src/unstrip.c:1381 src/unstrip.c:1385
#, c-format
msgid "cannot get section header string table section index: %s"
msgstr ""
-#: src/unstrip.c:1381 src/unstrip.c:1385 src/unstrip.c:1622
+#: src/unstrip.c:1389 src/unstrip.c:1393 src/unstrip.c:1644
#, c-format
msgid "cannot get section count: %s"
msgstr ""
-#: src/unstrip.c:1388
+#: src/unstrip.c:1396
#, c-format
msgid "more sections in stripped file than debug file -- arguments reversed?"
msgstr ""
-#: src/unstrip.c:1450 src/unstrip.c:1543
+#: src/unstrip.c:1400
+#, c-format
+msgid "no sections in stripped file"
+msgstr ""
+
+#: src/unstrip.c:1471 src/unstrip.c:1564
#, c-format
msgid "cannot read section header string table: %s"
msgstr ""
-#: src/unstrip.c:1601
+#: src/unstrip.c:1623
#, c-format
msgid "cannot add new section: %s"
msgstr ""
-#: src/unstrip.c:1714
+#: src/unstrip.c:1753
#, fuzzy, c-format
msgid "symbol [%zu] has invalid section index"
msgstr "ä¸å½“ãªã‚»ã‚¯ã‚·ãƒ§ãƒ³ç´¢å¼•"
-#: src/unstrip.c:1746
+#: src/unstrip.c:1785
#, fuzzy, c-format
msgid "group has invalid section index [%zd]"
msgstr "ä¸å½“ãªã‚»ã‚¯ã‚·ãƒ§ãƒ³ç´¢å¼•"
-#: src/unstrip.c:2017
+#: src/unstrip.c:2060
#, fuzzy, c-format
msgid "cannot read section data: %s"
msgstr "セクションデータを割り当ã¦ã‚‰ã‚Œã¾ã›ã‚“: %s"
-#: src/unstrip.c:2046
+#: src/unstrip.c:2089
#, c-format
msgid "cannot update ELF header: %s"
msgstr "ELF ヘッダーを更新ã§ãã¾ã›ã‚“: %s"
-#: src/unstrip.c:2070
+#: src/unstrip.c:2113
#, c-format
msgid "cannot update program header: %s"
msgstr ""
-#: src/unstrip.c:2075 src/unstrip.c:2157
+#: src/unstrip.c:2118 src/unstrip.c:2200
#, c-format
msgid "cannot write output file: %s"
msgstr ""
-#: src/unstrip.c:2126
+#: src/unstrip.c:2169
#, c-format
msgid "DWARF data not adjusted for prelinking bias; consider prelink -u"
msgstr ""
-#: src/unstrip.c:2129
+#: src/unstrip.c:2172
#, c-format
msgid ""
"DWARF data in '%s' not adjusted for prelinking bias; consider prelink -u"
msgstr ""
-#: src/unstrip.c:2148 src/unstrip.c:2199 src/unstrip.c:2211 src/unstrip.c:2297
+#: src/unstrip.c:2191 src/unstrip.c:2242 src/unstrip.c:2254 src/unstrip.c:2340
#, c-format
msgid "cannot create ELF descriptor: %s"
msgstr ""
-#: src/unstrip.c:2190
+#: src/unstrip.c:2233
msgid "WARNING: "
msgstr ""
-#: src/unstrip.c:2192
+#: src/unstrip.c:2235
msgid ", use --force"
msgstr ""
-#: src/unstrip.c:2215
+#: src/unstrip.c:2258
msgid "ELF header identification (e_ident) different"
msgstr ""
-#: src/unstrip.c:2218
+#: src/unstrip.c:2261
msgid "ELF header type (e_type) different"
msgstr ""
-#: src/unstrip.c:2221
+#: src/unstrip.c:2264
msgid "ELF header machine type (e_machine) different"
msgstr ""
-#: src/unstrip.c:2224
+#: src/unstrip.c:2267
msgid "stripped program header (e_phnum) smaller than unstripped"
msgstr ""
-#: src/unstrip.c:2254
+#: src/unstrip.c:2297
#, c-format
msgid "cannot find stripped file for module '%s': %s"
msgstr ""
-#: src/unstrip.c:2258
+#: src/unstrip.c:2301
#, c-format
msgid "cannot open stripped file '%s' for module '%s': %s"
msgstr ""
-#: src/unstrip.c:2273
+#: src/unstrip.c:2316
#, c-format
msgid "cannot find debug file for module '%s': %s"
msgstr ""
-#: src/unstrip.c:2277
+#: src/unstrip.c:2320
#, c-format
msgid "cannot open debug file '%s' for module '%s': %s"
msgstr ""
-#: src/unstrip.c:2290
+#: src/unstrip.c:2333
#, c-format
msgid "module '%s' file '%s' is not stripped"
msgstr ""
-#: src/unstrip.c:2321
+#: src/unstrip.c:2364
#, c-format
msgid "cannot cache section addresses for module '%s': %s"
msgstr ""
-#: src/unstrip.c:2454
+#: src/unstrip.c:2497
#, c-format
msgid "no matching modules found"
msgstr ""
-#: src/unstrip.c:2463
+#: src/unstrip.c:2506
#, c-format
msgid "matched more than one module"
msgstr ""
-#: src/unstrip.c:2507
+#: src/unstrip.c:2550
msgid ""
"STRIPPED-FILE DEBUG-FILE\n"
"[MODULE...]"
msgstr ""
-#: src/unstrip.c:2508
+#: src/unstrip.c:2551
msgid ""
"Combine stripped files with separate symbols and debug information.\n"
"\n"
diff --git a/po/pl.po b/po/pl.po
index 3ee669ab..54a01641 100644
--- a/po/pl.po
+++ b/po/pl.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: elfutils\n"
"Report-Msgid-Bugs-To: https://sourceware.org/bugzilla/\n"
-"POT-Creation-Date: 2019-08-13 23:38+0200\n"
+"POT-Creation-Date: 2019-11-26 09:48+0100\n"
"PO-Revision-Date: 2016-12-29 17:48+0100\n"
"Last-Translator: Piotr DrÄ…g <piotrdrag@gmail.com>\n"
"Language-Team: Polish <trans-pl@lists.fedoraproject.org>\n"
@@ -26,7 +26,7 @@ msgstr ""
"koloruje wyjście. WHEN domyślnie wynosi „always†lub może wynosić „auto†lub "
"„neverâ€"
-#: lib/color.c:127
+#: lib/color.c:129
#, c-format
msgid ""
"%s: invalid argument '%s' for '--color'\n"
@@ -41,7 +41,7 @@ msgstr ""
" • „neverâ€, „noâ€, „noneâ€\n"
" • „autoâ€, „ttyâ€, „if-ttyâ€\n"
-#: lib/color.c:190 src/objdump.c:726
+#: lib/color.c:194 src/objdump.c:728
#, c-format
msgid "cannot allocate memory"
msgstr "nie można przydzielić pamięci"
@@ -59,18 +59,18 @@ msgstr ""
"BEZ JAKIEJKOLWIEK GWARANCJI, nawet domyślnej gwarancji PRZYDATNOŚCI\n"
"HANDLOWEJ albo PRZYDATNOŚCI DO OKREŚLONYCH ZASTOSOWAŃ.\n"
-#: lib/xmalloc.c:52 lib/xmalloc.c:65 lib/xmalloc.c:77 src/readelf.c:3433
-#: src/readelf.c:11382 src/unstrip.c:2350 src/unstrip.c:2556
+#: lib/xmalloc.c:52 lib/xmalloc.c:65 lib/xmalloc.c:77 src/readelf.c:3449
+#: src/readelf.c:11398 src/unstrip.c:2393 src/unstrip.c:2599
#, c-format
msgid "memory exhausted"
msgstr "pamięć wyczerpana"
-#: libasm/asm_error.c:65 libdw/dwarf_error.c:57 libdwfl/libdwflP.h:50
+#: libasm/asm_error.c:65 libdw/dwarf_error.c:57 libdwfl/libdwflP.h:51
#: libelf/elf_error.c:60
msgid "no error"
msgstr "brak błędu"
-#: libasm/asm_error.c:66 libdw/dwarf_error.c:67 libdwfl/libdwflP.h:52
+#: libasm/asm_error.c:66 libdw/dwarf_error.c:67 libdwfl/libdwflP.h:53
#: libelf/elf_error.c:91
msgid "out of memory"
msgstr "brak pamięci"
@@ -107,7 +107,7 @@ msgstr "błąd podczas wyprowadzania danych"
msgid "no backend support available"
msgstr "brak dostępnej obsługi zaplecza"
-#: libasm/asm_error.c:83 libdw/dwarf_error.c:58 libdwfl/libdwflP.h:51
+#: libasm/asm_error.c:83 libdw/dwarf_error.c:58 libdwfl/libdwflP.h:52
#: libelf/elf_error.c:63
msgid "unknown error"
msgstr "nieznany błąd"
@@ -223,7 +223,7 @@ msgstr "nieprawidłowa wersja DWARF"
msgid "invalid directory index"
msgstr "nieprawidłowy indeks katalogu"
-#: libdw/dwarf_error.c:87 libdwfl/libdwflP.h:71
+#: libdw/dwarf_error.c:87 libdwfl/libdwflP.h:72
msgid "address out of range"
msgstr "adres jest spoza zakresu"
@@ -254,7 +254,7 @@ msgstr "nieprawidłowy indeks wiersza"
msgid "invalid address range index"
msgstr "nieprawidłowy indeks zakresu adresów"
-#: libdw/dwarf_error.c:94 libdwfl/libdwflP.h:72
+#: libdw/dwarf_error.c:94 libdwfl/libdwflP.h:73
msgid "no matching address range"
msgstr "brak pasującego zakresu adresów"
@@ -301,7 +301,7 @@ msgstr " nieznana instrukcja"
msgid ".debug_addr section missing"
msgstr "brak sekcji .debug_ranges"
-#: libdwfl/argp-std.c:50 src/stack.c:638 src/unstrip.c:2497
+#: libdwfl/argp-std.c:50 src/stack.c:638 src/unstrip.c:2540
msgid "Input selection options:"
msgstr "Opcje wyboru wejścia:"
@@ -367,155 +367,155 @@ msgstr "Za mało pamięci"
msgid "No modules recognized in core file"
msgstr "Nie rozpoznano żadnych modułów w pliku core"
-#: libdwfl/libdwflP.h:53
+#: libdwfl/libdwflP.h:54
msgid "See errno"
msgstr "Proszę zobaczyć errno"
-#: libdwfl/libdwflP.h:54
+#: libdwfl/libdwflP.h:55
msgid "See elf_errno"
msgstr "Proszę zobaczyć elf_errno"
-#: libdwfl/libdwflP.h:55
+#: libdwfl/libdwflP.h:56
msgid "See dwarf_errno"
msgstr "Proszę zobaczyć dwarf_errno"
-#: libdwfl/libdwflP.h:56
+#: libdwfl/libdwflP.h:57
msgid "See ebl_errno (XXX missing)"
msgstr "Proszę zobaczyć ebl_errno (brak XXX)"
-#: libdwfl/libdwflP.h:57
+#: libdwfl/libdwflP.h:58
msgid "gzip decompression failed"
msgstr "dekompresja gzip się nie powiodła"
-#: libdwfl/libdwflP.h:58
+#: libdwfl/libdwflP.h:59
msgid "bzip2 decompression failed"
msgstr "dekompresja bzip2 się nie powiodła"
-#: libdwfl/libdwflP.h:59
+#: libdwfl/libdwflP.h:60
msgid "LZMA decompression failed"
msgstr "dekompresja LZMA się nie powiodła"
-#: libdwfl/libdwflP.h:60
+#: libdwfl/libdwflP.h:61
msgid "no support library found for machine"
msgstr "nie odnaleziono biblioteki obsługi dla komputera"
-#: libdwfl/libdwflP.h:61
+#: libdwfl/libdwflP.h:62
msgid "Callbacks missing for ET_REL file"
msgstr "Brak wywołań zwrotnych dla pliku ET_REL"
-#: libdwfl/libdwflP.h:62
+#: libdwfl/libdwflP.h:63
msgid "Unsupported relocation type"
msgstr "Nieobsługiwany typ relokacji"
-#: libdwfl/libdwflP.h:63
+#: libdwfl/libdwflP.h:64
msgid "r_offset is bogus"
msgstr "r_offset jest fałszywe"
-#: libdwfl/libdwflP.h:64 libelf/elf_error.c:115 libelf/elf_error.c:175
+#: libdwfl/libdwflP.h:65 libelf/elf_error.c:115 libelf/elf_error.c:175
msgid "offset out of range"
msgstr "offset spoza zakresu"
-#: libdwfl/libdwflP.h:65
+#: libdwfl/libdwflP.h:66
msgid "relocation refers to undefined symbol"
msgstr "relokacja odnosi się do nieokreślonego symbolu"
-#: libdwfl/libdwflP.h:66
+#: libdwfl/libdwflP.h:67
msgid "Callback returned failure"
msgstr "Wywołanie zwrotne zwróciło niepowodzenie"
-#: libdwfl/libdwflP.h:67
+#: libdwfl/libdwflP.h:68
msgid "No DWARF information found"
msgstr "Nie odnaleziono informacji DWARF"
-#: libdwfl/libdwflP.h:68
+#: libdwfl/libdwflP.h:69
msgid "No symbol table found"
msgstr "Nie odnaleziono tabeli symboli"
-#: libdwfl/libdwflP.h:69
+#: libdwfl/libdwflP.h:70
msgid "No ELF program headers"
msgstr "Brak nagłówków programu ELF"
-#: libdwfl/libdwflP.h:70
+#: libdwfl/libdwflP.h:71
msgid "address range overlaps an existing module"
msgstr "zakres adresów pokrywa się z istniejącym modułem"
-#: libdwfl/libdwflP.h:73
+#: libdwfl/libdwflP.h:74
msgid "image truncated"
msgstr "skrócono obraz"
-#: libdwfl/libdwflP.h:74
+#: libdwfl/libdwflP.h:75
msgid "ELF file opened"
msgstr "otwarto plik ELF"
-#: libdwfl/libdwflP.h:75
+#: libdwfl/libdwflP.h:76
msgid "not a valid ELF file"
msgstr "nie jest prawidłowym plikiem ELF"
-#: libdwfl/libdwflP.h:76
+#: libdwfl/libdwflP.h:77
msgid "cannot handle DWARF type description"
msgstr "nie można obsłużyć opisu typu DWARF"
-#: libdwfl/libdwflP.h:77
+#: libdwfl/libdwflP.h:78
msgid "ELF file does not match build ID"
msgstr "plik ELF nie ma pasujÄ…cego identyfikatora kopii"
-#: libdwfl/libdwflP.h:78
+#: libdwfl/libdwflP.h:79
msgid "corrupt .gnu.prelink_undo section data"
msgstr "uszkodzone dane sekcji .gnu.prelink_undo"
-#: libdwfl/libdwflP.h:79
+#: libdwfl/libdwflP.h:80
msgid "Internal error due to ebl"
msgstr "Wewnętrzny błąd z powodu ebl"
-#: libdwfl/libdwflP.h:80
+#: libdwfl/libdwflP.h:81
msgid "Missing data in core file"
msgstr "Brak danych w pliku core"
-#: libdwfl/libdwflP.h:81
+#: libdwfl/libdwflP.h:82
msgid "Invalid register"
msgstr "Nieprawidłowy rejestr"
-#: libdwfl/libdwflP.h:82
+#: libdwfl/libdwflP.h:83
msgid "Error reading process memory"
msgstr "Błąd podczas odczytywania pamięci procesu"
-#: libdwfl/libdwflP.h:83
+#: libdwfl/libdwflP.h:84
msgid "Couldn't find architecture of any ELF"
msgstr "Nie można odnaleźć architektury żadnego ELF"
-#: libdwfl/libdwflP.h:84
+#: libdwfl/libdwflP.h:85
msgid "Error parsing /proc filesystem"
msgstr "Błąd podczas przetwarzania systemu plików /proc"
-#: libdwfl/libdwflP.h:85
+#: libdwfl/libdwflP.h:86
msgid "Invalid DWARF"
msgstr "Nieprawidłowy DWARF"
-#: libdwfl/libdwflP.h:86
+#: libdwfl/libdwflP.h:87
msgid "Unsupported DWARF"
msgstr "Nieobsługiwany DWARF"
-#: libdwfl/libdwflP.h:87
+#: libdwfl/libdwflP.h:88
msgid "Unable to find more threads"
msgstr "Nie można odnaleźć więcej wątków"
-#: libdwfl/libdwflP.h:88
+#: libdwfl/libdwflP.h:89
msgid "Dwfl already has attached state"
msgstr "Dwfl już ma załączony stan"
-#: libdwfl/libdwflP.h:89
+#: libdwfl/libdwflP.h:90
msgid "Dwfl has no attached state"
msgstr "Dwfl nie ma załączonego stanu"
-#: libdwfl/libdwflP.h:90
+#: libdwfl/libdwflP.h:91
msgid "Unwinding not supported for this architecture"
msgstr "Odwijanie nie jest obsługiwane dla tej architektury"
-#: libdwfl/libdwflP.h:91
+#: libdwfl/libdwflP.h:92
msgid "Invalid argument"
msgstr "Nieprawidłowy parametr"
-#: libdwfl/libdwflP.h:92
+#: libdwfl/libdwflP.h:93
msgid "Not an ET_CORE ELF file"
msgstr "Nie jest plikiem ELF ET_CORE"
@@ -620,7 +620,7 @@ msgstr "nieprawidłowy rozmiar operanda źródłowego"
msgid "invalid size of destination operand"
msgstr "nieprawidłowy rozmiar operanda docelowego"
-#: libelf/elf_error.c:87 src/readelf.c:6150
+#: libelf/elf_error.c:87 src/readelf.c:6166
#, c-format
msgid "invalid encoding"
msgstr "nieprawidłowe kodowanie"
@@ -706,8 +706,8 @@ msgstr "dane/scn nie zgadzajÄ… siÄ™"
msgid "invalid section header"
msgstr "nieprawidłowy nagłówek sekcji"
-#: libelf/elf_error.c:191 src/readelf.c:9898 src/readelf.c:10498
-#: src/readelf.c:10599 src/readelf.c:10781
+#: libelf/elf_error.c:191 src/readelf.c:9914 src/readelf.c:10514
+#: src/readelf.c:10615 src/readelf.c:10797
#, c-format
msgid "invalid data"
msgstr "nieprawidłowe dane"
@@ -1366,7 +1366,7 @@ 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:984 src/strip.c:1021
-#: src/unstrip.c:2146 src/unstrip.c:2175
+#: src/unstrip.c:2189 src/unstrip.c:2218
#, c-format
msgid "cannot open '%s'"
msgstr "nie można otworzyć „%sâ€"
@@ -1464,7 +1464,7 @@ 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:153
+#: src/elfcompress.c:1336 src/elflint.c:77 src/readelf.c:158
msgid "FILE..."
msgstr "PLIK…"
@@ -1498,14 +1498,14 @@ msgid "Pedantic checking of ELF files compliance with gABI/psABI spec."
msgstr ""
"Szczegółowe sprawdzanie zgodności plików ELF ze specyfikacją gABI/psABI."
-#: src/elflint.c:154 src/readelf.c:357
-#, c-format
-msgid "cannot open input file"
+#: src/elflint.c:154 src/readelf.c:368
+#, fuzzy, c-format
+msgid "cannot open input file '%s'"
msgstr "nie można otworzyć pliku wejściowego"
#: src/elflint.c:161
-#, c-format
-msgid "cannot generate Elf descriptor: %s\n"
+#, fuzzy, c-format
+msgid "cannot generate Elf descriptor for '%s': %s\n"
msgstr "nie można utworzyć deskryptora ELF: %s\n"
#: src/elflint.c:180
@@ -1517,7 +1517,7 @@ msgstr "błąd podczas zamykania deskryptora ELF: %s\n"
msgid "No errors"
msgstr "Brak błędów"
-#: src/elflint.c:219 src/readelf.c:559
+#: src/elflint.c:219 src/readelf.c:575
msgid "Missing file name.\n"
msgstr "Brak nazwy pliku.\n"
@@ -3692,12 +3692,12 @@ msgstr "%s%s%s: nie rozpoznano formatu pliku"
msgid "cannot create search tree"
msgstr "nie można utworzyć drzewa wyszukiwania"
-#: src/nm.c:746 src/nm.c:1205 src/objdump.c:777 src/readelf.c:619
-#: src/readelf.c:1431 src/readelf.c:1582 src/readelf.c:1783 src/readelf.c:1989
-#: src/readelf.c:2179 src/readelf.c:2357 src/readelf.c:2433 src/readelf.c:2691
-#: src/readelf.c:2767 src/readelf.c:2854 src/readelf.c:3452 src/readelf.c:3502
-#: src/readelf.c:3565 src/readelf.c:11214 src/readelf.c:12399
-#: src/readelf.c:12603 src/readelf.c:12671 src/size.c:398 src/size.c:470
+#: src/nm.c:746 src/nm.c:1205 src/objdump.c:779 src/readelf.c:635
+#: src/readelf.c:1447 src/readelf.c:1598 src/readelf.c:1799 src/readelf.c:2005
+#: src/readelf.c:2195 src/readelf.c:2373 src/readelf.c:2449 src/readelf.c:2707
+#: src/readelf.c:2783 src/readelf.c:2870 src/readelf.c:3468 src/readelf.c:3518
+#: src/readelf.c:3581 src/readelf.c:11230 src/readelf.c:12415
+#: src/readelf.c:12626 src/readelf.c:12695 src/size.c:398 src/size.c:470
#: src/strip.c:1038
#, c-format
msgid "cannot get section header string table index"
@@ -3743,12 +3743,12 @@ 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:1526
+#: src/nm.c:1527
#, c-format
msgid "%s%s%s%s: Invalid operation"
msgstr "%s%s%s%s: nieprawidłowe działanie"
-#: src/nm.c:1583
+#: src/nm.c:1584
#, c-format
msgid "%s%s%s: no symbols"
msgstr "%s%s%s: brak symboli"
@@ -3782,7 +3782,7 @@ msgstr "Wyświetla tylko informacje o sekcji NAZWA."
msgid "Show information from FILEs (a.out by default)."
msgstr "Wyświetla informacje z PLIKÓW (domyślnie a.out)."
-#: src/objdump.c:218 src/readelf.c:564
+#: src/objdump.c:218 src/readelf.c:580
msgid "No operation specified.\n"
msgstr "Nie podano działania.\n"
@@ -3791,11 +3791,11 @@ msgstr "Nie podano działania.\n"
msgid "while close `%s'"
msgstr "podczas zamykania „%sâ€"
-#: src/objdump.c:363 src/readelf.c:2084 src/readelf.c:2276
+#: src/objdump.c:363 src/readelf.c:2100 src/readelf.c:2292
msgid "INVALID SYMBOL"
msgstr "NIEPRAWIDÅOWY SYMBOL"
-#: src/objdump.c:378 src/readelf.c:2118 src/readelf.c:2312
+#: src/objdump.c:378 src/readelf.c:2134 src/readelf.c:2328
msgid "INVALID SECTION"
msgstr "NIEPRAWIDÅOWA SEKCJA"
@@ -3849,85 +3849,90 @@ msgstr "„%s†nie jest archiwum"
msgid "error while freeing sub-ELF descriptor: %s"
msgstr "błąd podczas zwalniania deskryptora pod-ELF: %s"
-#: src/readelf.c:94
+#: src/readelf.c:97
msgid "ELF input selection:"
msgstr "Wybór wyjścia ELF:"
-#: src/readelf.c:96
+#: src/readelf.c:99
msgid ""
"Use the named SECTION (default .gnu_debugdata) as (compressed) ELF input data"
msgstr ""
"Używa podanej SEKCJI (domyślnie .gnu_debugdata) jako (skompresowanych) "
"danych wejściowych ELF"
-#: src/readelf.c:99
+#: src/readelf.c:102
msgid ""
"Used with -w to find the skeleton Compile Units in FILE associated with the "
"Split Compile units in a .dwo input file"
msgstr ""
-#: src/readelf.c:101
+#: src/readelf.c:104
msgid "ELF output selection:"
msgstr "Wybór wyjścia ELF:"
-#: src/readelf.c:103
+#: src/readelf.c:106
msgid "All these plus -p .strtab -p .dynstr -p .comment"
msgstr "Wszystkie te plus -p .strtab -p .dynstr -p .comment"
-#: src/readelf.c:104
+#: src/readelf.c:107
msgid "Display the dynamic segment"
msgstr "Wyświetla segment dynamiczny"
-#: src/readelf.c:105
+#: src/readelf.c:108
msgid "Display the ELF file header"
msgstr "Wyświetla nagłówek pliku ELF"
-#: src/readelf.c:107
+#: src/readelf.c:110
msgid "Display histogram of bucket list lengths"
msgstr "Wyświetla histogram długości list kubełków"
-#: src/readelf.c:108
+#: src/readelf.c:111
msgid "Display the program headers"
msgstr "Wyświetla nagłówki programu"
-#: src/readelf.c:110
+#: src/readelf.c:113
msgid "Display relocations"
msgstr "Wyświetla relokacje"
-#: src/readelf.c:111
+#: src/readelf.c:114
#, fuzzy
msgid "Display the section groups"
msgstr "Wyświetla nagłówki sekcji"
-#: src/readelf.c:112
+#: src/readelf.c:115
msgid "Display the sections' headers"
msgstr "Wyświetla nagłówki sekcji"
-#: src/readelf.c:115
+#: src/readelf.c:118
msgid "Display the symbol table sections"
msgstr "Wyświetla sekcje tabeli symboli"
-#: src/readelf.c:116
+#: src/readelf.c:120
+#, fuzzy
+msgid "Display (only) the dynamic symbol table"
+msgstr "Wyświetla tylko symbole zewnętrzne"
+
+#: src/readelf.c:121
msgid "Display versioning information"
msgstr "Wyświetla informacje o wersji"
-#: src/readelf.c:117
+#: src/readelf.c:122
msgid "Display the ELF notes"
msgstr "Wyświetla notatki ELF"
-#: src/readelf.c:119
+#: src/readelf.c:124
msgid "Display architecture specific information, if any"
msgstr "Wyświetla informacje dla konkretnej architektury, jeśli są"
-#: src/readelf.c:121
+#: src/readelf.c:126
msgid "Display sections for exception handling"
msgstr "Wyświetla sekcje do obsługi wyjątków"
-#: src/readelf.c:123
+#: src/readelf.c:128
msgid "Additional output selection:"
msgstr "Dodatkowy wybór wyjścia:"
-#: src/readelf.c:125
+#: src/readelf.c:130
#, fuzzy
msgid ""
"Display DWARF section content. SECTION can be one of abbrev, addr, aranges, "
@@ -3938,38 +3943,38 @@ msgstr ""
"decodedaranges, frame, gdb_index, info, loc, line, decodedline, ranges, "
"pubnames, str, macinfo, macro lub exception"
-#: src/readelf.c:129
+#: src/readelf.c:134
msgid "Dump the uninterpreted contents of SECTION, by number or name"
msgstr "Zrzuca niezinterpretowaną zawartość SEKCJI, według liczny lub nazwy"
-#: src/readelf.c:131
+#: src/readelf.c:136
msgid "Print string contents of sections"
msgstr "Wyświetla zawartość ciągów sekcji"
-#: src/readelf.c:134
+#: src/readelf.c:139
msgid "Display the symbol index of an archive"
msgstr "Wyświetla indeks symboli archiwum"
-#: src/readelf.c:136
+#: src/readelf.c:141
msgid "Output control:"
msgstr "Kontrola wyjścia:"
-#: src/readelf.c:138
+#: src/readelf.c:143
msgid "Do not find symbol names for addresses in DWARF data"
msgstr "Bez odnajdywania nazw symboli dla adresów w danych DWARF"
-#: src/readelf.c:140
+#: src/readelf.c:145
msgid ""
"Display just offsets instead of resolving values to addresses in DWARF data"
msgstr ""
"Wyświetla tylko offsety zamiast rozwiązywania wartości na adresy w danych "
"DWARF"
-#: src/readelf.c:142
+#: src/readelf.c:147
msgid "Ignored for compatibility (lines always wide)"
msgstr "Ignorowane dla zgodności (wiersze są zawsze szerokie)"
-#: src/readelf.c:144
+#: src/readelf.c:149
msgid ""
"Show compression information for compressed sections (when used with -S); "
"decompress section before dumping data (when used with -p or -x)"
@@ -3979,156 +3984,156 @@ msgstr ""
"używane z opcją -p lub -x)"
#. Short description of program.
-#: src/readelf.c:149
+#: src/readelf.c:154
msgid "Print information from ELF file in human-readable form."
msgstr "Wyświetla informacje z pliku ELF w postaci czytelnej dla człowieka."
#. Look up once.
-#: src/readelf.c:339
+#: src/readelf.c:350
msgid "yes"
msgstr "tak"
-#: src/readelf.c:340
+#: src/readelf.c:351
msgid "no"
msgstr "nie"
-#: src/readelf.c:532
+#: src/readelf.c:548
#, c-format
msgid "Unknown DWARF debug section `%s'.\n"
msgstr "Nieznana sekcja debugowania DWARF „%sâ€.\n"
-#: src/readelf.c:603 src/readelf.c:714
+#: src/readelf.c:619 src/readelf.c:730
#, c-format
msgid "cannot generate Elf descriptor: %s"
msgstr "nie można utworzyć deskryptora ELF: %s"
-#: src/readelf.c:610 src/readelf.c:937 src/strip.c:1133
+#: src/readelf.c:626 src/readelf.c:953 src/strip.c:1133
#, c-format
msgid "cannot determine number of sections: %s"
msgstr "nie można określić liczby sekcji: %s"
-#: src/readelf.c:628 src/readelf.c:1247 src/readelf.c:1455
+#: src/readelf.c:644 src/readelf.c:1263 src/readelf.c:1471
#, c-format
msgid "cannot get section: %s"
msgstr "nie można uzyskać sekcji: %s"
-#: src/readelf.c:637 src/readelf.c:1254 src/readelf.c:1463 src/readelf.c:12623
-#: src/unstrip.c:395 src/unstrip.c:426 src/unstrip.c:481 src/unstrip.c:600
-#: src/unstrip.c:621 src/unstrip.c:661 src/unstrip.c:873 src/unstrip.c:1204
-#: src/unstrip.c:1331 src/unstrip.c:1355 src/unstrip.c:1398 src/unstrip.c:1462
-#: src/unstrip.c:1636 src/unstrip.c:1770 src/unstrip.c:1913 src/unstrip.c:2008
+#: src/readelf.c:653 src/readelf.c:1270 src/readelf.c:1479 src/readelf.c:12646
+#: src/unstrip.c:395 src/unstrip.c:426 src/unstrip.c:485 src/unstrip.c:604
+#: src/unstrip.c:625 src/unstrip.c:665 src/unstrip.c:881 src/unstrip.c:1212
+#: src/unstrip.c:1339 src/unstrip.c:1363 src/unstrip.c:1419 src/unstrip.c:1483
+#: src/unstrip.c:1658 src/unstrip.c:1809 src/unstrip.c:1952 src/unstrip.c:2051
#, c-format
msgid "cannot get section header: %s"
msgstr "nie można uzyskać nagłówka sekcji: %s"
-#: src/readelf.c:645
+#: src/readelf.c:661
#, c-format
msgid "cannot get section name"
msgstr "nie można uzyskać nazwy sekcji"
-#: src/readelf.c:654 src/readelf.c:6560 src/readelf.c:10486 src/readelf.c:10588
-#: src/readelf.c:10766
+#: src/readelf.c:670 src/readelf.c:6576 src/readelf.c:10502 src/readelf.c:10604
+#: src/readelf.c:10782
#, c-format
msgid "cannot get %s content: %s"
msgstr "nie można uzyskać zwartości %s: %s"
-#: src/readelf.c:670
+#: src/readelf.c:686
#, c-format
msgid "cannot create temp file '%s'"
msgstr "nie można utworzyć pliku tymczasowego „%sâ€"
-#: src/readelf.c:679
+#: src/readelf.c:695
#, c-format
msgid "cannot write section data"
msgstr "nie można zapisać danych sekcji"
-#: src/readelf.c:685 src/readelf.c:702 src/readelf.c:731
+#: src/readelf.c:701 src/readelf.c:718 src/readelf.c:747
#, c-format
msgid "error while closing Elf descriptor: %s"
msgstr "błąd podczas zamykania deskryptora ELF: %s"
-#: src/readelf.c:692
+#: src/readelf.c:708
#, c-format
msgid "error while rewinding file descriptor"
msgstr "błąd podczas przewijania deskryptora pliku"
-#: src/readelf.c:726
+#: src/readelf.c:742
#, c-format
msgid "'%s' is not an archive, cannot print archive index"
msgstr "„%s†nie jest archiwum, nie można wyświetlić indeksu archiwum"
-#: src/readelf.c:830
+#: src/readelf.c:846
#, c-format
msgid "cannot stat input file"
msgstr "nie można wykonać stat na pliku wejściowym"
-#: src/readelf.c:832
+#: src/readelf.c:848
#, c-format
msgid "input file is empty"
msgstr "plik wejściowy jest pusty"
-#: src/readelf.c:834
+#: src/readelf.c:850
#, c-format
msgid "failed reading '%s': %s"
msgstr "odczytanie „%s†się nie powiodło: %s"
-#: src/readelf.c:863
+#: src/readelf.c:879
#, c-format
msgid "No such section '%s' in '%s'"
msgstr "Brak sekcji „%s†w „%sâ€"
-#: src/readelf.c:922
+#: src/readelf.c:938
#, c-format
msgid "cannot read ELF header: %s"
msgstr "nie można odczytać nagłówka ELF: %s"
-#: src/readelf.c:930
+#: src/readelf.c:946
#, c-format
msgid "cannot create EBL handle"
msgstr "nie można utworzyć uchwytu EBL"
-#: src/readelf.c:943
+#: src/readelf.c:959
#, c-format
msgid "cannot determine number of program headers: %s"
msgstr "nie można określić liczby nagłówków programu: %s"
-#: src/readelf.c:975
+#: src/readelf.c:991
#, fuzzy, c-format
msgid "cannot read ELF: %s"
msgstr "nie można odczytać %s: %s"
-#: src/readelf.c:1036
+#: src/readelf.c:1052
msgid "NONE (None)"
msgstr "NONE (żaden)"
-#: src/readelf.c:1037
+#: src/readelf.c:1053
msgid "REL (Relocatable file)"
msgstr "REL (plik relokowalny)"
-#: src/readelf.c:1038
+#: src/readelf.c:1054
msgid "EXEC (Executable file)"
msgstr "EXEC (plik wykonywalny)"
-#: src/readelf.c:1039
+#: src/readelf.c:1055
msgid "DYN (Shared object file)"
msgstr "DYN (plik obiektu współdzielonego)"
-#: src/readelf.c:1040
+#: src/readelf.c:1056
msgid "CORE (Core file)"
msgstr "CORE (plik core)"
-#: src/readelf.c:1045
+#: src/readelf.c:1061
#, c-format
msgid "OS Specific: (%x)\n"
msgstr "Zależny od systemu: (%x)\n"
#. && e_type <= ET_HIPROC always true
-#: src/readelf.c:1047
+#: src/readelf.c:1063
#, c-format
msgid "Processor Specific: (%x)\n"
msgstr "Zależny od procesora: (%x)\n"
-#: src/readelf.c:1057
+#: src/readelf.c:1073
msgid ""
"ELF Header:\n"
" Magic: "
@@ -4136,7 +4141,7 @@ msgstr ""
"Nagłówek ELF:\n"
" Magic: "
-#: src/readelf.c:1061
+#: src/readelf.c:1077
#, c-format
msgid ""
"\n"
@@ -4145,123 +4150,123 @@ msgstr ""
"\n"
" Klasa: %s\n"
-#: src/readelf.c:1066
+#: src/readelf.c:1082
#, c-format
msgid " Data: %s\n"
msgstr " Dane: %s\n"
-#: src/readelf.c:1072
+#: src/readelf.c:1088
#, c-format
msgid " Ident Version: %hhd %s\n"
msgstr " Wersja Ident: %hhd %s\n"
-#: src/readelf.c:1074 src/readelf.c:1096
+#: src/readelf.c:1090 src/readelf.c:1112
msgid "(current)"
msgstr "(bieżąca)"
-#: src/readelf.c:1078
+#: src/readelf.c:1094
#, c-format
msgid " OS/ABI: %s\n"
msgstr " System operacyjny/ABI: %s\n"
-#: src/readelf.c:1081
+#: src/readelf.c:1097
#, c-format
msgid " ABI Version: %hhd\n"
msgstr " Wersja ABI: %hhd\n"
-#: src/readelf.c:1084
+#: src/readelf.c:1100
msgid " Type: "
msgstr " Typ: "
-#: src/readelf.c:1089
+#: src/readelf.c:1105
#, c-format
msgid " Machine: %s\n"
msgstr " Komputer: %s\n"
-#: src/readelf.c:1091
+#: src/readelf.c:1107
#, fuzzy, c-format
msgid " Machine: <unknown>: 0x%x\n"
msgstr " Komputer: %s\n"
-#: src/readelf.c:1094
+#: src/readelf.c:1110
#, c-format
msgid " Version: %d %s\n"
msgstr " Wersja: %d %s\n"
-#: src/readelf.c:1098
+#: src/readelf.c:1114
#, c-format
msgid " Entry point address: %#<PRIx64>\n"
msgstr " Adres punktu wejściowego: %#<PRIx64>\n"
-#: src/readelf.c:1101
+#: src/readelf.c:1117
#, c-format
msgid " Start of program headers: %<PRId64> %s\n"
msgstr " Początek nagłówków programu: %<PRId64> %s\n"
-#: src/readelf.c:1102 src/readelf.c:1105
+#: src/readelf.c:1118 src/readelf.c:1121
msgid "(bytes into file)"
msgstr "(bajtów w pliku)"
-#: src/readelf.c:1104
+#: src/readelf.c:1120
#, c-format
msgid " Start of section headers: %<PRId64> %s\n"
msgstr " Początek nagłówków sekcji: %<PRId64> %s\n"
-#: src/readelf.c:1107
+#: src/readelf.c:1123
#, c-format
msgid " Flags: %s\n"
msgstr " Flagi: %s\n"
-#: src/readelf.c:1110
+#: src/readelf.c:1126
#, c-format
msgid " Size of this header: %<PRId16> %s\n"
msgstr " Rozmiar tego nagłówka: %<PRId16> %s\n"
-#: src/readelf.c:1111 src/readelf.c:1114 src/readelf.c:1131
+#: src/readelf.c:1127 src/readelf.c:1130 src/readelf.c:1147
msgid "(bytes)"
msgstr "(bajtów)"
-#: src/readelf.c:1113
+#: src/readelf.c:1129
#, c-format
msgid " Size of program header entries: %<PRId16> %s\n"
msgstr " Rozmiar wpisów nagłówka programu: %<PRId16> %s\n"
-#: src/readelf.c:1116
+#: src/readelf.c:1132
#, c-format
msgid " Number of program headers entries: %<PRId16>"
msgstr " Liczba wpisów nagłówków programu: %<PRId16>"
-#: src/readelf.c:1123
+#: src/readelf.c:1139
#, c-format
msgid " (%<PRIu32> in [0].sh_info)"
msgstr " (%<PRIu32> w [0].sh_info)"
-#: src/readelf.c:1126 src/readelf.c:1143 src/readelf.c:1157
+#: src/readelf.c:1142 src/readelf.c:1159 src/readelf.c:1173
msgid " ([0] not available)"
msgstr " ([0] niedostępny)"
-#: src/readelf.c:1130
+#: src/readelf.c:1146
#, c-format
msgid " Size of section header entries: %<PRId16> %s\n"
msgstr " Rozmiar wpisów nagłówka sekcji: %<PRId16> %s\n"
-#: src/readelf.c:1133
+#: src/readelf.c:1149
#, c-format
msgid " Number of section headers entries: %<PRId16>"
msgstr " Liczba wpisów nagłówków sekcji: %<PRId16>"
-#: src/readelf.c:1140
+#: src/readelf.c:1156
#, c-format
msgid " (%<PRIu32> in [0].sh_size)"
msgstr " (%<PRIu32> w [0].sh_size)"
#. We managed to get the zeroth section.
-#: src/readelf.c:1153
+#: src/readelf.c:1169
#, c-format
msgid " (%<PRIu32> in [0].sh_link)"
msgstr " (%<PRIu32> w [0].sh_link)"
-#: src/readelf.c:1161
+#: src/readelf.c:1177
#, c-format
msgid ""
" Section header string table index: XINDEX%s\n"
@@ -4270,7 +4275,7 @@ msgstr ""
" Indeks tabeli ciągów nagłówków sekcji: XINDEX%s\n"
"\n"
-#: src/readelf.c:1165
+#: src/readelf.c:1181
#, c-format
msgid ""
" Section header string table index: %<PRId16>\n"
@@ -4279,12 +4284,12 @@ msgstr ""
" Indeks tabeli ciągów nagłówków sekcji: %<PRId16>\n"
"\n"
-#: src/readelf.c:1212 src/readelf.c:1420
+#: src/readelf.c:1228 src/readelf.c:1436
#, fuzzy, c-format
msgid "cannot get number of sections: %s"
msgstr "nie można określić liczby sekcji: %s"
-#: src/readelf.c:1215
+#: src/readelf.c:1231
#, fuzzy, c-format
msgid ""
"There are %zd section headers, starting at offset %#<PRIx64>:\n"
@@ -4293,16 +4298,16 @@ msgstr ""
"Jest %d nagłówków sekcji, rozpoczynających się od offsetu %#<PRIx64>:\n"
"\n"
-#: src/readelf.c:1224
+#: src/readelf.c:1240
#, fuzzy, 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"
-#: src/readelf.c:1227
+#: src/readelf.c:1243
msgid "Section Headers:"
msgstr "Nagłówki sekcji:"
-#: src/readelf.c:1230
+#: src/readelf.c:1246
msgid ""
"[Nr] Name Type Addr Off Size ES Flags Lk "
"Inf Al"
@@ -4310,7 +4315,7 @@ msgstr ""
"[Nr] Nazwa Typ Adres Offset Rozm. ES Flagi Lk "
"Inf Al"
-#: src/readelf.c:1232
+#: src/readelf.c:1248
msgid ""
"[Nr] Name Type Addr Off Size ES "
"Flags Lk Inf Al"
@@ -4318,36 +4323,36 @@ msgstr ""
"[Nr] Nazwa Typ Adres Offset Rozmiar ES "
"Flagi Lk Inf Al"
-#: src/readelf.c:1237
+#: src/readelf.c:1253
msgid " [Compression Size Al]"
msgstr " [Kompresja Rozmiar Al]"
-#: src/readelf.c:1239
+#: src/readelf.c:1255
msgid " [Compression Size Al]"
msgstr " [Kompresja Rozmiar Al]"
-#: src/readelf.c:1315
+#: src/readelf.c:1331
#, c-format
msgid "bad compression header for section %zd: %s"
msgstr "błędny nagłówek kompresji dla sekcji %zd: %s"
-#: src/readelf.c:1326
+#: src/readelf.c:1342
#, c-format
msgid "bad gnu compressed size for section %zd: %s"
msgstr "błędny rozmiar kompresji gnu dla sekcji %zd: %s"
-#: src/readelf.c:1344
+#: src/readelf.c:1360
msgid "Program Headers:"
msgstr "Nagłówki programu:"
-#: src/readelf.c:1346
+#: src/readelf.c:1362
msgid ""
" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align"
msgstr ""
" Typ Offset AdresWirt AdresFiz RozmPlik RozmPam Flg "
"Wyrównanie"
-#: src/readelf.c:1349
+#: src/readelf.c:1365
msgid ""
" Type Offset VirtAddr PhysAddr FileSiz "
"MemSiz Flg Align"
@@ -4355,12 +4360,12 @@ msgstr ""
" Typ Offset AdresWirtualny AdresFizyczny RozmPlik "
"RozmPam Flg Wyrównanie"
-#: src/readelf.c:1406
+#: src/readelf.c:1422
#, c-format
msgid "\t[Requesting program interpreter: %s]\n"
msgstr "\t[Wywołanie interpretera programu: %s]\n"
-#: src/readelf.c:1433
+#: src/readelf.c:1449
msgid ""
"\n"
" Section to Segment mapping:\n"
@@ -4370,12 +4375,12 @@ msgstr ""
" Mapowanie sekcji do segmentów:\n"
" Segment sekcji…"
-#: src/readelf.c:1444 src/unstrip.c:2067 src/unstrip.c:2109 src/unstrip.c:2116
+#: src/readelf.c:1460 src/unstrip.c:2110 src/unstrip.c:2152 src/unstrip.c:2159
#, c-format
msgid "cannot get program header: %s"
msgstr "nie można uzyskać nagłówka programu: %s"
-#: src/readelf.c:1590
+#: src/readelf.c:1606
#, c-format
msgid ""
"\n"
@@ -4393,7 +4398,7 @@ msgstr[2] ""
"\n"
"Grupa sekcji COMDAT [%2zu] „%s†z podpisem „%s†zawiera %zu wpisów:\n"
-#: src/readelf.c:1595
+#: src/readelf.c:1611
#, c-format
msgid ""
"\n"
@@ -4411,31 +4416,31 @@ msgstr[2] ""
"\n"
"Grupa sekcji [%2zu] „%s†z podpisem „%s†zawiera %zu wpisów:\n"
-#: src/readelf.c:1603
+#: src/readelf.c:1619
msgid "<INVALID SYMBOL>"
msgstr "<NIEPRAWIDÅOWY SYMBOL>"
-#: src/readelf.c:1617
+#: src/readelf.c:1633
msgid "<INVALID SECTION>"
msgstr "<NIEPRAWIDÅOWY SEKCJA>"
-#: src/readelf.c:1640 src/readelf.c:2367 src/readelf.c:3468 src/readelf.c:12494
-#: src/readelf.c:12501 src/readelf.c:12545 src/readelf.c:12552
+#: src/readelf.c:1656 src/readelf.c:2383 src/readelf.c:3484 src/readelf.c:12517
+#: src/readelf.c:12524 src/readelf.c:12568 src/readelf.c:12575
msgid "Couldn't uncompress section"
msgstr "Nie można dekompresować sekcji"
-#: src/readelf.c:1645 src/readelf.c:2372 src/readelf.c:3473
+#: src/readelf.c:1661 src/readelf.c:2388 src/readelf.c:3489
#, c-format
msgid "cannot get section [%zd] header: %s"
msgstr "nie można uzyskać nagłówka sekcji [%zd]: %s"
-#: src/readelf.c:1789 src/readelf.c:2439 src/readelf.c:2697 src/readelf.c:2773
-#: src/readelf.c:3077 src/readelf.c:3151 src/readelf.c:5348
+#: src/readelf.c:1805 src/readelf.c:2455 src/readelf.c:2713 src/readelf.c:2789
+#: src/readelf.c:3093 src/readelf.c:3167 src/readelf.c:5364
#, c-format
msgid "invalid sh_link value in section %zu"
msgstr "nieprawidłowa wartość sh_link w sekcji %zu"
-#: src/readelf.c:1792
+#: src/readelf.c:1808
#, c-format
msgid ""
"\n"
@@ -4461,36 +4466,36 @@ msgstr[2] ""
" Adres: %#0*<PRIx64> Offset: %#08<PRIx64> DowiÄ…zanie do sekcji: [%2u] "
"'%s'\n"
-#: src/readelf.c:1802
+#: src/readelf.c:1818
msgid " Type Value\n"
msgstr " Typ Wartość\n"
-#: src/readelf.c:1826
+#: src/readelf.c:1842
#, c-format
msgid "Shared library: [%s]\n"
msgstr "Biblioteka współdzielona: [%s]\n"
-#: src/readelf.c:1831
+#: src/readelf.c:1847
#, c-format
msgid "Library soname: [%s]\n"
msgstr "soname biblioteki: [%s]\n"
-#: src/readelf.c:1836
+#: src/readelf.c:1852
#, c-format
msgid "Library rpath: [%s]\n"
msgstr "rpath biblioteki: [%s]\n"
-#: src/readelf.c:1841
+#: src/readelf.c:1857
#, c-format
msgid "Library runpath: [%s]\n"
msgstr "runpath biblioteki: [%s]\n"
-#: src/readelf.c:1861
+#: src/readelf.c:1877
#, c-format
msgid "%<PRId64> (bytes)\n"
msgstr "%<PRId64> (bajtów)\n"
-#: src/readelf.c:1974 src/readelf.c:2164
+#: src/readelf.c:1990 src/readelf.c:2180
#, c-format
msgid ""
"\n"
@@ -4499,7 +4504,7 @@ msgstr ""
"\n"
"Nieprawidłowa tabela symboli pod offsetem %#0<PRIx64>\n"
-#: src/readelf.c:1992 src/readelf.c:2182
+#: src/readelf.c:2008 src/readelf.c:2198
#, c-format
msgid ""
"\n"
@@ -4528,7 +4533,7 @@ msgstr[2] ""
#. The .rela.dyn section does not refer to a specific section but
#. instead of section index zero. Do not try to print a section
#. name.
-#: src/readelf.c:2007 src/readelf.c:2197
+#: src/readelf.c:2023 src/readelf.c:2213
#, c-format
msgid ""
"\n"
@@ -4546,30 +4551,30 @@ msgstr[2] ""
"\n"
"Sekcja relokacji [%2u] „%s†pod offsetem %#0<PRIx64> zawiera %d wpisów:\n"
-#: src/readelf.c:2017
+#: src/readelf.c:2033
msgid " Offset Type Value Name\n"
msgstr " Offset Typ Wartość Nazwa\n"
-#: src/readelf.c:2019
+#: src/readelf.c:2035
msgid " Offset Type Value Name\n"
msgstr " Offset Typ Wartość Nazwa\n"
-#: src/readelf.c:2072 src/readelf.c:2083 src/readelf.c:2096 src/readelf.c:2117
-#: src/readelf.c:2129 src/readelf.c:2263 src/readelf.c:2275 src/readelf.c:2289
-#: src/readelf.c:2311 src/readelf.c:2324
+#: src/readelf.c:2088 src/readelf.c:2099 src/readelf.c:2112 src/readelf.c:2133
+#: src/readelf.c:2145 src/readelf.c:2279 src/readelf.c:2291 src/readelf.c:2305
+#: src/readelf.c:2327 src/readelf.c:2340
msgid "<INVALID RELOC>"
msgstr "<NIEPRAWIDÅOWA RELOKACJA>"
-#: src/readelf.c:2207
+#: src/readelf.c:2223
msgid " Offset Type Value Addend Name\n"
msgstr " Offset Typ Wartość Koniec Nazwa\n"
-#: src/readelf.c:2209
+#: src/readelf.c:2225
msgid " Offset Type Value Addend Name\n"
msgstr ""
" Offset Typ Wartość Koniec Nazwa\n"
-#: src/readelf.c:2447
+#: src/readelf.c:2463
#, c-format
msgid ""
"\n"
@@ -4587,7 +4592,7 @@ msgstr[2] ""
"\n"
"Tabela symboli [%2u] „%s†zawiera %u wpisów:\n"
-#: src/readelf.c:2452
+#: src/readelf.c:2468
#, c-format
msgid " %lu local symbol String table: [%2u] '%s'\n"
msgid_plural " %lu local symbols String table: [%2u] '%s'\n"
@@ -4595,33 +4600,33 @@ msgstr[0] " %lu symbol lokalny Tabela ciÄ…gów: [%2u] „%sâ€\n"
msgstr[1] " %lu symbole lokalne Tabela ciÄ…gów: [%2u] „%sâ€\n"
msgstr[2] " %lu symboli lokalnych Tabela ciÄ…gów: [%2u] „%sâ€\n"
-#: src/readelf.c:2460
+#: src/readelf.c:2476
msgid " Num: Value Size Type Bind Vis Ndx Name\n"
msgstr " Numer: Wartość Rozm Typ Bind Widoczność Ndx Nazwa\n"
-#: src/readelf.c:2462
+#: src/readelf.c:2478
msgid " Num: Value Size Type Bind Vis Ndx Name\n"
msgstr " Numer: Wartość Rozm Typ Bind Widoczność Ndx Nazwa\n"
-#: src/readelf.c:2482
+#: src/readelf.c:2498
#, c-format
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:2570
+#: src/readelf.c:2586
#, c-format
msgid "bad dynamic symbol"
msgstr "błędny symbol dynamiczny"
-#: src/readelf.c:2652
+#: src/readelf.c:2668
msgid "none"
msgstr "brak"
-#: src/readelf.c:2669
+#: src/readelf.c:2685
msgid "| <unknown>"
msgstr "| <nieznany>"
-#: src/readelf.c:2700
+#: src/readelf.c:2716
#, c-format
msgid ""
"\n"
@@ -4647,17 +4652,17 @@ msgstr[2] ""
" Adres: %#0*<PRIx64> Offset: %#08<PRIx64> DowiÄ…zanie do sekcji: [%2u] "
"„%sâ€\n"
-#: src/readelf.c:2721
+#: src/readelf.c:2737
#, c-format
msgid " %#06x: Version: %hu File: %s Cnt: %hu\n"
msgstr " %#06x: Wersja: %hu Plik: %s Licznik: %hu\n"
-#: src/readelf.c:2734
+#: src/readelf.c:2750
#, c-format
msgid " %#06x: Name: %s Flags: %s Version: %hu\n"
msgstr " %#06x: Nazwa: %s Flagi: %s Wersja: %hu\n"
-#: src/readelf.c:2777
+#: src/readelf.c:2793
#, c-format
msgid ""
"\n"
@@ -4683,19 +4688,19 @@ msgstr[2] ""
" Adres: %#0*<PRIx64> Offset: %#08<PRIx64> DowiÄ…zanie do sekcji: [%2u] "
"„%sâ€\n"
-#: src/readelf.c:2805
+#: src/readelf.c:2821
#, 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:2820
+#: src/readelf.c:2836
#, c-format
msgid " %#06x: Parent %d: %s\n"
msgstr " %#06x: Rodzic %d: %s\n"
#. Print the header.
-#: src/readelf.c:3081
+#: src/readelf.c:3097
#, c-format
msgid ""
"\n"
@@ -4718,15 +4723,15 @@ msgstr[2] ""
"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:3109
+#: src/readelf.c:3125
msgid " 0 *local* "
msgstr " 0 *lokalny* "
-#: src/readelf.c:3114
+#: src/readelf.c:3130
msgid " 1 *global* "
msgstr " 1 *globalny* "
-#: src/readelf.c:3156
+#: src/readelf.c:3172
#, c-format
msgid ""
"\n"
@@ -4757,22 +4762,22 @@ msgstr[2] ""
" Adres: %#0*<PRIx64> Offset: %#08<PRIx64> DowiÄ…zanie do sekcji: [%2u] "
"„%sâ€\n"
-#: src/readelf.c:3178
+#: src/readelf.c:3194
#, no-c-format
msgid " Length Number % of total Coverage\n"
msgstr " Długość Liczba % całości Pokrycie\n"
-#: src/readelf.c:3180
+#: src/readelf.c:3196
#, c-format
msgid " 0 %6<PRIu32> %5.1f%%\n"
msgstr " 0 %6<PRIu32> %5.1f%%\n"
-#: src/readelf.c:3187
+#: src/readelf.c:3203
#, c-format
msgid "%7d %6<PRIu32> %5.1f%% %5.1f%%\n"
msgstr "%7d %6<PRIu32> %5.1f%% %5.1f%%\n"
-#: src/readelf.c:3200
+#: src/readelf.c:3216
#, c-format
msgid ""
" Average number of tests: successful lookup: %f\n"
@@ -4781,37 +4786,37 @@ msgstr ""
" Średnia liczba testów: udane wyszukania: %f\n"
"\t\t\t nieudane wyszukania: %f\n"
-#: src/readelf.c:3218 src/readelf.c:3282 src/readelf.c:3348
+#: src/readelf.c:3234 src/readelf.c:3298 src/readelf.c:3364
#, c-format
msgid "cannot get data for section %d: %s"
msgstr "nie można uzyskać danych dla sekcji %d: %s"
-#: src/readelf.c:3226
+#: src/readelf.c:3242
#, c-format
msgid "invalid data in sysv.hash section %d"
msgstr "nieprawidłowe dane w sekcji sysv.hash %d"
-#: src/readelf.c:3255
+#: src/readelf.c:3271
#, fuzzy, c-format
msgid "invalid chain in sysv.hash section %d"
msgstr "nieprawidłowe dane w sekcji sysv.hash %d"
-#: src/readelf.c:3290
+#: src/readelf.c:3306
#, c-format
msgid "invalid data in sysv.hash64 section %d"
msgstr "nieprawidłowe dane w sekcji sysv.hash64 %d"
-#: src/readelf.c:3321
+#: src/readelf.c:3337
#, fuzzy, c-format
msgid "invalid chain in sysv.hash64 section %d"
msgstr "nieprawidłowe dane w sekcji sysv.hash64 %d"
-#: src/readelf.c:3357
+#: src/readelf.c:3373
#, c-format
msgid "invalid data in gnu.hash section %d"
msgstr "nieprawidłowe dane w sekcji gnu.hash %d"
-#: src/readelf.c:3424
+#: src/readelf.c:3440
#, c-format
msgid ""
" Symbol Bias: %u\n"
@@ -4821,7 +4826,7 @@ msgstr ""
" Rozmiar maski bitowej: %zu bajtów %<PRIuFAST32>%% bitów ustawionych "
"drugie przesunięcie skrótu: %u\n"
-#: src/readelf.c:3513
+#: src/readelf.c:3529
#, c-format
msgid ""
"\n"
@@ -4842,7 +4847,7 @@ msgstr[2] ""
"Sekcja listy bibliotek [%2zu] „%s†pod offsetem %#0<PRIx64> zawiera %d "
"wpisów:\n"
-#: src/readelf.c:3527
+#: src/readelf.c:3543
msgid ""
" Library Time Stamp Checksum Version "
"Flags"
@@ -4850,7 +4855,7 @@ msgstr ""
" Biblioteka Oznaczenie czasu Suma k. Wersja "
"Flagi"
-#: src/readelf.c:3579
+#: src/readelf.c:3595
#, c-format
msgid ""
"\n"
@@ -4861,102 +4866,102 @@ msgstr ""
"Sekcja atrybutów obiektu [%2zu] „%s†%<PRIu64> bajtów pod offsetem "
"%#0<PRIx64>:\n"
-#: src/readelf.c:3596
+#: src/readelf.c:3612
msgid " Owner Size\n"
msgstr " Właściciel Rozmiar\n"
-#: src/readelf.c:3625
+#: src/readelf.c:3641
#, c-format
msgid " %-13s %4<PRIu32>\n"
msgstr " %-13s %4<PRIu32>\n"
#. Unknown subsection, print and skip.
-#: src/readelf.c:3664
+#: src/readelf.c:3680
#, c-format
msgid " %-4u %12<PRIu32>\n"
msgstr " %-4u %12<PRIu32>\n"
#. Tag_File
-#: src/readelf.c:3669
+#: src/readelf.c:3685
#, c-format
msgid " File: %11<PRIu32>\n"
msgstr " Plik: %11<PRIu32>\n"
-#: src/readelf.c:3718
+#: src/readelf.c:3734
#, c-format
msgid " %s: %<PRId64>, %s\n"
msgstr " %s: %<PRId64>, %s\n"
-#: src/readelf.c:3721
+#: src/readelf.c:3737
#, c-format
msgid " %s: %<PRId64>\n"
msgstr " %s: %<PRId64>\n"
-#: src/readelf.c:3724
+#: src/readelf.c:3740
#, c-format
msgid " %s: %s\n"
msgstr " %s: %s\n"
-#: src/readelf.c:3734
+#: src/readelf.c:3750
#, c-format
msgid " %u: %<PRId64>\n"
msgstr " %u: %<PRId64>\n"
-#: src/readelf.c:3737
+#: src/readelf.c:3753
#, c-format
msgid " %u: %s\n"
msgstr " %u: %s\n"
-#: src/readelf.c:3807
+#: src/readelf.c:3823
#, fuzzy, c-format
msgid "sprintf failure"
msgstr "mprotect się nie powiodło"
-#: src/readelf.c:4289
+#: src/readelf.c:4305
msgid "empty block"
msgstr "pusty blok"
-#: src/readelf.c:4292
+#: src/readelf.c:4308
#, c-format
msgid "%zu byte block:"
msgstr "%zu bajtowy blok:"
-#: src/readelf.c:4770
+#: src/readelf.c:4786
#, fuzzy, c-format
msgid "%*s[%2<PRIuMAX>] %s <TRUNCATED>\n"
msgstr "%*s[%4<PRIuMAX>] %s <SKRÓCONE>\n"
-#: src/readelf.c:4834
+#: src/readelf.c:4850
#, 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:4841
+#: src/readelf.c:4857
#, 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:4848
+#: src/readelf.c:4864
#, 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:4855
+#: src/readelf.c:4871
#, fuzzy, c-format
msgid "%s %#<PRIx64> used with different attribute %s and %s"
msgstr "%s %#<PRIx64> zostało użyte z różnymi rozmiarami adresu"
-#: src/readelf.c:4952
+#: src/readelf.c:4968
#, c-format
msgid " [%6tx] <UNUSED GARBAGE IN REST OF SECTION>\n"
msgstr " [%6tx] <NIEUŻYWANE ŚMIECIE W RESZCIE SEKCJI>\n"
-#: src/readelf.c:4960
+#: src/readelf.c:4976
#, c-format
msgid " [%6tx] <UNUSED GARBAGE> ... %<PRIu64> bytes ...\n"
msgstr " [%6tx] <NIEUŻYWANE ŚMIECIE>… %<PRIu64> bajtów…\n"
-#: src/readelf.c:5038
+#: src/readelf.c:5054
#, c-format
msgid ""
"\n"
@@ -4967,7 +4972,7 @@ msgstr ""
"Sekcja DWARF [%2zu] „%s†pod offsetem %#<PRIx64>:\n"
" [ Kod]\n"
-#: src/readelf.c:5046
+#: src/readelf.c:5062
#, c-format
msgid ""
"\n"
@@ -4976,20 +4981,20 @@ msgstr ""
"\n"
"Sekcja skrótów pod offsetem %<PRIu64>:\n"
-#: src/readelf.c:5059
+#: src/readelf.c:5075
#, c-format
msgid " *** error while reading abbreviation: %s\n"
msgstr " *** błąd podczas odczytywania skrótu: %s\n"
-#: src/readelf.c:5075
+#: src/readelf.c:5091
#, c-format
msgid " [%5u] offset: %<PRId64>, children: %s, tag: %s\n"
msgstr " [%5u] offset: %<PRId64>, potomek: %s, znacznik: %s\n"
-#: src/readelf.c:5108 src/readelf.c:5417 src/readelf.c:5584 src/readelf.c:5969
-#: src/readelf.c:6570 src/readelf.c:8307 src/readelf.c:8993 src/readelf.c:9429
-#: src/readelf.c:9674 src/readelf.c:9840 src/readelf.c:10227
-#: src/readelf.c:10287
+#: src/readelf.c:5124 src/readelf.c:5433 src/readelf.c:5600 src/readelf.c:5985
+#: src/readelf.c:6586 src/readelf.c:8323 src/readelf.c:9009 src/readelf.c:9445
+#: src/readelf.c:9690 src/readelf.c:9856 src/readelf.c:10243
+#: src/readelf.c:10303
#, c-format
msgid ""
"\n"
@@ -4998,56 +5003,56 @@ msgstr ""
"\n"
"Sekcja DWARF [%2zu] „%s†pod offsetem %#<PRIx64>:\n"
-#: src/readelf.c:5121
+#: src/readelf.c:5137
#, fuzzy, c-format
msgid "cannot get .debug_addr section data: %s"
msgstr "nie można uzyskać danych sekcji: %s"
-#: src/readelf.c:5221 src/readelf.c:5245 src/readelf.c:5629 src/readelf.c:9038
+#: src/readelf.c:5237 src/readelf.c:5261 src/readelf.c:5645 src/readelf.c:9054
#, fuzzy, c-format
msgid " Length: %8<PRIu64>\n"
msgstr ""
"\n"
" Długość: %6<PRIu64>\n"
-#: src/readelf.c:5223 src/readelf.c:5260 src/readelf.c:5642 src/readelf.c:9051
+#: src/readelf.c:5239 src/readelf.c:5276 src/readelf.c:5658 src/readelf.c:9067
#, fuzzy, c-format
msgid " DWARF version: %8<PRIu16>\n"
msgstr " Wersja DWARF: %6<PRIuFAST16>\n"
-#: src/readelf.c:5224 src/readelf.c:5269 src/readelf.c:5651 src/readelf.c:9060
+#: src/readelf.c:5240 src/readelf.c:5285 src/readelf.c:5667 src/readelf.c:9076
#, fuzzy, c-format
msgid " Address size: %8<PRIu64>\n"
msgstr " Offset adresu: %6<PRIu64>\n"
-#: src/readelf.c:5226 src/readelf.c:5279 src/readelf.c:5661 src/readelf.c:9070
+#: src/readelf.c:5242 src/readelf.c:5295 src/readelf.c:5677 src/readelf.c:9086
#, fuzzy, c-format
msgid " Segment size: %8<PRIu64>\n"
msgstr ""
" Rozmiar segmentu: %6<PRIu64>\n"
"\n"
-#: src/readelf.c:5264 src/readelf.c:5646 src/readelf.c:9055 src/readelf.c:10419
+#: src/readelf.c:5280 src/readelf.c:5662 src/readelf.c:9071 src/readelf.c:10435
#, fuzzy, c-format
msgid "Unknown version"
msgstr "nieznana wersja"
-#: src/readelf.c:5274 src/readelf.c:5487 src/readelf.c:5656 src/readelf.c:9065
+#: src/readelf.c:5290 src/readelf.c:5503 src/readelf.c:5672 src/readelf.c:9081
#, c-format
msgid "unsupported address size"
msgstr "nieobsługiwany rozmiar adresu"
-#: src/readelf.c:5285 src/readelf.c:5498 src/readelf.c:5666 src/readelf.c:9075
+#: src/readelf.c:5301 src/readelf.c:5514 src/readelf.c:5682 src/readelf.c:9091
#, c-format
msgid "unsupported segment size"
msgstr "nieobsługiwany rozmiar segmentu"
-#: src/readelf.c:5338 src/readelf.c:5412
+#: src/readelf.c:5354 src/readelf.c:5428
#, c-format
msgid "cannot get .debug_aranges content: %s"
msgstr "nie można uzyskać zawartości .debug_aranges: %s"
-#: src/readelf.c:5353
+#: src/readelf.c:5369
#, c-format
msgid ""
"\n"
@@ -5065,12 +5070,12 @@ msgstr[2] ""
"\n"
"Sekcja DWARF [%2zu] „%s†pod offsetem %#<PRIx64> zawiera %zu wpisów:\n"
-#: src/readelf.c:5384
+#: src/readelf.c:5400
#, c-format
msgid " [%*zu] ???\n"
msgstr " [%*zu] ???\n"
-#: src/readelf.c:5386
+#: src/readelf.c:5402
#, c-format
msgid ""
" [%*zu] start: %0#*<PRIx64>, length: %5<PRIu64>, CU DIE offset: %6<PRId64>\n"
@@ -5078,7 +5083,7 @@ msgstr ""
" [%*zu] początek: %0#*<PRIx64>, długość: %5<PRIu64>, offset CU DIE: "
"%6<PRId64>\n"
-#: src/readelf.c:5430 src/readelf.c:8334
+#: src/readelf.c:5446 src/readelf.c:8350
#, c-format
msgid ""
"\n"
@@ -5087,13 +5092,13 @@ msgstr ""
"\n"
"Tabela pod offsetem %zu:\n"
-#: src/readelf.c:5434 src/readelf.c:5610 src/readelf.c:6594 src/readelf.c:8345
-#: src/readelf.c:9019
+#: src/readelf.c:5450 src/readelf.c:5626 src/readelf.c:6610 src/readelf.c:8361
+#: src/readelf.c:9035
#, c-format
msgid "invalid data in section [%zu] '%s'"
msgstr "nieprawidÅ‚owe dane w sekcji [%zu] „%sâ€"
-#: src/readelf.c:5450
+#: src/readelf.c:5466
#, c-format
msgid ""
"\n"
@@ -5102,27 +5107,27 @@ msgstr ""
"\n"
" Długość: %6<PRIu64>\n"
-#: src/readelf.c:5462
+#: src/readelf.c:5478
#, c-format
msgid " DWARF version: %6<PRIuFAST16>\n"
msgstr " Wersja DWARF: %6<PRIuFAST16>\n"
-#: src/readelf.c:5466
+#: src/readelf.c:5482
#, c-format
msgid "unsupported aranges version"
msgstr "nieobsługiwana wersja aranges"
-#: src/readelf.c:5477
+#: src/readelf.c:5493
#, c-format
msgid " CU offset: %6<PRIx64>\n"
msgstr " Offset CU: %6<PRIx64>\n"
-#: src/readelf.c:5483
+#: src/readelf.c:5499
#, c-format
msgid " Address size: %6<PRIu64>\n"
msgstr " Offset adresu: %6<PRIu64>\n"
-#: src/readelf.c:5494
+#: src/readelf.c:5510
#, c-format
msgid ""
" Segment size: %6<PRIu64>\n"
@@ -5131,111 +5136,111 @@ msgstr ""
" Rozmiar segmentu: %6<PRIu64>\n"
"\n"
-#: src/readelf.c:5549
+#: src/readelf.c:5565
#, c-format
msgid " %zu padding bytes\n"
msgstr " bajty wypełnienia: %zu\n"
-#: src/readelf.c:5593
+#: src/readelf.c:5609
#, fuzzy, c-format
msgid "cannot get .debug_rnglists content: %s"
msgstr "nie można uzyskać zawartości .debug_ranges: %s"
-#: src/readelf.c:5616 src/readelf.c:9025
+#: src/readelf.c:5632 src/readelf.c:9041
#, fuzzy, c-format
msgid ""
"Table at Offset 0x%<PRIx64>:\n"
"\n"
msgstr " Offset .debug_line: 0x%<PRIx64>\n"
-#: src/readelf.c:5671 src/readelf.c:9080
+#: src/readelf.c:5687 src/readelf.c:9096
#, fuzzy, c-format
msgid " Offset entries: %8<PRIu64>\n"
msgstr " Długość offsetu: %<PRIu8>\n"
-#: src/readelf.c:5687 src/readelf.c:9096
+#: src/readelf.c:5703 src/readelf.c:9112
#, c-format
msgid " Unknown CU base: "
msgstr ""
-#: src/readelf.c:5689 src/readelf.c:9098
+#: src/readelf.c:5705 src/readelf.c:9114
#, c-format
msgid " CU [%6<PRIx64>] base: "
msgstr ""
-#: src/readelf.c:5695 src/readelf.c:9104
+#: src/readelf.c:5711 src/readelf.c:9120
#, c-format
msgid " Not associated with a CU.\n"
msgstr ""
-#: src/readelf.c:5706 src/readelf.c:9115
+#: src/readelf.c:5722 src/readelf.c:9131
#, c-format
msgid "too many offset entries for unit length"
msgstr ""
-#: src/readelf.c:5710 src/readelf.c:9119
+#: src/readelf.c:5726 src/readelf.c:9135
#, fuzzy, c-format
msgid " Offsets starting at 0x%<PRIx64>:\n"
msgstr " Offset: 0x%<PRIx64>\n"
-#: src/readelf.c:5762
+#: src/readelf.c:5778
#, fuzzy, c-format
msgid "invalid range list data"
msgstr "nieprawidłowe dane"
-#: src/readelf.c:5947 src/readelf.c:9407
+#: src/readelf.c:5963 src/readelf.c:9423
#, fuzzy, c-format
msgid ""
" %zu padding bytes\n"
"\n"
msgstr " bajty wypełnienia: %zu\n"
-#: src/readelf.c:5964
+#: src/readelf.c:5980
#, c-format
msgid "cannot get .debug_ranges content: %s"
msgstr "nie można uzyskać zawartości .debug_ranges: %s"
-#: src/readelf.c:6000 src/readelf.c:9462
+#: src/readelf.c:6016 src/readelf.c:9478
#, c-format
msgid ""
"\n"
" Unknown CU base: "
msgstr ""
-#: src/readelf.c:6002 src/readelf.c:9464
+#: src/readelf.c:6018 src/readelf.c:9480
#, c-format
msgid ""
"\n"
" CU [%6<PRIx64>] base: "
msgstr ""
-#: src/readelf.c:6011 src/readelf.c:9490 src/readelf.c:9516
+#: src/readelf.c:6027 src/readelf.c:9506 src/readelf.c:9532
#, c-format
msgid " [%6tx] <INVALID DATA>\n"
msgstr " [%6tx] <NIEPRAWIDÅOWE DANE>\n"
-#: src/readelf.c:6032 src/readelf.c:9596
+#: src/readelf.c:6048 src/readelf.c:9612
#, fuzzy, c-format
msgid ""
" [%6tx] base address\n"
" "
msgstr " [%6tx] adres podstawowy %s\n"
-#: src/readelf.c:6040 src/readelf.c:9604
+#: src/readelf.c:6056 src/readelf.c:9620
#, fuzzy, c-format
msgid " [%6tx] empty list\n"
msgstr " [%6tx] pusta lista\n"
-#: src/readelf.c:6295
+#: src/readelf.c:6311
msgid " <INVALID DATA>\n"
msgstr " <NIEPRAWIDÅOWE DANE>\n"
-#: src/readelf.c:6548
+#: src/readelf.c:6564
#, c-format
msgid "cannot get ELF: %s"
msgstr "nie można uzyskać ELF: %s"
-#: src/readelf.c:6566
+#: src/readelf.c:6582
#, c-format
msgid ""
"\n"
@@ -5244,7 +5249,7 @@ msgstr ""
"\n"
"Sekcja informacji o ramce wywołania [%2zu] „%s†pod offsetem %#<PRIx64>:\n"
-#: src/readelf.c:6616
+#: src/readelf.c:6632
#, c-format
msgid ""
"\n"
@@ -5253,65 +5258,65 @@ msgstr ""
"\n"
" [%6tx] Zerowy koniec\n"
-#: src/readelf.c:6717 src/readelf.c:6871
+#: src/readelf.c:6733 src/readelf.c:6887
#, c-format
msgid "invalid augmentation length"
msgstr "nieprawidłowa długość powiększenia"
-#: src/readelf.c:6732
+#: src/readelf.c:6748
msgid "FDE address encoding: "
msgstr "Kodowanie adresu FDE: "
-#: src/readelf.c:6738
+#: src/readelf.c:6754
msgid "LSDA pointer encoding: "
msgstr "Kodowanie wskaźnika LSDA: "
-#: src/readelf.c:6848
+#: src/readelf.c:6864
#, c-format
msgid " (offset: %#<PRIx64>)"
msgstr " (offset: %#<PRIx64>)"
-#: src/readelf.c:6855
+#: src/readelf.c:6871
#, c-format
msgid " (end offset: %#<PRIx64>)"
msgstr " (kończący offset: %#<PRIx64>)"
-#: src/readelf.c:6892
+#: src/readelf.c:6908
#, c-format
msgid " %-26sLSDA pointer: %#<PRIx64>\n"
msgstr " %-26sWskaźnik LSDA: %#<PRIx64>\n"
-#: src/readelf.c:6977
+#: src/readelf.c:6993
#, fuzzy, c-format
msgid "DIE [%<PRIx64>] cannot get attribute code: %s"
msgstr "nie można uzyskać kodu atrybutu: %s"
-#: src/readelf.c:6987
+#: src/readelf.c:7003
#, fuzzy, c-format
msgid "DIE [%<PRIx64>] cannot get attribute form: %s"
msgstr "nie można uzyskać formy atrybutu: %s"
-#: src/readelf.c:7009
+#: src/readelf.c:7025
#, fuzzy, c-format
msgid "DIE [%<PRIx64>] cannot get attribute '%s' (%s) value: %s"
msgstr "nie można uzyskać wartości atrybutu: %s"
-#: src/readelf.c:7339
+#: src/readelf.c:7355
#, fuzzy, c-format
msgid "invalid file (%<PRId64>): %s"
msgstr "nieprawidłowy plik"
-#: src/readelf.c:7343
+#: src/readelf.c:7359
#, fuzzy, c-format
msgid "no srcfiles for CU [%<PRIx64>]"
msgstr " ustawienie pliku na %<PRIu64>\n"
-#: src/readelf.c:7347
+#: src/readelf.c:7363
#, fuzzy, c-format
msgid "couldn't get DWARF CU: %s"
msgstr "nie można uzyskać ELF: %s"
-#: src/readelf.c:7660
+#: src/readelf.c:7676
#, c-format
msgid ""
"\n"
@@ -5322,12 +5327,12 @@ msgstr ""
"Sekcja DWARF [%2zu] „%s†pod offsetem %#<PRIx64>:\n"
" [Offset]\n"
-#: src/readelf.c:7710
+#: src/readelf.c:7726
#, fuzzy, c-format
msgid "cannot get next unit: %s"
msgstr "nie można uzyskać następnego DIE: %s"
-#: src/readelf.c:7729
+#: src/readelf.c:7745
#, fuzzy, c-format
msgid ""
" Type unit at offset %<PRIu64>:\n"
@@ -5340,7 +5345,7 @@ msgstr ""
"%<PRIu8>, rozmiar offsetu: %<PRIu8>\n"
" Podpis typu: %#<PRIx64>, offset typu: %#<PRIx64>\n"
-#: src/readelf.c:7741
+#: src/readelf.c:7757
#, c-format
msgid ""
" Compilation unit at offset %<PRIu64>:\n"
@@ -5351,38 +5356,38 @@ msgstr ""
" Wersja: %<PRIu16>, offset sekcji skrótów: %<PRIu64>, rozmiar adresu: "
"%<PRIu8>, rozmiar offsetu: %<PRIu8>\n"
-#: src/readelf.c:7751 src/readelf.c:7914
+#: src/readelf.c:7767 src/readelf.c:7930
#, c-format
msgid " Unit type: %s (%<PRIu8>)"
msgstr ""
-#: src/readelf.c:7778
+#: src/readelf.c:7794
#, c-format
msgid "unknown version (%d) or unit type (%d)"
msgstr ""
-#: src/readelf.c:7807
+#: src/readelf.c:7823
#, c-format
msgid "cannot get DIE offset: %s"
msgstr "nie można uzyskać offsetu DIE: %s"
-#: src/readelf.c:7816
+#: src/readelf.c:7832
#, fuzzy, 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"
-#: src/readelf.c:7854
+#: src/readelf.c:7870
#, c-format
msgid "cannot get next DIE: %s\n"
msgstr "nie można uzyskać następnego DIE: %s\n"
-#: src/readelf.c:7862
+#: src/readelf.c:7878
#, c-format
msgid "cannot get next DIE: %s"
msgstr "nie można uzyskać następnego DIE: %s"
-#: src/readelf.c:7906
+#: src/readelf.c:7922
#, fuzzy, c-format
msgid ""
" Split compilation unit at offset %<PRIu64>:\n"
@@ -5393,7 +5398,7 @@ msgstr ""
" Wersja: %<PRIu16>, offset sekcji skrótów: %<PRIu64>, rozmiar adresu: "
"%<PRIu8>, rozmiar offsetu: %<PRIu8>\n"
-#: src/readelf.c:7958
+#: src/readelf.c:7974
#, c-format
msgid ""
"\n"
@@ -5404,18 +5409,18 @@ msgstr ""
"Sekcja DWARF [%2zu] „%s†pod offsetem %#<PRIx64>:\n"
"\n"
-#: src/readelf.c:8290
+#: src/readelf.c:8306
#, fuzzy, c-format
msgid "unknown form: %s"
msgstr "nieznany błąd"
-#: src/readelf.c:8321
+#: src/readelf.c:8337
#, 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:8423
+#: src/readelf.c:8439
#, fuzzy, c-format
msgid ""
"\n"
@@ -5446,27 +5451,27 @@ msgstr ""
"\n"
"Instrukcje:\n"
-#: src/readelf.c:8445
+#: src/readelf.c:8461
#, fuzzy, c-format
msgid "cannot handle .debug_line version: %u\n"
msgstr "nie można uzyskać wersji symbolu: %s"
-#: src/readelf.c:8453
+#: src/readelf.c:8469
#, fuzzy, c-format
msgid "cannot handle address size: %u\n"
msgstr "nieobsługiwany rozmiar adresu"
-#: src/readelf.c:8461
+#: src/readelf.c:8477
#, fuzzy, c-format
msgid "cannot handle segment selector size: %u\n"
msgstr "nie można uzyskać sekcji: %s"
-#: src/readelf.c:8471
+#: src/readelf.c:8487
#, 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:8486
+#: src/readelf.c:8502
#, c-format
msgid " [%*<PRIuFAST8>] %hhu argument\n"
msgid_plural " [%*<PRIuFAST8>] %hhu arguments\n"
@@ -5474,7 +5479,7 @@ msgstr[0] " [%*<PRIuFAST8>] %hhu parametr\n"
msgstr[1] " [%*<PRIuFAST8>] %hhu parametry\n"
msgstr[2] " [%*<PRIuFAST8>] %hhu parametrów\n"
-#: src/readelf.c:8497
+#: src/readelf.c:8513
msgid ""
"\n"
"Directory table:"
@@ -5482,12 +5487,12 @@ msgstr ""
"\n"
"Tabela katalogu:"
-#: src/readelf.c:8503 src/readelf.c:8580
+#: src/readelf.c:8519 src/readelf.c:8596
#, fuzzy, c-format
msgid " ["
msgstr " PC: "
-#: src/readelf.c:8574
+#: src/readelf.c:8590
#, fuzzy
msgid ""
"\n"
@@ -5496,7 +5501,7 @@ msgstr ""
"\n"
" Tabela strony wywołania:"
-#: src/readelf.c:8635
+#: src/readelf.c:8651
#, fuzzy
msgid " Entry Dir Time Size Name"
msgstr ""
@@ -5504,7 +5509,7 @@ msgstr ""
"Tabela nazw plików:\n"
" Wpis Kat Czas Rozmiar Nazwa"
-#: src/readelf.c:8672
+#: src/readelf.c:8688
msgid ""
"\n"
"Line number statements:"
@@ -5512,119 +5517,119 @@ msgstr ""
"\n"
"Instrukcje numerów wierszy:"
-#: src/readelf.c:8695
+#: src/readelf.c:8711
#, c-format
msgid "invalid maximum operations per instruction is zero"
msgstr "nieprawidłowe maksimum operacji na instrukcję wynosi zero"
-#: src/readelf.c:8729
+#: src/readelf.c:8745
#, fuzzy, c-format
msgid " special opcode %u: address+%u = "
msgstr " instrukcja specjalna %u: adres+%u = %s, wiersz%+d = %zu\n"
-#: src/readelf.c:8733
+#: src/readelf.c:8749
#, fuzzy, c-format
msgid ", op_index = %u, line%+d = %zu\n"
msgstr ""
" instrukcja specjalna %u: adres+%u = %s, op_index = %u, wiersz%+d = %zu\n"
-#: src/readelf.c:8736
+#: src/readelf.c:8752
#, c-format
msgid ", line%+d = %zu\n"
msgstr ""
-#: src/readelf.c:8754
+#: src/readelf.c:8770
#, c-format
msgid " extended opcode %u: "
msgstr " instrukcja rozszerzona %u: "
-#: src/readelf.c:8759
+#: src/readelf.c:8775
msgid " end of sequence"
msgstr " koniec sekwencji"
-#: src/readelf.c:8777
+#: src/readelf.c:8793
#, fuzzy, c-format
msgid " set address to "
msgstr " ustawienie adresu na %s\n"
-#: src/readelf.c:8805
+#: src/readelf.c:8821
#, 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:8819
+#: src/readelf.c:8835
#, c-format
msgid " set discriminator to %u\n"
msgstr " ustawienie dyskryminatora na %u\n"
#. Unknown, ignore it.
-#: src/readelf.c:8824
+#: src/readelf.c:8840
msgid " unknown opcode"
msgstr " nieznana instrukcja"
#. Takes no argument.
-#: src/readelf.c:8836
+#: src/readelf.c:8852
msgid " copy"
msgstr " kopiowanie"
-#: src/readelf.c:8847
+#: src/readelf.c:8863
#, fuzzy, c-format
msgid " advance address by %u to "
msgstr " zwiększenie adresu o %u do %s\n"
-#: src/readelf.c:8851 src/readelf.c:8912
+#: src/readelf.c:8867 src/readelf.c:8928
#, c-format
msgid ", op_index to %u"
msgstr ""
-#: src/readelf.c:8863
+#: src/readelf.c:8879
#, c-format
msgid " advance line by constant %d to %<PRId64>\n"
msgstr " zwiększenie wiersza o stałą %d do %<PRId64>\n"
-#: src/readelf.c:8873
+#: src/readelf.c:8889
#, c-format
msgid " set file to %<PRIu64>\n"
msgstr " ustawienie pliku na %<PRIu64>\n"
-#: src/readelf.c:8884
+#: src/readelf.c:8900
#, c-format
msgid " set column to %<PRIu64>\n"
msgstr " ustawienie kolumny na %<PRIu64>\n"
-#: src/readelf.c:8891
+#: src/readelf.c:8907
#, c-format
msgid " set '%s' to %<PRIuFAST8>\n"
msgstr " ustawienie „%s†na %<PRIuFAST8>\n"
#. Takes no argument.
-#: src/readelf.c:8897
+#: src/readelf.c:8913
msgid " set basic block flag"
msgstr " ustawienie podstawowej flagi bloku"
-#: src/readelf.c:8908
+#: src/readelf.c:8924
#, fuzzy, c-format
msgid " advance address by constant %u to "
msgstr " zwiększenie adresu o stałą %u do %s\n"
-#: src/readelf.c:8928
+#: src/readelf.c:8944
#, fuzzy, c-format
msgid " advance address by fixed value %u to \n"
msgstr " zwiększenie adresu o stałą wartość %u do %s\n"
#. Takes no argument.
-#: src/readelf.c:8938
+#: src/readelf.c:8954
msgid " set prologue end flag"
msgstr " ustawienie flagi końca prologu"
#. Takes no argument.
-#: src/readelf.c:8943
+#: src/readelf.c:8959
msgid " set epilogue begin flag"
msgstr " ustawienie flagi poczÄ…tku epilogu"
-#: src/readelf.c:8953
+#: src/readelf.c:8969
#, c-format
msgid " set isa to %u\n"
msgstr " ustawienie isa na %u\n"
@@ -5632,7 +5637,7 @@ msgstr " ustawienie isa na %u\n"
#. 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:8962
+#: src/readelf.c:8978
#, c-format
msgid " unknown opcode with %<PRIu8> parameter:"
msgid_plural " unknown opcode with %<PRIu8> parameters:"
@@ -5640,96 +5645,96 @@ msgstr[0] " nieznana instrukcja z %<PRIu8> parametrem:"
msgstr[1] " nieznana instrukcja z %<PRIu8> parametrami:"
msgstr[2] " nieznana instrukcja z %<PRIu8> parametrami:"
-#: src/readelf.c:9002
+#: src/readelf.c:9018
#, fuzzy, c-format
msgid "cannot get .debug_loclists content: %s"
msgstr "nie można uzyskać zawartości .debug_log: %s"
-#: src/readelf.c:9171
+#: src/readelf.c:9187
#, fuzzy, c-format
msgid "invalid loclists data"
msgstr "nieprawidłowe dane"
-#: src/readelf.c:9424
+#: src/readelf.c:9440
#, c-format
msgid "cannot get .debug_loc content: %s"
msgstr "nie można uzyskać zawartości .debug_log: %s"
-#: src/readelf.c:9631 src/readelf.c:10675
+#: src/readelf.c:9647 src/readelf.c:10691
msgid " <INVALID DATA>\n"
msgstr " <NIEPRAWIDÅOWE DANE>\n"
-#: src/readelf.c:9686 src/readelf.c:9849
+#: src/readelf.c:9702 src/readelf.c:9865
#, c-format
msgid "cannot get macro information section data: %s"
msgstr "nie można uzyskać danych sekcji informacji o makrach: %s"
-#: src/readelf.c:9766
+#: src/readelf.c:9782
#, c-format
msgid "%*s*** non-terminated string at end of section"
msgstr "%*s*** niezakończony ciąg na końcu sekcji"
-#: src/readelf.c:9789
+#: src/readelf.c:9805
#, 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:9890
+#: src/readelf.c:9906
#, c-format
msgid " Offset: 0x%<PRIx64>\n"
msgstr " Offset: 0x%<PRIx64>\n"
-#: src/readelf.c:9902
+#: src/readelf.c:9918
#, c-format
msgid " Version: %<PRIu16>\n"
msgstr " Wersja: %<PRIu16>\n"
-#: src/readelf.c:9908 src/readelf.c:10795
+#: src/readelf.c:9924 src/readelf.c:10811
#, c-format
msgid " unknown version, cannot parse section\n"
msgstr " nieznana wersja, nie można przetworzyć sekcji\n"
-#: src/readelf.c:9915
+#: src/readelf.c:9931
#, fuzzy, c-format
msgid " Flag: 0x%<PRIx8>"
msgstr " Flaga: 0x%<PRIx8>\n"
-#: src/readelf.c:9944
+#: src/readelf.c:9960
#, c-format
msgid " Offset length: %<PRIu8>\n"
msgstr " Długość offsetu: %<PRIu8>\n"
-#: src/readelf.c:9952
+#: src/readelf.c:9968
#, c-format
msgid " .debug_line offset: 0x%<PRIx64>\n"
msgstr " Offset .debug_line: 0x%<PRIx64>\n"
-#: src/readelf.c:9977
+#: src/readelf.c:9993
#, c-format
msgid " extension opcode table, %<PRIu8> items:\n"
msgstr " tabela instrukcji rozszerzenia, %<PRIu8> elementów:\n"
-#: src/readelf.c:9984
+#: src/readelf.c:10000
#, c-format
msgid " [%<PRIx8>]"
msgstr " [%<PRIx8>]"
-#: src/readelf.c:9996
+#: src/readelf.c:10012
#, c-format
msgid " %<PRIu8> arguments:"
msgstr " Parametry %<PRIu8>:"
-#: src/readelf.c:10011
+#: src/readelf.c:10027
#, c-format
msgid " no arguments."
msgstr " brak parametrów."
-#: src/readelf.c:10212
+#: src/readelf.c:10228
#, 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:10256
+#: src/readelf.c:10272
#, c-format
msgid ""
"\n"
@@ -5740,41 +5745,41 @@ msgstr ""
"Sekcja DWARF [%2zu] „%s†pod offsetem %#<PRIx64>:\n"
" %*s CiÄ…g\n"
-#: src/readelf.c:10271
+#: src/readelf.c:10287
#, fuzzy, c-format
msgid " *** error, missing string terminator\n"
msgstr " *** błąd podczas odczytywania ciągów: %s\n"
-#: src/readelf.c:10300
+#: src/readelf.c:10316
#, fuzzy, c-format
msgid "cannot get .debug_str_offsets section data: %s"
msgstr "nie można uzyskać danych sekcji: %s"
-#: src/readelf.c:10399
+#: src/readelf.c:10415
#, fuzzy, c-format
msgid " Length: %8<PRIu64>\n"
msgstr ""
"\n"
" Długość: %6<PRIu64>\n"
-#: src/readelf.c:10401
+#: src/readelf.c:10417
#, fuzzy, c-format
msgid " Offset size: %8<PRIu8>\n"
msgstr " Długość offsetu: %<PRIu8>\n"
-#: src/readelf.c:10415
+#: src/readelf.c:10431
#, fuzzy, c-format
msgid " DWARF version: %8<PRIu16>\n"
msgstr " Wersja DWARF: %6<PRIuFAST16>\n"
-#: src/readelf.c:10424
+#: src/readelf.c:10440
#, fuzzy, c-format
msgid " Padding: %8<PRIx16>\n"
msgstr ""
"\n"
" Długość: %6<PRIu64>\n"
-#: src/readelf.c:10478
+#: src/readelf.c:10494
#, c-format
msgid ""
"\n"
@@ -5783,7 +5788,7 @@ msgstr ""
"\n"
"Sekcja tabeli wyszukiwania ramki wywoÅ‚ania [%2zu] „.eh_frame_hdrâ€:\n"
-#: src/readelf.c:10580
+#: src/readelf.c:10596
#, c-format
msgid ""
"\n"
@@ -5792,22 +5797,22 @@ msgstr ""
"\n"
"Sekcja tabeli obsÅ‚ugiwania wyjÄ…tków [%2zu] „.gcc_except_tableâ€:\n"
-#: src/readelf.c:10603
+#: src/readelf.c:10619
#, c-format
msgid " LPStart encoding: %#x "
msgstr " Kodowanie LPStart: %#x "
-#: src/readelf.c:10615
+#: src/readelf.c:10631
#, c-format
msgid " TType encoding: %#x "
msgstr " Kodowanie TType: %#x "
-#: src/readelf.c:10630
+#: src/readelf.c:10646
#, c-format
msgid " Call site encoding: %#x "
msgstr " Kodowanie strony wywołania: %#x "
-#: src/readelf.c:10643
+#: src/readelf.c:10659
msgid ""
"\n"
" Call site table:"
@@ -5815,7 +5820,7 @@ msgstr ""
"\n"
" Tabela strony wywołania:"
-#: src/readelf.c:10657
+#: src/readelf.c:10673
#, c-format
msgid ""
" [%4u] Call site start: %#<PRIx64>\n"
@@ -5828,12 +5833,12 @@ msgstr ""
" LÄ…dowisko: %#<PRIx64>\n"
" Działanie: %u\n"
-#: src/readelf.c:10730
+#: src/readelf.c:10746
#, c-format
msgid "invalid TType encoding"
msgstr "nieprawidłowe kodowanie TType"
-#: src/readelf.c:10757
+#: src/readelf.c:10773
#, c-format
msgid ""
"\n"
@@ -5842,37 +5847,37 @@ msgstr ""
"\n"
"Sekcja GDB [%2zu] „%s†pod offsetem %#<PRIx64> zawiera %<PRId64> bajtów:\n"
-#: src/readelf.c:10786
+#: src/readelf.c:10802
#, c-format
msgid " Version: %<PRId32>\n"
msgstr " Wersja: %<PRId32>\n"
-#: src/readelf.c:10804
+#: src/readelf.c:10820
#, c-format
msgid " CU offset: %#<PRIx32>\n"
msgstr " offset CU: %#<PRIx32>\n"
-#: src/readelf.c:10811
+#: src/readelf.c:10827
#, c-format
msgid " TU offset: %#<PRIx32>\n"
msgstr " offset TU: %#<PRIx32>\n"
-#: src/readelf.c:10818
+#: src/readelf.c:10834
#, c-format
msgid " address offset: %#<PRIx32>\n"
msgstr " offset adresu: %#<PRIx32>\n"
-#: src/readelf.c:10825
+#: src/readelf.c:10841
#, c-format
msgid " symbol offset: %#<PRIx32>\n"
msgstr " offset symbolu: %#<PRIx32>\n"
-#: src/readelf.c:10832
+#: src/readelf.c:10848
#, c-format
msgid " constant offset: %#<PRIx32>\n"
msgstr " offset stałej: %#<PRIx32>\n"
-#: src/readelf.c:10846
+#: src/readelf.c:10862
#, c-format
msgid ""
"\n"
@@ -5881,7 +5886,7 @@ msgstr ""
"\n"
" Lista CU pod offsetem %#<PRIx32> zawiera %zu wpisów:\n"
-#: src/readelf.c:10871
+#: src/readelf.c:10887
#, c-format
msgid ""
"\n"
@@ -5890,7 +5895,7 @@ msgstr ""
"\n"
" Lista TU pod offsetem %#<PRIx32> zawiera %zu wpisów:\n"
-#: src/readelf.c:10900
+#: src/readelf.c:10916
#, c-format
msgid ""
"\n"
@@ -5899,7 +5904,7 @@ msgstr ""
"\n"
" Lista adresów pod offsetem %#<PRIx32> zawiera %zu wpisów:\n"
-#: src/readelf.c:10932
+#: src/readelf.c:10948
#, c-format
msgid ""
"\n"
@@ -5908,18 +5913,18 @@ msgstr ""
"\n"
" Tabela symboli pod offsetem %#<PRIx32> zawiera %zu gniazd:\n"
-#: src/readelf.c:11070
+#: src/readelf.c:11086
#, c-format
msgid "cannot get debug context descriptor: %s"
msgstr "nie można uzyskać deskryptora kontekstu debugowania: %s"
-#: src/readelf.c:11433 src/readelf.c:12055 src/readelf.c:12166
-#: src/readelf.c:12224
+#: src/readelf.c:11449 src/readelf.c:12071 src/readelf.c:12182
+#: src/readelf.c:12240
#, c-format
msgid "cannot convert core note data: %s"
msgstr "nie można konwertować danych notatki core: %s"
-#: src/readelf.c:11796
+#: src/readelf.c:11812
#, c-format
msgid ""
"\n"
@@ -5928,21 +5933,21 @@ msgstr ""
"\n"
"%*s… <powtarza się jeszcze %u razy>…"
-#: src/readelf.c:12303
+#: src/readelf.c:12319
msgid " Owner Data size Type\n"
msgstr " Właściciel Rozmiar danych Typ\n"
-#: src/readelf.c:12332
+#: src/readelf.c:12348
#, c-format
msgid " %-13.*s %9<PRId32> %s\n"
msgstr " %-13.*s %9<PRId32> %s\n"
-#: src/readelf.c:12384
+#: src/readelf.c:12400
#, fuzzy, c-format
msgid "cannot get content of note: %s"
msgstr "nie można uzyskać zawartości sekcji notatki: %s"
-#: src/readelf.c:12411
+#: src/readelf.c:12434
#, c-format
msgid ""
"\n"
@@ -5952,7 +5957,7 @@ msgstr ""
"Segment notatki [%2zu] „%s†o długości %<PRIu64> bajtów pod offsetem "
"%#0<PRIx64>:\n"
-#: src/readelf.c:12434
+#: src/readelf.c:12457
#, c-format
msgid ""
"\n"
@@ -5961,7 +5966,7 @@ msgstr ""
"\n"
"Segment notatki o długości %<PRIu64> bajtów pod offsetem %#0<PRIx64>:\n"
-#: src/readelf.c:12481
+#: src/readelf.c:12504
#, c-format
msgid ""
"\n"
@@ -5970,12 +5975,12 @@ msgstr ""
"\n"
"Sekcja [%zu] „%s†nie ma danych do zrzucenia.\n"
-#: src/readelf.c:12508 src/readelf.c:12559
+#: src/readelf.c:12531 src/readelf.c:12582
#, 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:12513
+#: src/readelf.c:12536
#, c-format
msgid ""
"\n"
@@ -5985,7 +5990,7 @@ msgstr ""
"Segment zrzutu szesnastkowego [%zu] „%sâ€, %<PRIu64> bajtów pod offsetem "
"%#0<PRIx64>:\n"
-#: src/readelf.c:12518
+#: src/readelf.c:12541
#, c-format
msgid ""
"\n"
@@ -5996,7 +6001,7 @@ msgstr ""
"Zrzut szesnastkowy sekcji [%zu] „%sâ€, %<PRIu64> bajtów (%zd "
"nieskompresowanych) pod offsetem %#0<PRIx64>:\n"
-#: src/readelf.c:12532
+#: src/readelf.c:12555
#, c-format
msgid ""
"\n"
@@ -6005,7 +6010,7 @@ msgstr ""
"\n"
"Sekcja [%zu] „%s†nie ma ciągów do zrzucenia.\n"
-#: src/readelf.c:12564
+#: src/readelf.c:12587
#, c-format
msgid ""
"\n"
@@ -6014,7 +6019,7 @@ msgstr ""
"\n"
"Sekcja ciągów [%zu] „%s†zawiera %<PRIu64> bajtów pod offsetem %#0<PRIx64>:\n"
-#: src/readelf.c:12569
+#: src/readelf.c:12592
#, c-format
msgid ""
"\n"
@@ -6025,7 +6030,7 @@ msgstr ""
"Sekcja ciągów [%zu] „%s†zawiera %<PRIu64> bajtów (%zd nieskompresowanych) "
"pod offsetem %#0<PRIx64>:\n"
-#: src/readelf.c:12618
+#: src/readelf.c:12641
#, c-format
msgid ""
"\n"
@@ -6034,7 +6039,7 @@ msgstr ""
"\n"
"sekcja [%lu] nie istnieje"
-#: src/readelf.c:12647
+#: src/readelf.c:12671
#, c-format
msgid ""
"\n"
@@ -6043,12 +6048,12 @@ msgstr ""
"\n"
"sekcja „%s†nie istnieje"
-#: src/readelf.c:12704
+#: src/readelf.c:12728
#, c-format
msgid "cannot get symbol index of archive '%s': %s"
msgstr "nie można uzyskać indeksu symboli archiwum „%sâ€: %s"
-#: src/readelf.c:12707
+#: src/readelf.c:12731
#, c-format
msgid ""
"\n"
@@ -6057,7 +6062,7 @@ msgstr ""
"\n"
"Archiwum „%s†nie ma indeksu symboli\n"
-#: src/readelf.c:12711
+#: src/readelf.c:12735
#, c-format
msgid ""
"\n"
@@ -6066,12 +6071,12 @@ msgstr ""
"\n"
"Indeks archiwum „%s†ma %zu wpisów:\n"
-#: src/readelf.c:12729
+#: src/readelf.c:12753
#, 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:12734
+#: src/readelf.c:12758
#, c-format
msgid "Archive member '%s' contains:\n"
msgstr "Element archiwum „%s†zawiera:\n"
@@ -6686,7 +6691,7 @@ msgstr "nie można utworzyć nagłówka ELF: %s"
msgid "cannot get shdrstrndx:%s"
msgstr "nie można uzyskać sekcji: %s"
-#: src/unstrip.c:248 src/unstrip.c:2038
+#: src/unstrip.c:248 src/unstrip.c:2081
#, c-format
msgid "cannot get ELF header: %s"
msgstr "nie można uzyskać nagłówka ELF: %s"
@@ -6706,12 +6711,12 @@ msgstr "nie można zaktualizować relokacji: %s"
msgid "cannot copy ELF header: %s"
msgstr "nie można skopiować nagłówka ELF: %s"
-#: src/unstrip.c:269 src/unstrip.c:2056 src/unstrip.c:2099
+#: src/unstrip.c:269 src/unstrip.c:2099 src/unstrip.c:2142
#, c-format
msgid "cannot get number of program headers: %s"
msgstr "nie można uzyskać liczby nagłówków programu: %s"
-#: src/unstrip.c:274 src/unstrip.c:2060
+#: src/unstrip.c:274 src/unstrip.c:2103
#, c-format
msgid "cannot create program headers: %s"
msgstr "nie można utworzyć nagłówków programu: %s"
@@ -6726,12 +6731,12 @@ msgstr "nie można skopiować nagłówka programu: %s"
msgid "cannot copy section header: %s"
msgstr "nie można skopiować nagłówka sekcji: %s"
-#: src/unstrip.c:293 src/unstrip.c:1669
+#: src/unstrip.c:293 src/unstrip.c:1703
#, c-format
msgid "cannot get section data: %s"
msgstr "nie można uzyskać danych sekcji: %s"
-#: src/unstrip.c:295 src/unstrip.c:1671
+#: src/unstrip.c:295 src/unstrip.c:1705
#, c-format
msgid "cannot copy section data: %s"
msgstr "nie można skopiować danych sekcji: %s"
@@ -6741,14 +6746,14 @@ msgstr "nie można skopiować danych sekcji: %s"
msgid "cannot create directory '%s'"
msgstr "nie można utworzyć katalogu „%sâ€"
-#: src/unstrip.c:391 src/unstrip.c:647 src/unstrip.c:681 src/unstrip.c:847
-#: src/unstrip.c:1706
+#: src/unstrip.c:391 src/unstrip.c:651 src/unstrip.c:685 src/unstrip.c:853
+#: src/unstrip.c:1745
#, c-format
msgid "cannot get symbol table entry: %s"
msgstr "nie można uzyskać wpisu tabeli symboli: %s"
-#: src/unstrip.c:407 src/unstrip.c:650 src/unstrip.c:671 src/unstrip.c:684
-#: src/unstrip.c:1727 src/unstrip.c:1922 src/unstrip.c:1946
+#: src/unstrip.c:407 src/unstrip.c:654 src/unstrip.c:675 src/unstrip.c:688
+#: src/unstrip.c:1766 src/unstrip.c:1961 src/unstrip.c:1985
#, c-format
msgid "cannot update symbol table: %s"
msgstr "nie można zaktualizować tabeli symboli: %s"
@@ -6758,151 +6763,166 @@ msgstr "nie można zaktualizować tabeli symboli: %s"
msgid "cannot update section header: %s"
msgstr "nie można zaktualizować nagłówka sekcji: %s"
-#: src/unstrip.c:459 src/unstrip.c:473
+#: src/unstrip.c:463 src/unstrip.c:477
#, c-format
msgid "cannot update relocation: %s"
msgstr "nie można zaktualizować relokacji: %s"
-#: src/unstrip.c:570
+#: src/unstrip.c:574
#, c-format
msgid "cannot get symbol version: %s"
msgstr "nie można uzyskać wersji symbolu: %s"
-#: src/unstrip.c:583
+#: src/unstrip.c:587
#, 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:853
+#: src/unstrip.c:842
+#, fuzzy, c-format
+msgid "cannot get symbol section data: %s"
+msgstr "nie można uzyskać danych sekcji: %s"
+
+#: src/unstrip.c:844
+#, fuzzy, c-format
+msgid "cannot get string section data: %s"
+msgstr "nie można uzyskać danych sekcji: %s"
+
+#: src/unstrip.c:861
#, c-format
msgid "invalid string offset in symbol [%zu]"
msgstr "nieprawidłowy offset ciągu w symbolu [%zu]"
-#: src/unstrip.c:1011 src/unstrip.c:1402
+#: src/unstrip.c:1019 src/unstrip.c:1423
#, c-format
msgid "cannot read section [%zu] name: %s"
msgstr "nie można odczytać nazwy sekcji [%zu]: %s"
-#: src/unstrip.c:1026
+#: src/unstrip.c:1034
#, fuzzy, c-format
msgid "bad sh_link for group section: %s"
msgstr "nieprawidłowa wartość sh_link w sekcji %zu"
-#: src/unstrip.c:1032
+#: src/unstrip.c:1040
#, fuzzy, c-format
msgid "couldn't get shdr for group section: %s"
msgstr "nie można uzyskać danych dla sekcji %d: %s"
-#: src/unstrip.c:1037
+#: src/unstrip.c:1045
#, fuzzy, c-format
msgid "bad data for group symbol section: %s"
msgstr "nie można uzyskać danych dla sekcji symboli\n"
-#: src/unstrip.c:1043
+#: src/unstrip.c:1051
#, fuzzy, c-format
msgid "couldn't get symbol for group section: %s"
msgstr "nie można uzyskać wersji symbolu: %s"
-#: src/unstrip.c:1048
+#: src/unstrip.c:1056
#, fuzzy, c-format
msgid "bad symbol name for group section: %s"
msgstr "błędny nagłówek kompresji dla sekcji %zd: %s"
-#: src/unstrip.c:1090 src/unstrip.c:1109 src/unstrip.c:1147
+#: src/unstrip.c:1098 src/unstrip.c:1117 src/unstrip.c:1155
#, c-format
msgid "cannot read '.gnu.prelink_undo' section: %s"
msgstr "nie można odczytać sekcji „.gnu.prelink_undoâ€: %s"
-#: src/unstrip.c:1127
+#: src/unstrip.c:1135
#, c-format
msgid "overflow with shnum = %zu in '%s' section"
msgstr "przepeÅ‚nienie z shnum = %zu w sekcji „%sâ€"
-#: src/unstrip.c:1138
+#: src/unstrip.c:1146
#, c-format
msgid "invalid contents in '%s' section"
msgstr "nieprawidÅ‚owa zawartość w sekcji „%sâ€"
-#: src/unstrip.c:1194 src/unstrip.c:1528
+#: src/unstrip.c:1202 src/unstrip.c:1549
#, c-format
msgid "cannot find matching section for [%zu] '%s'"
msgstr "nie można odnaleźć pasujÄ…cej sekcji dla [%zu] „%sâ€"
-#: src/unstrip.c:1319 src/unstrip.c:1335 src/unstrip.c:1607 src/unstrip.c:1881
+#: src/unstrip.c:1327 src/unstrip.c:1343 src/unstrip.c:1629 src/unstrip.c:1920
#, 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:1344
+#: src/unstrip.c:1352
#, 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:1373 src/unstrip.c:1377
+#: src/unstrip.c:1381 src/unstrip.c:1385
#, 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:1381 src/unstrip.c:1385 src/unstrip.c:1622
+#: src/unstrip.c:1389 src/unstrip.c:1393 src/unstrip.c:1644
#, c-format
msgid "cannot get section count: %s"
msgstr "nie można uzyskać licznika sekcji: %s"
-#: src/unstrip.c:1388
+#: src/unstrip.c:1396
#, 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:1450 src/unstrip.c:1543
+#: src/unstrip.c:1400
+#, c-format
+msgid "no sections in stripped file"
+msgstr ""
+
+#: src/unstrip.c:1471 src/unstrip.c:1564
#, 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:1601
+#: src/unstrip.c:1623
#, c-format
msgid "cannot add new section: %s"
msgstr "nie można dodać nowej sekcji: %s"
-#: src/unstrip.c:1714
+#: src/unstrip.c:1753
#, c-format
msgid "symbol [%zu] has invalid section index"
msgstr "symbol [%zu] ma nieprawidłowy indeks sekcji"
-#: src/unstrip.c:1746
+#: src/unstrip.c:1785
#, fuzzy, c-format
msgid "group has invalid section index [%zd]"
msgstr "symbol [%zu] ma nieprawidłowy indeks sekcji"
-#: src/unstrip.c:2017
+#: src/unstrip.c:2060
#, c-format
msgid "cannot read section data: %s"
msgstr "nie można odczytać danych sekcji: %s"
-#: src/unstrip.c:2046
+#: src/unstrip.c:2089
#, c-format
msgid "cannot update ELF header: %s"
msgstr "nie można zaktualizować nagłówka ELF: %s"
-#: src/unstrip.c:2070
+#: src/unstrip.c:2113
#, c-format
msgid "cannot update program header: %s"
msgstr "nie można zaktualizować nagłówka programu: %s"
-#: src/unstrip.c:2075 src/unstrip.c:2157
+#: src/unstrip.c:2118 src/unstrip.c:2200
#, c-format
msgid "cannot write output file: %s"
msgstr "nie można zapisać pliku wyjściowego: %s"
-#: src/unstrip.c:2126
+#: src/unstrip.c:2169
#, 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:2129
+#: src/unstrip.c:2172
#, c-format
msgid ""
"DWARF data in '%s' not adjusted for prelinking bias; consider prelink -u"
@@ -6910,77 +6930,77 @@ msgstr ""
"Dane DWARF w „%s†nie zostały dostosowane do przesunięcia wczesnego "
"konsolidowania; proszę rozważyć polecenie prelink -u"
-#: src/unstrip.c:2148 src/unstrip.c:2199 src/unstrip.c:2211 src/unstrip.c:2297
+#: src/unstrip.c:2191 src/unstrip.c:2242 src/unstrip.c:2254 src/unstrip.c:2340
#, c-format
msgid "cannot create ELF descriptor: %s"
msgstr "nie można utworzyć deskryptora ELF: %s"
-#: src/unstrip.c:2190
+#: src/unstrip.c:2233
msgid "WARNING: "
msgstr "OSTRZEŻENIE: "
-#: src/unstrip.c:2192
+#: src/unstrip.c:2235
msgid ", use --force"
msgstr ", należy użyć opcji --force"
-#: src/unstrip.c:2215
+#: src/unstrip.c:2258
msgid "ELF header identification (e_ident) different"
msgstr "Różna identyfikacja nagłówka ELF (e_ident)"
-#: src/unstrip.c:2218
+#: src/unstrip.c:2261
msgid "ELF header type (e_type) different"
msgstr "Różne typy nagłówka ELF (e_type)"
-#: src/unstrip.c:2221
+#: src/unstrip.c:2264
msgid "ELF header machine type (e_machine) different"
msgstr "Różne typy maszyny nagłówka ELF (e_machine)"
-#: src/unstrip.c:2224
+#: src/unstrip.c:2267
msgid "stripped program header (e_phnum) smaller than unstripped"
msgstr "okrojony nagłówek programu (e_phnum) jest mniejszy niż nieokrojony"
-#: src/unstrip.c:2254
+#: src/unstrip.c:2297
#, 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:2258
+#: src/unstrip.c:2301
#, 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:2273
+#: src/unstrip.c:2316
#, 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:2277
+#: src/unstrip.c:2320
#, 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:2290
+#: src/unstrip.c:2333
#, c-format
msgid "module '%s' file '%s' is not stripped"
msgstr "moduł „%s†pliku „%s†nie został okrojony"
-#: src/unstrip.c:2321
+#: src/unstrip.c:2364
#, 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:2454
+#: src/unstrip.c:2497
#, c-format
msgid "no matching modules found"
msgstr "nie odnaleziono pasujących modułów"
-#: src/unstrip.c:2463
+#: src/unstrip.c:2506
#, c-format
msgid "matched more than one module"
msgstr "pasuje więcej niż jeden moduł"
-#: src/unstrip.c:2507
+#: src/unstrip.c:2550
msgid ""
"STRIPPED-FILE DEBUG-FILE\n"
"[MODULE...]"
@@ -6988,7 +7008,7 @@ msgstr ""
"OKROJONY-PLIK PLIK-DEBUGOWANIA\n"
"[MODUÅ…]"
-#: src/unstrip.c:2508
+#: src/unstrip.c:2551
#, fuzzy
msgid ""
"Combine stripped files with separate symbols and debug information.\n"
diff --git a/po/uk.po b/po/uk.po
index 98bb80e7..0ca049e7 100644
--- a/po/uk.po
+++ b/po/uk.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: https://sourceware.org/bugzilla/\n"
-"POT-Creation-Date: 2019-08-13 23:38+0200\n"
+"POT-Creation-Date: 2019-11-26 09:48+0100\n"
"PO-Revision-Date: 2015-09-26 16:41+0300\n"
"Last-Translator: Yuri Chornoivan <yurchor@ukr.net>\n"
"Language-Team: Ukrainian <kde-i18n-uk@kde.org>\n"
@@ -26,7 +26,7 @@ msgstr ""
"розфарбовувати виведене. Типові Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Â«always» (завжди), «auto» (авто) "
"або «never» (ніколи)"
-#: lib/color.c:127
+#: lib/color.c:129
#, c-format
msgid ""
"%s: invalid argument '%s' for '--color'\n"
@@ -41,7 +41,7 @@ msgstr ""
" - «never», «no», «none»\n"
" - «auto», «tty», «if-tty»\n"
-#: lib/color.c:190 src/objdump.c:726
+#: lib/color.c:194 src/objdump.c:728
#, c-format
msgid "cannot allocate memory"
msgstr "не вдалоÑÑ Ñ€Ð¾Ð·Ð¿Ð¾Ð´Ñ–Ð»Ð¸Ñ‚Ð¸ пам’ÑÑ‚ÑŒ"
@@ -58,18 +58,18 @@ msgstr ""
"початкових кодах. Умовами Ð»Ñ–Ñ†ÐµÐ½Ð·ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¸ ÐЕ передбачено жодних "
"гарантій, зокрема гарантій працездатноÑÑ‚Ñ– або придатноÑÑ‚Ñ– Ð´Ð»Ñ Ð¿ÐµÐ²Ð½Ð¾Ñ— мети.\n"
-#: lib/xmalloc.c:52 lib/xmalloc.c:65 lib/xmalloc.c:77 src/readelf.c:3433
-#: src/readelf.c:11382 src/unstrip.c:2350 src/unstrip.c:2556
+#: lib/xmalloc.c:52 lib/xmalloc.c:65 lib/xmalloc.c:77 src/readelf.c:3449
+#: src/readelf.c:11398 src/unstrip.c:2393 src/unstrip.c:2599
#, c-format
msgid "memory exhausted"
msgstr "пам’ÑÑ‚ÑŒ вичерпано"
-#: libasm/asm_error.c:65 libdw/dwarf_error.c:57 libdwfl/libdwflP.h:50
+#: libasm/asm_error.c:65 libdw/dwarf_error.c:57 libdwfl/libdwflP.h:51
#: libelf/elf_error.c:60
msgid "no error"
msgstr "без помилок"
-#: libasm/asm_error.c:66 libdw/dwarf_error.c:67 libdwfl/libdwflP.h:52
+#: libasm/asm_error.c:66 libdw/dwarf_error.c:67 libdwfl/libdwflP.h:53
#: libelf/elf_error.c:91
msgid "out of memory"
msgstr "неÑтача пам'ÑÑ‚Ñ–"
@@ -106,7 +106,7 @@ msgstr "помилка під Ñ‡Ð°Ñ Ñпроби Ð²Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ…"
msgid "no backend support available"
msgstr "підтримки Ñерверів не передбачено"
-#: libasm/asm_error.c:83 libdw/dwarf_error.c:58 libdwfl/libdwflP.h:51
+#: libasm/asm_error.c:83 libdw/dwarf_error.c:58 libdwfl/libdwflP.h:52
#: libelf/elf_error.c:63
msgid "unknown error"
msgstr "невідома помилка"
@@ -222,7 +222,7 @@ msgstr "некоректна верÑÑ–Ñ DWARF"
msgid "invalid directory index"
msgstr "некоректний покажчик каталогу"
-#: libdw/dwarf_error.c:87 libdwfl/libdwflP.h:71
+#: libdw/dwarf_error.c:87 libdwfl/libdwflP.h:72
msgid "address out of range"
msgstr "некоректна адреÑа"
@@ -253,7 +253,7 @@ msgstr "некоректний номер Ñ€Ñдка"
msgid "invalid address range index"
msgstr "некоректний Ñ–Ð½Ð´ÐµÐºÑ Ð´Ñ–Ð°Ð¿Ð°Ð·Ð¾Ð½Ñƒ адреÑ"
-#: libdw/dwarf_error.c:94 libdwfl/libdwflP.h:72
+#: libdw/dwarf_error.c:94 libdwfl/libdwflP.h:73
msgid "no matching address range"
msgstr "не виÑвлено відповідного діапазону адреÑ"
@@ -300,7 +300,7 @@ msgstr " невідомий код операції"
msgid ".debug_addr section missing"
msgstr "немає розділу .debug_ranges"
-#: libdwfl/argp-std.c:50 src/stack.c:638 src/unstrip.c:2497
+#: libdwfl/argp-std.c:50 src/stack.c:638 src/unstrip.c:2540
msgid "Input selection options:"
msgstr "Вибір параметрів Ð²Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ…:"
@@ -368,155 +368,155 @@ msgstr "неÑтача пам'ÑÑ‚Ñ–"
msgid "No modules recognized in core file"
msgstr "Ðе вдалоÑÑ Ð²Ð¸Ñвити модулі у файлі core"
-#: libdwfl/libdwflP.h:53
+#: libdwfl/libdwflP.h:54
msgid "See errno"
msgstr "Див. errno"
-#: libdwfl/libdwflP.h:54
+#: libdwfl/libdwflP.h:55
msgid "See elf_errno"
msgstr "Див. elf_errno"
-#: libdwfl/libdwflP.h:55
+#: libdwfl/libdwflP.h:56
msgid "See dwarf_errno"
msgstr "Див. dwarf_errno"
-#: libdwfl/libdwflP.h:56
+#: libdwfl/libdwflP.h:57
msgid "See ebl_errno (XXX missing)"
msgstr "Див. ebl_errno (не виÑвлено XXX)"
-#: libdwfl/libdwflP.h:57
+#: libdwfl/libdwflP.h:58
msgid "gzip decompression failed"
msgstr "Помилка під Ñ‡Ð°Ñ Ñпроби Ð²Ð¸Ð´Ð¾Ð±ÑƒÐ²Ð°Ð½Ð½Ñ Ð· gzip"
-#: libdwfl/libdwflP.h:58
+#: libdwfl/libdwflP.h:59
msgid "bzip2 decompression failed"
msgstr "Помилка під Ñ‡Ð°Ñ Ñпроби Ð²Ð¸Ð´Ð¾Ð±ÑƒÐ²Ð°Ð½Ð½Ñ Ð· bzip2"
-#: libdwfl/libdwflP.h:59
+#: libdwfl/libdwflP.h:60
msgid "LZMA decompression failed"
msgstr "Помилка під Ñ‡Ð°Ñ Ñпроби Ð²Ð¸Ð´Ð¾Ð±ÑƒÐ²Ð°Ð½Ð½Ñ Ð· LZMA"
-#: libdwfl/libdwflP.h:60
+#: libdwfl/libdwflP.h:61
msgid "no support library found for machine"
msgstr "у ÑиÑтемі не виÑвлено бібліотеки підтримки"
-#: libdwfl/libdwflP.h:61
+#: libdwfl/libdwflP.h:62
msgid "Callbacks missing for ET_REL file"
msgstr "Ðемає зворотних викликів Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð° ET_REL"
-#: libdwfl/libdwflP.h:62
+#: libdwfl/libdwflP.h:63
msgid "Unsupported relocation type"
msgstr "Ðепідтримуваний тип переÑуваннÑ"
-#: libdwfl/libdwflP.h:63
+#: libdwfl/libdwflP.h:64
msgid "r_offset is bogus"
msgstr "r_offset є фіктивним"
-#: libdwfl/libdwflP.h:64 libelf/elf_error.c:115 libelf/elf_error.c:175
+#: libdwfl/libdwflP.h:65 libelf/elf_error.c:115 libelf/elf_error.c:175
msgid "offset out of range"
msgstr "Ð¿ÐµÑ€ÐµÐ²Ð¸Ñ‰ÐµÐ½Ð½Ñ Ð¼Ð¾Ð¶Ð»Ð¸Ð²Ð¾Ð³Ð¾ зміщеннÑ"
-#: libdwfl/libdwflP.h:65
+#: libdwfl/libdwflP.h:66
msgid "relocation refers to undefined symbol"
msgstr "переÑÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾ÑилаєтьÑÑ Ð½Ð° невизначений Ñимвол."
-#: libdwfl/libdwflP.h:66
+#: libdwfl/libdwflP.h:67
msgid "Callback returned failure"
msgstr "Зворотним викликом повернуто помилку"
-#: libdwfl/libdwflP.h:67
+#: libdwfl/libdwflP.h:68
msgid "No DWARF information found"
msgstr "Ðе виÑвлено відомоÑтей DWARF"
-#: libdwfl/libdwflP.h:68
+#: libdwfl/libdwflP.h:69
msgid "No symbol table found"
msgstr "Ðе виÑвлено таблиці Ñимволів"
-#: libdwfl/libdwflP.h:69
+#: libdwfl/libdwflP.h:70
msgid "No ELF program headers"
msgstr "Ðемає заголовків програми ELF"
-#: libdwfl/libdwflP.h:70
+#: libdwfl/libdwflP.h:71
msgid "address range overlaps an existing module"
msgstr "діапазон Ð°Ð´Ñ€ÐµÑ Ð¿ÐµÑ€ÐµÐºÑ€Ð¸Ð²Ð°Ñ” Ñ–Ñнуючий модуль"
-#: libdwfl/libdwflP.h:73
+#: libdwfl/libdwflP.h:74
msgid "image truncated"
msgstr "образ обрізано"
-#: libdwfl/libdwflP.h:74
+#: libdwfl/libdwflP.h:75
msgid "ELF file opened"
msgstr "Відкритий файл ELF"
-#: libdwfl/libdwflP.h:75
+#: libdwfl/libdwflP.h:76
msgid "not a valid ELF file"
msgstr "не є коректним файлом ELF"
-#: libdwfl/libdwflP.h:76
+#: libdwfl/libdwflP.h:77
msgid "cannot handle DWARF type description"
msgstr "не вдалоÑÑ Ð¾Ð±Ñ€Ð¾Ð±Ð¸Ñ‚Ð¸ Ð¾Ð¿Ð¸Ñ Ñ‚Ð¸Ð¿Ñƒ DWARF"
-#: libdwfl/libdwflP.h:77
+#: libdwfl/libdwflP.h:78
msgid "ELF file does not match build ID"
msgstr "Файл ELF не відповідає ідентифікатору збираннÑ"
-#: libdwfl/libdwflP.h:78
+#: libdwfl/libdwflP.h:79
msgid "corrupt .gnu.prelink_undo section data"
msgstr "дані розділу «.gnu.prelink_undo» пошкоджено"
-#: libdwfl/libdwflP.h:79
+#: libdwfl/libdwflP.h:80
msgid "Internal error due to ebl"
msgstr "Ð’Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° через ebl"
-#: libdwfl/libdwflP.h:80
+#: libdwfl/libdwflP.h:81
msgid "Missing data in core file"
msgstr "У файлі Ñдра не виÑтачає даних"
-#: libdwfl/libdwflP.h:81
+#: libdwfl/libdwflP.h:82
msgid "Invalid register"
msgstr "Ðекоректний регіÑÑ‚Ñ€"
-#: libdwfl/libdwflP.h:82
+#: libdwfl/libdwflP.h:83
msgid "Error reading process memory"
msgstr "Помилка під Ñ‡Ð°Ñ Ñпроби Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ð¿Ð°Ð¼â€™ÑÑ‚Ñ– процеÑу"
-#: libdwfl/libdwflP.h:83
+#: libdwfl/libdwflP.h:84
msgid "Couldn't find architecture of any ELF"
msgstr "Ðе вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ хоч ÑкуÑÑŒ архітектуру ELF"
-#: libdwfl/libdwflP.h:84
+#: libdwfl/libdwflP.h:85
msgid "Error parsing /proc filesystem"
msgstr "Помилка під Ñ‡Ð°Ñ Ñпроби обробки файлової ÑиÑтеми /proc"
-#: libdwfl/libdwflP.h:85
+#: libdwfl/libdwflP.h:86
msgid "Invalid DWARF"
msgstr "Ðекоректний Ð·Ð°Ð¿Ð¸Ñ DWARF"
-#: libdwfl/libdwflP.h:86
+#: libdwfl/libdwflP.h:87
msgid "Unsupported DWARF"
msgstr "Ðепідтримуваний Ð·Ð°Ð¿Ð¸Ñ DWARF"
-#: libdwfl/libdwflP.h:87
+#: libdwfl/libdwflP.h:88
msgid "Unable to find more threads"
msgstr "Ðе вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ додаткові потоки"
-#: libdwfl/libdwflP.h:88
+#: libdwfl/libdwflP.h:89
msgid "Dwfl already has attached state"
msgstr "Dwfl уже перебуває у Ñтані Ð´Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð½Ñ Ð´Ð¾ процеÑу"
-#: libdwfl/libdwflP.h:89
+#: libdwfl/libdwflP.h:90
msgid "Dwfl has no attached state"
msgstr "Dwfl не перебуває у Ñтані Ð´Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð½Ñ Ð´Ð¾ процеÑу"
-#: libdwfl/libdwflP.h:90
+#: libdwfl/libdwflP.h:91
msgid "Unwinding not supported for this architecture"
msgstr "Ð”Ð»Ñ Ñ†Ñ–Ñ”Ñ— архітектури Ñ€Ð¾Ð·Ð³Ð¾Ñ€Ñ‚Ð°Ð½Ð½Ñ Ð½Ðµ передбачено"
-#: libdwfl/libdwflP.h:91
+#: libdwfl/libdwflP.h:92
msgid "Invalid argument"
msgstr "Ðекоректний аргумент"
-#: libdwfl/libdwflP.h:92
+#: libdwfl/libdwflP.h:93
msgid "Not an ET_CORE ELF file"
msgstr "Ðе Ñ” файлом ET_CORE ELF"
@@ -621,7 +621,7 @@ msgstr "некоректна розмірніÑÑ‚ÑŒ вхідного парамÐ
msgid "invalid size of destination operand"
msgstr "некоректна розмірніÑÑ‚ÑŒ вихідного параметра"
-#: libelf/elf_error.c:87 src/readelf.c:6150
+#: libelf/elf_error.c:87 src/readelf.c:6166
#, c-format
msgid "invalid encoding"
msgstr "некоректне кодуваннÑ"
@@ -707,8 +707,8 @@ msgstr "невідповідніÑÑ‚ÑŒ полів data/scn"
msgid "invalid section header"
msgstr "некоректний заголовок розділу"
-#: libelf/elf_error.c:191 src/readelf.c:9898 src/readelf.c:10498
-#: src/readelf.c:10599 src/readelf.c:10781
+#: libelf/elf_error.c:191 src/readelf.c:9914 src/readelf.c:10514
+#: src/readelf.c:10615 src/readelf.c:10797
#, c-format
msgid "invalid data"
msgstr "некоректні дані"
@@ -1376,7 +1376,7 @@ 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:984 src/strip.c:1021
-#: src/unstrip.c:2146 src/unstrip.c:2175
+#: src/unstrip.c:2189 src/unstrip.c:2218
#, c-format
msgid "cannot open '%s'"
msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ «%s»"
@@ -1473,7 +1473,7 @@ msgstr ""
"розділ [%2zu] «%s»: адреÑа розділів локальних даних потоків не Ñ” нульовою\n"
#. Strings for arguments in help texts.
-#: src/elfcompress.c:1336 src/elflint.c:77 src/readelf.c:153
+#: src/elfcompress.c:1336 src/elflint.c:77 src/readelf.c:158
msgid "FILE..."
msgstr "ФÐЙЛ..."
@@ -1507,14 +1507,14 @@ msgid "Pedantic checking of ELF files compliance with gABI/psABI spec."
msgstr ""
"Педантична перевірка файлів ELF на ÑуміÑніÑÑ‚ÑŒ зі ÑпецифікаціÑми gABI/psABI."
-#: src/elflint.c:154 src/readelf.c:357
-#, c-format
-msgid "cannot open input file"
+#: src/elflint.c:154 src/readelf.c:368
+#, fuzzy, c-format
+msgid "cannot open input file '%s'"
msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ вхідний файл."
#: src/elflint.c:161
-#, c-format
-msgid "cannot generate Elf descriptor: %s\n"
+#, fuzzy, c-format
+msgid "cannot generate Elf descriptor for '%s': %s\n"
msgstr "не вдалоÑÑ Ñтворити деÑкриптор Elf: %s\n"
#: src/elflint.c:180
@@ -1526,7 +1526,7 @@ msgstr "помилка під Ñ‡Ð°Ñ Ñпроби Ð·Ð°ÐºÑ€Ð¸Ñ‚Ñ‚Ñ Ð´ÐµÑкриÐ
msgid "No errors"
msgstr "Без помилок"
-#: src/elflint.c:219 src/readelf.c:559
+#: src/elflint.c:219 src/readelf.c:575
msgid "Missing file name.\n"
msgstr "Ðе вказано назви файла.\n"
@@ -3747,12 +3747,12 @@ msgstr "%s%s%s: не вдалоÑÑ Ñ€Ð¾Ð·Ð¿Ñ–Ð·Ð½Ð°Ñ‚Ð¸ формат файла
msgid "cannot create search tree"
msgstr "не вдалоÑÑ Ñтворити дерево пошуку"
-#: src/nm.c:746 src/nm.c:1205 src/objdump.c:777 src/readelf.c:619
-#: src/readelf.c:1431 src/readelf.c:1582 src/readelf.c:1783 src/readelf.c:1989
-#: src/readelf.c:2179 src/readelf.c:2357 src/readelf.c:2433 src/readelf.c:2691
-#: src/readelf.c:2767 src/readelf.c:2854 src/readelf.c:3452 src/readelf.c:3502
-#: src/readelf.c:3565 src/readelf.c:11214 src/readelf.c:12399
-#: src/readelf.c:12603 src/readelf.c:12671 src/size.c:398 src/size.c:470
+#: src/nm.c:746 src/nm.c:1205 src/objdump.c:779 src/readelf.c:635
+#: src/readelf.c:1447 src/readelf.c:1598 src/readelf.c:1799 src/readelf.c:2005
+#: src/readelf.c:2195 src/readelf.c:2373 src/readelf.c:2449 src/readelf.c:2707
+#: src/readelf.c:2783 src/readelf.c:2870 src/readelf.c:3468 src/readelf.c:3518
+#: src/readelf.c:3581 src/readelf.c:11230 src/readelf.c:12415
+#: src/readelf.c:12626 src/readelf.c:12695 src/size.c:398 src/size.c:470
#: src/strip.c:1038
#, c-format
msgid "cannot get section header string table index"
@@ -3798,12 +3798,12 @@ msgid "%s: entries (%zd) in section %zd `%s' is too large"
msgstr "%s: розмір запиÑу у розділі %zd «%s» не Ñ” очікуваним"
#. XXX Add machine specific object file types.
-#: src/nm.c:1526
+#: src/nm.c:1527
#, c-format
msgid "%s%s%s%s: Invalid operation"
msgstr "%s%s%s%s: некоректна діÑ"
-#: src/nm.c:1583
+#: src/nm.c:1584
#, c-format
msgid "%s%s%s: no symbols"
msgstr "%s%s%s: немає Ñимволів"
@@ -3837,7 +3837,7 @@ msgstr "Показати інформацію лише з розділу ÐÐЗÐ
msgid "Show information from FILEs (a.out by default)."
msgstr "Показати інформацію з ФÐЙЛів (типово a.out)."
-#: src/objdump.c:218 src/readelf.c:564
+#: src/objdump.c:218 src/readelf.c:580
msgid "No operation specified.\n"
msgstr "Ðе вказано дії.\n"
@@ -3846,11 +3846,11 @@ msgstr "Ðе вказано дії.\n"
msgid "while close `%s'"
msgstr "під Ñ‡Ð°Ñ Ð·Ð°ÐºÑ€Ð¸Ñ‚Ñ‚Ñ Â«%s»"
-#: src/objdump.c:363 src/readelf.c:2084 src/readelf.c:2276
+#: src/objdump.c:363 src/readelf.c:2100 src/readelf.c:2292
msgid "INVALID SYMBOL"
msgstr "ÐЕКОРЕКТÐИЙ СИМВОЛ"
-#: src/objdump.c:378 src/readelf.c:2118 src/readelf.c:2312
+#: src/objdump.c:378 src/readelf.c:2134 src/readelf.c:2328
msgid "INVALID SECTION"
msgstr "ÐЕКОРЕКТÐИЙ РОЗДІЛ"
@@ -3904,86 +3904,91 @@ msgstr "«%s» не є архівом"
msgid "error while freeing sub-ELF descriptor: %s"
msgstr "помилка під Ñ‡Ð°Ñ Ñпроби Ð²Ð¸Ð²Ñ–Ð»ÑŒÐ½ÐµÐ½Ð½Ñ Ð´ÐµÑкриптора під-ELF: %s"
-#: src/readelf.c:94
+#: src/readelf.c:97
msgid "ELF input selection:"
msgstr "Вибір вихідних даних ELF:"
-#: src/readelf.c:96
+#: src/readelf.c:99
msgid ""
"Use the named SECTION (default .gnu_debugdata) as (compressed) ELF input data"
msgstr ""
"ВикориÑтовувати вказаний за іменем РОЗДІЛ (типово .gnu_debugdata) Ñк "
"(ÑтиÑнені) вхідні дані ELF"
-#: src/readelf.c:99
+#: src/readelf.c:102
msgid ""
"Used with -w to find the skeleton Compile Units in FILE associated with the "
"Split Compile units in a .dwo input file"
msgstr ""
-#: src/readelf.c:101
+#: src/readelf.c:104
msgid "ELF output selection:"
msgstr "Вибір виводу ELF:"
-#: src/readelf.c:103
+#: src/readelf.c:106
msgid "All these plus -p .strtab -p .dynstr -p .comment"
msgstr "Ð’Ñе це Ð¿Ð»ÑŽÑ -p .strtab -p .dynstr -p .comment"
-#: src/readelf.c:104
+#: src/readelf.c:107
msgid "Display the dynamic segment"
msgstr "Показувати динамічний Ñегмент"
-#: src/readelf.c:105
+#: src/readelf.c:108
msgid "Display the ELF file header"
msgstr "Показувати заголовок файла ELF"
-#: src/readelf.c:107
+#: src/readelf.c:110
msgid "Display histogram of bucket list lengths"
msgstr "Показати гіÑтограму довжин ÑпиÑку блоків"
-#: src/readelf.c:108
+#: src/readelf.c:111
msgid "Display the program headers"
msgstr "Показувати заголовки програми"
-#: src/readelf.c:110
+#: src/readelf.c:113
msgid "Display relocations"
msgstr "Показувати переÑуваннÑ"
-#: src/readelf.c:111
+#: src/readelf.c:114
#, fuzzy
msgid "Display the section groups"
msgstr "Показувати заголовки розділів"
-#: src/readelf.c:112
+#: src/readelf.c:115
msgid "Display the sections' headers"
msgstr "Показувати заголовки розділів"
-#: src/readelf.c:115
+#: src/readelf.c:118
#, fuzzy
msgid "Display the symbol table sections"
msgstr "Показувати таблицю Ñимволів"
-#: src/readelf.c:116
+#: src/readelf.c:120
+#, fuzzy
+msgid "Display (only) the dynamic symbol table"
+msgstr "Показувати лише зовнішні Ñимволи"
+
+#: src/readelf.c:121
msgid "Display versioning information"
msgstr "Показувати відомоÑÑ‚Ñ– щодо верÑÑ–Ñ—"
-#: src/readelf.c:117
+#: src/readelf.c:122
msgid "Display the ELF notes"
msgstr "Показувати нотатки ELF"
-#: src/readelf.c:119
+#: src/readelf.c:124
msgid "Display architecture specific information, if any"
msgstr "Показувати Ñпецифічні Ð´Ð»Ñ Ð°Ñ€Ñ…Ñ–Ñ‚ÐµÐºÑ‚ÑƒÑ€Ð¸ дані, Ñкщо такі буде виÑвлено"
-#: src/readelf.c:121
+#: src/readelf.c:126
msgid "Display sections for exception handling"
msgstr "Показувати розділи Ð´Ð»Ñ Ð¾Ð±Ñ€Ð¾Ð±ÐºÐ¸ виключень"
-#: src/readelf.c:123
+#: src/readelf.c:128
msgid "Additional output selection:"
msgstr "Додатковий вибір виводу:"
-#: src/readelf.c:125
+#: src/readelf.c:130
#, fuzzy
msgid ""
"Display DWARF section content. SECTION can be one of abbrev, addr, aranges, "
@@ -3994,194 +3999,194 @@ msgstr ""
"decodedaranges, frame, gdb_index, info, loc, line, decodedline, ranges, "
"pubnames, str, macinfo, macro або exception"
-#: src/readelf.c:129
+#: src/readelf.c:134
msgid "Dump the uninterpreted contents of SECTION, by number or name"
msgstr ""
"Створити дамп даних РОЗДІЛ, Ñкі не вдалоÑÑ Ñ–Ð½Ñ‚ÐµÑ€Ð¿Ñ€ÐµÑ‚ÑƒÐ²Ð°Ñ‚Ð¸, за номером або "
"назвами"
-#: src/readelf.c:131
+#: src/readelf.c:136
msgid "Print string contents of sections"
msgstr "Виводити вміÑÑ‚ Ñ€Ñдків розділів"
-#: src/readelf.c:134
+#: src/readelf.c:139
msgid "Display the symbol index of an archive"
msgstr "Показувати покажчик Ñимволів архіву"
-#: src/readelf.c:136
+#: src/readelf.c:141
msgid "Output control:"
msgstr "ÐšÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ð¸Ð²Ð¾Ð´Ð¾Ð¼:"
-#: src/readelf.c:138
+#: src/readelf.c:143
msgid "Do not find symbol names for addresses in DWARF data"
msgstr "Ðе шукати назви Ñимволів Ð´Ð»Ñ Ð°Ð´Ñ€ÐµÑ Ñƒ даних DWARF"
-#: src/readelf.c:140
+#: src/readelf.c:145
msgid ""
"Display just offsets instead of resolving values to addresses in DWARF data"
msgstr "Показати лише зміщеннÑ, а не визначені Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð°Ð´Ñ€ÐµÑи у даних DWARF"
-#: src/readelf.c:142
+#: src/readelf.c:147
msgid "Ignored for compatibility (lines always wide)"
msgstr "ІгноруєтьÑÑ Ð· міркувань ÑуміÑноÑÑ‚Ñ– (Ñ€Ñдки завжди широкі)"
-#: src/readelf.c:144
+#: src/readelf.c:149
msgid ""
"Show compression information for compressed sections (when used with -S); "
"decompress section before dumping data (when used with -p or -x)"
msgstr ""
#. Short description of program.
-#: src/readelf.c:149
+#: src/readelf.c:154
msgid "Print information from ELF file in human-readable form."
msgstr "Виводити відомоÑÑ‚Ñ– з файла ELF у придатному Ð´Ð»Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚Ñ–."
#. Look up once.
-#: src/readelf.c:339
+#: src/readelf.c:350
msgid "yes"
msgstr "так"
-#: src/readelf.c:340
+#: src/readelf.c:351
msgid "no"
msgstr "ні"
-#: src/readelf.c:532
+#: src/readelf.c:548
#, c-format
msgid "Unknown DWARF debug section `%s'.\n"
msgstr "Ðевідомий діагноÑтичний розділ DWARF «%s».\n"
-#: src/readelf.c:603 src/readelf.c:714
+#: src/readelf.c:619 src/readelf.c:730
#, c-format
msgid "cannot generate Elf descriptor: %s"
msgstr "не вдалоÑÑ Ñтворити деÑкриптор Elf: %s"
-#: src/readelf.c:610 src/readelf.c:937 src/strip.c:1133
+#: src/readelf.c:626 src/readelf.c:953 src/strip.c:1133
#, c-format
msgid "cannot determine number of sections: %s"
msgstr "не вдалоÑÑ Ð²Ð¸Ð·Ð½Ð°Ñ‡Ð¸Ñ‚Ð¸ кількіÑÑ‚ÑŒ розділів: %s"
-#: src/readelf.c:628 src/readelf.c:1247 src/readelf.c:1455
+#: src/readelf.c:644 src/readelf.c:1263 src/readelf.c:1471
#, c-format
msgid "cannot get section: %s"
msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ розділ: %s"
-#: src/readelf.c:637 src/readelf.c:1254 src/readelf.c:1463 src/readelf.c:12623
-#: src/unstrip.c:395 src/unstrip.c:426 src/unstrip.c:481 src/unstrip.c:600
-#: src/unstrip.c:621 src/unstrip.c:661 src/unstrip.c:873 src/unstrip.c:1204
-#: src/unstrip.c:1331 src/unstrip.c:1355 src/unstrip.c:1398 src/unstrip.c:1462
-#: src/unstrip.c:1636 src/unstrip.c:1770 src/unstrip.c:1913 src/unstrip.c:2008
+#: src/readelf.c:653 src/readelf.c:1270 src/readelf.c:1479 src/readelf.c:12646
+#: src/unstrip.c:395 src/unstrip.c:426 src/unstrip.c:485 src/unstrip.c:604
+#: src/unstrip.c:625 src/unstrip.c:665 src/unstrip.c:881 src/unstrip.c:1212
+#: src/unstrip.c:1339 src/unstrip.c:1363 src/unstrip.c:1419 src/unstrip.c:1483
+#: src/unstrip.c:1658 src/unstrip.c:1809 src/unstrip.c:1952 src/unstrip.c:2051
#, c-format
msgid "cannot get section header: %s"
msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ заголовок розділу: %s"
-#: src/readelf.c:645
+#: src/readelf.c:661
#, c-format
msgid "cannot get section name"
msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ назву розділу"
-#: src/readelf.c:654 src/readelf.c:6560 src/readelf.c:10486 src/readelf.c:10588
-#: src/readelf.c:10766
+#: src/readelf.c:670 src/readelf.c:6576 src/readelf.c:10502 src/readelf.c:10604
+#: src/readelf.c:10782
#, c-format
msgid "cannot get %s content: %s"
msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ дані %s: %s"
-#: src/readelf.c:670
+#: src/readelf.c:686
#, c-format
msgid "cannot create temp file '%s'"
msgstr "не вдалоÑÑ Ñтворити файл тимчаÑових даних «%s»"
-#: src/readelf.c:679
+#: src/readelf.c:695
#, c-format
msgid "cannot write section data"
msgstr "не вдалоÑÑ Ð·Ð°Ð¿Ð¸Ñати дані розділу"
-#: src/readelf.c:685 src/readelf.c:702 src/readelf.c:731
+#: src/readelf.c:701 src/readelf.c:718 src/readelf.c:747
#, c-format
msgid "error while closing Elf descriptor: %s"
msgstr "помилка під Ñ‡Ð°Ñ Ñпроби Ð·Ð°ÐºÑ€Ð¸Ñ‚Ñ‚Ñ Ð´ÐµÑкриптора Elf: %s"
-#: src/readelf.c:692
+#: src/readelf.c:708
#, c-format
msgid "error while rewinding file descriptor"
msgstr "помилка під Ñ‡Ð°Ñ Ð¿Ð¾Ð²ÐµÑ€Ð½ÐµÐ½Ð½Ñ Ð´Ð¾ початкового Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð´ÐµÑкриптора файла"
-#: src/readelf.c:726
+#: src/readelf.c:742
#, c-format
msgid "'%s' is not an archive, cannot print archive index"
msgstr "«%s» не Ñ” архівом, Ð²Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ð¿Ð¾ÐºÐ°Ð¶Ñ‡Ð¸ÐºÐ° архіву неможливе"
-#: src/readelf.c:830
+#: src/readelf.c:846
#, c-format
msgid "cannot stat input file"
msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ дані з вхідного файла за допомогою stat"
-#: src/readelf.c:832
+#: src/readelf.c:848
#, c-format
msgid "input file is empty"
msgstr "вхідний файл є порожнім"
-#: src/readelf.c:834
+#: src/readelf.c:850
#, c-format
msgid "failed reading '%s': %s"
msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ «%s»: %s"
-#: src/readelf.c:863
+#: src/readelf.c:879
#, c-format
msgid "No such section '%s' in '%s'"
msgstr "У «%2$s» немає розділу «%1$s»"
-#: src/readelf.c:922
+#: src/readelf.c:938
#, c-format
msgid "cannot read ELF header: %s"
msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ заголовок ELF: %s"
-#: src/readelf.c:930
+#: src/readelf.c:946
#, c-format
msgid "cannot create EBL handle"
msgstr "не вдалоÑÑ Ñтворити деÑкриптор EBL"
-#: src/readelf.c:943
+#: src/readelf.c:959
#, c-format
msgid "cannot determine number of program headers: %s"
msgstr "не вдалоÑÑ Ð²Ð¸Ð·Ð½Ð°Ñ‡Ð¸Ñ‚Ð¸ кількіÑÑ‚ÑŒ заголовків програми: %s"
-#: src/readelf.c:975
+#: src/readelf.c:991
#, fuzzy, c-format
msgid "cannot read ELF: %s"
msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ %s: %s"
-#: src/readelf.c:1036
+#: src/readelf.c:1052
msgid "NONE (None)"
msgstr "NONE (Ðемає)"
-#: src/readelf.c:1037
+#: src/readelf.c:1053
msgid "REL (Relocatable file)"
msgstr "REL (Придатний до переÑÑƒÐ²Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»)"
-#: src/readelf.c:1038
+#: src/readelf.c:1054
msgid "EXEC (Executable file)"
msgstr "EXEC (Виконуваний файл)"
-#: src/readelf.c:1039
+#: src/readelf.c:1055
msgid "DYN (Shared object file)"
msgstr "DYN (Файл об’єктів Ñпільного викориÑтаннÑ)"
-#: src/readelf.c:1040
+#: src/readelf.c:1056
msgid "CORE (Core file)"
msgstr "CORE (Файл Ñдра)"
-#: src/readelf.c:1045
+#: src/readelf.c:1061
#, c-format
msgid "OS Specific: (%x)\n"
msgstr "ОС-Ñпецифічне: (%x)\n"
#. && e_type <= ET_HIPROC always true
-#: src/readelf.c:1047
+#: src/readelf.c:1063
#, c-format
msgid "Processor Specific: (%x)\n"
msgstr "Специфічне Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñ†ÐµÑора: (%x)\n"
-#: src/readelf.c:1057
+#: src/readelf.c:1073
msgid ""
"ELF Header:\n"
" Magic: "
@@ -4189,7 +4194,7 @@ msgstr ""
"Заголовок ELF:\n"
" Magic: "
-#: src/readelf.c:1061
+#: src/readelf.c:1077
#, c-format
msgid ""
"\n"
@@ -4198,123 +4203,123 @@ msgstr ""
"\n"
" КлаÑ: %s\n"
-#: src/readelf.c:1066
+#: src/readelf.c:1082
#, c-format
msgid " Data: %s\n"
msgstr " Дані: %s\n"
-#: src/readelf.c:1072
+#: src/readelf.c:1088
#, c-format
msgid " Ident Version: %hhd %s\n"
msgstr " ВерÑÑ–Ñ Ident: %hhd %s\n"
-#: src/readelf.c:1074 src/readelf.c:1096
+#: src/readelf.c:1090 src/readelf.c:1112
msgid "(current)"
msgstr "(поточний)"
-#: src/readelf.c:1078
+#: src/readelf.c:1094
#, c-format
msgid " OS/ABI: %s\n"
msgstr " ОС/ABI: %s\n"
-#: src/readelf.c:1081
+#: src/readelf.c:1097
#, c-format
msgid " ABI Version: %hhd\n"
msgstr " ВерÑÑ–Ñ ABI: %hhd\n"
-#: src/readelf.c:1084
+#: src/readelf.c:1100
msgid " Type: "
msgstr " Тип: "
-#: src/readelf.c:1089
+#: src/readelf.c:1105
#, c-format
msgid " Machine: %s\n"
msgstr " Ðрхітектура: %s\n"
-#: src/readelf.c:1091
+#: src/readelf.c:1107
#, fuzzy, c-format
msgid " Machine: <unknown>: 0x%x\n"
msgstr " Ðрхітектура: %s\n"
-#: src/readelf.c:1094
+#: src/readelf.c:1110
#, c-format
msgid " Version: %d %s\n"
msgstr " ВерÑÑ–Ñ: %d %s\n"
-#: src/readelf.c:1098
+#: src/readelf.c:1114
#, c-format
msgid " Entry point address: %#<PRIx64>\n"
msgstr " ÐдреÑа вхідної точки: %#<PRIx64>\n"
-#: src/readelf.c:1101
+#: src/readelf.c:1117
#, c-format
msgid " Start of program headers: %<PRId64> %s\n"
msgstr " Початок заголовків програм: %<PRId64> %s\n"
-#: src/readelf.c:1102 src/readelf.c:1105
+#: src/readelf.c:1118 src/readelf.c:1121
msgid "(bytes into file)"
msgstr "(байтів у файл)"
-#: src/readelf.c:1104
+#: src/readelf.c:1120
#, c-format
msgid " Start of section headers: %<PRId64> %s\n"
msgstr " Початок заголовків розділів: %<PRId64> %s\n"
-#: src/readelf.c:1107
+#: src/readelf.c:1123
#, c-format
msgid " Flags: %s\n"
msgstr " Прапорці: %s\n"
-#: src/readelf.c:1110
+#: src/readelf.c:1126
#, c-format
msgid " Size of this header: %<PRId16> %s\n"
msgstr " Розмір цього заголовка: %<PRId16> %s\n"
-#: src/readelf.c:1111 src/readelf.c:1114 src/readelf.c:1131
+#: src/readelf.c:1127 src/readelf.c:1130 src/readelf.c:1147
msgid "(bytes)"
msgstr "(байтів)"
-#: src/readelf.c:1113
+#: src/readelf.c:1129
#, c-format
msgid " Size of program header entries: %<PRId16> %s\n"
msgstr " Розмір запиÑів заголовка програми: %<PRId16> %s\n"
-#: src/readelf.c:1116
+#: src/readelf.c:1132
#, c-format
msgid " Number of program headers entries: %<PRId16>"
msgstr " КількіÑÑ‚ÑŒ запиÑів заголовків програми: %<PRId16>"
-#: src/readelf.c:1123
+#: src/readelf.c:1139
#, c-format
msgid " (%<PRIu32> in [0].sh_info)"
msgstr " (%<PRIu32> у [0].sh_info)"
-#: src/readelf.c:1126 src/readelf.c:1143 src/readelf.c:1157
+#: src/readelf.c:1142 src/readelf.c:1159 src/readelf.c:1173
msgid " ([0] not available)"
msgstr " ([0] недоÑтупний)"
-#: src/readelf.c:1130
+#: src/readelf.c:1146
#, c-format
msgid " Size of section header entries: %<PRId16> %s\n"
msgstr " Розмір запиÑів заголовків розділів: %<PRId16> %s\n"
-#: src/readelf.c:1133
+#: src/readelf.c:1149
#, c-format
msgid " Number of section headers entries: %<PRId16>"
msgstr " КількіÑÑ‚ÑŒ запиÑів заголовків розділів: %<PRId16>"
-#: src/readelf.c:1140
+#: src/readelf.c:1156
#, c-format
msgid " (%<PRIu32> in [0].sh_size)"
msgstr " (%<PRIu32> у [0].sh_size)"
#. We managed to get the zeroth section.
-#: src/readelf.c:1153
+#: src/readelf.c:1169
#, c-format
msgid " (%<PRIu32> in [0].sh_link)"
msgstr " (%<PRIu32> у [0].sh_link)"
-#: src/readelf.c:1161
+#: src/readelf.c:1177
#, c-format
msgid ""
" Section header string table index: XINDEX%s\n"
@@ -4323,7 +4328,7 @@ msgstr ""
" Ð†Ð½Ð´ÐµÐºÑ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ° розділу у таблиці Ñ€Ñдків: XINDEX%s\n"
"\n"
-#: src/readelf.c:1165
+#: src/readelf.c:1181
#, c-format
msgid ""
" Section header string table index: %<PRId16>\n"
@@ -4332,12 +4337,12 @@ msgstr ""
" Ð†Ð½Ð´ÐµÐºÑ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ° розділу у таблиці Ñ€Ñдків: %<PRId16>\n"
"\n"
-#: src/readelf.c:1212 src/readelf.c:1420
+#: src/readelf.c:1228 src/readelf.c:1436
#, fuzzy, c-format
msgid "cannot get number of sections: %s"
msgstr "не вдалоÑÑ Ð²Ð¸Ð·Ð½Ð°Ñ‡Ð¸Ñ‚Ð¸ кількіÑÑ‚ÑŒ розділів: %s"
-#: src/readelf.c:1215
+#: src/readelf.c:1231
#, fuzzy, c-format
msgid ""
"There are %zd section headers, starting at offset %#<PRIx64>:\n"
@@ -4346,16 +4351,16 @@ msgstr ""
"ВиÑвлено %d заголовків розділів, Ð·Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð¿Ð¾Ñ‡Ð°Ñ‚ÐºÑƒ — %#<PRIx64>:\n"
"\n"
-#: src/readelf.c:1224
+#: src/readelf.c:1240
#, fuzzy, c-format
msgid "cannot get section header string table index: %s"
msgstr "не вдалоÑÑ Ð²Ð¸Ð·Ð½Ð°Ñ‡Ð¸Ñ‚Ð¸ Ñ–Ð½Ð´ÐµÐºÑ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ° розділу у таблиці Ñ€Ñдків"
-#: src/readelf.c:1227
+#: src/readelf.c:1243
msgid "Section Headers:"
msgstr "Заголовки розділів:"
-#: src/readelf.c:1230
+#: src/readelf.c:1246
msgid ""
"[Nr] Name Type Addr Off Size ES Flags Lk "
"Inf Al"
@@ -4363,7 +4368,7 @@ msgstr ""
"[â„– ] Ðазва Тип Ðдр Змі Розмір ES Прап Lk "
"Інф Al"
-#: src/readelf.c:1232
+#: src/readelf.c:1248
msgid ""
"[Nr] Name Type Addr Off Size ES "
"Flags Lk Inf Al"
@@ -4371,35 +4376,35 @@ msgstr ""
"[â„– ] Ðазва Тип Ðдр Змі Розмір ES "
"Прап Lk Інф Al"
-#: src/readelf.c:1237
+#: src/readelf.c:1253
msgid " [Compression Size Al]"
msgstr ""
-#: src/readelf.c:1239
+#: src/readelf.c:1255
msgid " [Compression Size Al]"
msgstr ""
-#: src/readelf.c:1315
+#: src/readelf.c:1331
#, fuzzy, c-format
msgid "bad compression header for section %zd: %s"
msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ заголовок розділу %zu: %s"
-#: src/readelf.c:1326
+#: src/readelf.c:1342
#, fuzzy, c-format
msgid "bad gnu compressed size for section %zd: %s"
msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ дані Ð´Ð»Ñ Ñ€Ð¾Ð·Ð´Ñ–Ð»Ñƒ %d: %s"
-#: src/readelf.c:1344
+#: src/readelf.c:1360
msgid "Program Headers:"
msgstr "Заголовки програми:"
-#: src/readelf.c:1346
+#: src/readelf.c:1362
msgid ""
" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align"
msgstr ""
" Тип Зміщен ВіртÐдр ФізÐдр РозмФайл РозмПам Пра Вирів"
-#: src/readelf.c:1349
+#: src/readelf.c:1365
msgid ""
" Type Offset VirtAddr PhysAddr FileSiz "
"MemSiz Flg Align"
@@ -4407,12 +4412,12 @@ msgstr ""
" Тип Зміщен ВіртÐдр ФізÐдр "
"РозмФайлРозмПам Пра Вирів"
-#: src/readelf.c:1406
+#: src/readelf.c:1422
#, c-format
msgid "\t[Requesting program interpreter: %s]\n"
msgstr "\t[Запит щодо інтерпретатора програми: %s]\n"
-#: src/readelf.c:1433
+#: src/readelf.c:1449
msgid ""
"\n"
" Section to Segment mapping:\n"
@@ -4422,12 +4427,12 @@ msgstr ""
" Ð’Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ñ€Ð¾Ð·Ð´Ñ–Ð»Ñ–Ð² на Ñегмент:\n"
" Розділи Ñегмента..."
-#: src/readelf.c:1444 src/unstrip.c:2067 src/unstrip.c:2109 src/unstrip.c:2116
+#: src/readelf.c:1460 src/unstrip.c:2110 src/unstrip.c:2152 src/unstrip.c:2159
#, c-format
msgid "cannot get program header: %s"
msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ заголовок програми: %s"
-#: src/readelf.c:1590
+#: src/readelf.c:1606
#, c-format
msgid ""
"\n"
@@ -4445,7 +4450,7 @@ msgstr[2] ""
"\n"
"Група розділів COMDAT [%2zu] «%s» з підпиÑом «%s» міÑтить %zu запиÑів:\n"
-#: src/readelf.c:1595
+#: src/readelf.c:1611
#, c-format
msgid ""
"\n"
@@ -4463,31 +4468,31 @@ msgstr[2] ""
"\n"
"Група розділів [%2zu] «%s» з підпиÑом «%s» міÑтить %zu запиÑів:\n"
-#: src/readelf.c:1603
+#: src/readelf.c:1619
msgid "<INVALID SYMBOL>"
msgstr "<ÐЕКОРЕКТÐИЙ СИМВОЛ>"
-#: src/readelf.c:1617
+#: src/readelf.c:1633
msgid "<INVALID SECTION>"
msgstr "<ÐЕКОРЕКТÐИЙ РОЗДІЛ>"
-#: src/readelf.c:1640 src/readelf.c:2367 src/readelf.c:3468 src/readelf.c:12494
-#: src/readelf.c:12501 src/readelf.c:12545 src/readelf.c:12552
+#: src/readelf.c:1656 src/readelf.c:2383 src/readelf.c:3484 src/readelf.c:12517
+#: src/readelf.c:12524 src/readelf.c:12568 src/readelf.c:12575
msgid "Couldn't uncompress section"
msgstr ""
-#: src/readelf.c:1645 src/readelf.c:2372 src/readelf.c:3473
+#: src/readelf.c:1661 src/readelf.c:2388 src/readelf.c:3489
#, fuzzy, c-format
msgid "cannot get section [%zd] header: %s"
msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ заголовок розділу: %s"
-#: src/readelf.c:1789 src/readelf.c:2439 src/readelf.c:2697 src/readelf.c:2773
-#: src/readelf.c:3077 src/readelf.c:3151 src/readelf.c:5348
+#: src/readelf.c:1805 src/readelf.c:2455 src/readelf.c:2713 src/readelf.c:2789
+#: src/readelf.c:3093 src/readelf.c:3167 src/readelf.c:5364
#, c-format
msgid "invalid sh_link value in section %zu"
msgstr "некоректне Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ sh_link у розділі %zu"
-#: src/readelf.c:1792
+#: src/readelf.c:1808
#, c-format
msgid ""
"\n"
@@ -4510,36 +4515,36 @@ msgstr[2] ""
"Динамічний Ñегмент міÑтить %lu запиÑів:\n"
" Ðдр: %#0*<PRIx64> ЗміщеннÑ: %#08<PRIx64> ПоÑ. на розділ: [%2u] '%s'\n"
-#: src/readelf.c:1802
+#: src/readelf.c:1818
msgid " Type Value\n"
msgstr " Тип ЗначеннÑ\n"
-#: src/readelf.c:1826
+#: src/readelf.c:1842
#, c-format
msgid "Shared library: [%s]\n"
msgstr "Спільна бібліотека: [%s]\n"
-#: src/readelf.c:1831
+#: src/readelf.c:1847
#, c-format
msgid "Library soname: [%s]\n"
msgstr "Ðазва so бібліотеки: [%s]\n"
-#: src/readelf.c:1836
+#: src/readelf.c:1852
#, c-format
msgid "Library rpath: [%s]\n"
msgstr "Rpath бібліотеки: [%s]\n"
-#: src/readelf.c:1841
+#: src/readelf.c:1857
#, c-format
msgid "Library runpath: [%s]\n"
msgstr "Runpath бібліотеки: [%s]\n"
-#: src/readelf.c:1861
+#: src/readelf.c:1877
#, c-format
msgid "%<PRId64> (bytes)\n"
msgstr "%<PRId64> (байт)\n"
-#: src/readelf.c:1974 src/readelf.c:2164
+#: src/readelf.c:1990 src/readelf.c:2180
#, c-format
msgid ""
"\n"
@@ -4548,7 +4553,7 @@ msgstr ""
"\n"
"Ðекоректна Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ Ñимволів за зміщеннÑм %#0<PRIx64>\n"
-#: src/readelf.c:1992 src/readelf.c:2182
+#: src/readelf.c:2008 src/readelf.c:2198
#, c-format
msgid ""
"\n"
@@ -4577,7 +4582,7 @@ msgstr[2] ""
#. The .rela.dyn section does not refer to a specific section but
#. instead of section index zero. Do not try to print a section
#. name.
-#: src/readelf.c:2007 src/readelf.c:2197
+#: src/readelf.c:2023 src/readelf.c:2213
#, c-format
msgid ""
"\n"
@@ -4595,30 +4600,30 @@ msgstr[2] ""
"\n"
"Розділ переÑÑƒÐ²Ð°Ð½Ð½Ñ [%2u] «%s» за зміщеннÑм %#0<PRIx64> міÑтить %d запиÑів:\n"
-#: src/readelf.c:2017
+#: src/readelf.c:2033
msgid " Offset Type Value Name\n"
msgstr " Ð—Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð¢Ð¸Ð¿ Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ðазва\n"
-#: src/readelf.c:2019
+#: src/readelf.c:2035
msgid " Offset Type Value Name\n"
msgstr " Ð—Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð¢Ð¸Ð¿ Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ðазва\n"
-#: src/readelf.c:2072 src/readelf.c:2083 src/readelf.c:2096 src/readelf.c:2117
-#: src/readelf.c:2129 src/readelf.c:2263 src/readelf.c:2275 src/readelf.c:2289
-#: src/readelf.c:2311 src/readelf.c:2324
+#: src/readelf.c:2088 src/readelf.c:2099 src/readelf.c:2112 src/readelf.c:2133
+#: src/readelf.c:2145 src/readelf.c:2279 src/readelf.c:2291 src/readelf.c:2305
+#: src/readelf.c:2327 src/readelf.c:2340
msgid "<INVALID RELOC>"
msgstr "<ÐЕКОРЕКТÐЕ ПЕРЕМІЩЕÐÐЯ>"
-#: src/readelf.c:2207
+#: src/readelf.c:2223
msgid " Offset Type Value Addend Name\n"
msgstr " Ð—Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð¢Ð¸Ð¿ Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ðазва додатка\n"
-#: src/readelf.c:2209
+#: src/readelf.c:2225
msgid " Offset Type Value Addend Name\n"
msgstr ""
" Ð—Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð¢Ð¸Ð¿ Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ðазва додатка\n"
-#: src/readelf.c:2447
+#: src/readelf.c:2463
#, c-format
msgid ""
"\n"
@@ -4636,7 +4641,7 @@ msgstr[2] ""
"\n"
"Ð¢Ð°Ð±Ð»Ð¸Ñ†Ñ Ñимволів [%2u] «%s» міÑтить %u запиÑів:\n"
-#: src/readelf.c:2452
+#: src/readelf.c:2468
#, c-format
msgid " %lu local symbol String table: [%2u] '%s'\n"
msgid_plural " %lu local symbols String table: [%2u] '%s'\n"
@@ -4644,33 +4649,33 @@ msgstr[0] " %lu лок. Ñимвол Ð¢Ð°Ð±Ð»Ð¸Ñ†Ñ Ñимволів: [%2u] «
msgstr[1] " %lu лок. Ñимволи Ð¢Ð°Ð±Ð»Ð¸Ñ†Ñ Ñимволів: [%2u] «%s»\n"
msgstr[2] " %lu лок. Ñимволів Ð¢Ð°Ð±Ð»Ð¸Ñ†Ñ Ñимволів: [%2u] «%s»\n"
-#: src/readelf.c:2460
+#: src/readelf.c:2476
msgid " Num: Value Size Type Bind Vis Ndx Name\n"
msgstr " â„–â„– Знач. Роз. Тип Зв’Ñз Вид. Інд Ðазва\n"
-#: src/readelf.c:2462
+#: src/readelf.c:2478
msgid " Num: Value Size Type Bind Vis Ndx Name\n"
msgstr " â„–â„– Знач. Роз. Тип Зв’Ñз Вид. Інд Ðазва\n"
-#: src/readelf.c:2482
+#: src/readelf.c:2498
#, c-format
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:2570
+#: src/readelf.c:2586
#, c-format
msgid "bad dynamic symbol"
msgstr "помилковий динамічний Ñимвол"
-#: src/readelf.c:2652
+#: src/readelf.c:2668
msgid "none"
msgstr "немає"
-#: src/readelf.c:2669
+#: src/readelf.c:2685
msgid "| <unknown>"
msgstr "| <невідомо>"
-#: src/readelf.c:2700
+#: src/readelf.c:2716
#, c-format
msgid ""
"\n"
@@ -4693,17 +4698,17 @@ msgstr[2] ""
"Розділ потреби у верÑÑ–ÑÑ… [%2u] «%s», що міÑтить %d запиÑів:\n"
" Ðдр.: %#0*<PRIx64> Зміщ.: %#08<PRIx64> ПоÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° розділ: [%2u] «%s»\n"
-#: src/readelf.c:2721
+#: src/readelf.c:2737
#, c-format
msgid " %#06x: Version: %hu File: %s Cnt: %hu\n"
msgstr " %#06x: ВерÑÑ–Ñ: %hu Файл: %s Кть: %hu\n"
-#: src/readelf.c:2734
+#: src/readelf.c:2750
#, c-format
msgid " %#06x: Name: %s Flags: %s Version: %hu\n"
msgstr " %#06x: Ðазва: %s Прап: %s ВерÑÑ–Ñ: %hu\n"
-#: src/readelf.c:2777
+#: src/readelf.c:2793
#, c-format
msgid ""
"\n"
@@ -4726,18 +4731,18 @@ msgstr[2] ""
"Розділ Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð²ÐµÑ€ÑÑ–Ñ— [%2u] «%s», що міÑтить %d запиÑів:\n"
" Ðдр.: %#0*<PRIx64> Зміщ.: %#08<PRIx64> ПоÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° розділ: [%2u] «%s»\n"
-#: src/readelf.c:2805
+#: src/readelf.c:2821
#, 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:2820
+#: src/readelf.c:2836
#, c-format
msgid " %#06x: Parent %d: %s\n"
msgstr " %#06x: батьківÑький %d: %s\n"
#. Print the header.
-#: src/readelf.c:3081
+#: src/readelf.c:3097
#, c-format
msgid ""
"\n"
@@ -4760,15 +4765,15 @@ msgstr[2] ""
"Розділ Ñимволів верÑій [%2u] «%s», що міÑтить %d запиÑів:\n"
" Ðдр.: %#0*<PRIx64> Зміщ.: %#08<PRIx64> ПоÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° розділ: [%2u] «%s»"
-#: src/readelf.c:3109
+#: src/readelf.c:3125
msgid " 0 *local* "
msgstr " 0 *локальний* "
-#: src/readelf.c:3114
+#: src/readelf.c:3130
msgid " 1 *global* "
msgstr " 1 *загальний* "
-#: src/readelf.c:3156
+#: src/readelf.c:3172
#, c-format
msgid ""
"\n"
@@ -4796,22 +4801,22 @@ msgstr[2] ""
"блоками):\n"
" Ðдр.: %#0*<PRIx64> Зміщ.: %#08<PRIx64> ПоÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° розділ: [%2u] «%s»\n"
-#: src/readelf.c:3178
+#: src/readelf.c:3194
#, no-c-format
msgid " Length Number % of total Coverage\n"
msgstr " Довжина Ðомер % від загал. ПокриттÑ\n"
-#: src/readelf.c:3180
+#: src/readelf.c:3196
#, c-format
msgid " 0 %6<PRIu32> %5.1f%%\n"
msgstr " 0 %6<PRIu32> %5.1f%%\n"
-#: src/readelf.c:3187
+#: src/readelf.c:3203
#, c-format
msgid "%7d %6<PRIu32> %5.1f%% %5.1f%%\n"
msgstr "%7d %6<PRIu32> %5.1f%% %5.1f%%\n"
-#: src/readelf.c:3200
+#: src/readelf.c:3216
#, c-format
msgid ""
" Average number of tests: successful lookup: %f\n"
@@ -4820,37 +4825,37 @@ msgstr ""
" Ð¡ÐµÑ€ÐµÐ´Ð½Ñ ÐºÑ–Ð»ÑŒÐºÑ–ÑÑ‚ÑŒ теÑтів: уÑпішний пошук: %f\n"
"\t\t\t неуÑпішний пошук: %f\n"
-#: src/readelf.c:3218 src/readelf.c:3282 src/readelf.c:3348
+#: src/readelf.c:3234 src/readelf.c:3298 src/readelf.c:3364
#, c-format
msgid "cannot get data for section %d: %s"
msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ дані Ð´Ð»Ñ Ñ€Ð¾Ð·Ð´Ñ–Ð»Ñƒ %d: %s"
-#: src/readelf.c:3226
+#: src/readelf.c:3242
#, c-format
msgid "invalid data in sysv.hash section %d"
msgstr "некоректні дані у розділі sysv.hash %d"
-#: src/readelf.c:3255
+#: src/readelf.c:3271
#, fuzzy, c-format
msgid "invalid chain in sysv.hash section %d"
msgstr "некоректні дані у розділі sysv.hash %d"
-#: src/readelf.c:3290
+#: src/readelf.c:3306
#, c-format
msgid "invalid data in sysv.hash64 section %d"
msgstr "некоректні дані у розділі sysv.hash64 %d"
-#: src/readelf.c:3321
+#: src/readelf.c:3337
#, fuzzy, c-format
msgid "invalid chain in sysv.hash64 section %d"
msgstr "некоректні дані у розділі sysv.hash64 %d"
-#: src/readelf.c:3357
+#: src/readelf.c:3373
#, c-format
msgid "invalid data in gnu.hash section %d"
msgstr "некоректні дані у розділі gnu.hash %d"
-#: src/readelf.c:3424
+#: src/readelf.c:3440
#, c-format
msgid ""
" Symbol Bias: %u\n"
@@ -4860,7 +4865,7 @@ msgstr ""
" Розмір бітової маÑки: %zu байтів %<PRIuFAST32>%% вÑтановлених бітів зÑув "
"2-го хешу: %u\n"
-#: src/readelf.c:3513
+#: src/readelf.c:3529
#, c-format
msgid ""
"\n"
@@ -4881,7 +4886,7 @@ msgstr[2] ""
"Розділ ÑпиÑку бібліотек [%2zu] «%s» за зміщеннÑм %#0<PRIx64> міÑтить %d "
"запиÑів:\n"
-#: src/readelf.c:3527
+#: src/readelf.c:3543
msgid ""
" Library Time Stamp Checksum Version "
"Flags"
@@ -4889,7 +4894,7 @@ msgstr ""
" Бібліотека ЧаÑовий штамп ВерÑÑ–Ñ Ñуми "
"Прапорці"
-#: src/readelf.c:3579
+#: src/readelf.c:3595
#, c-format
msgid ""
"\n"
@@ -4900,102 +4905,102 @@ msgstr ""
"Розділ атрибутів об’єктів [%2zu] «%s» з %<PRIu64> байтів за зміщеннÑм "
"%#0<PRIx64>:\n"
-#: src/readelf.c:3596
+#: src/readelf.c:3612
msgid " Owner Size\n"
msgstr " ВлаÑник Розмір\n"
-#: src/readelf.c:3625
+#: src/readelf.c:3641
#, c-format
msgid " %-13s %4<PRIu32>\n"
msgstr " %-13s %4<PRIu32>\n"
#. Unknown subsection, print and skip.
-#: src/readelf.c:3664
+#: src/readelf.c:3680
#, c-format
msgid " %-4u %12<PRIu32>\n"
msgstr " %-4u %12<PRIu32>\n"
#. Tag_File
-#: src/readelf.c:3669
+#: src/readelf.c:3685
#, c-format
msgid " File: %11<PRIu32>\n"
msgstr " Файл: %11<PRIu32>\n"
-#: src/readelf.c:3718
+#: src/readelf.c:3734
#, c-format
msgid " %s: %<PRId64>, %s\n"
msgstr " %s: %<PRId64>, %s\n"
-#: src/readelf.c:3721
+#: src/readelf.c:3737
#, c-format
msgid " %s: %<PRId64>\n"
msgstr " %s: %<PRId64>\n"
-#: src/readelf.c:3724
+#: src/readelf.c:3740
#, c-format
msgid " %s: %s\n"
msgstr " %s: %s\n"
-#: src/readelf.c:3734
+#: src/readelf.c:3750
#, c-format
msgid " %u: %<PRId64>\n"
msgstr " %u: %<PRId64>\n"
-#: src/readelf.c:3737
+#: src/readelf.c:3753
#, c-format
msgid " %u: %s\n"
msgstr " %u: %s\n"
-#: src/readelf.c:3807
+#: src/readelf.c:3823
#, fuzzy, c-format
msgid "sprintf failure"
msgstr "помилка mprotect"
-#: src/readelf.c:4289
+#: src/readelf.c:4305
msgid "empty block"
msgstr "порожній блок"
-#: src/readelf.c:4292
+#: src/readelf.c:4308
#, c-format
msgid "%zu byte block:"
msgstr "%zu-байтовий блок:"
-#: src/readelf.c:4770
+#: src/readelf.c:4786
#, fuzzy, c-format
msgid "%*s[%2<PRIuMAX>] %s <TRUNCATED>\n"
msgstr "%*s[%4<PRIuMAX>] %s <ОБРІЗÐÐО>\n"
-#: src/readelf.c:4834
+#: src/readelf.c:4850
#, c-format
msgid "%s %#<PRIx64> used with different address sizes"
msgstr "%s %#<PRIx64> викориÑтано з різними розмірами адреÑ"
-#: src/readelf.c:4841
+#: src/readelf.c:4857
#, c-format
msgid "%s %#<PRIx64> used with different offset sizes"
msgstr "%s %#<PRIx64> викориÑтано з різними розмірами зміщень"
-#: src/readelf.c:4848
+#: src/readelf.c:4864
#, c-format
msgid "%s %#<PRIx64> used with different base addresses"
msgstr "%s %#<PRIx64> викориÑтано з різними базовими адреÑами"
-#: src/readelf.c:4855
+#: src/readelf.c:4871
#, fuzzy, c-format
msgid "%s %#<PRIx64> used with different attribute %s and %s"
msgstr "%s %#<PRIx64> викориÑтано з різними розмірами адреÑ"
-#: src/readelf.c:4952
+#: src/readelf.c:4968
#, c-format
msgid " [%6tx] <UNUSED GARBAGE IN REST OF SECTION>\n"
msgstr " [%6tx] <ÐЕВИКОРИСТОВУВÐÐІ ДÐÐІ У РЕШТІ РОЗДІЛУ>\n"
-#: src/readelf.c:4960
+#: src/readelf.c:4976
#, c-format
msgid " [%6tx] <UNUSED GARBAGE> ... %<PRIu64> bytes ...\n"
msgstr " [%6tx] <ÐЕВИКОРИСТОВУВÐÐІ ДÐÐІ> ... %<PRIu64> байтів ...\n"
-#: src/readelf.c:5038
+#: src/readelf.c:5054
#, c-format
msgid ""
"\n"
@@ -5006,7 +5011,7 @@ msgstr ""
"Розділ DWARF [%2zu] «%s» зі зміщеннÑм %#<PRIx64>:\n"
" [ Код]\n"
-#: src/readelf.c:5046
+#: src/readelf.c:5062
#, c-format
msgid ""
"\n"
@@ -5015,20 +5020,20 @@ msgstr ""
"\n"
"Розділ Ñкорочень за зміщеннÑм %<PRIu64>:\n"
-#: src/readelf.c:5059
+#: src/readelf.c:5075
#, c-format
msgid " *** error while reading abbreviation: %s\n"
msgstr " *** помилка під Ñ‡Ð°Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ ÑкороченнÑ: %s\n"
-#: src/readelf.c:5075
+#: src/readelf.c:5091
#, c-format
msgid " [%5u] offset: %<PRId64>, children: %s, tag: %s\n"
msgstr " [%5u] зміщеннÑ: %<PRId64>, дочірній: %s, мітка: %s\n"
-#: src/readelf.c:5108 src/readelf.c:5417 src/readelf.c:5584 src/readelf.c:5969
-#: src/readelf.c:6570 src/readelf.c:8307 src/readelf.c:8993 src/readelf.c:9429
-#: src/readelf.c:9674 src/readelf.c:9840 src/readelf.c:10227
-#: src/readelf.c:10287
+#: src/readelf.c:5124 src/readelf.c:5433 src/readelf.c:5600 src/readelf.c:5985
+#: src/readelf.c:6586 src/readelf.c:8323 src/readelf.c:9009 src/readelf.c:9445
+#: src/readelf.c:9690 src/readelf.c:9856 src/readelf.c:10243
+#: src/readelf.c:10303
#, c-format
msgid ""
"\n"
@@ -5037,56 +5042,56 @@ msgstr ""
"\n"
"Розділ DWARF [%2zu] «%s» зі зміщеннÑм %#<PRIx64>:\n"
-#: src/readelf.c:5121
+#: src/readelf.c:5137
#, fuzzy, c-format
msgid "cannot get .debug_addr section data: %s"
msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ дані розділу: %s"
-#: src/readelf.c:5221 src/readelf.c:5245 src/readelf.c:5629 src/readelf.c:9038
+#: src/readelf.c:5237 src/readelf.c:5261 src/readelf.c:5645 src/readelf.c:9054
#, fuzzy, c-format
msgid " Length: %8<PRIu64>\n"
msgstr ""
"\n"
" Довжина: %6<PRIu64>\n"
-#: src/readelf.c:5223 src/readelf.c:5260 src/readelf.c:5642 src/readelf.c:9051
+#: src/readelf.c:5239 src/readelf.c:5276 src/readelf.c:5658 src/readelf.c:9067
#, fuzzy, c-format
msgid " DWARF version: %8<PRIu16>\n"
msgstr " верÑÑ–Ñ DWARF: %6<PRIuFAST16>\n"
-#: src/readelf.c:5224 src/readelf.c:5269 src/readelf.c:5651 src/readelf.c:9060
+#: src/readelf.c:5240 src/readelf.c:5285 src/readelf.c:5667 src/readelf.c:9076
#, fuzzy, c-format
msgid " Address size: %8<PRIu64>\n"
msgstr " Розмір адреÑи: %6<PRIu64>\n"
-#: src/readelf.c:5226 src/readelf.c:5279 src/readelf.c:5661 src/readelf.c:9070
+#: src/readelf.c:5242 src/readelf.c:5295 src/readelf.c:5677 src/readelf.c:9086
#, fuzzy, c-format
msgid " Segment size: %8<PRIu64>\n"
msgstr ""
" Розмір Ñегмента: %6<PRIu64>\n"
"\n"
-#: src/readelf.c:5264 src/readelf.c:5646 src/readelf.c:9055 src/readelf.c:10419
+#: src/readelf.c:5280 src/readelf.c:5662 src/readelf.c:9071 src/readelf.c:10435
#, fuzzy, c-format
msgid "Unknown version"
msgstr "невідома верÑÑ–Ñ"
-#: src/readelf.c:5274 src/readelf.c:5487 src/readelf.c:5656 src/readelf.c:9065
+#: src/readelf.c:5290 src/readelf.c:5503 src/readelf.c:5672 src/readelf.c:9081
#, c-format
msgid "unsupported address size"
msgstr "непідтримуваний розмір адреÑи"
-#: src/readelf.c:5285 src/readelf.c:5498 src/readelf.c:5666 src/readelf.c:9075
+#: src/readelf.c:5301 src/readelf.c:5514 src/readelf.c:5682 src/readelf.c:9091
#, c-format
msgid "unsupported segment size"
msgstr "непідтримуваний розмір Ñегмента"
-#: src/readelf.c:5338 src/readelf.c:5412
+#: src/readelf.c:5354 src/readelf.c:5428
#, c-format
msgid "cannot get .debug_aranges content: %s"
msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ дані get .debug_aranges: %s"
-#: src/readelf.c:5353
+#: src/readelf.c:5369
#, c-format
msgid ""
"\n"
@@ -5104,12 +5109,12 @@ msgstr[2] ""
"\n"
"Розділ DWARF [%2zu] «%s» за зміщеннÑм %#<PRIx64> міÑтить %zu запиÑів:\n"
-#: src/readelf.c:5384
+#: src/readelf.c:5400
#, c-format
msgid " [%*zu] ???\n"
msgstr " [%*zu] ???\n"
-#: src/readelf.c:5386
+#: src/readelf.c:5402
#, c-format
msgid ""
" [%*zu] start: %0#*<PRIx64>, length: %5<PRIu64>, CU DIE offset: %6<PRId64>\n"
@@ -5117,7 +5122,7 @@ msgstr ""
" [%*zu] початок: %0#*<PRIx64>, довжина: %5<PRIu64>, Ð·Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ CU DIE: "
"%6<PRId64>\n"
-#: src/readelf.c:5430 src/readelf.c:8334
+#: src/readelf.c:5446 src/readelf.c:8350
#, c-format
msgid ""
"\n"
@@ -5126,13 +5131,13 @@ msgstr ""
"\n"
"Ð¢Ð°Ð±Ð»Ð¸Ñ†Ñ Ð·Ð° зміщеннÑм %zu:\n"
-#: src/readelf.c:5434 src/readelf.c:5610 src/readelf.c:6594 src/readelf.c:8345
-#: src/readelf.c:9019
+#: src/readelf.c:5450 src/readelf.c:5626 src/readelf.c:6610 src/readelf.c:8361
+#: src/readelf.c:9035
#, c-format
msgid "invalid data in section [%zu] '%s'"
msgstr "некоректні дані у розділі [%zu] «%s»"
-#: src/readelf.c:5450
+#: src/readelf.c:5466
#, c-format
msgid ""
"\n"
@@ -5141,27 +5146,27 @@ msgstr ""
"\n"
" Довжина: %6<PRIu64>\n"
-#: src/readelf.c:5462
+#: src/readelf.c:5478
#, c-format
msgid " DWARF version: %6<PRIuFAST16>\n"
msgstr " верÑÑ–Ñ DWARF: %6<PRIuFAST16>\n"
-#: src/readelf.c:5466
+#: src/readelf.c:5482
#, c-format
msgid "unsupported aranges version"
msgstr "непідтримувана верÑÑ–Ñ aranges"
-#: src/readelf.c:5477
+#: src/readelf.c:5493
#, c-format
msgid " CU offset: %6<PRIx64>\n"
msgstr " Ð·Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ CU: %6<PRIx64>\n"
-#: src/readelf.c:5483
+#: src/readelf.c:5499
#, c-format
msgid " Address size: %6<PRIu64>\n"
msgstr " Розмір адреÑи: %6<PRIu64>\n"
-#: src/readelf.c:5494
+#: src/readelf.c:5510
#, c-format
msgid ""
" Segment size: %6<PRIu64>\n"
@@ -5170,111 +5175,111 @@ msgstr ""
" Розмір Ñегмента: %6<PRIu64>\n"
"\n"
-#: src/readelf.c:5549
+#: src/readelf.c:5565
#, c-format
msgid " %zu padding bytes\n"
msgstr " %zu байтів доповненнÑ\n"
-#: src/readelf.c:5593
+#: src/readelf.c:5609
#, fuzzy, c-format
msgid "cannot get .debug_rnglists content: %s"
msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ дані .debug_ranges: %s"
-#: src/readelf.c:5616 src/readelf.c:9025
+#: src/readelf.c:5632 src/readelf.c:9041
#, fuzzy, c-format
msgid ""
"Table at Offset 0x%<PRIx64>:\n"
"\n"
msgstr " Ð·Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ .debug_line: 0x%<PRIx64>\n"
-#: src/readelf.c:5671 src/readelf.c:9080
+#: src/readelf.c:5687 src/readelf.c:9096
#, fuzzy, c-format
msgid " Offset entries: %8<PRIu64>\n"
msgstr " Довжина зміщеннÑ: %<PRIu8>\n"
-#: src/readelf.c:5687 src/readelf.c:9096
+#: src/readelf.c:5703 src/readelf.c:9112
#, c-format
msgid " Unknown CU base: "
msgstr ""
-#: src/readelf.c:5689 src/readelf.c:9098
+#: src/readelf.c:5705 src/readelf.c:9114
#, c-format
msgid " CU [%6<PRIx64>] base: "
msgstr ""
-#: src/readelf.c:5695 src/readelf.c:9104
+#: src/readelf.c:5711 src/readelf.c:9120
#, c-format
msgid " Not associated with a CU.\n"
msgstr ""
-#: src/readelf.c:5706 src/readelf.c:9115
+#: src/readelf.c:5722 src/readelf.c:9131
#, c-format
msgid "too many offset entries for unit length"
msgstr ""
-#: src/readelf.c:5710 src/readelf.c:9119
+#: src/readelf.c:5726 src/readelf.c:9135
#, fuzzy, c-format
msgid " Offsets starting at 0x%<PRIx64>:\n"
msgstr " ЗміщеннÑ: 0x%<PRIx64>\n"
-#: src/readelf.c:5762
+#: src/readelf.c:5778
#, fuzzy, c-format
msgid "invalid range list data"
msgstr "некоректні дані"
-#: src/readelf.c:5947 src/readelf.c:9407
+#: src/readelf.c:5963 src/readelf.c:9423
#, fuzzy, c-format
msgid ""
" %zu padding bytes\n"
"\n"
msgstr " %zu байтів доповненнÑ\n"
-#: src/readelf.c:5964
+#: src/readelf.c:5980
#, c-format
msgid "cannot get .debug_ranges content: %s"
msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ дані .debug_ranges: %s"
-#: src/readelf.c:6000 src/readelf.c:9462
+#: src/readelf.c:6016 src/readelf.c:9478
#, c-format
msgid ""
"\n"
" Unknown CU base: "
msgstr ""
-#: src/readelf.c:6002 src/readelf.c:9464
+#: src/readelf.c:6018 src/readelf.c:9480
#, c-format
msgid ""
"\n"
" CU [%6<PRIx64>] base: "
msgstr ""
-#: src/readelf.c:6011 src/readelf.c:9490 src/readelf.c:9516
+#: src/readelf.c:6027 src/readelf.c:9506 src/readelf.c:9532
#, c-format
msgid " [%6tx] <INVALID DATA>\n"
msgstr " [%6tx] <ÐЕКОРЕКТÐІ ДÐÐІ>\n"
-#: src/readelf.c:6032 src/readelf.c:9596
+#: src/readelf.c:6048 src/readelf.c:9612
#, fuzzy, c-format
msgid ""
" [%6tx] base address\n"
" "
msgstr " [%6tx] базова адреÑа %s\n"
-#: src/readelf.c:6040 src/readelf.c:9604
+#: src/readelf.c:6056 src/readelf.c:9620
#, fuzzy, c-format
msgid " [%6tx] empty list\n"
msgstr " [%6tx] порожній ÑпиÑок\n"
-#: src/readelf.c:6295
+#: src/readelf.c:6311
msgid " <INVALID DATA>\n"
msgstr " <ÐЕКОРЕКТÐІ ДÐÐІ>\n"
-#: src/readelf.c:6548
+#: src/readelf.c:6564
#, c-format
msgid "cannot get ELF: %s"
msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ ELF: %s"
-#: src/readelf.c:6566
+#: src/readelf.c:6582
#, c-format
msgid ""
"\n"
@@ -5283,7 +5288,7 @@ msgstr ""
"\n"
"Розділ відомоÑтей щодо вікна викликів [%2zu] «%s» за зміщеннÑм %#<PRIx64>:\n"
-#: src/readelf.c:6616
+#: src/readelf.c:6632
#, c-format
msgid ""
"\n"
@@ -5292,65 +5297,65 @@ msgstr ""
"\n"
" [%6tx] нульовий переривач\n"
-#: src/readelf.c:6717 src/readelf.c:6871
+#: src/readelf.c:6733 src/readelf.c:6887
#, c-format
msgid "invalid augmentation length"
msgstr "некоректна довжина збільшеннÑ"
-#: src/readelf.c:6732
+#: src/readelf.c:6748
msgid "FDE address encoding: "
msgstr "ÐšÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ð°Ð´Ñ€ÐµÑи FDE: "
-#: src/readelf.c:6738
+#: src/readelf.c:6754
msgid "LSDA pointer encoding: "
msgstr "ÐšÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ð²ÐºÐ°Ð·Ñ–Ð²Ð½Ð¸ÐºÐ° LSDA: "
-#: src/readelf.c:6848
+#: src/readelf.c:6864
#, c-format
msgid " (offset: %#<PRIx64>)"
msgstr " (зміщеннÑ: %#<PRIx64>)"
-#: src/readelf.c:6855
+#: src/readelf.c:6871
#, c-format
msgid " (end offset: %#<PRIx64>)"
msgstr " (Ð·Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð²Ñ–Ð´ кінцÑ: %#<PRIx64>)"
-#: src/readelf.c:6892
+#: src/readelf.c:6908
#, c-format
msgid " %-26sLSDA pointer: %#<PRIx64>\n"
msgstr " %-26sвказівник LSDA: %#<PRIx64>\n"
-#: src/readelf.c:6977
+#: src/readelf.c:6993
#, fuzzy, c-format
msgid "DIE [%<PRIx64>] cannot get attribute code: %s"
msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ код атрибута: %s"
-#: src/readelf.c:6987
+#: src/readelf.c:7003
#, fuzzy, c-format
msgid "DIE [%<PRIx64>] cannot get attribute form: %s"
msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ форму атрибута: %s"
-#: src/readelf.c:7009
+#: src/readelf.c:7025
#, fuzzy, c-format
msgid "DIE [%<PRIx64>] cannot get attribute '%s' (%s) value: %s"
msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð°Ñ‚Ñ€Ð¸Ð±ÑƒÑ‚Ð°: %s"
-#: src/readelf.c:7339
+#: src/readelf.c:7355
#, fuzzy, c-format
msgid "invalid file (%<PRId64>): %s"
msgstr "некоректний файл"
-#: src/readelf.c:7343
+#: src/readelf.c:7359
#, fuzzy, c-format
msgid "no srcfiles for CU [%<PRIx64>]"
msgstr " вÑтановити файл у %<PRIu64>\n"
-#: src/readelf.c:7347
+#: src/readelf.c:7363
#, fuzzy, c-format
msgid "couldn't get DWARF CU: %s"
msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ ELF: %s"
-#: src/readelf.c:7660
+#: src/readelf.c:7676
#, c-format
msgid ""
"\n"
@@ -5361,12 +5366,12 @@ msgstr ""
"Розділ DWARF [%2zu] «%s» за зміщеннÑм %#<PRIx64>:\n"
" [ЗміщеннÑ]\n"
-#: src/readelf.c:7710
+#: src/readelf.c:7726
#, fuzzy, c-format
msgid "cannot get next unit: %s"
msgstr "не вдалоÑÑ Ð²Ð¸Ð·Ð½Ð°Ñ‡Ð¸Ñ‚Ð¸ наÑтупний DIE: %s"
-#: src/readelf.c:7729
+#: src/readelf.c:7745
#, fuzzy, c-format
msgid ""
" Type unit at offset %<PRIu64>:\n"
@@ -5379,7 +5384,7 @@ msgstr ""
"ЗміщеннÑ: %<PRIu8>\n"
" ÐŸÑ–Ð´Ð¿Ð¸Ñ Ñ‚Ð¸Ð¿Ñƒ: %#<PRIx64>, Ð—Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ñ‚Ð¸Ð¿Ñƒ: %#<PRIx64>\n"
-#: src/readelf.c:7741
+#: src/readelf.c:7757
#, c-format
msgid ""
" Compilation unit at offset %<PRIu64>:\n"
@@ -5390,38 +5395,38 @@ msgstr ""
" ВерÑÑ–Ñ: %<PRIu16>, Ð—Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ñ€Ð¾Ð·Ð´Ñ–Ð»Ñƒ Ñкорочень: %<PRIu64>, ÐдреÑа: %<PRIu8>, "
"ЗміщеннÑ: %<PRIu8>\n"
-#: src/readelf.c:7751 src/readelf.c:7914
+#: src/readelf.c:7767 src/readelf.c:7930
#, c-format
msgid " Unit type: %s (%<PRIu8>)"
msgstr ""
-#: src/readelf.c:7778
+#: src/readelf.c:7794
#, c-format
msgid "unknown version (%d) or unit type (%d)"
msgstr ""
-#: src/readelf.c:7807
+#: src/readelf.c:7823
#, c-format
msgid "cannot get DIE offset: %s"
msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ Ð·Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ DIE: %s"
-#: src/readelf.c:7816
+#: src/readelf.c:7832
#, fuzzy, c-format
msgid "cannot get tag of DIE at offset [%<PRIx64>] in section '%s': %s"
msgstr ""
"не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ мітку DIE за зміщеннÑм %<PRIu64> у розділі «%s»: %s"
-#: src/readelf.c:7854
+#: src/readelf.c:7870
#, c-format
msgid "cannot get next DIE: %s\n"
msgstr "не вдалоÑÑ Ð²Ð¸Ð·Ð½Ð°Ñ‡Ð¸Ñ‚Ð¸ наÑтупний DIE: %s\n"
-#: src/readelf.c:7862
+#: src/readelf.c:7878
#, c-format
msgid "cannot get next DIE: %s"
msgstr "не вдалоÑÑ Ð²Ð¸Ð·Ð½Ð°Ñ‡Ð¸Ñ‚Ð¸ наÑтупний DIE: %s"
-#: src/readelf.c:7906
+#: src/readelf.c:7922
#, fuzzy, c-format
msgid ""
" Split compilation unit at offset %<PRIu64>:\n"
@@ -5432,7 +5437,7 @@ msgstr ""
" ВерÑÑ–Ñ: %<PRIu16>, Ð—Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ñ€Ð¾Ð·Ð´Ñ–Ð»Ñƒ Ñкорочень: %<PRIu64>, ÐдреÑа: %<PRIu8>, "
"ЗміщеннÑ: %<PRIu8>\n"
-#: src/readelf.c:7958
+#: src/readelf.c:7974
#, c-format
msgid ""
"\n"
@@ -5443,18 +5448,18 @@ msgstr ""
"Розділ DWARF [%2zu] «%s» зі зміщеннÑм %#<PRIx64>:\n"
"\n"
-#: src/readelf.c:8290
+#: src/readelf.c:8306
#, fuzzy, c-format
msgid "unknown form: %s"
msgstr "невідома форма %#<PRIx64>"
-#: src/readelf.c:8321
+#: src/readelf.c:8337
#, c-format
msgid "cannot get line data section data: %s"
msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ дані розділу лінійних даних: %s"
#. Print what we got so far.
-#: src/readelf.c:8423
+#: src/readelf.c:8439
#, fuzzy, c-format
msgid ""
"\n"
@@ -5485,27 +5490,27 @@ msgstr ""
"\n"
"Коди операцій:\n"
-#: src/readelf.c:8445
+#: src/readelf.c:8461
#, fuzzy, c-format
msgid "cannot handle .debug_line version: %u\n"
msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ верÑÑ–ÑŽ Ñимволу: %s"
-#: src/readelf.c:8453
+#: src/readelf.c:8469
#, fuzzy, c-format
msgid "cannot handle address size: %u\n"
msgstr "непідтримуваний розмір адреÑи"
-#: src/readelf.c:8461
+#: src/readelf.c:8477
#, fuzzy, c-format
msgid "cannot handle segment selector size: %u\n"
msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ розділ: %s"
-#: src/readelf.c:8471
+#: src/readelf.c:8487
#, c-format
msgid "invalid data at offset %tu in section [%zu] '%s'"
msgstr "некоректні дані зі зміщеннÑм %tu у розділі [%zu] «%s»"
-#: src/readelf.c:8486
+#: src/readelf.c:8502
#, c-format
msgid " [%*<PRIuFAST8>] %hhu argument\n"
msgid_plural " [%*<PRIuFAST8>] %hhu arguments\n"
@@ -5513,7 +5518,7 @@ msgstr[0] " [%*<PRIuFAST8>] %hhu аргумент\n"
msgstr[1] " [%*<PRIuFAST8>] %hhu аргументи\n"
msgstr[2] " [%*<PRIuFAST8>] %hhu аргументів\n"
-#: src/readelf.c:8497
+#: src/readelf.c:8513
msgid ""
"\n"
"Directory table:"
@@ -5521,12 +5526,12 @@ msgstr ""
"\n"
"Ð¢Ð°Ð±Ð»Ð¸Ñ†Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ñƒ:"
-#: src/readelf.c:8503 src/readelf.c:8580
+#: src/readelf.c:8519 src/readelf.c:8596
#, fuzzy, c-format
msgid " ["
msgstr " PC: "
-#: src/readelf.c:8574
+#: src/readelf.c:8590
#, fuzzy
msgid ""
"\n"
@@ -5535,7 +5540,7 @@ msgstr ""
"\n"
" Ð¢Ð°Ð±Ð»Ð¸Ñ†Ñ Ð¼Ñ–ÑÑ†Ñ Ð²Ð¸ÐºÐ»Ð¸ÐºÑƒ:"
-#: src/readelf.c:8635
+#: src/readelf.c:8651
#, fuzzy
msgid " Entry Dir Time Size Name"
msgstr ""
@@ -5543,7 +5548,7 @@ msgstr ""
"Ð¢Ð°Ð±Ð»Ð¸Ñ†Ñ Ð½Ð°Ð·Ð² файлів:\n"
" Ð—Ð°Ð¿Ð¸Ñ ÐšÐ°Ñ‚ Ð§Ð°Ñ Ð Ð¾Ð·Ð¼Ñ–Ñ€ Ðазва"
-#: src/readelf.c:8672
+#: src/readelf.c:8688
msgid ""
"\n"
"Line number statements:"
@@ -5551,120 +5556,120 @@ msgstr ""
"\n"
"Оператори номерів Ñ€Ñдків:"
-#: src/readelf.c:8695
+#: src/readelf.c:8711
#, c-format
msgid "invalid maximum operations per instruction is zero"
msgstr "некоректну кількіÑÑ‚ÑŒ операцій на інÑтрукцію прирівнÑно до нулÑ"
-#: src/readelf.c:8729
+#: src/readelf.c:8745
#, fuzzy, c-format
msgid " special opcode %u: address+%u = "
msgstr " Ñпеціальний код операції %u: адреÑа+%u = %s, Ñ€Ñдок%+d = %zu\n"
-#: src/readelf.c:8733
+#: src/readelf.c:8749
#, fuzzy, c-format
msgid ", op_index = %u, line%+d = %zu\n"
msgstr ""
" Ñпеціальний код операції %u: адреÑа+%u = %s, індекÑ_оп = %u, Ñ€Ñдок%+d = "
"%zu\n"
-#: src/readelf.c:8736
+#: src/readelf.c:8752
#, c-format
msgid ", line%+d = %zu\n"
msgstr ""
-#: src/readelf.c:8754
+#: src/readelf.c:8770
#, c-format
msgid " extended opcode %u: "
msgstr " розширений код операції %u: "
-#: src/readelf.c:8759
+#: src/readelf.c:8775
msgid " end of sequence"
msgstr " кінець поÑлідовноÑÑ‚Ñ–"
-#: src/readelf.c:8777
+#: src/readelf.c:8793
#, fuzzy, c-format
msgid " set address to "
msgstr " вÑтановити адреÑу у Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ %s\n"
-#: src/readelf.c:8805
+#: src/readelf.c:8821
#, 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:8819
+#: src/readelf.c:8835
#, c-format
msgid " set discriminator to %u\n"
msgstr " вÑтановити Ñ€Ð¾Ð·Ñ€Ñ–Ð·Ð½ÐµÐ½Ð½Ñ Ð´Ð»Ñ %u\n"
#. Unknown, ignore it.
-#: src/readelf.c:8824
+#: src/readelf.c:8840
msgid " unknown opcode"
msgstr " невідомий код операції"
#. Takes no argument.
-#: src/readelf.c:8836
+#: src/readelf.c:8852
msgid " copy"
msgstr " копіÑ"
-#: src/readelf.c:8847
+#: src/readelf.c:8863
#, fuzzy, c-format
msgid " advance address by %u to "
msgstr " Ð·Ð±Ñ–Ð»ÑŒÑˆÐµÐ½Ð½Ñ Ð°Ð´Ñ€ÐµÑи на %u до %s\n"
-#: src/readelf.c:8851 src/readelf.c:8912
+#: src/readelf.c:8867 src/readelf.c:8928
#, c-format
msgid ", op_index to %u"
msgstr ""
-#: src/readelf.c:8863
+#: src/readelf.c:8879
#, c-format
msgid " advance line by constant %d to %<PRId64>\n"
msgstr " проÑувати Ñ€Ñдок на Ñталу %d до %<PRId64>\n"
-#: src/readelf.c:8873
+#: src/readelf.c:8889
#, c-format
msgid " set file to %<PRIu64>\n"
msgstr " вÑтановити файл у %<PRIu64>\n"
-#: src/readelf.c:8884
+#: src/readelf.c:8900
#, c-format
msgid " set column to %<PRIu64>\n"
msgstr " вÑтановити Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñтовпчика %<PRIu64>\n"
-#: src/readelf.c:8891
+#: src/readelf.c:8907
#, c-format
msgid " set '%s' to %<PRIuFAST8>\n"
msgstr " вÑтановити «%s» у %<PRIuFAST8>\n"
#. Takes no argument.
-#: src/readelf.c:8897
+#: src/readelf.c:8913
msgid " set basic block flag"
msgstr " вÑтановити прапорець базового блоку"
-#: src/readelf.c:8908
+#: src/readelf.c:8924
#, fuzzy, c-format
msgid " advance address by constant %u to "
msgstr " збільшити адреÑу на Ñталу величину %u до %s\n"
-#: src/readelf.c:8928
+#: src/readelf.c:8944
#, fuzzy, c-format
msgid " advance address by fixed value %u to \n"
msgstr " збільшити адреÑу на фікÑовану величину %u до %s\n"
#. Takes no argument.
-#: src/readelf.c:8938
+#: src/readelf.c:8954
msgid " set prologue end flag"
msgstr " вÑтановити прапорець ÐºÑ–Ð½Ñ†Ñ Ð²Ñтупу"
#. Takes no argument.
-#: src/readelf.c:8943
+#: src/readelf.c:8959
msgid " set epilogue begin flag"
msgstr " вÑтановити прапорець початку епілогу"
-#: src/readelf.c:8953
+#: src/readelf.c:8969
#, c-format
msgid " set isa to %u\n"
msgstr " вÑтановити isa у %u\n"
@@ -5672,7 +5677,7 @@ msgstr " вÑтановити isa у %u\n"
#. 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:8962
+#: src/readelf.c:8978
#, c-format
msgid " unknown opcode with %<PRIu8> parameter:"
msgid_plural " unknown opcode with %<PRIu8> parameters:"
@@ -5680,97 +5685,97 @@ msgstr[0] " невідомий код операції з %<PRIu8> парамеÑ
msgstr[1] " невідомий код операції з %<PRIu8> параметрами:"
msgstr[2] " невідомий код операції з %<PRIu8> параметрами:"
-#: src/readelf.c:9002
+#: src/readelf.c:9018
#, fuzzy, c-format
msgid "cannot get .debug_loclists content: %s"
msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ вміÑÑ‚ .debug_loc: %s"
-#: src/readelf.c:9171
+#: src/readelf.c:9187
#, fuzzy, c-format
msgid "invalid loclists data"
msgstr "некоректні дані"
-#: src/readelf.c:9424
+#: src/readelf.c:9440
#, c-format
msgid "cannot get .debug_loc content: %s"
msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ вміÑÑ‚ .debug_loc: %s"
-#: src/readelf.c:9631 src/readelf.c:10675
+#: src/readelf.c:9647 src/readelf.c:10691
msgid " <INVALID DATA>\n"
msgstr " <ÐЕКОРЕКТÐІ ДÐÐІ>\n"
-#: src/readelf.c:9686 src/readelf.c:9849
+#: src/readelf.c:9702 src/readelf.c:9865
#, c-format
msgid "cannot get macro information section data: %s"
msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ дані розділу відомоÑтей щодо макроÑів: %s"
-#: src/readelf.c:9766
+#: src/readelf.c:9782
#, c-format
msgid "%*s*** non-terminated string at end of section"
msgstr "%*s*** незавершений Ñ€Ñдок наприкінці розділу"
-#: src/readelf.c:9789
+#: src/readelf.c:9805
#, c-format
msgid "%*s*** missing DW_MACINFO_start_file argument at end of section"
msgstr "%*s*** пропущено аргумент DW_MACINFO_start_file наприкінці розділу"
-#: src/readelf.c:9890
+#: src/readelf.c:9906
#, c-format
msgid " Offset: 0x%<PRIx64>\n"
msgstr " ЗміщеннÑ: 0x%<PRIx64>\n"
-#: src/readelf.c:9902
+#: src/readelf.c:9918
#, c-format
msgid " Version: %<PRIu16>\n"
msgstr " ВерÑÑ–Ñ: %<PRIu16>\n"
-#: src/readelf.c:9908 src/readelf.c:10795
+#: src/readelf.c:9924 src/readelf.c:10811
#, c-format
msgid " unknown version, cannot parse section\n"
msgstr " невідома верÑÑ–Ñ, не вдалоÑÑ Ð¾Ð±Ñ€Ð¾Ð±Ð¸Ñ‚Ð¸ розділ\n"
-#: src/readelf.c:9915
+#: src/readelf.c:9931
#, fuzzy, c-format
msgid " Flag: 0x%<PRIx8>"
msgstr " Прапорець: 0x%<PRIx8>\n"
-#: src/readelf.c:9944
+#: src/readelf.c:9960
#, c-format
msgid " Offset length: %<PRIu8>\n"
msgstr " Довжина зміщеннÑ: %<PRIu8>\n"
-#: src/readelf.c:9952
+#: src/readelf.c:9968
#, c-format
msgid " .debug_line offset: 0x%<PRIx64>\n"
msgstr " Ð·Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ .debug_line: 0x%<PRIx64>\n"
-#: src/readelf.c:9977
+#: src/readelf.c:9993
#, c-format
msgid " extension opcode table, %<PRIu8> items:\n"
msgstr " Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ ÐºÐ¾Ð´Ñ–Ð² операцій розширень, запиÑів — %<PRIu8>:\n"
-#: src/readelf.c:9984
+#: src/readelf.c:10000
#, c-format
msgid " [%<PRIx8>]"
msgstr " [%<PRIx8>]"
-#: src/readelf.c:9996
+#: src/readelf.c:10012
#, c-format
msgid " %<PRIu8> arguments:"
msgstr " %<PRIu8> аргументів:"
-#: src/readelf.c:10011
+#: src/readelf.c:10027
#, c-format
msgid " no arguments."
msgstr " немає аргументів."
-#: src/readelf.c:10212
+#: src/readelf.c:10228
#, 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:10256
+#: src/readelf.c:10272
#, c-format
msgid ""
"\n"
@@ -5781,41 +5786,41 @@ msgstr ""
"Розділ DWARF [%2zu] «%s» зі зміщеннÑм %#<PRIx64>:\n"
" %*s РÑдок\n"
-#: src/readelf.c:10271
+#: src/readelf.c:10287
#, fuzzy, c-format
msgid " *** error, missing string terminator\n"
msgstr " *** помилка під Ñ‡Ð°Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ñ€Ñдків: %s\n"
-#: src/readelf.c:10300
+#: src/readelf.c:10316
#, fuzzy, c-format
msgid "cannot get .debug_str_offsets section data: %s"
msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ дані розділу: %s"
-#: src/readelf.c:10399
+#: src/readelf.c:10415
#, fuzzy, c-format
msgid " Length: %8<PRIu64>\n"
msgstr ""
"\n"
" Довжина: %6<PRIu64>\n"
-#: src/readelf.c:10401
+#: src/readelf.c:10417
#, fuzzy, c-format
msgid " Offset size: %8<PRIu8>\n"
msgstr " Довжина зміщеннÑ: %<PRIu8>\n"
-#: src/readelf.c:10415
+#: src/readelf.c:10431
#, fuzzy, c-format
msgid " DWARF version: %8<PRIu16>\n"
msgstr " верÑÑ–Ñ DWARF: %6<PRIuFAST16>\n"
-#: src/readelf.c:10424
+#: src/readelf.c:10440
#, fuzzy, c-format
msgid " Padding: %8<PRIx16>\n"
msgstr ""
"\n"
" Довжина: %6<PRIu64>\n"
-#: src/readelf.c:10478
+#: src/readelf.c:10494
#, c-format
msgid ""
"\n"
@@ -5824,7 +5829,7 @@ msgstr ""
"\n"
"Розділ таблиці пошуку вікон виклику [%2zu] '.eh_frame_hdr':\n"
-#: src/readelf.c:10580
+#: src/readelf.c:10596
#, c-format
msgid ""
"\n"
@@ -5833,22 +5838,22 @@ msgstr ""
"\n"
"Розділ таблиці обробки виключень [%2zu] '.gcc_except_table':\n"
-#: src/readelf.c:10603
+#: src/readelf.c:10619
#, c-format
msgid " LPStart encoding: %#x "
msgstr " ÐšÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ LPStart: %#x "
-#: src/readelf.c:10615
+#: src/readelf.c:10631
#, c-format
msgid " TType encoding: %#x "
msgstr " ÐšÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ TType: %#x "
-#: src/readelf.c:10630
+#: src/readelf.c:10646
#, c-format
msgid " Call site encoding: %#x "
msgstr " ÐšÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ð¼Ñ–ÑÑ†Ñ Ð²Ð¸ÐºÐ»Ð¸ÐºÑƒ:%#x "
-#: src/readelf.c:10643
+#: src/readelf.c:10659
msgid ""
"\n"
" Call site table:"
@@ -5856,7 +5861,7 @@ msgstr ""
"\n"
" Ð¢Ð°Ð±Ð»Ð¸Ñ†Ñ Ð¼Ñ–ÑÑ†Ñ Ð²Ð¸ÐºÐ»Ð¸ÐºÑƒ:"
-#: src/readelf.c:10657
+#: src/readelf.c:10673
#, c-format
msgid ""
" [%4u] Call site start: %#<PRIx64>\n"
@@ -5869,12 +5874,12 @@ msgstr ""
" МіÑце заÑтоÑуваннÑ: %#<PRIx64>\n"
" ДіÑ: %u\n"
-#: src/readelf.c:10730
+#: src/readelf.c:10746
#, c-format
msgid "invalid TType encoding"
msgstr "некоректне ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ TType"
-#: src/readelf.c:10757
+#: src/readelf.c:10773
#, c-format
msgid ""
"\n"
@@ -5883,37 +5888,37 @@ msgstr ""
"\n"
"Розділ GDB [%2zu] «%s» за зміщеннÑм %#<PRIx64> міÑтить %<PRId64> байтів:\n"
-#: src/readelf.c:10786
+#: src/readelf.c:10802
#, c-format
msgid " Version: %<PRId32>\n"
msgstr " ВерÑÑ–Ñ: %<PRId32>\n"
-#: src/readelf.c:10804
+#: src/readelf.c:10820
#, c-format
msgid " CU offset: %#<PRIx32>\n"
msgstr " Ð·Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ CU: %#<PRIx32>\n"
-#: src/readelf.c:10811
+#: src/readelf.c:10827
#, c-format
msgid " TU offset: %#<PRIx32>\n"
msgstr " Ð·Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ TU: %#<PRIx32>\n"
-#: src/readelf.c:10818
+#: src/readelf.c:10834
#, c-format
msgid " address offset: %#<PRIx32>\n"
msgstr " Ð·Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð°Ð´Ñ€ÐµÑи: %#<PRIx32>\n"
-#: src/readelf.c:10825
+#: src/readelf.c:10841
#, c-format
msgid " symbol offset: %#<PRIx32>\n"
msgstr " Ð·Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ñимволу: %#<PRIx32>\n"
-#: src/readelf.c:10832
+#: src/readelf.c:10848
#, c-format
msgid " constant offset: %#<PRIx32>\n"
msgstr " Ñтале зміщеннÑ: %#<PRIx32>\n"
-#: src/readelf.c:10846
+#: src/readelf.c:10862
#, c-format
msgid ""
"\n"
@@ -5922,7 +5927,7 @@ msgstr ""
"\n"
" СпиÑок CU зі зміщеннÑм %#<PRIx32> міÑтить %zu запиÑів:\n"
-#: src/readelf.c:10871
+#: src/readelf.c:10887
#, c-format
msgid ""
"\n"
@@ -5931,7 +5936,7 @@ msgstr ""
"\n"
" СпиÑок TU зі зміщеннÑм %#<PRIx32> міÑтить %zu запиÑів:\n"
-#: src/readelf.c:10900
+#: src/readelf.c:10916
#, c-format
msgid ""
"\n"
@@ -5940,7 +5945,7 @@ msgstr ""
"\n"
" СпиÑок Ð°Ð´Ñ€ÐµÑ Ð·Ñ– зміщеннÑм %#<PRIx32> міÑтить %zu запиÑів:\n"
-#: src/readelf.c:10932
+#: src/readelf.c:10948
#, c-format
msgid ""
"\n"
@@ -5949,18 +5954,18 @@ msgstr ""
"\n"
" Ð¢Ð°Ð±Ð»Ð¸Ñ†Ñ Ñимволів за зміщеннÑм %#<PRIx32> міÑтить %zu позицій:\n"
-#: src/readelf.c:11070
+#: src/readelf.c:11086
#, c-format
msgid "cannot get debug context descriptor: %s"
msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ деÑкриптор контекÑту зневаджуваннÑ: %s"
-#: src/readelf.c:11433 src/readelf.c:12055 src/readelf.c:12166
-#: src/readelf.c:12224
+#: src/readelf.c:11449 src/readelf.c:12071 src/readelf.c:12182
+#: src/readelf.c:12240
#, c-format
msgid "cannot convert core note data: %s"
msgstr "не вдалоÑÑ Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€Ð¸Ñ‚Ð¸ дані запиÑу Ñдра: %s"
-#: src/readelf.c:11796
+#: src/readelf.c:11812
#, c-format
msgid ""
"\n"
@@ -5969,21 +5974,21 @@ msgstr ""
"\n"
"%*s... <повторюєтьÑÑ %u разів> ..."
-#: src/readelf.c:12303
+#: src/readelf.c:12319
msgid " Owner Data size Type\n"
msgstr " ВлаÑник Розм. даних Тип\n"
-#: src/readelf.c:12332
+#: src/readelf.c:12348
#, c-format
msgid " %-13.*s %9<PRId32> %s\n"
msgstr " %-13.*s %9<PRId32> %s\n"
-#: src/readelf.c:12384
+#: src/readelf.c:12400
#, fuzzy, c-format
msgid "cannot get content of note: %s"
msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ вміÑÑ‚ розділу запиÑів: %s"
-#: src/readelf.c:12411
+#: src/readelf.c:12434
#, c-format
msgid ""
"\n"
@@ -5993,7 +5998,7 @@ msgstr ""
"Розділ запиÑів (note) [%2zu] «%s» з %<PRIu64> байтів за зміщеннÑм "
"%#0<PRIx64>:\n"
-#: src/readelf.c:12434
+#: src/readelf.c:12457
#, c-format
msgid ""
"\n"
@@ -6002,7 +6007,7 @@ msgstr ""
"\n"
"Сегмент запиÑів з %<PRIu64> байтів за зміщеннÑм %#0<PRIx64>:\n"
-#: src/readelf.c:12481
+#: src/readelf.c:12504
#, c-format
msgid ""
"\n"
@@ -6011,12 +6016,12 @@ msgstr ""
"\n"
"У розділі [%zu] «%s» не міÑтитьÑÑ Ð´Ð°Ð½Ð¸Ñ… Ð´Ð»Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð´Ð°Ð¼Ð¿Ñƒ.\n"
-#: src/readelf.c:12508 src/readelf.c:12559
+#: src/readelf.c:12531 src/readelf.c:12582
#, c-format
msgid "cannot get data for section [%zu] '%s': %s"
msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ дані Ð´Ð»Ñ Ñ€Ð¾Ð·Ð´Ñ–Ð»Ñƒ [%zu] «%s»: %s"
-#: src/readelf.c:12513
+#: src/readelf.c:12536
#, c-format
msgid ""
"\n"
@@ -6025,7 +6030,7 @@ msgstr ""
"\n"
"ШіÑÑ‚. дамп розділу [%zu] «%s», %<PRIu64> байтів за зміщеннÑм %#0<PRIx64>:\n"
-#: src/readelf.c:12518
+#: src/readelf.c:12541
#, fuzzy, c-format
msgid ""
"\n"
@@ -6035,7 +6040,7 @@ msgstr ""
"\n"
"ШіÑÑ‚. дамп розділу [%zu] «%s», %<PRIu64> байтів за зміщеннÑм %#0<PRIx64>:\n"
-#: src/readelf.c:12532
+#: src/readelf.c:12555
#, c-format
msgid ""
"\n"
@@ -6044,7 +6049,7 @@ msgstr ""
"\n"
"У розділі [%zu] «%s» не міÑтитьÑÑ Ñ€Ñдків Ð´Ð»Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð´Ð°Ð¼Ð¿Ñƒ.\n"
-#: src/readelf.c:12564
+#: src/readelf.c:12587
#, c-format
msgid ""
"\n"
@@ -6053,7 +6058,7 @@ msgstr ""
"\n"
"Розділ Ñ€Ñдків [%zu] «%s» міÑтить %<PRIu64> байтів за зміщеннÑм %#0<PRIx64>:\n"
-#: src/readelf.c:12569
+#: src/readelf.c:12592
#, fuzzy, c-format
msgid ""
"\n"
@@ -6063,7 +6068,7 @@ msgstr ""
"\n"
"Розділ Ñ€Ñдків [%zu] «%s» міÑтить %<PRIu64> байтів за зміщеннÑм %#0<PRIx64>:\n"
-#: src/readelf.c:12618
+#: src/readelf.c:12641
#, c-format
msgid ""
"\n"
@@ -6072,7 +6077,7 @@ msgstr ""
"\n"
"розділу [%lu] не Ñ–Ñнує"
-#: src/readelf.c:12647
+#: src/readelf.c:12671
#, c-format
msgid ""
"\n"
@@ -6081,12 +6086,12 @@ msgstr ""
"\n"
"розділу «%s» не Ñ–Ñнує"
-#: src/readelf.c:12704
+#: src/readelf.c:12728
#, c-format
msgid "cannot get symbol index of archive '%s': %s"
msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ покажчик Ñимволів архіву «%s»: %s"
-#: src/readelf.c:12707
+#: src/readelf.c:12731
#, c-format
msgid ""
"\n"
@@ -6095,7 +6100,7 @@ msgstr ""
"\n"
"У архіві «%s» немає покажчика Ñимволів\n"
-#: src/readelf.c:12711
+#: src/readelf.c:12735
#, c-format
msgid ""
"\n"
@@ -6104,12 +6109,12 @@ msgstr ""
"\n"
"Покажчик архіву «%s» міÑтить %zu запиÑів:\n"
-#: src/readelf.c:12729
+#: src/readelf.c:12753
#, c-format
msgid "cannot extract member at offset %zu in '%s': %s"
msgstr "не вдалоÑÑ Ð²Ð¸Ð´Ð¾Ð±ÑƒÑ‚Ð¸ елемент за зміщеннÑм %zu у «%s»: %s"
-#: src/readelf.c:12734
+#: src/readelf.c:12758
#, c-format
msgid "Archive member '%s' contains:\n"
msgstr "Елемент архіву «%s» міÑтить:\n"
@@ -6737,7 +6742,7 @@ msgstr "не вдалоÑÑ Ñтворити заголовок ELF: %s"
msgid "cannot get shdrstrndx:%s"
msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ розділ: %s"
-#: src/unstrip.c:248 src/unstrip.c:2038
+#: src/unstrip.c:248 src/unstrip.c:2081
#, c-format
msgid "cannot get ELF header: %s"
msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ заголовок ELF: %s"
@@ -6757,12 +6762,12 @@ msgstr "не вдалоÑÑ Ð¾Ð½Ð¾Ð²Ð¸Ñ‚Ð¸ переÑуваннÑ: %s"
msgid "cannot copy ELF header: %s"
msgstr "не вдалоÑÑ Ñкопіювати заголовок ELF: %s"
-#: src/unstrip.c:269 src/unstrip.c:2056 src/unstrip.c:2099
+#: src/unstrip.c:269 src/unstrip.c:2099 src/unstrip.c:2142
#, c-format
msgid "cannot get number of program headers: %s"
msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ кількіÑÑ‚ÑŒ заголовків програми: %s"
-#: src/unstrip.c:274 src/unstrip.c:2060
+#: src/unstrip.c:274 src/unstrip.c:2103
#, c-format
msgid "cannot create program headers: %s"
msgstr "не вдалоÑÑ Ñтворити заголовки програми: %s"
@@ -6777,12 +6782,12 @@ msgstr "не вдалоÑÑ Ñкопіювати заголовок програ
msgid "cannot copy section header: %s"
msgstr "не вдалоÑÑ Ñкопіювати заголовок розділу: %s"
-#: src/unstrip.c:293 src/unstrip.c:1669
+#: src/unstrip.c:293 src/unstrip.c:1703
#, c-format
msgid "cannot get section data: %s"
msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ дані розділу: %s"
-#: src/unstrip.c:295 src/unstrip.c:1671
+#: src/unstrip.c:295 src/unstrip.c:1705
#, c-format
msgid "cannot copy section data: %s"
msgstr "не вдалоÑÑ Ñкопіювати дані розділу: %s"
@@ -6792,14 +6797,14 @@ msgstr "не вдалоÑÑ Ñкопіювати дані розділу: %s"
msgid "cannot create directory '%s'"
msgstr "не вдалоÑÑ Ñтворити каталог «%s»"
-#: src/unstrip.c:391 src/unstrip.c:647 src/unstrip.c:681 src/unstrip.c:847
-#: src/unstrip.c:1706
+#: src/unstrip.c:391 src/unstrip.c:651 src/unstrip.c:685 src/unstrip.c:853
+#: src/unstrip.c:1745
#, c-format
msgid "cannot get symbol table entry: %s"
msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ Ð·Ð°Ð¿Ð¸Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ– Ñимволів: %s"
-#: src/unstrip.c:407 src/unstrip.c:650 src/unstrip.c:671 src/unstrip.c:684
-#: src/unstrip.c:1727 src/unstrip.c:1922 src/unstrip.c:1946
+#: src/unstrip.c:407 src/unstrip.c:654 src/unstrip.c:675 src/unstrip.c:688
+#: src/unstrip.c:1766 src/unstrip.c:1961 src/unstrip.c:1985
#, c-format
msgid "cannot update symbol table: %s"
msgstr "не вдалоÑÑ Ð¾Ð½Ð¾Ð²Ð¸Ñ‚Ð¸ таблицю Ñимволів: %s"
@@ -6809,152 +6814,167 @@ msgstr "не вдалоÑÑ Ð¾Ð½Ð¾Ð²Ð¸Ñ‚Ð¸ таблицю Ñимволів: %s"
msgid "cannot update section header: %s"
msgstr "не вдалоÑÑ Ð¾Ð½Ð¾Ð²Ð¸Ñ‚Ð¸ заголовок розділу: %s"
-#: src/unstrip.c:459 src/unstrip.c:473
+#: src/unstrip.c:463 src/unstrip.c:477
#, c-format
msgid "cannot update relocation: %s"
msgstr "не вдалоÑÑ Ð¾Ð½Ð¾Ð²Ð¸Ñ‚Ð¸ переÑуваннÑ: %s"
-#: src/unstrip.c:570
+#: src/unstrip.c:574
#, c-format
msgid "cannot get symbol version: %s"
msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ верÑÑ–ÑŽ Ñимволу: %s"
-#: src/unstrip.c:583
+#: src/unstrip.c:587
#, c-format
msgid "unexpected section type in [%zu] with sh_link to symtab"
msgstr "неочікуваний тип розділу у [%zu] з поÑиланнÑм sh_link на symtab"
-#: src/unstrip.c:853
+#: src/unstrip.c:842
+#, fuzzy, c-format
+msgid "cannot get symbol section data: %s"
+msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ дані розділу: %s"
+
+#: src/unstrip.c:844
+#, fuzzy, c-format
+msgid "cannot get string section data: %s"
+msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ дані розділу: %s"
+
+#: src/unstrip.c:861
#, c-format
msgid "invalid string offset in symbol [%zu]"
msgstr "некоректне Ð·Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ñ€Ñдка у Ñимволі [%zu]"
-#: src/unstrip.c:1011 src/unstrip.c:1402
+#: src/unstrip.c:1019 src/unstrip.c:1423
#, c-format
msgid "cannot read section [%zu] name: %s"
msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ назву розділу [%zu]: %s"
-#: src/unstrip.c:1026
+#: src/unstrip.c:1034
#, fuzzy, c-format
msgid "bad sh_link for group section: %s"
msgstr "некоректне Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ sh_link у розділі %zu"
-#: src/unstrip.c:1032
+#: src/unstrip.c:1040
#, fuzzy, c-format
msgid "couldn't get shdr for group section: %s"
msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ заголовок 0-го розділу: %s"
-#: src/unstrip.c:1037
+#: src/unstrip.c:1045
#, fuzzy, c-format
msgid "bad data for group symbol section: %s"
msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ дані Ð´Ð»Ñ Ñ€Ð¾Ð·Ð´Ñ–Ð»Ñƒ Ñимволів\n"
-#: src/unstrip.c:1043
+#: src/unstrip.c:1051
#, fuzzy, c-format
msgid "couldn't get symbol for group section: %s"
msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ верÑÑ–ÑŽ Ñимволу: %s"
-#: src/unstrip.c:1048
+#: src/unstrip.c:1056
#, fuzzy, c-format
msgid "bad symbol name for group section: %s"
msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ заголовок розділу %zu: %s"
-#: src/unstrip.c:1090 src/unstrip.c:1109 src/unstrip.c:1147
+#: src/unstrip.c:1098 src/unstrip.c:1117 src/unstrip.c:1155
#, c-format
msgid "cannot read '.gnu.prelink_undo' section: %s"
msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ розділ «.gnu.prelink_undo»: %s"
-#: src/unstrip.c:1127
+#: src/unstrip.c:1135
#, c-format
msgid "overflow with shnum = %zu in '%s' section"
msgstr ""
-#: src/unstrip.c:1138
+#: src/unstrip.c:1146
#, c-format
msgid "invalid contents in '%s' section"
msgstr "некоректний вміÑÑ‚ розділу «%s»"
-#: src/unstrip.c:1194 src/unstrip.c:1528
+#: src/unstrip.c:1202 src/unstrip.c:1549
#, c-format
msgid "cannot find matching section for [%zu] '%s'"
msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ відповідний розділ Ð´Ð»Ñ [%zu] «%s»"
-#: src/unstrip.c:1319 src/unstrip.c:1335 src/unstrip.c:1607 src/unstrip.c:1881
+#: src/unstrip.c:1327 src/unstrip.c:1343 src/unstrip.c:1629 src/unstrip.c:1920
#, c-format
msgid "cannot add section name to string table: %s"
msgstr "не вдалоÑÑ Ð´Ð¾Ð´Ð°Ñ‚Ð¸ назву розділу до таблиці Ñ€Ñдків: %s"
-#: src/unstrip.c:1344
+#: src/unstrip.c:1352
#, c-format
msgid "cannot update section header string table data: %s"
msgstr "не вдалоÑÑ Ð¾Ð½Ð¾Ð²Ð¸Ñ‚Ð¸ дані заголовка розділу у таблиці Ñ€Ñдків: %s"
-#: src/unstrip.c:1373 src/unstrip.c:1377
+#: src/unstrip.c:1381 src/unstrip.c:1385
#, c-format
msgid "cannot get section header string table section index: %s"
msgstr ""
"не вдалоÑÑ Ð²Ð¸Ð·Ð½Ð°Ñ‡Ð¸Ñ‚Ð¸ Ñ–Ð½Ð´ÐµÐºÑ Ñ€Ð¾Ð·Ð´Ñ–Ð»Ñƒ заголовка розділу у таблиці Ñ€Ñдків: %s"
-#: src/unstrip.c:1381 src/unstrip.c:1385 src/unstrip.c:1622
+#: src/unstrip.c:1389 src/unstrip.c:1393 src/unstrip.c:1644
#, c-format
msgid "cannot get section count: %s"
msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ кількіÑÑ‚ÑŒ розділів: %s"
-#: src/unstrip.c:1388
+#: src/unstrip.c:1396
#, c-format
msgid "more sections in stripped file than debug file -- arguments reversed?"
msgstr ""
"у очищеному файлі більше розділів ніж у файлі з даними Ð´Ð»Ñ Ð·Ð½ÐµÐ²Ð°Ð´Ð¶ÑƒÐ²Ð°Ð½Ð½Ñ â€” "
"помилковий порÑдок параметрів?"
-#: src/unstrip.c:1450 src/unstrip.c:1543
+#: src/unstrip.c:1400
+#, c-format
+msgid "no sections in stripped file"
+msgstr ""
+
+#: src/unstrip.c:1471 src/unstrip.c:1564
#, c-format
msgid "cannot read section header string table: %s"
msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ таблицю Ñ€Ñдків заголовка розділу: %s"
-#: src/unstrip.c:1601
+#: src/unstrip.c:1623
#, c-format
msgid "cannot add new section: %s"
msgstr "не вдалоÑÑ Ð´Ð¾Ð´Ð°Ñ‚Ð¸ новий розділ: %s"
-#: src/unstrip.c:1714
+#: src/unstrip.c:1753
#, c-format
msgid "symbol [%zu] has invalid section index"
msgstr "Ñимвол [%zu] має некоректний Ñ–Ð½Ð´ÐµÐºÑ Ñ€Ð¾Ð·Ð´Ñ–Ð»Ñƒ"
-#: src/unstrip.c:1746
+#: src/unstrip.c:1785
#, fuzzy, c-format
msgid "group has invalid section index [%zd]"
msgstr "Ñимвол [%zu] має некоректний Ñ–Ð½Ð´ÐµÐºÑ Ñ€Ð¾Ð·Ð´Ñ–Ð»Ñƒ"
-#: src/unstrip.c:2017
+#: src/unstrip.c:2060
#, c-format
msgid "cannot read section data: %s"
msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ дані розділу: %s"
-#: src/unstrip.c:2046
+#: src/unstrip.c:2089
#, c-format
msgid "cannot update ELF header: %s"
msgstr "не вдалоÑÑ Ð¾Ð½Ð¾Ð²Ð¸Ñ‚Ð¸ заголовок ELF: %s"
-#: src/unstrip.c:2070
+#: src/unstrip.c:2113
#, c-format
msgid "cannot update program header: %s"
msgstr "не вдалоÑÑ Ð¾Ð½Ð¾Ð²Ð¸Ñ‚Ð¸ заголовок програми: %s"
-#: src/unstrip.c:2075 src/unstrip.c:2157
+#: src/unstrip.c:2118 src/unstrip.c:2200
#, c-format
msgid "cannot write output file: %s"
msgstr "не вдалоÑÑ Ð·Ð°Ð¿Ð¸Ñати файл виведених даних: %s"
-#: src/unstrip.c:2126
+#: src/unstrip.c:2169
#, c-format
msgid "DWARF data not adjusted for prelinking bias; consider prelink -u"
msgstr ""
"Дані DWARF не Ñкориговано відповідно до Ð²Ñ–Ð´Ñ…Ð¸Ð»ÐµÐ½Ð½Ñ Ð¿ÐµÑ€ÐµÐ´ компонуваннÑм; "
"Ñпробуйте виправити це командою prelink -u"
-#: src/unstrip.c:2129
+#: src/unstrip.c:2172
#, c-format
msgid ""
"DWARF data in '%s' not adjusted for prelinking bias; consider prelink -u"
@@ -6962,76 +6982,76 @@ msgstr ""
"Дані DWARF у «%s» не Ñкориговано відповідно до Ð²Ñ–Ð´Ñ…Ð¸Ð»ÐµÐ½Ð½Ñ Ð¿ÐµÑ€ÐµÐ´ "
"компонуваннÑм; Ñпробуйте виправити це командою prelink -u"
-#: src/unstrip.c:2148 src/unstrip.c:2199 src/unstrip.c:2211 src/unstrip.c:2297
+#: src/unstrip.c:2191 src/unstrip.c:2242 src/unstrip.c:2254 src/unstrip.c:2340
#, c-format
msgid "cannot create ELF descriptor: %s"
msgstr "не вдалоÑÑ Ñтворити деÑкриптор ELF: %s"
-#: src/unstrip.c:2190
+#: src/unstrip.c:2233
msgid "WARNING: "
msgstr "УВÐГÐ: "
-#: src/unstrip.c:2192
+#: src/unstrip.c:2235
msgid ", use --force"
msgstr ", ÑкориÑтайтеÑÑ --force"
-#: src/unstrip.c:2215
+#: src/unstrip.c:2258
msgid "ELF header identification (e_ident) different"
msgstr "Різні ідентифікатори заголовків ELF (e_ident)"
-#: src/unstrip.c:2218
+#: src/unstrip.c:2261
msgid "ELF header type (e_type) different"
msgstr "Різні типи заголовків ELF (e_type)"
-#: src/unstrip.c:2221
+#: src/unstrip.c:2264
msgid "ELF header machine type (e_machine) different"
msgstr "Різні типи архітектур заголовків ELF (e_machine)"
-#: src/unstrip.c:2224
+#: src/unstrip.c:2267
msgid "stripped program header (e_phnum) smaller than unstripped"
msgstr "очищений заголовок програми (e_phnum) є меншим за неочищений"
-#: src/unstrip.c:2254
+#: src/unstrip.c:2297
#, c-format
msgid "cannot find stripped file for module '%s': %s"
msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ очищений файл Ð´Ð»Ñ Ð¼Ð¾Ð´ÑƒÐ»Ñ Â«%s»: %s"
-#: src/unstrip.c:2258
+#: src/unstrip.c:2301
#, c-format
msgid "cannot open stripped file '%s' for module '%s': %s"
msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ очищений файл «%s» Ð´Ð»Ñ Ð¼Ð¾Ð´ÑƒÐ»Ñ Â«%s»: %s"
-#: src/unstrip.c:2273
+#: src/unstrip.c:2316
#, c-format
msgid "cannot find debug file for module '%s': %s"
msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ файл діагноÑтичних даних Ð´Ð»Ñ Ð¼Ð¾Ð´ÑƒÐ»Ñ Â«%s»: %s"
-#: src/unstrip.c:2277
+#: src/unstrip.c:2320
#, c-format
msgid "cannot open debug file '%s' for module '%s': %s"
msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл діагноÑтичних даних «%s» Ð´Ð»Ñ Ð¼Ð¾Ð´ÑƒÐ»Ñ Â«%s»: %s"
-#: src/unstrip.c:2290
+#: src/unstrip.c:2333
#, c-format
msgid "module '%s' file '%s' is not stripped"
msgstr "у модулі «%s» файл «%s» не очищено strip"
-#: src/unstrip.c:2321
+#: src/unstrip.c:2364
#, c-format
msgid "cannot cache section addresses for module '%s': %s"
msgstr "не вдалоÑÑ ÐºÐµÑˆÑƒÐ²Ð°Ñ‚Ð¸ адреÑи розділів Ð´Ð»Ñ Ð¼Ð¾Ð´ÑƒÐ»Ñ Â«%s»: %s"
-#: src/unstrip.c:2454
+#: src/unstrip.c:2497
#, c-format
msgid "no matching modules found"
msgstr "відповідних модулів не виÑвлено"
-#: src/unstrip.c:2463
+#: src/unstrip.c:2506
#, c-format
msgid "matched more than one module"
msgstr "вÑтановлено відповідніÑÑ‚ÑŒ декількох модулів"
-#: src/unstrip.c:2507
+#: src/unstrip.c:2550
msgid ""
"STRIPPED-FILE DEBUG-FILE\n"
"[MODULE...]"
@@ -7039,7 +7059,7 @@ msgstr ""
"ОЧИЩЕÐИЙ-ФÐЙЛ ФÐЙЛ-DEBUG\n"
"[МОДУЛЬ...]"
-#: src/unstrip.c:2508
+#: src/unstrip.c:2551
#, fuzzy
msgid ""
"Combine stripped files with separate symbols and debug information.\n"
diff --git a/src/ChangeLog b/src/ChangeLog
index c2102fcd..6af977ed 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,77 @@
+2019-11-26 Mark Wielaard <mark@klomp.org>
+
+ * Makefile.am (BUILD_STATIC): Add libraries needed for libdw.
+
+2019-10-26 Mark Wielaard <mark@klomp.org>
+
+ * unstrip.c (collect_symbols): Check symbol strings are
+ terminated.
+
+2019-10-18 Mark Wielaard <mark@klomp.org>
+
+ * unstrip.c (adjust_relocs): Set versym data d_size to the actual
+ size allocated.
+
+2019-10-20 Mark Wielaard <mark@klomp.org>
+
+ * unstrip.c (copy_elided_sections): Set and check max_off.
+
+2019-10-21 Mark Wielaard <mark@klomp.org>
+
+ * unstrip.c (adjust_relocs): Add map_size argument and check ndx
+ against it.
+ (adjust_all_relocs): Add map_size argument and pass it to
+ adjust_relocs.
+ (add_new_section_symbols): Call adjust_all_relocs with symndx_map
+ size.
+ (collect)symbols): Check sym and string data can be found.
+ (compare_symbols_output): Call error when (different) symbols are
+ equal.
+ (new_shstrtab): Make unstripped_strent array one larger. Check
+ stripped_shnum isn't zero.
+ (copy_elided_sections): Add ndx_sec_num as size of ndx_section
+ array. Check sh_link and sh_info are not larger than ndx_sec_num.
+ Allocate symbols and symndx_map arrays on heap, not stack. Pass
+ map sizes to adjust_all_relocs.
+
+2019-09-28 Dmitry V. Levin <ldv@altlinux.org>
+
+ * elflint.c (main): When an input file cannot be opened,
+ include its name into the error diagnostics.
+ * readelf.c (main): Likewise.
+
+2019-09-02 Mark Wielaard <mark@klomp.org>
+
+ * readelf.c (PRINT_DYNSYM_TABLE): New argp key value.
+ (argp_opt): Add syn-sym.
+ (print_dynsym_table): New static bool.
+ (parse_opt): Handle PRINT_DYNSYM_TABLE.
+ (process_elf_file): Check print_dynsym_table.
+
+2019-08-27 Mark Wielaard <mark@klomp.org>
+
+ * readelf.c (for_each_section_argument): Call (*dump) also for
+ section numbers.
+
+2019-08-26 Mark Wielaard <mark@klomp.org>
+
+ * nm.c (show_symbols): Remember nentries_orig and check before
+ freeing sym_mem.
+
+2019-07-05 Omar Sandoval <osandov@fb.com>
+
+ * Makefile.am: Remove -ldl.
+ (elflint_LDADD): Add $(libdw).
+ (elfcmp_LDADD): Add $(libdw).
+ (objdump_LDADD): Add $(libdw).
+
+2019-08-26 Mark Wielaard <mark@klomp.org>
+
+ * readelf (options): Add OPTION_ARG_OPTIONAL "SECTION" for notes.
+ (notes_section): New global variable.
+ (parse_opt): Set notes_section.
+ (handle_notes): Check if notes_section is set.
+
2019-07-26 Florian Weimer <fweimer@redhat.com>
Mark Wielaard <mark@klomp.org>
diff --git a/src/Makefile.am b/src/Makefile.am
index 3956b12a..e462e7d7 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -41,15 +41,14 @@ CLEANFILES += make-debug-archive
if BUILD_STATIC
libasm = ../libasm/libasm.a
-libdw = ../libdw/libdw.a -lz $(zip_LIBS) $(libelf) $(libebl) -ldl
+libdw = ../libdw/libdw.a -lz $(zip_LIBS) $(libelf) -ldl -lpthread
libelf = ../libelf/libelf.a -lz
else
libasm = ../libasm/libasm.so
libdw = ../libdw/libdw.so
libelf = ../libelf/libelf.so
endif
-libebl = ../libebl/libebl.a ../backends/libebl_static_pic.a ../libcpu/libcpu_static_pic.a
-libdw_static = ../libdw/libdw_static_pic.a
+libebl = ../libebl/libebl.a ../backends/libebl_backends.a ../libcpu/libcpu.a
libeu = ../lib/libeu.a
if DEMANGLE
@@ -69,22 +68,21 @@ ranlib_no_Wstack_usage = yes
ar_no_Wstack_usage = yes
unstrip_no_Wstack_usage = yes
-
-readelf_LDADD = $(libdw) $(libebl) $(libelf) $(libeu) $(argp_LDADD) -ldl
-nm_LDADD = $(libdw) $(libebl) $(libelf) $(libeu) $(argp_LDADD) -ldl \
+readelf_LDADD = $(libdw) $(libebl) $(libelf) $(libeu) $(argp_LDADD)
+nm_LDADD = $(libdw) $(libebl) $(libelf) $(libeu) $(argp_LDADD) \
$(demanglelib)
size_LDADD = $(libelf) $(libeu) $(argp_LDADD)
-strip_LDADD = $(libebl) $(libelf) $(libdw) $(libeu) $(argp_LDADD) -ldl
-elflint_LDADD = $(libebl) $(libdw_static) $(libelf) $(libeu) $(argp_LDADD) -ldl
+strip_LDADD = $(libebl) $(libelf) $(libdw) $(libeu) $(argp_LDADD)
+elflint_LDADD = $(libebl) $(libdw) $(libelf) $(libeu) $(argp_LDADD)
findtextrel_LDADD = $(libdw) $(libelf) $(libeu) $(argp_LDADD)
addr2line_LDADD = $(libdw) $(libelf) $(libeu) $(argp_LDADD) $(demanglelib)
-elfcmp_LDADD = $(libebl) $(libdw_static) $(libeu) $(libelf) $(argp_LDADD) -ldl
-objdump_LDADD = $(libasm) $(libebl) $(libdw_static) $(libelf) $(libeu) $(argp_LDADD) -ldl
+elfcmp_LDADD = $(libebl) $(libdw) $(libelf) $(libeu) $(argp_LDADD)
+objdump_LDADD = $(libasm) $(libebl) $(libdw) $(libelf) $(libeu) $(argp_LDADD)
ranlib_LDADD = libar.a $(libelf) $(libeu) $(argp_LDADD)
strings_LDADD = $(libelf) $(libeu) $(argp_LDADD)
ar_LDADD = libar.a $(libelf) $(libeu) $(argp_LDADD)
-unstrip_LDADD = $(libebl) $(libelf) $(libdw) $(libeu) $(argp_LDADD) -ldl
-stack_LDADD = $(libebl) $(libelf) $(libdw) $(libeu) $(argp_LDADD) -ldl $(demanglelib)
+unstrip_LDADD = $(libebl) $(libelf) $(libdw) $(libeu) $(argp_LDADD)
+stack_LDADD = $(libebl) $(libelf) $(libdw) $(libeu) $(argp_LDADD) $(demanglelib)
elfcompress_LDADD = $(libebl) $(libelf) $(libdw) $(libeu) $(argp_LDADD)
elfclassify_LDADD = $(libelf) $(libdw) $(libeu) $(argp_LDADD)
diff --git a/src/elflint.c b/src/elflint.c
index edb466dd..684b794e 100644
--- a/src/elflint.c
+++ b/src/elflint.c
@@ -151,15 +151,15 @@ main (int argc, char *argv[])
int fd = open (argv[remaining], O_RDONLY);
if (fd == -1)
{
- error (0, errno, gettext ("cannot open input file"));
+ error (0, errno, _("cannot open input file '%s'"), argv[remaining]);
continue;
}
/* Create an `Elf' descriptor. */
Elf *elf = elf_begin (fd, ELF_C_READ_MMAP, NULL);
if (elf == NULL)
- ERROR (gettext ("cannot generate Elf descriptor: %s\n"),
- elf_errmsg (-1));
+ ERROR (_("cannot generate Elf descriptor for '%s': %s\n"),
+ argv[remaining], elf_errmsg (-1));
else
{
unsigned int prev_error_count = error_count;
diff --git a/src/nm.c b/src/nm.c
index da1350b4..7f6cf2a2 100644
--- a/src/nm.c
+++ b/src/nm.c
@@ -1438,6 +1438,7 @@ show_symbols (int fd, Ebl *ebl, GElf_Ehdr *ehdr,
free (demangle_buffer);
#endif
/* Now we know the exact number. */
+ size_t nentries_orig = nentries;
nentries = nentries_used;
/* Sort the entries according to the users wishes. */
@@ -1472,7 +1473,7 @@ show_symbols (int fd, Ebl *ebl, GElf_Ehdr *ehdr,
}
/* Free all memory. */
- if (nentries * sizeof (sym_mem[0]) >= MAX_STACK_ALLOC)
+ if (nentries_orig * sizeof (sym_mem[0]) >= MAX_STACK_ALLOC)
free (sym_mem);
obstack_free (&whereob, NULL);
diff --git a/src/objdump.c b/src/objdump.c
index 6b365d5c..a619674f 100644
--- a/src/objdump.c
+++ b/src/objdump.c
@@ -717,11 +717,13 @@ show_disasm (Ebl *ebl, const char *fname, uint32_t shstrndx)
info.address_color = color_address;
info.bytes_color = color_bytes;
- if (asprintf (&fmt, "%s%%7m %s%%.1o,%s%%.2o,%s%%.3o%%34a %s%%l",
+ 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"));
}
@@ -729,7 +731,7 @@ show_disasm (Ebl *ebl, const char *fname, uint32_t shstrndx)
{
info.address_color = info.bytes_color = NULL;
- fmt = "%7m %.1o,%.2o,%.3o%34a %l";
+ fmt = "%7m %.1o,%.2o,%.3o,%.4o,%.5o%34a %l";
}
disasm_cb (ctx, &info.cur, info.cur + data->d_size, info.addr,
diff --git a/src/readelf.c b/src/readelf.c
index 2084fb1f..cbb519d1 100644
--- a/src/readelf.c
+++ b/src/readelf.c
@@ -84,6 +84,9 @@ ARGP_PROGRAM_BUG_ADDRESS_DEF = PACKAGE_BUGREPORT;
/* argp key value for --dwarf-skeleton, non-ascii. */
#define DWARF_SKELETON 257
+/* argp key value for --dyn-syms, non-ascii. */
+#define PRINT_DYNSYM_TABLE 258
+
/* Terrible hack for hooking unrelated skeleton/split compile units,
see __libdw_link_skel_split in print_debug. */
static bool do_not_close_dwfl = false;
@@ -113,8 +116,10 @@ static const struct argp_option options[] =
{ "sections", 'S', NULL, OPTION_ALIAS | OPTION_HIDDEN, NULL, 0 },
{ "symbols", 's', "SECTION", OPTION_ARG_OPTIONAL,
N_("Display the symbol table sections"), 0 },
+ { "dyn-syms", PRINT_DYNSYM_TABLE, NULL, 0,
+ N_("Display (only) the dynamic symbol table"), 0 },
{ "version-info", 'V', NULL, 0, N_("Display versioning information"), 0 },
- { "notes", 'n', NULL, 0, N_("Display the ELF notes"), 0 },
+ { "notes", 'n', "SECTION", OPTION_ARG_OPTIONAL, N_("Display the ELF notes"), 0 },
{ "arch-specific", 'A', NULL, 0,
N_("Display architecture specific information, if any"), 0 },
{ "exception", 'e', NULL, 0,
@@ -187,9 +192,15 @@ static bool print_section_header;
/* True if the symbol table should be printed. */
static bool print_symbol_table;
+/* True if (only) the dynsym table should be printed. */
+static bool print_dynsym_table;
+
/* A specific section name, or NULL to print all symbol tables. */
static char *symbol_table_section;
+/* A specific section name, or NULL to print all ELF notes. */
+static char *notes_section;
+
/* True if the version information should be printed. */
static bool print_version_info;
@@ -354,7 +365,7 @@ main (int argc, char *argv[])
int fd = open (argv[remaining], O_RDONLY);
if (fd == -1)
{
- error (0, errno, gettext ("cannot open input file"));
+ error (0, errno, _("cannot open input file '%s'"), argv[remaining]);
continue;
}
@@ -439,6 +450,7 @@ parse_opt (int key, char *arg,
case 'n':
print_notes = true;
any_control_option = true;
+ notes_section = arg;
break;
case 'r':
print_relocations = true;
@@ -453,6 +465,10 @@ parse_opt (int key, char *arg,
any_control_option = true;
symbol_table_section = arg;
break;
+ case PRINT_DYNSYM_TABLE:
+ print_dynsym_table = true;
+ any_control_option = true;
+ break;
case 'V':
print_version_info = true;
any_control_option = true;
@@ -994,7 +1010,7 @@ process_elf_file (Dwfl_Module *dwflmod, int fd)
print_relocs (pure_ebl, ehdr);
if (print_histogram)
handle_hash (ebl);
- if (print_symbol_table)
+ if (print_symbol_table || print_dynsym_table)
print_symtab (ebl, SHT_DYNSYM);
if (print_version_info)
print_verinfo (ebl);
@@ -12408,6 +12424,13 @@ handle_notes (Ebl *ebl, GElf_Ehdr *ehdr)
/* Not what we are looking for. */
continue;
+ if (notes_section != NULL)
+ {
+ char *sname = elf_strptr (ebl->elf, shstrndx, shdr->sh_name);
+ if (sname == NULL || strcmp (sname, notes_section) != 0)
+ continue;
+ }
+
printf (gettext ("\
\nNote section [%2zu] '%s' of %" PRIu64 " bytes at offset %#0" PRIx64 ":\n"),
elf_ndxscn (scn),
@@ -12623,6 +12646,7 @@ for_each_section_argument (Elf *elf, const struct section_argument *list,
error (EXIT_FAILURE, 0, gettext ("cannot get section header: %s"),
elf_errmsg (-1));
name = elf_strptr (elf, shstrndx, shdr_mem.sh_name);
+ (*dump) (scn, &shdr_mem, name);
}
else
{
diff --git a/src/unstrip.c b/src/unstrip.c
index fc878325..9b8c09a1 100644
--- a/src/unstrip.c
+++ b/src/unstrip.c
@@ -433,7 +433,7 @@ update_sh_size (Elf_Scn *outscn, const Elf_Data *data)
/* Update relocation sections using the symbol table. */
static void
adjust_relocs (Elf_Scn *outscn, Elf_Scn *inscn, const GElf_Shdr *shdr,
- size_t map[], const GElf_Shdr *symshdr)
+ size_t map[], size_t map_size, const GElf_Shdr *symshdr)
{
Elf_Data *data = elf_getdata (outscn, NULL);
@@ -441,7 +441,11 @@ adjust_relocs (Elf_Scn *outscn, Elf_Scn *inscn, const GElf_Shdr *shdr,
{
size_t ndx = GELF_R_SYM (*info);
if (ndx != STN_UNDEF)
- *info = GELF_R_INFO (map[ndx - 1], GELF_R_TYPE (*info));
+ {
+ 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)
@@ -572,7 +576,7 @@ adjust_relocs (Elf_Scn *outscn, Elf_Scn *inscn, const GElf_Shdr *shdr,
record_new_data (versym);
data->d_buf = versym;
- data->d_size = nent * shdr->sh_entsize;
+ data->d_size = nent * sizeof versym[0];
elf_flagdata (data, ELF_C_SET, ELF_F_DIRTY);
update_sh_size (outscn, data);
}
@@ -588,7 +592,7 @@ adjust_relocs (Elf_Scn *outscn, Elf_Scn *inscn, const GElf_Shdr *shdr,
/* Adjust all the relocation sections in the file. */
static void
adjust_all_relocs (Elf *elf, Elf_Scn *symtab, const GElf_Shdr *symshdr,
- size_t map[])
+ size_t map[], size_t map_size)
{
size_t new_sh_link = elf_ndxscn (symtab);
Elf_Scn *scn = NULL;
@@ -603,7 +607,7 @@ adjust_all_relocs (Elf *elf, Elf_Scn *symtab, const GElf_Shdr *symshdr,
stripped_symtab. */
if (shdr->sh_type != SHT_NOBITS && shdr->sh_type != SHT_GROUP
&& shdr->sh_link == new_sh_link)
- adjust_relocs (scn, scn, shdr, map, symshdr);
+ adjust_relocs (scn, scn, shdr, map, map_size, symshdr);
}
}
@@ -687,7 +691,7 @@ add_new_section_symbols (Elf_Scn *old_symscn, size_t old_shnum,
}
/* Adjust any relocations referring to the old symbol table. */
- adjust_all_relocs (elf, symscn, shdr, symndx_map);
+ adjust_all_relocs (elf, symscn, shdr, symndx_map, nsym - 1);
return symdata;
}
@@ -835,7 +839,9 @@ collect_symbols (Elf *outelf, bool rel, Elf_Scn *symscn, Elf_Scn *strscn,
struct section *split_bss)
{
Elf_Data *symdata = elf_getdata (symscn, NULL);
+ ELF_CHECK (symdata != NULL, _("cannot get symbol section data: %s"));
Elf_Data *strdata = elf_getdata (strscn, NULL);
+ ELF_CHECK (strdata != NULL, _("cannot get string section data: %s"));
Elf_Data *shndxdata = NULL; /* XXX */
for (size_t i = 1; i < nent; ++i)
@@ -848,7 +854,9 @@ collect_symbols (Elf *outelf, bool rel, Elf_Scn *symscn, Elf_Scn *strscn,
if (sym->st_shndx != SHN_XINDEX)
shndx = sym->st_shndx;
- if (sym->st_name >= strdata->d_size)
+ if (sym->st_name >= strdata->d_size
+ || memrchr (strdata->d_buf + sym->st_name, '\0',
+ strdata->d_size - sym->st_name) == NULL)
error (EXIT_FAILURE, 0,
_("invalid string offset in symbol [%zu]"), i);
@@ -931,14 +939,14 @@ compare_symbols_output (const void *a, const void *b)
{
/* binutils always puts section symbols in section index order. */
CMP (shndx);
- else
- assert (s1 == s2);
+ else if (s1 != s2)
+ error (EXIT_FAILURE, 0, "section symbols in unexpected order");
}
/* Nothing really matters, so preserve the original order. */
CMP (map);
- else
- assert (s1 == s2);
+ else if (s1 != s2)
+ error (EXIT_FAILURE, 0, "found two identical symbols");
}
return cmp;
@@ -1305,7 +1313,7 @@ new_shstrtab (Elf *unstripped, size_t unstripped_shnum,
if (strtab == NULL)
return NULL;
- Dwelf_Strent *unstripped_strent[unstripped_shnum - 1];
+ Dwelf_Strent *unstripped_strent[unstripped_shnum];
memset (unstripped_strent, 0, sizeof unstripped_strent);
for (struct section *sec = sections;
sec < &sections[stripped_shnum - 1];
@@ -1388,6 +1396,19 @@ copy_elided_sections (Elf *unstripped, Elf *stripped,
error (EXIT_FAILURE, 0, _("\
more sections in stripped file than debug file -- arguments reversed?"));
+ if (unlikely (stripped_shnum == 0))
+ error (EXIT_FAILURE, 0, _("no sections in stripped file"));
+
+ /* Used as sanity check for allocated section offset, if the section
+ offset needs to be preserved. We want to know the max size of the
+ ELF file, to check if any existing section offsets are OK. */
+ int64_t max_off = -1;
+ if (stripped_ehdr->e_type != ET_REL)
+ {
+ elf_flagelf (stripped, ELF_C_SET, ELF_F_LAYOUT);
+ max_off = elf_update (stripped, ELF_C_NULL);
+ }
+
/* Cache the stripped file's section details. */
struct section sections[stripped_shnum - 1];
Elf_Scn *scn = NULL;
@@ -1550,10 +1571,11 @@ more sections in stripped file than debug file -- arguments reversed?"));
/* Make sure each main file section has a place to go. */
const struct section *stripped_dynsym = NULL;
size_t debuglink = SHN_UNDEF;
- size_t ndx_section[stripped_shnum - 1];
+ size_t ndx_sec_num = stripped_shnum - 1;
+ size_t ndx_section[ndx_sec_num];
Dwelf_Strtab *strtab = NULL;
for (struct section *sec = sections;
- sec < &sections[stripped_shnum - 1];
+ sec < &sections[ndx_sec_num];
++sec)
{
size_t secndx = elf_ndxscn (sec->scn);
@@ -1658,9 +1680,21 @@ more sections in stripped file than debug file -- arguments reversed?"));
shdr_mem.sh_flags |= SHF_INFO_LINK;
if (sec->shdr.sh_link != SHN_UNDEF)
- shdr_mem.sh_link = ndx_section[sec->shdr.sh_link - 1];
+ {
+ if (sec->shdr.sh_link > ndx_sec_num)
+ error (EXIT_FAILURE, 0,
+ "section [%zd] has invalid sh_link %" PRId32,
+ elf_ndxscn (sec->scn), sec->shdr.sh_link);
+ shdr_mem.sh_link = ndx_section[sec->shdr.sh_link - 1];
+ }
if (SH_INFO_LINK_P (&sec->shdr) && sec->shdr.sh_info != 0)
- shdr_mem.sh_info = ndx_section[sec->shdr.sh_info - 1];
+ {
+ if (sec->shdr.sh_info > ndx_sec_num)
+ error (EXIT_FAILURE, 0,
+ "section [%zd] has invalid sh_info %" PRId32,
+ elf_ndxscn (sec->scn), sec->shdr.sh_info);
+ shdr_mem.sh_info = ndx_section[sec->shdr.sh_info - 1];
+ }
if (strtab != NULL)
shdr_mem.sh_name = dwelf_strent_off (sec->strent);
@@ -1675,6 +1709,11 @@ more sections in stripped file than debug file -- arguments reversed?"));
/* Preserve the file layout of the allocated sections. */
if (stripped_ehdr->e_type != ET_REL && (shdr_mem.sh_flags & SHF_ALLOC))
{
+ if (max_off > 0 && sec->shdr.sh_offset > (Elf64_Off) max_off)
+ error (EXIT_FAILURE, 0,
+ "allocated section offset too large [%zd] %" PRIx64,
+ elf_ndxscn (sec->scn), sec->shdr.sh_offset);
+
shdr_mem.sh_offset = sec->shdr.sh_offset;
placed[elf_ndxscn (sec->outscn) - 1] = true;
@@ -1776,8 +1815,8 @@ more sections in stripped file than debug file -- arguments reversed?"));
/* First collect all the symbols from both tables. */
const size_t total_syms = stripped_nsym - 1 + unstripped_nsym - 1;
- struct symbol symbols[total_syms];
- size_t symndx_map[total_syms];
+ struct symbol *symbols = xmalloc (total_syms * sizeof (struct symbol));
+ size_t *symndx_map = xmalloc (total_syms * sizeof (size_t));
if (stripped_symtab != NULL)
collect_symbols (unstripped, stripped_ehdr->e_type == ET_REL,
@@ -1958,12 +1997,16 @@ more sections in stripped file than debug file -- arguments reversed?"));
++sec)
if (sec->outscn != NULL && sec->shdr.sh_link == old_sh_link)
adjust_relocs (sec->outscn, sec->scn, &sec->shdr,
- symndx_map, shdr);
+ symndx_map, total_syms, shdr);
}
/* Also adjust references to the other old symbol table. */
adjust_all_relocs (unstripped, unstripped_symtab, shdr,
- &symndx_map[stripped_nsym - 1]);
+ &symndx_map[stripped_nsym - 1],
+ total_syms - (stripped_nsym - 1));
+
+ free (symbols);
+ free (symndx_map);
}
else if (stripped_symtab != NULL && stripped_shnum != unstripped_shnum)
check_symtab_section_symbols (unstripped,
diff --git a/tests/ChangeLog b/tests/ChangeLog
index 2900bd82..6e3923f5 100644
--- a/tests/ChangeLog
+++ b/tests/ChangeLog
@@ -1,3 +1,75 @@
+2019-11-26 Mark Wielaard <mark@klomp.org>
+
+ * Makefile.am (BUILD_STATIC): Add libraries needed for libdw.
+ * coverage.sh: Add debuginfod directory, check whether source
+ is .c or cxx.
+
+2019-11-24 Mark Wielaard <mark@klomp.org>
+
+ * run-debuginfod-find.sh: Reduce verbosity. Add new cleanup
+ function to use with trap. Add wait_ready function to query
+ metrics instead of sleeping. Calculate rpms and sourcefiles
+ to check.
+
+2019-11-23 Mark Wielaard <mark@klomp.org>
+
+ * run-debuginfod-find.sh: Replace all localhost with 127.0.0.1.
+
+2019-11-07 Frank Ch. Eigler <fche@redhat.com>
+
+ * run-debuginfod-find.sh: Test debuginfod metrics via curl.
+ Fix federated testing, asserted by metrics.
+
+2019-11-06 Frank Ch. Eigler <fche@redhat.com>
+
+ * run-debuginfod-find.sh: Test debuginfod -L mode. Drop
+ plain debuginfo-find help-output-comparison.
+
+2019-11-04 Frank Ch. Eigler <fche@redhat.com>
+
+ * run-debuginfod-find.sh: Test debuginfod-find -v progress mode.
+
+2019-10-28 Aaron Merey <amerey@redhat.com>
+ Frank Ch. Eigler <fche@redhat.com>
+
+ * run-debuginfod-find.sh, debuginfod_build_id_find.c: New test.
+ * testfile-debuginfod-*.rpm.bz2: New data files for test.
+ * Makefile.am: Run it.
+
+2019-11-14 Andreas Schwab <schwab@suse.de>
+
+ * run-large-elf-file.sh: Skip if available memory cannot be
+ determined.
+
+2019-11-14 Andreas Schwab <schwab@suse.de>
+
+ * dwelf_elf_e_machine_string.c (main): Clear errno before calling
+ strtol.
+
+2019-09-02 Mark Wielaard <mark@klomp.org>
+
+ * run-readelf-s.sh: Add --dyn-syms case.
+
+2019-09-07 Mark Wielaard <mark@klomp.org>
+
+ * Makefile.am (EXTRA_DIST): Add run-disasm-riscv64.sh,
+ testfile-riscv64-dis1.o.bz2 and testfile-riscv64-dis1.expect.bz2.
+
+2019-08-27 Mark Wielaard <mark@klomp.org>
+
+ * run-readelf-test2.sh: Add -x num testcase.
+
+2019-08-29 Mark Wielaard <mark@klomp.org>
+
+ * test-subr.sh (self_test_files_exe): replace elfcmp, objdump and
+ readelf with elfclassify, stack and unstrip.
+ (self_test_files_lib): Replace libdw.so with libasm.so.
+
+2019-07-05 Omar Sandoval <osandov@fb.com>
+
+ * Makefile.am: Remove -ldl.
+ * tests-subr.sh (self_test_files): Remove libebl_{i386,x86_64}.so.
+
2019-07-26 Florian Weimer <fweimer@redhat.com>
Mark Wielaard <mark@klomp.org>
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 64857623..03eebfa8 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -1,6 +1,6 @@
## Process this file with automake to create Makefile.in
##
-## Copyright (C) 1996-2018 Red Hat, Inc.
+## Copyright (C) 1996-2019 Red Hat, Inc.
## This file is part of elfutils.
##
## This file is free software; you can redistribute it and/or modify
@@ -188,6 +188,11 @@ check_PROGRAMS += $(asm_TESTS)
TESTS += $(asm_TESTS) run-disasm-bpf.sh
endif
+if DEBUGINFOD
+check_PROGRAMS += debuginfod_build_id_find
+TESTS += run-debuginfod-find.sh
+endif
+
EXTRA_DIST = run-arextract.sh run-arsymtest.sh run-ar.sh \
run-show-die-info.sh run-get-files.sh run-get-lines.sh \
run-next-files.sh run-next-lines.sh testfile-only-debug-line.bz2 \
@@ -436,7 +441,27 @@ EXTRA_DIST = run-arextract.sh run-arsymtest.sh run-ar.sh \
run-readelf-discr.sh \
testfile-rng.debug.bz2 testfile-urng.debug.bz2 \
run-dwelf_elf_e_machine_string.sh \
- run-elfclassify.sh run-elfclassify-self.sh
+ 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 \
+ 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 \
+ debuginfod-rpms/fedora30/hello2-debugsource-1.0-2.x86_64.rpm \
+ debuginfod-rpms/fedora30/hello2-two-1.0-2.x86_64.rpm \
+ debuginfod-rpms/fedora30/hello2-two-debuginfo-1.0-2.x86_64.rpm \
+ debuginfod-rpms/hello2.spec. \
+ debuginfod-rpms/rhel6/hello2-1.0-2.i686.rpm \
+ debuginfod-rpms/rhel6/hello2-1.0-2.src.rpm \
+ debuginfod-rpms/rhel6/hello2-debuginfo-1.0-2.i686.rpm \
+ debuginfod-rpms/rhel6/hello2-two-1.0-2.i686.rpm \
+ debuginfod-rpms/rhel7/hello2-1.0-2.src.rpm \
+ debuginfod-rpms/rhel7/hello2-1.0-2.x86_64.rpm \
+ debuginfod-rpms/rhel7/hello2-debuginfo-1.0-2.x86_64.rpm \
+ debuginfod-rpms/rhel7/hello2-two-1.0-2.x86_64.rpm
+
+
if USE_VALGRIND
valgrind_cmd='valgrind -q --leak-check=full --error-exitcode=1'
@@ -470,7 +495,7 @@ TESTS_ENVIRONMENT = LC_ALL=C; LANG=C; VALGRIND_CMD=$(valgrind_cmd); \
export LC_ALL; export LANG; export VALGRIND_CMD; \
NM=$(NM); export NM;
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)/libdw:$(abs_top_builddir)/backends:$(abs_top_builddir)/libelf:$(abs_top_builddir)/libasm:$(abs_top_builddir)/debuginfod
installcheck-local:
$(MAKE) $(AM_MAKEFLAGS) \
@@ -485,7 +510,7 @@ libasm = -lasm
libebl = -lebl
else !STANDALONE
if BUILD_STATIC
-libdw = ../libdw/libdw.a -lz $(zip_LIBS) $(libelf) $(libebl) -ldl
+libdw = ../libdw/libdw.a -lz $(zip_LIBS) $(libelf) $(libebl) -ldl -lpthread
libelf = ../libelf/libelf.a -lz
libasm = ../libasm/libasm.a
else
@@ -493,8 +518,7 @@ libdw = ../libdw/libdw.so
libelf = ../libelf/libelf.so
libasm = ../libasm/libasm.so
endif
-libebl = ../libebl/libebl.a ../backends/libebl_static_pic.a ../libcpu/libcpu_static_pic.a
-libdw_static = ../libdw/libdw_static_pic.a
+libebl = ../libebl/libebl.a ../backends/libebl_backends.a ../libcpu/libcpu.a
libeu = ../lib/libeu.a
endif !STANDALONE
@@ -532,27 +556,27 @@ funcretval_LDADD = $(libdw) $(argp_LDADD)
allregs_LDADD = $(libdw) $(argp_LDADD)
find_prologues_LDADD = $(libdw) $(argp_LDADD)
#show_ciefde_LDADD = ../libdwarf/libdwarf.so $(libelf)
-asm_tst1_LDADD = $(libasm) $(libebl) $(libelf) $(libdw) -ldl
-asm_tst2_LDADD = $(libasm) $(libebl) $(libelf) $(libdw) -ldl
-asm_tst3_LDADD = $(libasm) $(libebl) $(libelf) $(libdw) -ldl
-asm_tst4_LDADD = $(libasm) $(libebl) $(libelf) $(libdw) -ldl
-asm_tst5_LDADD = $(libasm) $(libebl) $(libelf) $(libdw) -ldl
-asm_tst6_LDADD = $(libasm) $(libebl) $(libelf) $(libdw) -ldl
-asm_tst7_LDADD = $(libasm) $(libebl) $(libelf) $(libdw) -ldl
-asm_tst8_LDADD = $(libasm) $(libebl) $(libelf) $(libdw) -ldl
-asm_tst9_LDADD = $(libasm) $(libebl) $(libelf) $(libdw) -ldl
-dwflmodtest_LDADD = $(libdw) $(libebl) $(libelf) $(argp_LDADD) -ldl
+asm_tst1_LDADD = $(libasm) $(libebl) $(libelf) $(libdw)
+asm_tst2_LDADD = $(libasm) $(libebl) $(libelf) $(libdw)
+asm_tst3_LDADD = $(libasm) $(libebl) $(libelf) $(libdw)
+asm_tst4_LDADD = $(libasm) $(libebl) $(libelf) $(libdw)
+asm_tst5_LDADD = $(libasm) $(libebl) $(libelf) $(libdw)
+asm_tst6_LDADD = $(libasm) $(libebl) $(libelf) $(libdw)
+asm_tst7_LDADD = $(libasm) $(libebl) $(libelf) $(libdw)
+asm_tst8_LDADD = $(libasm) $(libebl) $(libelf) $(libdw)
+asm_tst9_LDADD = $(libasm) $(libebl) $(libelf) $(libdw)
+dwflmodtest_LDADD = $(libdw) $(libebl) $(libelf) $(argp_LDADD)
rdwrmmap_LDADD = $(libelf)
-dwfl_bug_addr_overflow_LDADD = $(libdw) $(libebl) $(libelf) -ldl
+dwfl_bug_addr_overflow_LDADD = $(libdw) $(libebl) $(libelf)
arls_LDADD = $(libelf)
-dwfl_bug_fd_leak_LDADD = $(libdw) $(libebl) $(libelf) -ldl
-dwfl_bug_report_LDADD = $(libdw) $(libebl) $(libelf) -ldl
-dwfl_bug_getmodules_LDADD = $(libdw) $(libebl) $(libelf) -ldl
-dwfl_addr_sect_LDADD = $(libdw) $(libebl) $(libelf) $(argp_LDADD) -ldl
+dwfl_bug_fd_leak_LDADD = $(libdw) $(libebl) $(libelf)
+dwfl_bug_report_LDADD = $(libdw) $(libebl) $(libelf)
+dwfl_bug_getmodules_LDADD = $(libdw) $(libebl) $(libelf)
+dwfl_addr_sect_LDADD = $(libdw) $(libebl) $(libelf) $(argp_LDADD)
dwarf_getmacros_LDADD = $(libdw)
dwarf_ranges_LDADD = $(libdw)
dwarf_getstring_LDADD = $(libdw)
-addrcfi_LDADD = $(libdw) $(libebl) $(libelf) $(argp_LDADD) -ldl
+addrcfi_LDADD = $(libdw) $(libebl) $(libelf) $(argp_LDADD)
dwarfcfi_LDADD = $(libdw) $(libelf)
test_flag_nobits_LDADD = $(libelf)
rerequest_tag_LDADD = $(libdw)
@@ -608,6 +632,7 @@ unit_info_LDADD = $(libdw)
next_cfi_LDADD = $(libelf) $(libdw)
elfcopy_LDADD = $(libelf)
addsections_LDADD = $(libelf)
+debuginfod_build_id_find_LDADD = $(libelf) $(libdw)
xlate_notes_LDADD = $(libelf)
elfrdwrnop_LDADD = $(libelf)
dwelf_elf_e_machine_string_LDADD = $(libelf) $(libdw)
diff --git a/tests/coverage.sh b/tests/coverage.sh
index 5cc353c9..01d292cc 100755
--- a/tests/coverage.sh
+++ b/tests/coverage.sh
@@ -8,14 +8,14 @@ fi
cd ..
-for d in lib libasm libdw libdwfl libebl libelf backends src; do
+for d in lib libasm libdw libdwfl libebl libelf backends src debuginfod; do
tmp=$d-data
cd $d
unused=0
unused_files=
for f in *.gcno; do
base="$(basename $f .gcno)"
- fc="$base.c"
+ if [ -f "$base.c" ]; then fc="$base.c"; else fc="$base.cxx"; fi
gcda="$base.gcda"
if [ -f "$gcda" ]; then
gcov -n -a "$fc" |
diff --git a/tests/debuginfod-rpms/fedora30/hello2-1.0-2.src.rpm b/tests/debuginfod-rpms/fedora30/hello2-1.0-2.src.rpm
new file mode 100644
index 00000000..29a60999
--- /dev/null
+++ b/tests/debuginfod-rpms/fedora30/hello2-1.0-2.src.rpm
Binary files differ
diff --git a/tests/debuginfod-rpms/fedora30/hello2-1.0-2.x86_64.rpm b/tests/debuginfod-rpms/fedora30/hello2-1.0-2.x86_64.rpm
new file mode 100644
index 00000000..2757e01a
--- /dev/null
+++ b/tests/debuginfod-rpms/fedora30/hello2-1.0-2.x86_64.rpm
Binary files differ
diff --git a/tests/debuginfod-rpms/fedora30/hello2-debuginfo-1.0-2.x86_64.rpm b/tests/debuginfod-rpms/fedora30/hello2-debuginfo-1.0-2.x86_64.rpm
new file mode 100644
index 00000000..dc6e0f2f
--- /dev/null
+++ b/tests/debuginfod-rpms/fedora30/hello2-debuginfo-1.0-2.x86_64.rpm
Binary files differ
diff --git a/tests/debuginfod-rpms/fedora30/hello2-debugsource-1.0-2.x86_64.rpm b/tests/debuginfod-rpms/fedora30/hello2-debugsource-1.0-2.x86_64.rpm
new file mode 100644
index 00000000..f036fa39
--- /dev/null
+++ b/tests/debuginfod-rpms/fedora30/hello2-debugsource-1.0-2.x86_64.rpm
Binary files differ
diff --git a/tests/debuginfod-rpms/fedora30/hello2-two-1.0-2.x86_64.rpm b/tests/debuginfod-rpms/fedora30/hello2-two-1.0-2.x86_64.rpm
new file mode 100644
index 00000000..e1c09dac
--- /dev/null
+++ b/tests/debuginfod-rpms/fedora30/hello2-two-1.0-2.x86_64.rpm
Binary files differ
diff --git a/tests/debuginfod-rpms/fedora30/hello2-two-debuginfo-1.0-2.x86_64.rpm b/tests/debuginfod-rpms/fedora30/hello2-two-debuginfo-1.0-2.x86_64.rpm
new file mode 100644
index 00000000..b9a63dfa
--- /dev/null
+++ b/tests/debuginfod-rpms/fedora30/hello2-two-debuginfo-1.0-2.x86_64.rpm
Binary files differ
diff --git a/tests/debuginfod-rpms/hello2.spec. b/tests/debuginfod-rpms/hello2.spec.
new file mode 100644
index 00000000..0690992f
--- /dev/null
+++ b/tests/debuginfod-rpms/hello2.spec.
@@ -0,0 +1,57 @@
+Summary: hello2 -- double hello, world rpm
+Name: hello2
+Version: 1.0
+Release: 2
+Group: Utilities
+License: GPL
+Distribution: RPM ^W Elfutils test suite.
+Vendor: Red Hat Software
+Packager: Red Hat Software <bugs@redhat.com>
+URL: http://www.redhat.com
+BuildRequires: gcc make
+Source0: hello-1.0.tar.gz
+
+%description
+Simple rpm demonstration with an eye to consumption by debuginfod.
+
+%package two
+Summary: hello2two
+License: GPL
+
+%description two
+Dittoish.
+
+%prep
+%setup -q -n hello-1.0
+
+%build
+gcc -g -O1 hello.c -o hello
+gcc -g -O2 -D_FORTIFY_SOURCE=2 hello.c -o hello2
+
+%install
+rm -rf $RPM_BUILD_ROOT
+mkdir -p $RPM_BUILD_ROOT/usr/local/bin
+cp hello $RPM_BUILD_ROOT/usr/local/bin/
+cp hello2 $RPM_BUILD_ROOT/usr/local/bin/
+
+%clean
+rm -rf $RPM_BUILD_ROOT
+
+%files
+%defattr(-,root,root)
+%attr(0751,root,root) /usr/local/bin/hello
+
+%files two
+%defattr(-,root,root)
+%attr(0751,root,root) /usr/local/bin/hello2
+
+%changelog
+* Thu Nov 14 2019 Frank Ch. Eigler <fche@redhat.com>
+- Added source code right here to make spec file self-contained.
+- Dropped misc files not relevant to debuginfod testing.
+
+* Wed May 18 2016 Mark Wielaard <mjw@redhat.com>
+- Add hello2 for dwz testing support.
+
+* Tue Oct 20 1998 Jeff Johnson <jbj@redhat.com>
+- create.
diff --git a/tests/debuginfod-rpms/rhel6/hello2-1.0-2.i686.rpm b/tests/debuginfod-rpms/rhel6/hello2-1.0-2.i686.rpm
new file mode 100644
index 00000000..cb99fd6e
--- /dev/null
+++ b/tests/debuginfod-rpms/rhel6/hello2-1.0-2.i686.rpm
Binary files differ
diff --git a/tests/debuginfod-rpms/rhel6/hello2-1.0-2.src.rpm b/tests/debuginfod-rpms/rhel6/hello2-1.0-2.src.rpm
new file mode 100644
index 00000000..603a9b1a
--- /dev/null
+++ b/tests/debuginfod-rpms/rhel6/hello2-1.0-2.src.rpm
Binary files differ
diff --git a/tests/debuginfod-rpms/rhel6/hello2-debuginfo-1.0-2.i686.rpm b/tests/debuginfod-rpms/rhel6/hello2-debuginfo-1.0-2.i686.rpm
new file mode 100644
index 00000000..19f4360c
--- /dev/null
+++ b/tests/debuginfod-rpms/rhel6/hello2-debuginfo-1.0-2.i686.rpm
Binary files differ
diff --git a/tests/debuginfod-rpms/rhel6/hello2-two-1.0-2.i686.rpm b/tests/debuginfod-rpms/rhel6/hello2-two-1.0-2.i686.rpm
new file mode 100644
index 00000000..58c77a1d
--- /dev/null
+++ b/tests/debuginfod-rpms/rhel6/hello2-two-1.0-2.i686.rpm
Binary files differ
diff --git a/tests/debuginfod-rpms/rhel7/hello2-1.0-2.src.rpm b/tests/debuginfod-rpms/rhel7/hello2-1.0-2.src.rpm
new file mode 100644
index 00000000..5ca4d423
--- /dev/null
+++ b/tests/debuginfod-rpms/rhel7/hello2-1.0-2.src.rpm
Binary files differ
diff --git a/tests/debuginfod-rpms/rhel7/hello2-1.0-2.x86_64.rpm b/tests/debuginfod-rpms/rhel7/hello2-1.0-2.x86_64.rpm
new file mode 100644
index 00000000..0e6f6cc8
--- /dev/null
+++ b/tests/debuginfod-rpms/rhel7/hello2-1.0-2.x86_64.rpm
Binary files differ
diff --git a/tests/debuginfod-rpms/rhel7/hello2-debuginfo-1.0-2.x86_64.rpm b/tests/debuginfod-rpms/rhel7/hello2-debuginfo-1.0-2.x86_64.rpm
new file mode 100644
index 00000000..c1136f3a
--- /dev/null
+++ b/tests/debuginfod-rpms/rhel7/hello2-debuginfo-1.0-2.x86_64.rpm
Binary files differ
diff --git a/tests/debuginfod-rpms/rhel7/hello2-two-1.0-2.x86_64.rpm b/tests/debuginfod-rpms/rhel7/hello2-two-1.0-2.x86_64.rpm
new file mode 100644
index 00000000..5e89afd2
--- /dev/null
+++ b/tests/debuginfod-rpms/rhel7/hello2-two-1.0-2.x86_64.rpm
Binary files differ
diff --git a/tests/debuginfod_build_id_find.c b/tests/debuginfod_build_id_find.c
new file mode 100644
index 00000000..753a20c2
--- /dev/null
+++ b/tests/debuginfod_build_id_find.c
@@ -0,0 +1,62 @@
+/* Test program for fetching debuginfo with debuginfo-server.
+ Copyright (C) 2019 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 <stdio.h>
+#include ELFUTILS_HEADER(dwfl)
+#include <elf.h>
+#include <dwarf.h>
+#include <argp.h>
+#include <assert.h>
+#include <string.h>
+
+static const char *debuginfo_path = "";
+static const Dwfl_Callbacks cb =
+ {
+ NULL,
+ dwfl_standard_find_debuginfo,
+ NULL,
+ (char **)&debuginfo_path,
+ };
+
+int
+main (int argc __attribute__ ((unused)), char **argv)
+{
+ int expect_pass = strcmp(argv[3], "0");
+ Dwarf_Addr bias = 0;
+ Dwfl *dwfl = dwfl_begin(&cb);
+ dwfl_report_begin(dwfl);
+
+ /* Open an executable. */
+ Dwfl_Module *mod = dwfl_report_offline(dwfl, argv[2], argv[2], -1);
+
+ /* The corresponding debuginfo will not be found in debuginfo_path
+ (since it's empty), causing the server to be queried. */
+
+ Dwarf *res = dwfl_module_getdwarf(mod, &bias);
+ if (expect_pass)
+ assert(res);
+ else
+ assert(!res);
+
+ dwfl_end (dwfl);
+
+ return 0;
+}
diff --git a/tests/dwelf_elf_e_machine_string.c b/tests/dwelf_elf_e_machine_string.c
index 1df2b233..afad1058 100644
--- a/tests/dwelf_elf_e_machine_string.c
+++ b/tests/dwelf_elf_e_machine_string.c
@@ -40,6 +40,7 @@ main (int argc, char **argv)
int em;
const char *machine;
+ errno = 0;
if (strncmp ("0x", argv[i], 2) == 0)
val = strtol (&argv[i][2], NULL, 16);
else
diff --git a/tests/run-debuginfod-find.sh b/tests/run-debuginfod-find.sh
new file mode 100755
index 00000000..0ade03b7
--- /dev/null
+++ b/tests/run-debuginfod-find.sh
@@ -0,0 +1,324 @@
+#!/bin/bash
+#
+# Copyright (C) 2019 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
+
+DB=${PWD}/.debuginfod_tmp.sqlite
+tempfiles $DB
+export DEBUGINFOD_CACHE_PATH=${PWD}/.client_cache
+
+PID1=0
+PID2=0
+
+cleanup()
+{
+ if [ $PID1 -ne 0 ]; then kill $PID1; wait $PID1; fi
+ if [ $PID2 -ne 0 ]; then kill $PID2; wait $PID2; fi
+
+ rm -rf F R L ${PWD}/.client_cache*
+ 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
+# not tempfiles F R L - 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"
+ exit 1;
+ fi
+}
+
+env LD_LIBRARY_PATH=$ldpath DEBUGINFOD_URLS= ${abs_builddir}/../debuginfod/debuginfod -F -R -d $DB -p $PORT1 -t0 -g0 R F L &
+PID1=$!
+# 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
+gcc -g -o prog ${PWD}/prog.c
+ ${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{file="F"}' 2
+
+########################################################################
+
+# 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 $BUILDID`
+cmp $filename F/prog
+
+filename=`testrun ${abs_top_builddir}/debuginfod/debuginfod-find source $BUILDID ${PWD}/prog.c`
+cmp $filename ${PWD}/prog.c
+
+########################################################################
+
+# 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 -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{file="F"}' 3
+
+# 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
+tempfiles vlog
+filename=`testrun ${abs_top_builddir}/debuginfod/debuginfod-find executable $BUILDID2`
+cmp $filename F/prog2
+filename=`testrun ${abs_top_builddir}/debuginfod/debuginfod-find source $BUILDID2 ${PWD}/prog2.c`
+cmp $filename ${PWD}/prog2.c
+
+cp -rp ${abs_srcdir}/debuginfod-rpms R
+kill -USR1 $PID1
+# All rpms need to be in the index
+rpms=$(find R -name \*rpm | wc -l)
+wait_ready $PORT1 'scanned_total{source="rpm"}' $rpms
+
+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)
+for i in $newrpms; do
+ subdir=$[$subdir+1];
+ mkdir $subdir;
+ cd $subdir;
+ ls -lah ../$i
+ rpm2cpio ../$i | cpio -id;
+ 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"}' $sourcefiles
+
+# Run a bank of queries against the debuginfod-rpms test cases
+
+rpm_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
+
+ 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
+
+ filename=`testrun ${abs_top_builddir}/debuginfod/debuginfod-find source $__BUILDID $__SOURCEPATH`
+ hash=`cat $filename | sha1sum | awk '{print $1}'`
+ test $__SOURCESHA1 = $hash
+}
+
+
+# common source file sha1
+SHA=f4a1a8062be998ae93b8f1cd744a398c6de6dbb1
+# fedora30
+rpm_test c36708a78618d597dee15d0dc989f093ca5f9120 /usr/src/debug/hello2-1.0-2.x86_64/hello.c $SHA
+rpm_test 41a236eb667c362a1c4196018cc4581e09722b1b /usr/src/debug/hello2-1.0-2.x86_64/hello.c $SHA
+# rhel7
+rpm_test bc1febfd03ca05e030f0d205f7659db29f8a4b30 /usr/src/debug/hello-1.0/hello.c $SHA
+rpm_test f0aa15b8aba4f3c28cac3c2a73801fefa644a9f2 /usr/src/debug/hello-1.0/hello.c $SHA
+# rhel6
+rpm_test bbbf92ebee5228310e398609c23c2d7d53f6e2f9 /usr/src/debug/hello-1.0/hello.c $SHA
+rpm_test d44d42cbd7d915bc938c81333a21e355a6022fb7 /usr/src/debug/hello-1.0/hello.c $SHA
+
+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
+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
+
+########################################################################
+
+# 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 -F -d ${DB}_2 -p $PORT2 -L L &
+PID2=$!
+tempfiles ${DB}_2
+wait_ready $PORT2 'ready' 1
+
+# have clients contact the new server
+export DEBUGINFOD_URLS=http://127.0.0.1:$PORT2
+rm -rf $DEBUGINFOD_CACHE_PATH
+testrun ${abs_top_builddir}/debuginfod/debuginfod-find debuginfo $BUILDID
+
+# 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 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, if curl program is installed
+if type curl 2>/dev/null; then
+ curl http://127.0.0.1:$PORT1/badapi
+ curl http://127.0.0.1:$PORT1/metrics
+ curl http://127.0.0.1:$PORT2/metrics
+ curl http://127.0.0.1:$PORT1/metrics | grep -q 'http_responses_total.*result.*error'
+ curl http://127.0.0.1:$PORT2/metrics | grep -q 'http_responses_total.*result.*upstream'
+fi
+
+########################################################################
+
+# 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
+
+########################################################################
+
+# 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
+
+exit 0
diff --git a/tests/run-disasm-riscv64.sh b/tests/run-disasm-riscv64.sh
new file mode 100755
index 00000000..5353e818
--- /dev/null
+++ b/tests/run-disasm-riscv64.sh
@@ -0,0 +1,529 @@
+#! /bin/sh
+# Copyright (C) 2019 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 testfile-riscv64-dis1.o testfile-riscv64-dis1.expect
+testrun_compare ${abs_top_builddir}/src/objdump -d testfile-riscv64-dis1.o < testfile-riscv64-dis1.expect
+
+exit $?
+
+# The following code is used to generate the test file.
+cat <<EOF | riscv64-linux-gnu-as -c -o testfile-riscv64-dis1.o -
+.text
+.word 0x80000037
+.word 0x800000b7
+.word 0x40300137
+.word 0x90000017
+.word 0x01003317
+.word 0x000000ef
+.word 0x0000116f
+.word 0x000021ef
+.word 0x0000426f
+.word 0x000082ef
+.word 0x0001036f
+.word 0x000203ef
+.word 0x0004046f
+.word 0x000804ef
+.word 0x0010056f
+.word 0x002005ef
+.word 0x0040066f
+.word 0x008006ef
+.word 0x0100076f
+.word 0x020007ef
+.word 0x0400086f
+.word 0x080008ef
+.word 0x1000096f
+.word 0x200009ef
+.word 0x40000a6f
+.word 0x80000aef
+.word 0x00000067
+.word 0x80008567
+.word 0x050109e7
+.word 0x00d30863
+.word 0x80c41463
+.word 0x40d348e3
+.word 0x20d35263
+.word 0x10d364e3
+.word 0x08d37463
+.word 0x00000003
+.word 0x83050703
+.word 0x00001003
+.word 0x850c1383
+.word 0x04012003
+.word 0xa50c2383
+.word 0x05013003
+.word 0xf50c3383
+.word 0x00004003
+.word 0x83054703
+.word 0x00005003
+.word 0x850c5383
+.word 0x04016003
+.word 0xa50c6383
+.word 0x00000023
+.word 0x5f430323
+.word 0x00001023
+.word 0x5f431323
+.word 0x00002023
+.word 0x5f432323
+.word 0x00003023
+.word 0x5f433323
+.word 0x00000013
+.word 0x00000093
+.word 0x00300093
+.word 0x00310093
+.word 0x00002013
+.word 0x00002093
+.word 0x00302093
+.word 0x00312093
+.word 0x00003013
+.word 0x00003093
+.word 0x00303093
+.word 0x00313093
+.word 0x00004013
+.word 0x00004093
+.word 0x00304093
+.word 0x00314093
+.word 0x00006013
+.word 0x00006093
+.word 0x00306093
+.word 0x00316093
+.word 0x00007013
+.word 0x00007093
+.word 0x00307093
+.word 0x00317093
+.word 0x00311093
+.word 0x00315093
+.word 0x40315093
+.word 0x00000033
+.word 0x010000b3
+.word 0x40000033
+.word 0x410000b3
+.word 0x40010033
+.word 0x410200b3
+.word 0x00001033
+.word 0x010010b3
+.word 0x00002033
+.word 0x010020b3
+.word 0x00012033
+.word 0x010220b3
+.word 0x00003033
+.word 0x010030b3
+.word 0x00043033
+.word 0x010530b3
+.word 0x00004033
+.word 0x010040b3
+.word 0x00005033
+.word 0x010050b3
+.word 0x40005033
+.word 0x410050b3
+.word 0x00006033
+.word 0x010060b3
+.word 0x00007033
+.word 0x010070b3
+.word 0x0000000f
+.word 0x0210000f
+.word 0x00000073
+.word 0x00100073
+.word 0x0000001b
+.word 0x0010001b
+.word 0x0000101b
+.word 0x0010101b
+.word 0x0000501b
+.word 0x0000501b
+.word 0x4010501b
+.word 0x4010501b
+.word 0x0000003b
+.word 0x0000003b
+.word 0x00d0833b
+.word 0x00d0833b
+.word 0x40d0833b
+.word 0x40d0833b
+.word 0x00d0933b
+.word 0x00d0933b
+.word 0x00d0d33b
+.word 0x00d0d33b
+.word 0x40d0d33b
+.word 0x40d0d33b
+.word 0x0000100f
+.word 0x00431073
+.word 0x00431ff3
+.word 0xc0132ff3
+.word 0xc8133ff3
+.word 0x00435ff3
+.word 0xc0136ff3
+.word 0xc8137ff3
+.word 0x02000033
+.word 0x02e40733
+.word 0x02001033
+.word 0x02e41733
+.word 0x02002033
+.word 0x02e42733
+.word 0x02003033
+.word 0x02e43733
+.word 0x02004033
+.word 0x02e44733
+.word 0x02005033
+.word 0x02e45733
+.word 0x02006033
+.word 0x02e46733
+.word 0x02007033
+.word 0x02e47733
+.word 0x0200003b
+.word 0x02e4073b
+.word 0x0200403b
+.word 0x02e4473b
+.word 0x0200503b
+.word 0x02e4573b
+.word 0x0200603b
+.word 0x02e4673b
+.word 0x0200703b
+.word 0x02e4773b
+.word 0x1000202f
+.word 0x1800202f
+.word 0x1000302f
+.word 0x1800302f
+.word 0x0800202f
+.word 0x0800302f
+.word 0x0000202f
+.word 0x0000302f
+.word 0x2000202f
+.word 0x2000302f
+.word 0x6000202f
+.word 0x6000302f
+.word 0x4000202f
+.word 0x4000302f
+.word 0x8000202f
+.word 0x8000302f
+.word 0xa000202f
+.word 0xa000302f
+.word 0xc000202f
+.word 0xc000302f
+.word 0xe000202f
+.word 0xe000302f
+.word 0x00002007
+.word 0x00003007
+.word 0x00004007
+.word 0x00002027
+.word 0x00003027
+.word 0x00004027
+.word 0x00002043
+.word 0x02002043
+.word 0x06002043
+.word 0x00002047
+.word 0x02002047
+.word 0x06002047
+.word 0x0000204b
+.word 0x0200204b
+.word 0x0600204b
+.word 0x0000204f
+.word 0x0200204f
+.word 0x0600204f
+.word 0x00000053
+.word 0x00001053
+.word 0x00002053
+.word 0x00003053
+.word 0x00004053
+.word 0x00007053
+.word 0x02000053
+.word 0x06000053
+.word 0x08000053
+.word 0x0a000053
+.word 0x0e000053
+.word 0x10000053
+.word 0x12000053
+.word 0x16000053
+.word 0x18000053
+.word 0x1a000053
+.word 0x1e000053
+.word 0x58000053
+.word 0x5a000053
+.word 0x5e000053
+.word 0x20000053
+.word 0x20300053
+.word 0x22000053
+.word 0x22300053
+.word 0x26000053
+.word 0x26300053
+.word 0x20001053
+.word 0x20401053
+.word 0x22001053
+.word 0x22401053
+.word 0x26001053
+.word 0x26401053
+.word 0x20002053
+.word 0x20702053
+.word 0x22002053
+.word 0x22702053
+.word 0x26002053
+.word 0x26702053
+.word 0x29700053
+.word 0x2b700053
+.word 0x2f700053
+.word 0x29701053
+.word 0x2b701053
+.word 0x2f701053
+.word 0xc00332d3
+.word 0xc02332d3
+.word 0xc20342d3
+.word 0xc22342d3
+.word 0xc60222d3
+.word 0xc62222d3
+.word 0xc01332d3
+.word 0xc03332d3
+.word 0xc21342d3
+.word 0xc23342d3
+.word 0xc61222d3
+.word 0xc63222d3
+.word 0xe00503d3
+.word 0xe20504d3
+.word 0xe60509d3
+.word 0xa0340753
+.word 0xa0341753
+.word 0xa0342753
+.word 0xa2340753
+.word 0xa2341753
+.word 0xa2342753
+.word 0xa6340753
+.word 0xa6341753
+.word 0xa6342753
+.word 0xe0091d53
+.word 0xe2091d53
+.word 0xe6091d53
+.word 0xd00e2453
+.word 0xd02e2453
+.word 0xd01e1453
+.word 0xd03e1453
+.word 0xd2030553
+.word 0xd2130553
+.word 0xd6030553
+.word 0xd6130553
+.word 0xd22e2453
+.word 0xd23e1453
+.word 0xd62e2453
+.word 0xd63e2453
+.word 0xf00c0753
+.word 0xf20c0753
+.word 0xf60c0753
+.short 0x1000
+.short 0x0800
+.short 0x0400
+.short 0x0200
+.short 0x0100
+.short 0x0080
+.short 0x0040
+.short 0x0020
+.short 0x3100
+.short 0x2900
+.short 0x2500
+.short 0x2140
+.short 0x2120
+.short 0x5100
+.short 0x4900
+.short 0x4500
+.short 0x4140
+.short 0x4120
+.short 0x7100
+.short 0x6900
+.short 0x6500
+.short 0x6140
+.short 0x6120
+.short 0xb100
+.short 0xa900
+.short 0xa500
+.short 0xa140
+.short 0xa120
+.short 0xd100
+.short 0xc900
+.short 0xc500
+.short 0xc140
+.short 0xc120
+.short 0xf100
+.short 0xe900
+.short 0xe500
+.short 0xe140
+.short 0xe120
+.short 0x1001
+.short 0x1301
+.short 0x0341
+.short 0x0321
+.short 0x0311
+.short 0x0309
+.short 0x0305
+.short 0x2081
+.short 0x3081
+.short 0x20c1
+.short 0x20a1
+.short 0x2091
+.short 0x2089
+.short 0x2085
+.short 0x2105
+.short 0x2185
+.short 0x2205
+.short 0x2285
+.short 0x2305
+.short 0x2385
+.short 0x2405
+.short 0x2485
+.short 0x2505
+.short 0x2585
+.short 0x2605
+.short 0x2685
+.short 0x2705
+.short 0x2785
+.short 0x2805
+.short 0x2885
+.short 0x2905
+.short 0x2985
+.short 0x2a05
+.short 0x2a85
+.short 0x2b05
+.short 0x2b85
+.short 0x2c05
+.short 0x2c85
+.short 0x2d05
+.short 0x2d85
+.short 0x2e05
+.short 0x2e85
+.short 0x2f05
+.short 0x2f85
+.short 0x4081
+.short 0x5081
+.short 0x40c1
+.short 0x40a1
+.short 0x4091
+.short 0x4089
+.short 0x4085
+.short 0x7101
+.short 0x6141
+.short 0x6121
+.short 0x6111
+.short 0x6109
+.short 0x6105
+.short 0x7301
+.short 0x6341
+.short 0x6321
+.short 0x6311
+.short 0x6309
+.short 0x6305
+.short 0x9001
+.short 0x8041
+.short 0x8021
+.short 0x8011
+.short 0x8009
+.short 0x8005
+.short 0x8405
+.short 0x8801
+.short 0x9801
+.short 0x8941
+.short 0x8921
+.short 0x8911
+.short 0x8909
+.short 0x8905
+.short 0x8f11
+.short 0x8f31
+.short 0x8f51
+.short 0x8f71
+.short 0x9f11
+.short 0x9f31
+.short 0xa001
+.short 0xb001
+.short 0xa801
+.short 0xa401
+.short 0xa201
+.short 0xa101
+.short 0xa081
+.short 0xa041
+.short 0xa021
+.short 0xa011
+.short 0xa009
+.short 0xa005
+.short 0xc301
+.short 0xd301
+.short 0xcb01
+.short 0xc701
+.short 0xc341
+.short 0xc321
+.short 0xc311
+.short 0xc309
+.short 0xc305
+.short 0xe301
+.short 0xf301
+.short 0xeb01
+.short 0xe701
+.short 0xe341
+.short 0xe321
+.short 0xe311
+.short 0xe309
+.short 0xe305
+.short 0x1302
+.short 0x0342
+.short 0x0322
+.short 0x0312
+.short 0x030a
+.short 0x0306
+.short 0x2702
+.short 0x3702
+.short 0x2742
+.short 0x2722
+.short 0x2712
+.short 0x270a
+.short 0x2706
+.short 0x4702
+.short 0x5702
+.short 0x4742
+.short 0x4722
+.short 0x4712
+.short 0x470a
+.short 0x4706
+.short 0x6702
+.short 0x7702
+.short 0x6742
+.short 0x6722
+.short 0x6712
+.short 0x670a
+.short 0x6706
+.short 0x8302
+.short 0x8342
+.short 0x9002
+.short 0x9502
+.short 0x9572
+.short 0xa062
+.short 0xb062
+.short 0xa862
+.short 0xa462
+.short 0xa262
+.short 0xa162
+.short 0xa0e2
+.short 0xc062
+.short 0xd062
+.short 0xc862
+.short 0xc462
+.short 0xc262
+.short 0xc162
+.short 0xc0e2
+.short 0xe062
+.short 0xf062
+.short 0xe862
+.short 0xe462
+.short 0xe262
+.short 0xe162
+.short 0xe0e2
+.word 0x00153073
+.word 0x0011d073
+.word 0x0011e073
+EOF
diff --git a/tests/run-large-elf-file.sh b/tests/run-large-elf-file.sh
index 6146cfed..cbe30615 100755
--- a/tests/run-large-elf-file.sh
+++ b/tests/run-large-elf-file.sh
@@ -42,9 +42,9 @@ if [ "x$VALGRIND_CMD" != "x" ]; then
mem_needed=$[${mem_needed} + 2]
fi
echo "mem_needed: $mem_needed"
-mem_available=$(free -g | grep ^Mem: | awk -F ' +' '{print $7}')
+mem_available=$(free -g 2>/dev/null | grep ^Mem: | awk -F ' +' '{print $7}')
echo "mem_available: $mem_available"
-if test $mem_available -lt $mem_needed; then
+if test -z "$mem_available" || test $mem_available -lt $mem_needed; then
echo "Need at least ${mem_needed}GB free available memory"
exit 77
fi
diff --git a/tests/run-readelf-s.sh b/tests/run-readelf-s.sh
index 82c3417e..527c436c 100755
--- a/tests/run-readelf-s.sh
+++ b/tests/run-readelf-s.sh
@@ -281,6 +281,9 @@ cat testfile.dynsym.in testfile.symtab.in \
cat testfile.dynsym.in \
| testrun_compare ${abs_top_builddir}/src/readelf \
--symbols=.dynsym testfilebaztab
+cat testfile.dynsym.in \
+ | testrun_compare ${abs_top_builddir}/src/readelf \
+ --dyn-syms testfilebaztab
# Display just .symtab
cat testfile.symtab.in \
diff --git a/tests/run-readelf-test2.sh b/tests/run-readelf-test2.sh
index 90306247..e03ee8d7 100755
--- a/tests/run-readelf-test2.sh
+++ b/tests/run-readelf-test2.sh
@@ -25,4 +25,11 @@ Hex dump of section [6] '.strtab', 1 bytes at offset 0x290:
0x00000000 00 .
EOF
+testrun_compare ${abs_top_builddir}/src/readelf -x 6 testfile28 <<\EOF
+
+Hex dump of section [6] '.strtab', 1 bytes at offset 0x290:
+ 0x00000000 00 .
+EOF
+
+
exit 0
diff --git a/tests/test-subr.sh b/tests/test-subr.sh
index 09f428d1..e768c1e5 100644
--- a/tests/test-subr.sh
+++ b/tests/test-subr.sh
@@ -116,14 +116,12 @@ program_transform()
}
self_test_files_exe=`echo ${abs_top_builddir}/src/addr2line \
-${abs_top_builddir}/src/elfcmp \
-${abs_top_builddir}/src/objdump \
-${abs_top_builddir}/src/readelf`
+${abs_top_builddir}/src/elfclassify \
+${abs_top_builddir}/src/stack \
+${abs_top_builddir}/src/unstrip`
self_test_files_lib=`echo ${abs_top_builddir}/libelf/libelf.so \
-${abs_top_builddir}/libdw/libdw.so \
-${abs_top_builddir}/backends/libebl_i386.so \
-${abs_top_builddir}/backends/libebl_x86_64.so`
+${abs_top_builddir}/libasm/libasm.so`
self_test_files_obj=`echo ${abs_top_builddir}/src/size.o \
${abs_top_builddir}/src/strip.o`
diff --git a/tests/testfile-riscv64-dis1.expect.bz2 b/tests/testfile-riscv64-dis1.expect.bz2
new file mode 100644
index 00000000..2740795d
--- /dev/null
+++ b/tests/testfile-riscv64-dis1.expect.bz2
Binary files differ
diff --git a/tests/testfile-riscv64-dis1.o.bz2 b/tests/testfile-riscv64-dis1.o.bz2
new file mode 100644
index 00000000..50f95f26
--- /dev/null
+++ b/tests/testfile-riscv64-dis1.o.bz2
Binary files differ
diff --git a/tests/testfile45.expect.bz2 b/tests/testfile45.expect.bz2
index b8b33e9b..e502e15a 100644
--- a/tests/testfile45.expect.bz2
+++ b/tests/testfile45.expect.bz2
Binary files differ